Сквозной проект представляет собой сервис рассылки электронной почты.

Основной сценарий работы c системой:

  1. Пользователь в браузере авторизуется на сервисе auth (эндпоинт /login) с помощью basic-авторизации. Для этого логины и хэш-суммы паролей должны быть заведены администратором в конфиг-файл сервиса auth. Сервис отправляет access jwt-куку клиенту, в которой содержится его логин, со сроком жизни 1 минута. Дополнительно к этому, клиенту отправляется вспомогательная refresh-кука с токеном jwt, который тоже соджержит логин пользователя. Кука refresh должна быть действительна в течение 1 часа. По истечении этого срока пользователь считается разлогиненным. Если в момент любого запроса, кроме /login и /logout, от клиента refresh кука еще жива, а access уже протухла, то сервис auth отправляет клиенту обновленные access и refresh куки.
  2. Пользователь загружает новые шаблоны писем в формате golang html template на сервис profile. Шаблоны могут внутри себя содержать ссылки на другие шаблоны и использовать их. Все параметры внутри шаблона должны быть текстовыми строками. Сервис profile анализирует шаблон и сохраняет шаблон и его метаданные в postgres так, чтобы его можно было там найти по id (uuid). Метаданные шаблона содержат имя файла, id и перечень параметров типа "строка" к заполнению пользователем.
  3. Пользователь выбирает шаблон из списка и заполняет его параметры для отправки, редактирует список рассылки (email-адреса), жмет кнопку "Отправить". Сервис profile создает и отправляет новую задачу сервису bodyshop, если введенные данные корректны. Список рассылки должен сохраниться в профиле этого пользователя в сервисе profile и в следующий раз при выборе шаблона автоматически заполниться. Для редактирования списка рассылки в сервисе profile нужно реализовать соответствующее CRUDL-api.
  4. Система в сервисе bodyshop пробует сформировать тело письма по выбранному шаблону, списку рассылки и параметрам, и передает письмо в сервис mailsender.
  5. Сервис mailsender хранит в MongoDB очередь писем, пришедших на вход, и пробует отправить письма (распечатать их в stdout). Сервис случайным образом сообщает об успехе или ошибке отправки письма. Сервис profile должен асинхронно получить и отразить результат этой отправки в истории отправок.
  6. Пользователь просматривает историю отправленных писем в сервисе profile, видит успешные отправки и отправки с ошибками.

Задание со * - реализовать отправку писем не в stdout, а на реальный SMTP-сервер.

Реализация

В ходе разработки проекта необходимо разработать и запустить в контейнерах как основные сервисы, так и вспомогательные, позволяющие протестировать работу основных сервисов. Тестовая среда, состоящая из вспомогательных сервисов, должна суметь протестировать основной сценарий работы сервиса полностью.

Основные сервисы

Система, реализуемая в ходе сквозного проекта, состоит из основных сервисов:

Вспомогательные сервисы