Современное REST API для управления задачами (TODO) с поддержкой real-time уведомлений через WebSocket.
- CRUD операции для задач: создание, чтение, обновление, удаление
- Частичное обновление через PATCH запросы
- Валидация данных с детальными сообщениями об ошибках
- JSON API с поддержкой UTF-8
- Правильные HTTP коды ответов (200, 422)
- Real-time уведомления о всех изменениях задач
- Поддержка множественных клиентов одновременно
- Heartbeat механизм (ping/pong) для поддержания соединения
- Автоматическая очистка неактивных соединений
- Многослойная архитектура: Handler → Service → Repository
- Разделение ответственности между компонентами
- Потокобезопасность с использованием ConcurrentHashMap
- Хранение в памяти для быстрого доступа
- Java 21 с виртуальными потоками
- Jetty 12 - веб-сервер и WebSocket сервер
- Jackson - JSON сериализация/десериализация
- JUnit 5 - тестирование
- Gradle - сборка проекта
Задача (Todo) содержит:
id- уникальный идентификатор (только для чтения)text- текст задачи (обязательное поле)creation_date- дата создания (только для чтения)completion_date- дата завершения (опциональное)
- ID должен быть больше нуля
- Текст не может быть пустым или состоять только из пробелов
- Дата завершения не может быть раньше даты создания
- После установки даты завершения задача становится неизменяемой
| Метод | Путь | Описание |
|---|---|---|
GET |
/health |
Проверка состояния сервера |
GET |
/todo |
Получить все задачи |
GET |
/todo/{id} |
Получить задачу по ID |
POST |
/todo/create |
Создать новую задачу |
PUT |
/todo/{id} |
Полное обновление задачи |
PATCH |
/todo/{id} |
Частичное обновление задачи |
DELETE |
/todo/{id} |
Удалить задачу |
WebSocket |
/todo/updates |
Подписка на уведомления |
{
"id": 1,
"text": "Текст задачи",
"creation_date": "2025-10-12T07:08:32.149500Z",
"completion_date": null,
"deleted": false
}- Создание - при добавлении новой задачи
- Обновление - при изменении существующей задачи
- Удаление - при удалении задачи (поле
deleted: true)
Проект включает комплексные тесты:
- HTTP API тесты - проверка всех эндпоинтов
- Валидация данных - тестирование бизнес-правил
- WebSocket клиент - для тестирования уведомлений
- Интеграционные тесты - полные сценарии использования
- Java 21+
- Gradle 9.1+
# Сборка проекта
./gradlew build
# Запуск сервера
./gradlew run
# Запуск тестов
./gradlew testСервер запускается на порту 8080.
curl -X POST http://localhost:8080/todo/create \
-H "Content-Type: application/json" \
-d '{"text": "Изучить WebSocket"}'curl -X PATCH http://localhost:8080/todo/1 \
-H "Content-Type: application/json" \
-d '{"text": "Изучить WebSocket и реализовать"}'const ws = new WebSocket('ws://localhost:8080/todo/updates');
ws.onmessage = (event) => {
const notification = JSON.parse(event.data);
console.log('Получено уведомление:', notification);
};app/src/main/java/
├── model/
│ └── Todo.java # Модель данных
├── domain/
│ ├── TodoRepository.java # Интерфейс репозитория
│ └── TodoRepositoryImpl.java # Реализация репозитория
├── service/
│ └── TodoService.java # Бизнес-логика
└── todo/server/
├── TodoApp.java # Главный класс приложения
├── TodoHandler.java # HTTP обработчик
├── TodoWebSocketHandler.java # WebSocket обработчик
├── NotificationService.java # Сервис уведомлений
├── WebSocketClient.java # WebSocket клиент для тестов
└── HealthHandler.java # Обработчик health check
- Порт: 8080
- Потоки: Виртуальные потоки Java 21
- Логирование: Jetty debug handler
- JSON: ISO 8601 формат дат в UTC
- Потокобезопасность - поддержка одновременных запросов
- Виртуальные потоки - эффективная обработка множественных соединений
- In-memory хранилище - быстрый доступ к данным
- WebSocket heartbeat - автоматическое поддержание соединений
- Валидация на уровне модели - бизнес-правила встроены в класс Todo
- Детальные сообщения об ошибках - понятные описания проблем
- Автоматическая генерация ID - атомарный счетчик для уникальности
- Неизменяемость завершенных задач - защита от случайных изменений
- Real-time синхронизация - мгновенные уведомления всех клиентов