Skip to content

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

Task Catalog

REST-сервис для управления задачами. Проект выполнен на Kotlin, Spring Boot, Reactor и Spring JDBC JdbcClient без ORM/JPA.

Быстрый запуск

1. Проверить Java

Нужна Java 17 или новее.

java -version

Если команда не найдена, установите JDK 17 или 21, например Eclipse Temurin:

https://adoptium.net/temurin/releases/

После установки откройте новый терминал и снова проверьте java -version.

2. Запустить тесты

Windows:

.\gradlew.bat test

Linux / macOS:

./gradlew test

3. Запустить приложение

Windows:

.\gradlew.bat bootRun

Linux / macOS:

./gradlew bootRun

После запуска сервис доступен по адресу:

http://localhost:8080

Проверить, что сервис отвечает:

GET http://localhost:8080/api/tasks?page=0&size=10

Для Windows PowerShell:

Invoke-RestMethod -Method Get -Uri "http://localhost:8080/api/tasks?page=0&size=10"

Запуск на другом порту

Windows PowerShell:

$env:SERVER_PORT=8081
.\gradlew.bat bootRun

Linux / macOS:

SERVER_PORT=8081 ./gradlew bootRun

Сборка jar

Windows:

.\gradlew.bat clean build

Linux / macOS:

./gradlew clean build

После сборки jar будет находиться в папке:

build/libs/

База данных

По умолчанию используется in-memory H2:

spring.datasource.url=jdbc:h2:mem:task_catalog;MODE=PostgreSQL;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE

Миграции Flyway запускаются автоматически при старте приложения. Таблица создается миграцией:

src/main/resources/db/migration/V1__create_tasks_table.sql

Так как база in-memory, данные очищаются после остановки приложения.

API

Создать задачу

POST /api/tasks
Content-Type: application/json

{
  "title": "Prepare report",
  "description": "Monthly financial report"
}

Ответ: 201 Created.

Пример PowerShell:

Invoke-RestMethod `
  -Method Post `
  -Uri "http://localhost:8080/api/tasks" `
  -ContentType "application/json" `
  -Body '{"title":"Prepare report","description":"Monthly financial report"}'

Пример curl:

curl -i -X POST "http://localhost:8080/api/tasks" \
  -H "Content-Type: application/json" \
  -d '{"title":"Prepare report","description":"Monthly financial report"}'

Получить список задач

GET /api/tasks?page=0&size=10&status=NEW

Параметры:

  • page - обязательный, начинается с 0.
  • size - обязательный, от 1 до 100.
  • status - необязательный фильтр.

Сортировка: created_at DESC, id DESC.

Ответ:

{
  "content": [
    {
      "id": 1,
      "title": "Prepare report",
      "description": "Monthly financial report",
      "status": "NEW",
      "createdAt": "2026-03-26T12:00:00",
      "updatedAt": "2026-03-26T12:00:00"
    }
  ],
  "page": 0,
  "size": 10,
  "totalElements": 1,
  "totalPages": 1
}

Получить задачу по id

GET /api/tasks/1

Если задача не найдена, возвращается 404 Not Found.

Обновить статус задачи

PATCH /api/tasks/1/status
Content-Type: application/json

{
  "status": "DONE"
}

Обновляется только поле status. Поле updatedAt меняется автоматически.

Пример PowerShell:

Invoke-RestMethod `
  -Method Patch `
  -Uri "http://localhost:8080/api/tasks/1/status" `
  -ContentType "application/json" `
  -Body '{"status":"DONE"}'

Удалить задачу

DELETE /api/tasks/1

Ответ: 204 No Content.

Статусы задач

  • NEW
  • IN_PROGRESS
  • DONE
  • CANCELLED

Валидация

Для создания задачи:

  • title обязателен.
  • title не должен быть пустым.
  • длина title должна быть от 3 до 100 символов.

Для списка задач:

  • page >= 0.
  • 1 <= size <= 100.

Ошибки возвращаются в едином формате:

{
  "code": "VALIDATION_ERROR",
  "message": "Request validation failed",
  "details": {
    "title": "title length must be between 3 and 100 characters"
  },
  "timestamp": "2026-03-26T12:00:00"
}

Архитектура

src/main/kotlin/ru/testhhdobr/taskcatalog
├── config
├── controller
├── dto
├── exception
├── model
├── repository
└── service

Слои:

  • controller - REST API, HTTP-статусы, request validation.
  • service - бизнес-логика и Reactor API.
  • repository - доступ к данным через JdbcClient и native SQL.
  • dto - request/response модели.
  • model - доменная модель Task и enum TaskStatus.
  • exception - централизованная обработка ошибок через @RestControllerAdvice.

JdbcClient является блокирующим API, поэтому сервис оборачивает обращения к repository в Mono.fromCallable / Mono.fromRunnable и выполняет их на Schedulers.boundedElastic().

Тесты

Покрыты основные сценарии:

  • service: создание, получение по id, ошибка при отсутствии, обновление статуса, удаление, список с фильтрацией и пагинацией;
  • controller: HTTP-статусы, валидация входных данных, 404 Not Found;
  • repository: интеграционная проверка SQL, маппинга и CRUD на H2.

Запуск:

./gradlew test

Windows:

.\gradlew.bat test

Готовые запросы

Готовые HTTP-запросы лежат в файле:

docs/api.http

Их можно запускать из IntelliJ IDEA Ultimate или VS Code с расширением REST Client.

Что проверять при приемке

  1. .\gradlew.bat test проходит без ошибок.
  2. .\gradlew.bat bootRun запускает приложение.
  3. POST /api/tasks создает задачу со статусом NEW.
  4. GET /api/tasks?page=0&size=10 возвращает страницу задач.
  5. GET /api/tasks/{id} возвращает задачу или 404.
  6. PATCH /api/tasks/{id}/status меняет только статус и updatedAt.
  7. DELETE /api/tasks/{id} возвращает 204 No Content.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages