Cервис управления рассылками API администрирования и получения статистики. Тестовое задание для Fabrique.
License: MIT
Сущность "Рассылка":
Сделано:
- реализована фильтрация по выбранными тегами и операторам:
- если операторы не выбраны, то рассылка идет по всем операторам, если выбрано несколько, то в рассылку попадают клиенты с оператором из выбранных;
- фильтрация по тегам происходит в зависимости от выбранной логики фильтрации: "Все выбранные теги" - в рассылку попадут клиенты у которых ксть все теги из выбранных, "Любой из выбранных тегов" - в рассылку попадут клиенты минимум с одним из выбранных тегов. Если теги не выбраны - рассылка будет производиться по всем клиентам.
- время окончания рассылки не может быть меньше времени начала;
- API: можно создавать рассылку только для существующих тегов и операторов;
- получение общей статистики по созданным рассылкам и количеству отправленных сообщений по ним с группировкой по статусам
- получение детальной статистики отправленных сообщений по конкретной рассылке
Сущность "Клиент":
- API: при создании клиента с несуществующим тегом и/или оператором - недостающие сущности создаются автоматически;
Сущность "Сообщение":
- создается автоматически при запуске рассылки.
- Реализована втоматическая сборка/тестирование с помощью GitHub CI
- Стек поднимается в docker-compose (local/production)
- Traefik как реверс-прокси в production
- По адресу api/docs/ открывается страница со Swagger UI
- Celery+Redis
- Обеспечено подробное логирование приложения
- Все подготовлено для написания тестов, написано несколько тестов
- Обеспечена интеграция с внешним OAuth2 сервисом авторизации (django-allauth)
- Использовать django-celery-beat для работы с задачами
- Реализовать администраторский Web UI
- Реализовать дополнительный сервис, который раз в сутки отправляет статистику по обработанным рассылкам на email
- Реализовать отдачу метрик в формате prometheus и задокументировать эндпоинты и экспортируемые метрики
- Реализовать дополнительную бизнес-логику: добавить в сущность "рассылка" поле "временной интервал", в котором можно задать промежуток времени, в котором клиентам можно отправлять сообщения с учётом их локального времени. Не отправлять клиенту сообщение, если его локальное время не входит в указанный интервал.
git clone https://github.com/baikov/notification_service_api.git
docker compose -f local.yml build
docker compose -f local.yml up -d
docker compose -f local.yml run --rm django python manage.py migrate
docker compose -f local.yml run --rm django python manage.py createsuperuser
docker compose -f local.yml run --rm django pytest
MailHog на порту 8025
Flower на порту 5555 admin:admin