/Api-Notification-app

Django REST API app to create spam mailings

Primary LanguagePython

Сервис уведомлений

Сервис разработан на django rest framework с celery

Установка и запуск

  1. Склонировать репозиторий с Github:

  2. Перейти в директорию проекта

  3. Создать виртуальное окружение:

python -m venv venv
  1. Активировать окружение:
source\venv\bin\activate
  1. В файле .evn заполнить необходимые данные: TOKEN = '<your token>

  2. Установка зависимостей:

pip install -r requirements.txt
  1. Создать и применить миграции в базу данных:
python manage.py makemigrations
python manage.py migrate
  1. Запустить сервер
python manage.py runserver
  1. Запустить celery
celery -A notification_project worker -l info

Установка проекта с помощью docker-compose

  1. Склонировать репозиторий с Github
  2. Перейти в директорию проекта
  3. В файле .evn заполнить необходимые данные: TOKEN = '<your token>'
  4. Запустить контейнеры
sudo docker-compose up -d
  1. Остановка работы контейнеров
sudo docker-compose stop

http://0.0.0.0:8000/api/get_all_clients - получить всех клиентов http://0.0.0.0:8000/api/get_all_mailing - получить все рассылки http://0.0.0.0:8000/api/statistics/get_statistics - получить статистику

подробнее в файле swagger.yml


Техзадание: https://www.craft.do/s/n6OVYFVUpq0o6L

Задача

Необходимо разработать сервис управления рассылками API администрирования и получения статистики

## Описание
  • Необходимо реализовать методы создания новой рассылки, просмотра созданных и получения статистики по выполненным рассылкам.
  • Реализовать сам сервис отправки уведомлений на внешнее API.
  • Опционально вы можете выбрать любое количество дополнительных пунктов описанных после основного.

Для успешного принятия задания как выполненного достаточно корректной и рабочей реализации требований по основной части, но дополнительные пункты помогут вам продемонстрировать ваши навыки в смежных технологиях.

## Критерии приёмки
  • Выполненное задание необходимо разместить в публичном репозитории на gitlab.com
  • Понятная документация по запуску проекта со всеми его зависимостями
  • Документация по API для интеграции с разработанным сервисом
  • Описание реализованных методов в формате OpenAPI
  • Если выполнено хотя бы одно дополнительное задание - написать об этом в документации, указав на конкретные пункты из списка ниже.
## Основное задание

Спроектировать и разработать сервис, который по заданным правилам запускает рассылку по списку клиентов.

### Сущность "рассылка" имеет атрибуты:
  • уникальный id рассылки
  • дата и время запуска рассылки
  • текст сообщения для доставки клиенту
  • фильтр свойств клиентов, на которых должна быть произведена рассылка (код мобильного оператора, тег)
  • дата и время окончания рассылки: если по каким-то причинам не успели разослать все сообщения - никакие сообщения клиентам после этого времени доставляться не должны
### Сущность "клиент" имеет атрибуты:
  • уникальный id клиента
  • номер телефона клиента в формате 7XXXXXXXXXX (X - цифра от 0 до 9)
  • код мобильного оператора
  • тег (произвольная метка)
  • часовой пояс
### Сущность "сообщение" имеет атрибуты:
  • уникальный id сообщения
  • дата и время создания (отправки)
  • статус отправки
  • id рассылки, в рамках которой было отправлено сообщение
  • id клиента, которому отправили
## Спроектировать и реализовать API для:
  • добавления нового клиента в справочник со всеми его атрибутами
  • обновления данных атрибутов клиента
  • удаления клиента из справочника
  • добавления новой рассылки со всеми её атрибутами
  • получения общей статистики по созданным рассылкам и количеству отправленных сообщений по ним с группировкой по статусам
  • получения детальной статистики отправленных сообщений по конкретной рассылке
  • обновления атрибутов рассылки
  • удаления рассылки
  • обработки активных рассылок и отправки сообщений клиентам
## Логика рассылки
  • После создания новой рассылки, если текущее время больше времени начала и меньше времени окончания - должны быть выбраны из справочника все клиенты, которые подходят под значения фильтра, указанного в этой рассылке и запущена отправка для всех этих клиентов.
  • Если создаётся рассылка с временем старта в будущем - отправка должна стартовать автоматически по наступлению этого времени без дополнительных действий со стороны пользователя системы.
  • По ходу отправки сообщений должна собираться статистика (см. описание сущности "сообщение" выше) по каждому сообщению для последующего формирования отчётов.
  • Внешний сервис, который принимает отправляемые сообщения, может долго обрабатывать запрос, отвечать некорректными данными, на какое-то время вообще не принимать запросы. Необходимо реализовать корректную обработку подобных ошибок. Проблемы с внешним сервисом не должны влиять на стабильность работы разрабатываемого сервиса рассылок.
## API внешнего сервиса отправки

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

OpenAPI спецификация находится по адресу: https://probe.fbrq.cloud/docs

В этом API предполагается аутентификация с использованием JWT. Токен доступа предоставлен вам вместе с тестовым заданием.

## Дополнительные задания

Опциональные пункты, выполнение любого количества из приведённого списка повышают ваши шансы на положительное решение о приёме

  1. организовать тестирование написанного кода
  2. подготовить docker-compose для запуска всех сервисов проекта одной командой
  3. сделать так, чтобы по адресу /docs/ открывалась страница со Swagger UI и в нём отображалось описание разработанного API. Пример: https://petstore.swagger.io
  4. удаленный сервис может быть недоступен, долго отвечать на запросы или выдавать некорректные ответы. Необходимо организовать обработку ошибок и откладывание запросов при неуспехе для последующей повторной отправки. Задержки в работе внешнего сервиса никак не должны оказывать влияние на работу сервиса рассылок.
  5. обеспечить подробное логирование на всех этапах обработки запросов, чтобы при эксплуатации была возможность найти в логах всю информацию по • id рассылки - все логи по конкретной рассылке (и запросы на api и внешние запросы на отправку конкретных сообщений) • id сообщения - по конкретному сообщению (все запросы и ответы от внешнего сервиса, вся обработка конкретного сообщения) • id клиента - любые операции, которые связаны с конкретным клиентом (добавление/редактирование/отправка сообщения/…)