Сервис разработан на django rest framework с celery и flower
- Склонировать репозиторий с Github:
git clone git@github.com:Witaly3/notification_service.git
-
Перейти в директорию проекта
-
Создать виртуальное окружение:
python -m venv venv
- Активировать окружение:
source venv/bin/activate
-
В файле .evn заполнить необходимые данные:
TOKEN = '<your token>'
-
Установка зависимостей:
pip install -r requirements.txt
- Создать и применить миграции в базу данных:
python manage.py makemigrations
python manage.py migrate
- Запустить сервер
python manage.py runserver
- Запустить celery
celery -A notification_service worker -l info
- Запустить flower
celery -A notification_service flower --port=5555
python manage.py test
- Склонировать репозиторий с Github
git clone git@github.com:Witaly3/notification_service.git
- Перейти в директорию проекта
- В файле .evn заполнить необходимые данные:
TOKEN = '<your token>'
- Запустить контейнеры
sudo docker-compose up -d
- Остановка работы контейнеров
sudo docker-compose stop
http://0.0.0.0:8000/api/
- api проекта
http://0.0.0.0:8000/api/clients/
- клиенты
http://0.0.0.0:8000/api/mailings/
- рассылки
http://0.0.0.0:8000/api/mailings/fullinfo/
- общая статистика по всем рассылкам
http://0.0.0.0:8000/api/mailings/<pk>/info/
- детальная статистика по конкретной рассылке
http://0.0.0.0:8000/api/messages/
- сообщения
http://0.0.0.0:8000/docs/
- docs проекта
http://0.0.0.0:5555
- celery flower
Техзадание: https://www.craft.do/s/n6OVYFVUpq0o6L
Необходимо разработать сервис управления рассылками API администрирования и получения статистики
- Необходимо реализовать методы создания новой рассылки, просмотра созданных и получения статистики по выполненным рассылкам.
- Реализовать сам сервис отправки уведомлений на внешнее API.
- Опционально вы можете выбрать любое количество дополнительных пунктов описанных после основного.
Для успешного принятия задания как выполненного достаточно корректной и рабочей реализации требований по основной части, но дополнительные пункты помогут вам продемонстрировать ваши навыки в смежных технологиях.
- Выполненное задание необходимо разместить в публичном репозитории на gitlab.com
- Понятная документация по запуску проекта со всеми его зависимостями
- Документация по API для интеграции с разработанным сервисом
- Описание реализованных методов в формате OpenAPI
- Если выполнено хотя бы одно дополнительное задание - написать об этом в документации, указав на конкретные пункты из списка ниже.
Спроектировать и разработать сервис, который по заданным правилам запускает рассылку по списку клиентов.
- уникальный id рассылки
- дата и время запуска рассылки
- текст сообщения для доставки клиенту
- фильтр свойств клиентов, на которых должна быть произведена рассылка (код мобильного оператора, тег)
- дата и время окончания рассылки: если по каким-то причинам не успели разослать все сообщения - никакие сообщения клиентам после этого времени доставляться не должны
- уникальный id клиента
- номер телефона клиента в формате 7XXXXXXXXXX (X - цифра от 0 до 9)
- код мобильного оператора
- тег (произвольная метка)
- часовой пояс
- уникальный id сообщения
- дата и время создания (отправки)
- статус отправки
- id рассылки, в рамках которой было отправлено сообщение
- id клиента, которому отправили
- добавления нового клиента в справочник со всеми его атрибутами
- обновления данных атрибутов клиента
- удаления клиента из справочника
- добавления новой рассылки со всеми её атрибутами
- получения общей статистики по созданным рассылкам и количеству отправленных сообщений по ним с группировкой по статусам
- получения детальной статистики отправленных сообщений по конкретной рассылке
- обновления атрибутов рассылки
- удаления рассылки
- обработки активных рассылок и отправки сообщений клиентам
- После создания новой рассылки, если текущее время больше времени начала и меньше времени окончания - должны быть выбраны из справочника все клиенты, которые подходят под значения фильтра, указанного в этой рассылке и запущена отправка для всех этих клиентов.
- Если создаётся рассылка с временем старта в будущем - отправка должна стартовать автоматически по наступлению этого времени без дополнительных действий со стороны пользователя системы.
- По ходу отправки сообщений должна собираться статистика (см. описание сущности "сообщение" выше) по каждому сообщению для последующего формирования отчётов.
- Внешний сервис, который принимает отправляемые сообщения, может долго обрабатывать запрос, отвечать некорректными данными, на какое-то время вообще не принимать запросы. Необходимо реализовать корректную обработку подобных ошибок. Проблемы с внешним сервисом не должны влиять на стабильность работы разрабатываемого сервиса рассылок.
Для интеграции с разрабатываемым проектом в данном задании существует внешний сервис, который может принимать запросы на отправку сообщений в сторону клиентов.
OpenAPI спецификация находится по адресу: https://probe.fbrq.cloud/docs
В этом API предполагается аутентификация с использованием JWT. Токен доступа предоставлен вам вместе с тестовым заданием.
Опциональные пункты, выполнение любого количества из приведённого списка повышают ваши шансы на положительное решение о приёме
- организовать тестирование написанного кода
- подготовить docker-compose для запуска всех сервисов проекта одной командой
- сделать так, чтобы по адресу /docs/ открывалась страница со Swagger UI и в нём отображалось описание разработанного API. Пример: https://petstore.swagger.io
- реализовать администраторский Web UI для управления рассылками и получения статистики по отправленным сообщениям
- удаленный сервис может быть недоступен, долго отвечать на запросы или выдавать некорректные ответы. Необходимо организовать обработку ошибок и откладывание запросов при неуспехе для последующей повторной отправки. Задержки в работе внешнего сервиса никак не должны оказывать влияние на работу сервиса рассылок.
- реализовать дополнительную бизнес-логику: добавить в сущность "рассылка" поле "временной интервал", в котором можно задать промежуток времени, в котором клиентам можно отправлять сообщения с учётом их локального времени. Не отправлять клиенту сообщение, если его локальное время не входит в указанный интервал.