Описание:
Реализовать веб-сервис для передачи команд клиентскому устройству посредством long polling запросов.
Есть некоторые устройства которые умеют по http/https протоколам запрашивать команды с сервера. Каждая команда состоит из имени и списка параметров команды. Список параметров - простой key/value список. Команды поступают на сервер со стороны пользователя в виде http requests. При поступлении команды она помещается в очередь команд для конкретного устройства. Для устройств есть строго ограниченный набор команд. При воступлении новой команды от пользователя необходимо валидировать команду и ее параметры. У каждой команды есть "время жизни", т.е. timeout через который команда должна быть помечена как "просроченная" и быть удалена из очереди. Пользователю должен быть доступен список с историей команд по каждому устройству.
Общий принцип работы приложения:
- Клиентское устройство посылает GET-запрос по url следующего вида: Method GET
http://<service>/commands/{deviceId}/{timeout}
// deviceId (string) - идентификатор устройства
// timeout - timeout для long polling.
- Сервис проверяет наличие команд в очереди. В случае наличия - клиент сразу получает response с json следующего вида:
GetCommandResponseDto
{
"commandId": "{commandId}", // commandId (int) - номер команды, от 1 до 255,
присваивается сервисом для каждого устройства отдельно (при достижении номера 255 следующий номер будет 1)
"command": {command details} // command json содержащий детали команды.
}
В случае отсутствия команд для устройства сервис стартует long polling с timeout {timeout} секунд.
- Команды поступают в виде POST-запросов с json следующего вида в теле запроса:
SendCommandDto {
"deviceId": "{deviceId}", // deviceId (string) - идентификатор устройства
"command": "{command details}" // command json содержащий детали команды.
}
При получении команды сервис должен отправить ее в очередь. Затем в контроллер, отвечающий за long polling, должно быть отправлено уведомление о поступлении новой команды. При поступлении такого уведомления контроллер long polling должен закончить long polling имеющихся запросов по соответствующему устройству и вернуть команду устройству.
Приложение должно содержать UnitTests для основных кейсов. Реализация очередей команд на основе RabbitMQ. В качестве БД использовать MongoDB.
Список команд которые должно поддерживать тестовое приложение:
{
"commandName": "delete"
"parameters":[]
},
{
"commandName": "getInfo"
"parameters":[]
},
{
"commandName": "upgrade"
"parameters":[
{
"name":"url",
"value":"..."// string value.
}
]
},
{
"commandName": "setOnOff"
"parameters":[
{
"name":"switchOn",
"value":"..."// boolean value.
}
]
}