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