В рамках задания необходимо реализовать систему простых чатов.
Система включает
- сервис реестра пользователей (HTTP REST API)
- клиентское приложения работающие по протоколу HTTP
Реализовать с использованием Ktor
Сервис должен поддерживать следующий интерфейс:
-
Регистрация пользователя
POST /v1/users { "user" : "<name>", "address" : { "host": "<host or ip>", "port":"<port>" } }
В случае успеха ответ
200 OK
{ "status" : "ok" }
Если пользователь уже есть -
409 Conflict
Имя пользователя не должно быть пустым, должно состоять из [a-zA-Z0-9-_.]. В случае неверного имени -400 Bad Request
-
Обновление пользователя
PUT /v1/users/{user} { "host": "<host or ip>", "port": "<port>" }
В случае успеха ответ
200 OK
{ "status" : "ok" }
Если пользователя нет - создать как при регистрации Имя пользователя не должно быть пустым, должно состоять из [a-zA-Z0-9-_.]. В случае неверного имени -
400 Bad Request
-
Получение списка пользователей
GET /v1/users/
В случае успеха ответ
200 OK
. Пример:{ "user1" : { "host" : "127.0.0.1", "port" : 8083 }, "user2" : { "host" : "myhost.example.com", "port" : 3002 }, "user3" : { "host" : "192.168.0.1", "port" : 8080 }
-
Удаление пользователя
DELETE /v1/users/{user}
В случае успеха ответ
200 OK
{ "status" : "ok" }
Если пользователя нет отвечать как при успешном удалении
См. Ktor REST API
Необходимо реализовать тесты для всех методов REST API. Обратите внимание на проверку имени пользователя, добавление/изменение существующего пользователя и прочие подобные сценарии.
Реализовать периодическую (раз в 2-3 минуты) проверку доступности клиентов со стороны реестра с помощью запроса к /v1/health
Клиентов, которые недоступны более 3-х проверок подряд удалять из реестра.
Приложение реализует command line чат со следующими командами:
:update
- Обновление списка пользователей, вывод пользователей и их адресов. Сообщение об ошибке, если реестр недоступен. Если выбранный пользователь был удалён - сбросить пользователя для отправки сообщений.:user <user>
- Выбор пользователя для отправки сообщений. Сообщение об ошибке если пользователя нет или его протокол пока не поддерживается.<text>
- Отправка сообщения выбранному пользователю. Сообщение об ошибке если пользователь не выбран. Сообщение об ошибке, если отправка сообщения не удалась.:exit
- Выход. Перед выходом удаляем клиента из реестра.
Клиент принимает сообщение по протоколу HTTP.
Порт по умолчанию - 8080
, путь - /v1/message
(см. Ktor REST API)
Сообщение передаётся в виде json: { "user" : "<имя отправителя>", "text": "<текст сообщение>" }
При старте клиента доступны следующие опции:
--name
- имя клиента--registry
- базовый URL реестра, напримерhttp://127.0.01:8088
--host
- hostname или ip, на котором клиент будет слушать сообщения--port
- порт (Int), на котором клиент будет слушать сообщения--public-url
- URL по которому клиент доступен извне (может отличаться от http://:, если используется прокси, например ngrok).
При старте клиент регистрируется в реестре со host
и port
из public-url
и выполняет команду :update
.
Необходимо реализовать тесты приёма сообщений. Для этого можно установить свой ChatMessageListener, отправить сообщение с помощью соответствующего ChatClient и убедиться, что оно доставлено.
Реализовать периодический (раз в 2-3 минуты) опрос реестра и обновление списка пользователей.