- Пользователь может добавлять, удалять, закрывать и заново открывать задачи
- Названия задач должны быть уникальными для всех пользователей (удаленные не учитываются).
- Пользователь может получить список всех задач любого другого пользователя, кроме удаленных.
- Пользователь может закрывать, удалять и заново открывать только свои задачи
- Задача проходит следующие состояния:
CREATED <--> CLOSED -> DELETED
. При этом задача в статусеCREATED
не может сразу перейти вDELETED
. Задача же вDELETED
больше не может переходить ни в какое состояние.
В рамках задания
DELETED
можно трактовать как фактическое удаление элемента, а не выставление какого-либо статуса.
Веб-сервер принимает сообщения по придуманному нами протоколу - Simple Web Protocol.
Запросы и ответы состоят из одной строки.
Формат запроса: "USER COMMAND ARG"
Формат ответа: "RESULT ARG"
USER
— имя пользователя, который осуществляет действие.COMMAND
— команда. Варианты команд:CREATE_TASK MyTask
— создать задачу с названием MyTaskCLOSE_TASK MyTask
— закрыть задачу MyTaskDELETE_TASK MyTask
— удалить задачу MyTaskREOPEN_TASK MyTask
— заново открыть задачу MyTaskLIST_TASK USER
— Получить список задач пользователя (в статусеCREATED
иCLOSED
)__DELETE_ALL
— Удалить информацию о всех пользователях и их задачах. Используется в тестах, чтобы «чистить» данные между их выполнением. Формат ответа для этой команды не имеет значения, так как он нигде не валидируется.
ARG
— аргумент запроса или ответа. Может отсутствовать. Например, в запросе на создание задачиVASYA CREATE_TASK CleanRoom
— этоCleanRoom
. А в ответеTASKS [MyTask1, MyTask2]
—[MyTask1, MyTask2]
.RESULT
— ответ сервера о совершении действия. Варианты ответов.CREATED
— задача успешно созданаDELETED
— задача успешно удаленаCLOSED
— задача успешно закрытаREOPENED
— задача успешно открыта зановоTASKS [MyTask1, MyTask2]
— список задач пользователя. Если задач нет, список пустой ([]
). Задачи перечислены в порядке их создания.WRONG_FORMAT
— Неверный формат запросаACCESS_DENIED
— Нет прав на совершение операцииERROR
— Любая другая ошибка
- Все команды, а также имена пользователей регистрозависимые. В названии задач и имен пользователей не может быть пробелов.
- Запросы валидируются в следующем порядке: формат запроса, право на совершение операции, все остальные проверки. Если первая проверка не прошла, остальные не выполняются.
VASYA CREATE_TASK CleanRoom
CREATED
PETYA DELETE_TASK CleanRoom
ACCESS_DENIED
PETYA CREATE_TASK Task1
CREATED
PETYA CREATE_TASK Task2
CREATED
VASYA LIST_TASK PETYA
TASKS [Task1, Task2]
VASYA CREATE_TASK CleanRoom
ERROR
В данном примере состояние сервиса сохраняется между запросами, поэтому
PETYA DELETE_TASK CleanRoom
возвращаетACCESS_DENIED
.
В ServerTest объявлены тест-кейсы, которые проверяют корректность вышеописанных фич. Необходимо дописать бизнес-функциональность таким образом, чтобы все тесты проходили.
Все данные храним в оперативной памяти. Concurrency-эффекты не учитываем, так как сервер обрабатывает запросы последовательно.
Spring, прочие фреймворки, вспомогательные библиотеки, а также Service Loader использовать нельзя. Применяем только то, что уже есть в проекте.
Важно:
Перед тем, как отправлять код на проверку убедитесь, что все тесты, объявленные в проекте (а также те, что вы написали самостоятельно), успешно проходят. Когда код принят на рассмотрение, никакие изменения вносить не допускается.
Критерии, по которым работа автоматически отклоняется:
- Хотя бы один тест не выполнился успешно (билд «красный»).
- Тесты, которые были написаны заранее, удалены/отмечены как
disabled
/закомментированы. - В
pom.xml
внесены любые изменения: на CI автоматически проверяется hash-сумма.
Для сборки проекта на CI используется Java 11. Чтобы убедиться в корректности написанного вами кода, локально также рекомендуется запускать проект на Java 11.
Исключением могут являться технические проблемы. Например, build на GitHub Actions «красный» из-за проблем на сервере. Но такие вещи решаются в индивидуальном порядке.
Учитывается общее оформление кода, архитектурное разделение компонентов, а также наличие Unit-тестов на отдельные части проекта.
- Форкаем репозиторий.
- Создаем новую ветку от
master
. - Выполняем задание и пушим изменения.
- Создаем Pull Request из своей feature-ветки в
master
исходного репозитория. - В комментарии оставляем ФИО и почту (тегаем
@SimonHarmonicMinor
) - Ждем результатов :)
Обратите внимание, что после того, как вы тегнули @SimonHarmonicMinor
, вы в то же время оповестили
нас о том, что выполнили задание. Если же к моменту проверки билд оказывается «красным», задание
сразу же оценивается в 0 баллов. Поэтому перед тем, как уведомлять нас о сдаче работы,
пожалуйста, проверьте, что билд собирается корректно. Создание Pull Request само по себе не является
сигналом, пока вы не тегните @SimonHarmonicMinor
.
В случае возникновения каких-либо вопросов, пишите на почту МТС Тета.