Необходимо реализовать сервис, который может собирать токены устройств для push уведомлений. Один токен соответствует только одному устройству, он может меняться со временем. Также устройство имеет уникальный идентификатор, и принято считать, что он не меняется. У одного пользователя может быть несколько устройств. Токен, привязанный к устройству, должен иметь признак отличия для авторизованного и анонимного пользователя
- Docker
- Nginx
- Phalcon, Yii, Laravel, Plain PHP
- MySQL, MongoDB
- Redis
- RabbitMQ
Сервис общается с внешним миром в формате json посредством http протокола. Все конечные точки запрашиваются методом POST
Устройство будет запрашивать данную конечную точку при создании и обновлении токена
{“user_id”: 1, “device_id”: “f472787a84477aefc2be5617876ab1b2”, “token”: “d5b119095f2c027176c17124e1437029”, “os”: “ios”, “version”: “4.3.12”}
{“device_id”: “f472787a84477aefc2be5617876ab1b2”, “token”: “d5b119095f2c027176c17124e1437029”, “os”: “ios”, “version”: “4.3.12”}
HTTP 200 OK
{“status”: “ok”}
HTTP 400 Bad Request
{“status”: “error”, “validation”: {“device_id”: “required”}, “message”: “Переданы не все данные”}
HTTP 500 Internal Server Error
{“status”: “error”, “message”: “Ошибка при обращении к базе данных”}
Сторонние сервисы будут запрашивать данную конечную точку для получения токенов пользователя, которому нужно отправить push уведомления
{“user_id”: 1}
{“device_id”: “f472787a84477aefc2be5617876ab1b2”}
HTTP 200 OK
{“status”: “ok”, “tokens”: [{“user_id”: 1, “device_id”: “f472787a84477aefc2be5617876ab1b2”, “token”: “d5b119095f2c027176c17124e1437029”, “os”: “ios”, “version”: “4.3.12”}]}
HTTP 400 Bad Request
{“status”: “error”, “validation”: {“user_id”: “required”, “device_id”: “required”}, “message”: “Не передан идентификатор пользователя”}
HTTP 500 Internal Server Error
{“status”: “error”, “message”: “Ошибка при обращении к базе данных”}
Сторонний сервис будет запрашивать данную конечную точку для удаления токенов при истечении их срока жизни
{“token”: “d5b119095f2c027176c17124e1437029”}
HTTP 200 OK
{“status”: “ok”}
HTTP 400 Bad Request
{“status”: “error”, “validation”: {“token”: “required”}, “message”: “Не указан token для удаления”}
HTTP 500 Internal Server Error
{“status”: “error”, “message”: “Ошибка при обращении к базе данных”}
- Необходимо подключить in-memory базу данных “Redis” для хранения токенов, чтобы повысить скорость ответа
- Необходимо внедрить другой вид транспорта для общения с сервисом, который будет работать параллельно с HTTP - очереди “RabbitMQ”. Формат сообщений в очереди такой же, как и у запросов по HTTP. Обработка ошибок будет отличаться. В случае ошибок валидации, необходимо переправлять сообщения в очередь с ошибками валидации для ручного анализа и обработки. В случае ошибок, которые могут исчезнуть через время, необходимо делать повторную обработку сообщения - requeue
- docker-compose up web - запуск сервера
- docker-compose up tests - запуск тестов. Все тесты будут пройдены после правильной реализации внешних интерфейсов сервиса. Для тестов необходимо настроить поднятие выбранной вами БД в docker-compose
- docker-compose run terminal - запуск терминала, где можно установить зависимости и сделать другие необходимые операции на сервере
- Composer
- Phalcon, Yii, Laravel
- Настройка среды разработки на примере Docker, nginx, MySQL, Laravel
- Awesome PHP
- Router
- Validation
- Database
- Redis & PHP
- RabbitMQ & PHP
P.S:
-
Используйте только нужное. Ссылки приведены в качестве рекомендаций, а не инструкций к действию
-
Учтите, что тесты покрывают не все кейсы, и если они проходят - не факт, что у вас все реализовано правильно