/
idalynnn
/
api
Обзор
Документация
Войти
/
idalynnn
/
api
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Controllers/V1/TasksController.cs
119 строк
3 KB
idalynnn
Лаба 2: пагинация, опциональные поля, внутренние API, фиксация сериализации
13 дек 2025, 06:36
13 дек 2025, 06:36
494190c
Код
Авторство
О чём код?
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using System.Text.Json; using TaskTrackerApi.Data; using TaskTrackerApi.Models; using TaskTrackerApi.Services; namespace TaskTrackerApi.Controllers.V1; [ApiController] [ApiVersion("1.0")] [Route("api/v{version:apiVersion}/tasks")] [Authorize] public class TasksController : ControllerBase { private readonly AppDbContext _db; private readonly IdempotencyService _idempotency; public TasksController(AppDbContext db, IdempotencyService idempotency) { _db = db; _idempotency = idempotency; } [HttpGet] public async Task<IActionResult> GetTasks( [FromQuery] int page = 1, [FromQuery] int pageSize = 10) { var query = _db.Tasks.AsQueryable(); var totalCount = await query.CountAsync(); var items = await query .Skip((page - 1) * pageSize) .Take(pageSize) .ToListAsync(); return Ok(new { page, pageSize, totalCount, items }); } [HttpGet("{id}")] public async Task<IActionResult> GetTask( int id, [FromQuery] string? include = null) { var query = _db.Tasks.AsQueryable(); if (include == "project") query = query.Include(t => t.Project); var task = await query.FirstOrDefaultAsync(t => t.Id == id); if (task == null) return NotFound(); return Ok(task); } [HttpPost] public async Task<IActionResult> CreateTask(TaskItem task) { var key = Request.Headers["Idempotency-Key"].FirstOrDefault(); if (string.IsNullOrEmpty(key)) return BadRequest(new { message = "Idempotency-Key header is required for POST" }); var existing = await _idempotency.FindAsync( key, HttpMethods.Post, Request.Path ); if (existing != null) return StatusCode(existing.StatusCode, existing.ResponseBody); _db.Tasks.Add(task); await _db.SaveChangesAsync(); var responseJson = JsonSerializer.Serialize(task); await _idempotency.SaveAsync( key, HttpMethods.Post, Request.Path, StatusCodes.Status200OK, responseJson ); return Ok(task); } [HttpPut("{id}")] public async Task<IActionResult> UpdateTask(int id, TaskItem input) { var task = await _db.Tasks.FindAsync(id); if (task == null) return NotFound(); task.Title = input.Title; task.IsDone = input.IsDone; await _db.SaveChangesAsync(); return Ok(task); } [HttpDelete("{id}")] public async Task<IActionResult> DeleteTask(int id) { var task = await _db.Tasks.FindAsync(id); if (task == null) return NotFound(); _db.Tasks.Remove(task); await _db.SaveChangesAsync(); return NoContent(); } }