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