/
zykovad
/
PIR_Lab1_E-Library
Обзор
Документация
Войти
/
zykovad
/
PIR_Lab1_E-Library
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Controllers/v2/UserController.cs
149 строк
6 KB
Darya
Done lab 2
17 окт 2025, 22:38
17 окт 2025, 22:38
38ce9ac
Код
Авторство
О чём код?
using libraryAPI.DataStorage.v2; using libraryAPI.DTO; using libraryAPI.Entities.v2; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; using Swashbuckle.AspNetCore.Annotations; namespace libraryAPI.Controllers.v2 { [ApiController] [ApiVersion("2.0")] [Route("api/v{version:apiVersion}/[controller]")] public class UsersController : ControllerBase { private readonly Data _data; public UsersController(Data data) { _data = data; } [HttpGet("GetAllUsers")] [SwaggerOperation(Summary = "Получить всех пользователей (с пагинацией)", Description = "Можно выбрать поля через параметр include (например: ?include=username,login). Опциональные поля: username, login, role.", OperationId = "GetAllUsers")] [SwaggerResponse(200, "Список пользователей успешно получен", typeof(PagedResult<User_Response>))] public IResult GetUsers(int page = 1, int pageSize = 10, [FromQuery] string? include = null) { // Преобразуем строку include в список var includeFields = include?.Split(',').Select(f => f.Trim().ToLower()).ToHashSet() ?? new HashSet<string>(); var list = _data.Users.ToList(); var total = list.Count; var items = list.Skip((page - 1) * pageSize).Take(pageSize) .Select(u => new User_Response { Id = u.Id, Username = includeFields.Count == 0 || includeFields.Contains("username") ? u.Username : null, Login = includeFields.Count == 0 || includeFields.Contains("login") ? u.Login : null, Role = includeFields.Count == 0 || includeFields.Contains("role") ? u.Role : null }).ToList(); var response = new PagedResult<User_Response> { Items = items, Page = page, PageSize = pageSize, TotalCount = total }; return Results.Json(response); } [HttpGet("GetUserById/{id}")] [SwaggerOperation(Summary = "Получить пользователя по id", Description = "Можно выбрать поля через параметр include (например: ?include=username,login). Опциональные поля: username, login, role.", OperationId = "GetUserById")] [SwaggerResponse(200, "Пользователь найден", typeof(User_Response))] public IResult GetUser(int id, [FromQuery] string? include = null) { // Преобразуем строку include в список var includeFields = include?.Split(',').Select(f => f.Trim().ToLower()).ToHashSet() ?? new HashSet<string>(); var u = _data.Users.FirstOrDefault(x => x.Id == id); if (u == null) return Results.NotFound(); var dto = new User_Response { Id = u.Id, Username = includeFields.Count == 0 || includeFields.Contains("username") ? u.Username : null, Login = includeFields.Count == 0 || includeFields.Contains("login") ? u.Login : null, Role = includeFields.Count == 0 || includeFields.Contains("role") ? u.Role : null }; return Results.Json(dto); } [HttpPost("CreateUser")] [SwaggerOperation(Summary = "Создать пользователя", OperationId = "CreateUser")] [SwaggerResponse(200, "Пользователь успешно создан", typeof(User_Response))] public IResult CreateUser(User_Request dto, [FromHeader(Name = "Idempotency-Key")] string idempotencyKey) { if (string.IsNullOrEmpty(idempotencyKey)) return Results.BadRequest("Missing Idempotency-Key header."); if (_data.IdempotencyCache.ContainsKey(idempotencyKey)) return Results.Json(_data.IdempotencyCache[idempotencyKey]); var newUser = new User { Id = _data.Users.Max(u => u.Id) + 1, Username = dto.Username, Login = dto.Login, PasswordHash = dto.PasswordHash, Role = "user" }; _data.Users.Add(newUser); _data.IdempotencyCache[idempotencyKey] = newUser; var response = new User_Response { Id = newUser.Id, Username = newUser.Username, Login = newUser.Login, PasswordHash = newUser.PasswordHash, Role = newUser.Role }; return Results.Json(response); } [HttpPut("UpdateUserById/{id}")] [SwaggerOperation(Summary = "Обновить пользователя по id", OperationId = "UpdateUserById")] [SwaggerResponse(200, "Пользователь успешно обновлен", typeof(User_Response))] public IResult UpdateUser(int id, User_Request dto) { var user = _data.Users.FirstOrDefault(u => u.Id == id); if (user == null) return Results.NotFound(); user.Username = dto.Username; user.Login = dto.Login; user.PasswordHash = dto.PasswordHash; var response = new User_Response { Id = user.Id, Username = user.Username, Login = user.Login, PasswordHash = user.PasswordHash, Role = user.Role }; return Results.Json(response); } [HttpDelete("DeleteUserById/{id}")] [SwaggerOperation(Summary = "Удалить пользователя по id", OperationId = "DeleteUserById")] [SwaggerResponse(200, "Пользователь успешно удален")] public IResult DeleteUser(int id) { var user = _data.Users.FirstOrDefault(u => u.Id == id); if (user == null) return Results.NotFound(); _data.Users.Remove(user); return Results.Ok($"User with ID {id} deleted."); } } }