Skip to content

AleksNesterzz/avito_backend_2024

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

12 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Что использовал

  • БД: PostgreSQL (драйвер pgx)
  • Роутер: chi
  • Тестирование: testing, apitest
  • Чтение конфига: cleanenv
  • Развертиывание приложения: Docker
  • Тестирование API: Postman

Сборка и запуск проекта

docker build -t go-app . && docker compose up --build go-app Приложение будет готово к использованию после вывода в консоль строки "Postgres is up - executing command"

Для запуска тестов

docker compose run go-app go test ./apitest

Что было сделано

  • При инициализации БД происходит создание одной пустой таблицы(banners)
  • 5 методов:
    • POST-запрос для создания нового баннера "/banner"
    • Delete-запрос для удаления баннера "/banner/{id}"
    • Patch-запрос для обновления содержимого сегментов "/banner/{id}"
    • Get-запрос для получения информации о баннерах пользователя "/user_banner"
    • Get-запрос для получения информации о баннерах по фильтру "/banner" -e2e тестирование для сценария получения пользователем своего баннера

Вопросы по ходу решения задачи

  1. Как отдавать информацию пользователям, которые не пользуются флагом last_revision? Я решил использовать локальный кэш, который обновляется каждые 5 минут в отдельной горутине. (Конечно для такой задачи лучше подойдет Redis, однако я не изучал его)
  2. Как проверять токены авторизации? Так как не стояло задачи реализовать сервис авторизации, то я решил, что можно просто проверять Header запроса на наличие определенного значения по ключу "token". То есть я просто проверяю значение токена в заголовке запроса, подразумевая, что токен выдаст пользователю сторонний сервис авторизации.
  3. Сколько записей показывать при фильтрации? По умолчанию решил назначить значения параметрам limit и offset.
  4. Структура БД Я решил ограничиться одной таблицей, не создавая отдельных таблиц для хранения тэгов и фич. Сделал я это для того, чтобы было легче тестировать, а также не нужно было создавать отдельные методы для таблицы. Для запроса получения баннеров с фильтрацией я с помощью функции агрегации создаю из отдельных записей "тег-фича-баннер" запись "массив тегов - фича - баннер".
  5. Что можно будет изменять при patch-запросе Я решил, что нельзя будет менять структуру тэгов и фич во время патч-запроса. Меняться может только содержимое и флаг is_active. Если нужно добавить еще тэгов для баннера, то это можно будет сделать с помощью запроса на создание баннера.

ПРИМЕРЫ ЗАПРОСОВ

Запросы в Postman:

  1. Post-запрос на добавление баннера image при token = admin image при token = user image при отсутствии токена

  2. Delete-запрос на удаление баннера image

  3. Patch-запрос на обновление баннера image

  4. Get-запрос для получения баннера пользователя image

  5. Get-запрос для получения баннеров по фильтру image

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages