/
ArtSerg
/
IntegrationProject
Обзор
Документация
Войти
/
ArtSerg
/
IntegrationProject
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
lab4
Integration1/Controllers/TasksV2Controller.cs
81 строка
3 KB
artS3rg
Added idempotency header filter + swagger integration + middleware improvements
20 ноя 2025, 05:16
20 ноя 2025, 05:16
e27f9a4
Код
Авторство
О чём код?
using Integration1.Data; using Integration1.Models; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; namespace Integration1.Controllers { [ApiController] [Route("api/v2/tasks")] [Authorize] public class TasksV2Controller : ControllerBase { private readonly AppDbContext _db; public TasksV2Controller(AppDbContext db) => _db = db; private string GetUserId() => User.FindFirst("UserId")?.Value ?? ""; [HttpGet] public async Task<IActionResult> GetTasks([FromQuery] int page = 1, [FromQuery] int pageSize = 10, [FromQuery] string? include = null) { if (page < 1) page = 1; if (pageSize < 1) pageSize = 10; if (pageSize > 100) pageSize = 100; var userId = GetUserId(); var query = _db.Tasks.Where(t => t.UserId == userId).AsNoTracking(); var totalCount = await query.CountAsync(); var totalPages = (int)Math.Ceiling(totalCount / (double)pageSize); var tasks = await query .OrderByDescending(t => t.Id) .Skip((page - 1) * pageSize) .Take(pageSize) .ToListAsync(); var projected = ProjectTasks(tasks, include); Response.Headers["X-Total-Count"] = totalCount.ToString(); Response.Headers["X-Total-Pages"] = totalPages.ToString(); Response.Headers["X-Current-Page"] = page.ToString(); return Ok(new { items = projected, totalCount, page, pageSize }); } private IEnumerable<object> ProjectTasks(IEnumerable<TaskItem> tasks, string? include) { var fields = (include ?? "") .Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries) .Select(f => f.ToLowerInvariant()) .ToHashSet(); bool all = fields.Count == 0; foreach (var t in tasks) { var dict = new Dictionary<string, object?>(); if (all || fields.Contains("id")) dict["id"] = t.Id; if (all || fields.Contains("title")) dict["title"] = t.Title; if (all || fields.Contains("description")) dict["description"] = t.Description; if (all || fields.Contains("priority")) dict["priority"] = t.Priority.ToString(); if (all || fields.Contains("iscompleted")) dict["isCompleted"] = t.IsCompleted; if (all || fields.Contains("duedate")) dict["dueDate"] = t.DueDate; if (all || fields.Contains("category")) dict["category"] = t.Category; if (all || fields.Contains("userid")) dict["userId"] = t.UserId; yield return dict; } } } }