# README
Описание задания:
Баннер — это документ, описывающий какой-либо элемент пользовательского интерфейса. Технически баннер представляет собой JSON-документ неопределенной структуры. Тег — это сущность для обозначения группы пользователей; представляет собой число (ID тега). Фича — это домен или функциональность; представляет собой число (ID фичи).
- Один баннер может быть связан только с одной фичей и несколькими тегами
- При этом один тег, как и одна фича, могут принадлежать разным баннерам одновременно
- Фича и тег однозначно определяют баннер
Так как баннеры являются для пользователя вспомогательным функционалом, допускается, если пользователь в течение короткого срока будет получать устаревшую информацию. При этом существует часть пользователей (порядка 10%), которым обязательно получать самую актуальную информацию. Для таких пользователей нужно предусмотреть механизм получения информации напрямую из БД.
Проект:
Проект данного типа выполнялся мной впервые, поэтому полностью не закончил 🙂
ОС выполнения - MacOS.
Описаны только работоспособные запросы на /banner:
- GET (Получение всех баннеров c фильтрацией по фиче и/или тегу)
- POST(Создание нового баннера).
Деплой на сервер не подготовлен.
Локальный запуск:
Для локального запуска сервиса на MacOS (предполагается, что homebrew и go уже установлены) в корне репозитория:
- Выполнить make install
(Установка docker и migrate. Установка внутрь докера postgres) - Выполнить make docker-run
(Запуск контейнера Docker) - Выполнить make migrate-up
(Миграция базы данных) - Выполнить make go-start
Тестирование:
Запросы описаны внутри Makefile через curl. Цели post-createBanner и get-getBannerFiltered.
Для ручного тестирования через другой терминал:
- Выполнить make post-createBanner
(Отправка 4 запросов на создание баннеров, есть как от user так и от admin для проверки авторизации). - Выполнить make get-getBannerFiltered
(Отправка 4 запросов на получение баннеров с разной фильтрацией, есть как от user, так и от admin для проверки авторизации).
Удаление контейнера:
Для удаления запущенного контейнера:
- Выполнить make docker-remove
(Остановка и удаление контейнера)
Вопросы-мысли:
- Предоставление дополнительной информации об ошибке в формате JSON в спецификации указано не везде (есть только на 500 ошибке). Поэтому лучше делать все единообразно (передавать объект json с ошибкой) для удобной обработки ошибок на стороне клиента, поэтому делаю везде с json. На 500 ошибке буду передавать описание ошибки нативное.
- В методе получения баннеров с фильтрацией нет возврата ошибки с некорректными данными, добавил от себя еще один код ошибки 400 "Некорретные данные".
- Запросы sql выполнены параметризованными для защиты от SQL-иньекций. Названия таблиц указаны константами.
- Не знаю насколько верно смоделировал таблицы базы данных, но судя по описанию кажется все ок, поэтому оставляю.
- Структуру распределения папок и файлов нужно будет изучить как моделировать, на мой взгляд, надо вынести структуры отдельно.