Task API
REST API → PostgreSQL → RabbitMQ
Backend-сервис для управления задачами на .NET 9. API позволяет создавать, получать, завершать и удалять задачи. При завершении формируется событие для дальнейшей обработки другими компонентами системы.
CRUD — это только начало
Нужно было разработать API для управления задачами: создание, получение списка, завершение и удаление. Данные должны храниться в PostgreSQL, а завершение задачи сопровождаться публикацией события в RabbitMQ.
Отдельное внимание уделено валидации входных данных, корректному заполнению времени завершения и защите от конкурентных запросов, которые пытаются завершить одну и ту же задачу.
Четыре операции
для управления задачами
POST /tasks
Создаёт задачу с названием, приоритетом Medium и статусом IsCompleted = false по умолчанию.
GET /tasks
Возвращает список задач, сохранённых в PostgreSQL.
PUT /complete
Завершает задачу, устанавливает CompletedAt и инициирует публикацию события.
DELETE /tasks
Удаляет задачу из базы данных без возможности восстановления.
Некорректные данные не проходят
Название задачи обязательно и должно содержать не более 200 символов. Если оно пустое или превышает ограничение, API возвращает 400 Bad Request.
При создании задачи время CompletedAt не заполняется. Оно устанавливается только при успешном завершении, поэтому состояние задачи и временные метки остаются согласованными.
Одну задачу нельзя завершить дважды
При одновременных запросах на завершение задачи важно не допустить повторного изменения её состояния. Для этого используется механизм контроля конкурентных изменений на уровне Entity Framework Core и PostgreSQL.
Если данные успел изменить другой запрос, приложение должно обработать конфликт сохранения и вернуть клиенту HTTP 409 Conflict.
События вместо жёсткой связанности
После успешного сохранения завершённой задачи приложение публикует событие в exchange task.events с routing key task.completed.
Сообщение содержит идентификатор задачи, название, время завершения и приоритет. Другие сервисы могут подписаться на такие события и выполнять собственную обработку независимо от основного API.
Корректная остановка приложения
При остановке приложения предусмотрено завершение уже начатых публикаций и закрытие соединения с RabbitMQ в пределах ограниченного времени.
Это уменьшает вероятность потери уже обрабатываемых сообщений при штатном завершении процесса.
Проверка сценария завершения
Интеграционный тест проверяет основной пользовательский сценарий: создание задачи через API, её завершение и передачу события компоненту публикации.
RabbitMQ можно заменить тестовой реализацией интерфейса, чтобы проверить вызов публикации без запуска брокера. Такой подход упрощает тестирование HTTP-сценария и позволяет изолировать внешнюю инфраструктуру.
Что внутри
От CRUD-операций до событийного API
Task API объединяет управление задачами, хранение данных в PostgreSQL, контроль конкурентности и публикацию событий через RabbitMQ.
Проект подготовлен как технический кейс ITоднушки. Исходный код доступен в открытом репозитории.
Посмотреть код на GitHub →Давайте обсудим задачу
Расскажите, какой сервис нужно разработать или какие системы связать между собой.