Categorygithub.com/Manifoldz/AvitoTraineeBackend24
repositorypackage
0.0.0-20240609173100-668beb8d50ee
Repository: https://github.com/manifoldz/avitotraineebackend24.git
Documentation: pkg.go.dev

# Packages

No description provided by the author
No description provided by the author

# README

Описание задания:

Баннер — это документ, описывающий какой-либо элемент пользовательского интерфейса. Технически баннер представляет собой  JSON-документ неопределенной структуры.  Тег — это сущность для обозначения группы пользователей; представляет собой число (ID тега).  Фича — это домен или функциональность; представляет собой число (ID фичи).  

  1. Один баннер может быть связан только с одной фичей и несколькими тегами
  2. При этом один тег, как и одна фича, могут принадлежать разным баннерам одновременно
  3. Фича и тег однозначно определяют баннер

Так как баннеры являются для пользователя вспомогательным функционалом, допускается, если пользователь в течение короткого срока будет получать устаревшую информацию. При этом существует часть пользователей (порядка 10%), которым обязательно получать самую актуальную информацию. Для таких пользователей нужно предусмотреть механизм получения информации напрямую из БД.

Проект:

Проект данного типа выполнялся мной впервые, поэтому полностью не закончил 🙂
ОС выполнения - MacOS.

Описаны только работоспособные запросы на /banner:

  • GET (Получение всех баннеров c фильтрацией по фиче и/или тегу)
  • POST(Создание нового баннера).

Деплой на сервер не подготовлен.

Локальный запуск:

Для локального запуска сервиса на MacOS (предполагается, что homebrew и go уже установлены) в корне репозитория:

  1. Выполнить make install
    (Установка docker и migrate. Установка внутрь докера postgres)
  2. Выполнить make docker-run
    (Запуск контейнера Docker)
  3. Выполнить make migrate-up
    (Миграция базы данных)
  4. Выполнить make go-start

Тестирование:

Запросы описаны внутри Makefile через curl. Цели post-createBanner и get-getBannerFiltered.

Для ручного тестирования через другой терминал:

  1. Выполнить make post-createBanner
    (Отправка 4 запросов на создание баннеров, есть как от user так и от admin для проверки авторизации).
  2. Выполнить make get-getBannerFiltered
    (Отправка 4 запросов на получение баннеров с разной фильтрацией, есть как от user, так и от admin для проверки авторизации).

Удаление контейнера:

Для удаления запущенного контейнера:

  1. Выполнить make docker-remove
    (Остановка и удаление контейнера)

Вопросы-мысли:

  1. Предоставление дополнительной информации об ошибке в формате JSON в спецификации указано не везде (есть только на 500 ошибке). Поэтому лучше делать все единообразно (передавать объект json с ошибкой) для удобной обработки ошибок на стороне клиента, поэтому делаю везде с json. На 500 ошибке буду передавать описание ошибки нативное.
  2. В методе получения баннеров с фильтрацией нет возврата ошибки с некорректными данными, добавил от себя еще один код ошибки 400 "Некорретные данные".
  3. Запросы sql выполнены параметризованными для защиты от SQL-иньекций. Названия таблиц указаны константами.
  4. Не знаю насколько верно смоделировал таблицы базы данных, но судя по описанию кажется все ок, поэтому оставляю.
  5. Структуру распределения папок и файлов нужно будет изучить как моделировать, на мой взгляд, надо вынести структуры отдельно.