Есть папка. В папке постепенно появляются JSON файлы. В файле объект звонка со следующими полями: номер того, кто звонил (строка), номер того, кому звонили (строка), время начала звонка (Unix timestamp), время окончания звонка (Unix timestamp), тип связи (строка, одно из (GSM, CDMA, LTE)). Есть БД. Две сущности: тарифный план и звонок. Тарифный план состоит из следующих атрибутов: тип связи и цена за минуту разговора (в неделимых единицах, например, в копейках, может быть просто целым положительным числом). Звонок состоит из следующих атрибутов: номер того, кто звонил, номер того, кому звонили, время начала звонка, время окончания звонка, стоимость звонка. Задача: написать сервис (EDI), который следит за тем, как появляются файлы звонков в каталоге. Как только появляется файл со звонком, он его читает, парсит, считает стоимость для соответствующего типа связи и записывает в базу и, если все ок с записью, файл удаляет. Помимо этого есть простой REST API с одним методом: GET /call с параметром number который возвращает все звонки (2 номера, время начала/конца, стоимость), в которых участвовал номер из параметра (то есть и входящие, и исходящие). Данные брать из БД. Формат данных: JSON Техонологии: python 3, любая реляционная СУБД (например, MySQL), API на последнем flask (1.1.x)
Инструкция:
- Создаем базу данных в MySQL и заполняем настройки для подключения к ней в файле config.py
- Запускаем create_db.py для создания базы данных, таблиц и заполнения начальных данных
- Запускаем в первом терминале: celery -A celery_worker beat -l debug
- Запускаем во втором терминале: celery worker -A celery_worker -l info
- Как только в каталоге files появятся файлы - они обработаются в течение 30 секунд
- Если отправить GET-запрос к адресу: http://localhost:8080/api/call?number=375259552233, то мы получим массив данных (JSON), которые включают в себя указанный в запросе номер телефона
Для работы требуется:
- MySQL=8.0.18, RabbitMQ=3.7.8
- flask=1.1.1, flask-SQLAlchemy=2.4.1, PyMySQL=0.9.3, celery=4.4.0, amqp=2.5.2