Skip to content

ks2999/Todo

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 

Repository files navigation

Todo REST API с WebSocket уведомлениями

Современное REST API для управления задачами (TODO) с поддержкой real-time уведомлений через WebSocket.

🚀 Возможности

REST API

  • CRUD операции для задач: создание, чтение, обновление, удаление
  • Частичное обновление через PATCH запросы
  • Валидация данных с детальными сообщениями об ошибках
  • JSON API с поддержкой UTF-8
  • Правильные HTTP коды ответов (200, 422)

WebSocket уведомления

  • 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 должен быть больше нуля
  • Текст не может быть пустым или состоять только из пробелов
  • Дата завершения не может быть раньше даты создания
  • После установки даты завершения задача становится неизменяемой

🔌 API Endpoints

Метод Путь Описание
GET /health Проверка состояния сервера
GET /todo Получить все задачи
GET /todo/{id} Получить задачу по ID
POST /todo/create Создать новую задачу
PUT /todo/{id} Полное обновление задачи
PATCH /todo/{id} Частичное обновление задачи
DELETE /todo/{id} Удалить задачу
WebSocket /todo/updates Подписка на уведомления

📡 WebSocket уведомления

Формат уведомления

{
  "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 и реализовать"}'

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 синхронизация - мгновенные уведомления всех клиентов

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages