- Два типа пользователей: “клиент” и “агент”, которые могут общаться друг с другом.
- Поддерживаются только личные сообщения клиента с агентом (клиент не может писать другому клиенту, а агент - другому агенту).
- Когда клиент начинает писать сообщение, он ещё не знает, с каким агентом он будет общаться.
- При получении первого сообщения клиента сервер должен выбрать свободного агента в качестве собеседника.
- Агент может вести беседу одновременно только с одним клиентом.
- Должны поддерживаться консольные команды для регистрации в системе, завершения чата и выходы из системы.
- Сообщения, отправленные клиентом в отсутствии соединения с агентом не должны теряться.
- Автоматическая сборка проекта посредством Apache Maven
- Покрытие кода unit-тестами
- Логирование основных событий с указанием времени:
- Появления агента и клиента в системе
- Начало и завершение чата
- Запускаем сервер
- Запускаем клиентское приложение
- Вводим “/register agent Cooper”
- Сервер регистрирует нас как агента
- Запускаем ещё один экземпляр клиентского приложения
- Вводим “/register client Alice”
- Сервер регистрирует нового клиента
- Клиент вводит “Hello, I need help”
- Агент получает сообщение и может ему ответить “How can I help you?”
- Клиент может продолжить переписку или завершить чат: “/leave”
- После завершения чата клиент может снова написать сообщение и, возможно, попасть на другого агента
- Клиент или агент может выйти из системы, введя “/exit”, в этом случае приложение закрывается.
- Необходимо добавить веб-интерфейс для вашего агентского/клиентского приложения.
Он должен быть представлен в виде веб-страницы со следующими элементами:
- поле для ввода сообщений
- поле для вывода сообщений
- кнопка для отправки сообщений.
- При этом, должна сохраняться обратная совместимость с вашим консольным приложением таким образом, чтобы консольный агент мог общаться с веб-клиентами и консольные клиенты могли общаться с веб-агентами.
- Получить всех зарегистрированных агентов
- Получить всех свободных агентов
- Получить детальную информацию об одном указанном агенте
- Получить количество свободных агентов
- Получить текущие открытые чаты
- Получить детальную информацию об одном указанном чате
- Получить всех клиентов, находящихся в очереди
- Получить детальную информацию об одном указанном клиенте
- Зарегистрировать агента
- Зарегистрировать клиента
- Послать сообщение агенту
- Послать сообщение клиенту
- Получить новые сообщения
- Покинуть чат
- Транспортный протокол: HTTP
- Формат запросов: JSON
- Сервисы, позволяющие получить списки, должны поддерживать пагинацию - передаём входные параметры “номер страницы” и “размер страницы”. Например: GET http://localhost:8080/app/agents?pageNumber=0&pageSize=5 - вернёт первые 5 агентов в списке.
- Также необходимо сгенерировать документацию сервисов.
- Рекомендации:
- Использовать один из REST Frameworks: RESTEasy, Jersey, средства Spring (RestController)
- Тестировать сервисы с помощью сторонних REST-клиентов (e.g. YARC, Postman)
- Генерировать документацию с помощью таких инструментов, как Swagger или SpringRestDoc
-
Действия, произведённые через REST клиент, должны быть интегрированы с действиями из консольного и веб-клиента (т.е. можно отправить сообщение из REST-клиента агенту, использующему веб-интерфейс или клиенту, использующему консольный интерфейс, и т. д.)
- В рамках данного задания необходимо добавить в своё приложение аутентификацию и авторизацию.