/
afanasevn
/
RedisLab
Обзор
Документация
Войти
/
afanasevn
/
RedisLab
Код
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
src/RedisLab.Api/Controllers/TasksController.cs
110 строк
3 KB
IBS\NAfanasev
Solution commit
24 июн 2026, 16:45
24 июн 2026, 16:45
bab80b7
Код
Авторство
О чём код?
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using RedisLab.Application.Abstractions; using RedisLab.Application.Contracts.Tasks; namespace RedisLab.Api.Controllers; /// <summary> /// Задачи: список из PG, карточка через Redis Hash cache-aside. /// </summary> [ApiController] [Route("api/tasks")] [Authorize] public sealed class TasksController( ITaskService taskService, IWebHostEnvironment environment) : ControllerBase { /// <summary> /// Список задач (без Redis-кэша). /// </summary> [HttpGet] [ProducesResponseType(typeof(IReadOnlyList<TaskListItemDto>), StatusCodes.Status200OK)] public async Task<IActionResult> GetList(CancellationToken ct) { var items = await taskService.GetListAsync(ct); return Ok(items); } /// <summary> /// Карточка задачи: Redis Hash task:{id}, заголовок X-Cache в Development. /// </summary> [HttpGet("{id:guid}")] [ProducesResponseType(typeof(TaskCardDto), StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status404NotFound)] public async Task<IActionResult> GetById( Guid id, CancellationToken ct) { var result = await taskService.GetByIdAsync(id, ct); if (result is null) { return NotFound(); } if (environment.IsDevelopment()) { Response.Headers["X-Cache"] = result.CacheHit ? "HIT" : "MISS"; } return Ok(result.Card); } /// <summary> /// Создаёт задачу и invalidates KPI-кэш. /// </summary> [HttpPost] [ProducesResponseType(typeof(object), StatusCodes.Status201Created)] [ProducesResponseType(StatusCodes.Status400BadRequest)] public async Task<IActionResult> Create( [FromBody] CreateTaskRequest request, CancellationToken ct) { try { var id = await taskService.CreateAsync(request, ct); return Created($"/api/tasks/{id}", new { id }); } catch (ArgumentException ex) { return BadRequest(new { error = ex.Message }); } } /// <summary> /// Обновляет статус задачи и invalidates KPI + Hash task:{id}. /// </summary> [HttpPatch("{id:guid}/status")] [ProducesResponseType(StatusCodes.Status204NoContent)] [ProducesResponseType(StatusCodes.Status404NotFound)] [ProducesResponseType(StatusCodes.Status400BadRequest)] public async Task<IActionResult> UpdateStatus( Guid id, [FromBody] UpdateTaskStatusRequest request, CancellationToken ct) { try { var updated = await taskService.UpdateStatusAsync(id, request, ct); return updated ? NoContent() : NotFound(); } catch (ArgumentException ex) { return BadRequest(new { error = ex.Message }); } } /// <summary> /// Удаляет задачу и invalidates KPI + Hash task:{id}. /// </summary> [HttpDelete("{id:guid}")] [ProducesResponseType(StatusCodes.Status204NoContent)] [ProducesResponseType(StatusCodes.Status404NotFound)] public async Task<IActionResult> Delete( Guid id, CancellationToken ct) { var deleted = await taskService.DeleteAsync(id, ct); return deleted ? NoContent() : NotFound(); } }