← Все кейсы
ITоднушка / Кейс

Task API

REST API → PostgreSQL → RabbitMQ

Backend-сервис для управления задачами на .NET 9. API позволяет создавать, получать, завершать и удалять задачи. При завершении формируется событие для дальнейшей обработки другими компонентами системы.

01 API
→
02 EF Core
→
03 PostgreSQL
→
04 RabbitMQ
Task #8 Completed
Buy milk
Priority: High CompletedAt task.completed
Задача

CRUD — это только начало

Нужно было разработать API для управления задачами: создание, получение списка, завершение и удаление. Данные должны храниться в PostgreSQL, а завершение задачи сопровождаться публикацией события в RabbitMQ.

Отдельное внимание уделено валидации входных данных, корректному заполнению времени завершения и защите от конкурентных запросов, которые пытаются завершить одну и ту же задачу.

409 Контроль конкурентности Повторный запрос на завершение уже изменённой задачи должен получить HTTP 409 Conflict.
API

Четыре операции
для управления задачами

01

POST /tasks

Создаёт задачу с названием, приоритетом Medium и статусом IsCompleted = false по умолчанию.

02

GET /tasks

Возвращает список задач, сохранённых в PostgreSQL.

03

PUT /complete

Завершает задачу, устанавливает CompletedAt и инициирует публикацию события.

04

DELETE /tasks

Удаляет задачу из базы данных без возможности восстановления.

Валидация

Некорректные данные не проходят

Название задачи обязательно и должно содержать не более 200 символов. Если оно пустое или превышает ограничение, API возвращает 400 Bad Request.

При создании задачи время CompletedAt не заполняется. Оно устанавливается только при успешном завершении, поэтому состояние задачи и временные метки остаются согласованными.

Request validation enforced
Пустой Title 400 Bad Request
Title больше 200 символов 400 Bad Request
Новая задача CompletedAt = null
Завершённая задача CompletedAt установлен
409
Конкурентность

Одну задачу нельзя завершить дважды

При одновременных запросах на завершение задачи важно не допустить повторного изменения её состояния. Для этого используется механизм контроля конкурентных изменений на уровне Entity Framework Core и PostgreSQL.

Если данные успел изменить другой запрос, приложение должно обработать конфликт сохранения и вернуть клиенту HTTP 409 Conflict.

RabbitMQ

События вместо жёсткой связанности

После успешного сохранения завершённой задачи приложение публикует событие в exchange task.events с routing key task.completed.

Сообщение содержит идентификатор задачи, название, время завершения и приоритет. Другие сервисы могут подписаться на такие события и выполнять собственную обработку независимо от основного API.

MQ Асинхронная публикация Ошибка RabbitMQ записывается в лог и не отменяет сохранённое завершение задачи.
task.events task.completed
taskId Guid Идентификатор задачи
title string Название задачи
completedAt DateTimeOffset Время завершения
priority enum Low / Medium / High
Надёжность

Корректная остановка приложения

При остановке приложения предусмотрено завершение уже начатых публикаций и закрытие соединения с RabbitMQ в пределах ограниченного времени.

Это уменьшает вероятность потери уже обрабатываемых сообщений при штатном завершении процесса.

4s Graceful shutdown Ограниченное время на завершение публикаций и освобождение ресурсов брокера.
Тестирование

Проверка сценария завершения

Интеграционный тест проверяет основной пользовательский сценарий: создание задачи через API, её завершение и передачу события компоненту публикации.

RabbitMQ можно заменить тестовой реализацией интерфейса, чтобы проверить вызов публикации без запуска брокера. Такой подход упрощает тестирование HTTP-сценария и позволяет изолировать внешнюю инфраструктуру.

API Сквозной сценарий Создание задачи → завершение → проверка события.
Технологии

Что внутри

01 C# Backend
02 .NET 9 Runtime
03 Minimal API REST API
04 EF Core ORM
05 PostgreSQL Database
06 RabbitMQ Messaging
07 Docker Containers
08 xUnit Testing
Результат

От CRUD-операций до событийного API

Task API объединяет управление задачами, хранение данных в PostgreSQL, контроль конкурентности и публикацию событий через RabbitMQ.

Проект подготовлен как технический кейс ITоднушки. Исходный код доступен в открытом репозитории.

Посмотреть код на GitHub →
Нужен backend или интеграция?

Давайте обсудим задачу

Расскажите, какой сервис нужно разработать или какие системы связать между собой.

Обсудить задачу →