/
zykovad
/
PIR_Lab1_E-Library
Обзор
Документация
Войти
/
zykovad
/
PIR_Lab1_E-Library
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Controllers/v2/ReviewController.cs
160 строк
7 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.ViewEngines; using Swashbuckle.AspNetCore.Annotations; namespace libraryAPI.Controllers.v2 { [ApiController] [ApiVersion("2.0")] [Route("api/v{version:apiVersion}/[controller]")] public class ReviewsController : ControllerBase { private readonly Data _data; public ReviewsController(Data data) { _data = data; } [HttpGet("GetAllReviews")] [SwaggerOperation(Summary = "Получить все отзывы (с пагинацией)", Description = "Можно выбрать поля через параметр include (например: ?include=comment,rating). Опциональные поля: comment, rating.", OperationId = "GetAllReviews")] [SwaggerResponse(200, "Список отзывов успешно получен", typeof(PagedResult<Review_Response>))] public IResult GetReviews(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.Reviews.ToList(); var total = list.Count; var items = list.Skip((page - 1) * pageSize).Take(pageSize) .Select(r => new Review_Response { Id = r.Id, UserId = r.UserId, BookId = r.BookId, Comment = includeFields.Count == 0 || includeFields.Contains("comment") ? r.Comment : null, Rating = includeFields.Count == 0 || includeFields.Contains("rating") ? r.Rating : 0, CreatedAt = r.CreatedAt }).ToList(); var response = new PagedResult<Review_Response> { Items = items, Page = page, PageSize = pageSize, TotalCount = total }; return Results.Json(response); } [HttpGet("GetReviewById/{id}")] [SwaggerOperation(Summary = "Получить отзыв по id", Description = "Можно выбрать поля через параметр include (например: ?include=comment,rating). Опциональные поля: comment, rating.", OperationId = "GetReviewById")] [SwaggerResponse(200, "Отзыв найден", typeof(Review_Response))] public IResult GetReview(int id, [FromQuery] string? include = null) { // Преобразуем строку include в список var includeFields = include?.Split(',').Select(f => f.Trim().ToLower()).ToHashSet() ?? new HashSet<string>(); var r = _data.Reviews.FirstOrDefault(x => x.Id == id); if (r == null) return Results.NotFound(); var dto = new Review_Response { Id = r.Id, UserId = r.UserId, BookId = r.BookId, Comment = includeFields.Count == 0 || includeFields.Contains("comment") ? r.Comment : null, Rating = includeFields.Count == 0 || includeFields.Contains("rating") ? r.Rating : 0, CreatedAt = r.CreatedAt }; return Results.Json(dto); } [HttpPost("CreateReview")] [SwaggerOperation(Summary = "Создать отзыв", OperationId = "CreateReview")] [SwaggerResponse(200, "Отзыв успешно создан", typeof(Review_Response))] public IResult CreateReview(Review_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 user = _data.Users.FirstOrDefault(u => u.Id == dto.UserId); var book = _data.Books.FirstOrDefault(b => b.Id == dto.BookId); if (user == null || book == null) return Results.BadRequest("User or book not found."); var review = new Review { Id = _data.Reviews.Max(r => r.Id) + 1, UserId = dto.UserId, BookId = dto.BookId, Comment = dto.Comment, Rating = dto.Rating, CreatedAt = dto.CreatedAt }; _data.Reviews.Add(review); var response = new Review_Response { Id = review.Id, UserId = review.UserId, BookId = review.BookId, Comment = review.Comment, Rating = review.Rating, CreatedAt = review.CreatedAt }; return Results.Json(response); } [HttpPut("UpdateReviewById/{id}")] [SwaggerOperation(Summary = "Обновить отзыв по id", OperationId = "UpdateReviewById")] [SwaggerResponse(200, "Отзыв успешно обновлен", typeof(Review_Response))] public IResult UpdateReview(int id, Review_Request_Put dto) { var review = _data.Reviews.FirstOrDefault(x => x.Id == id); if (review == null) return Results.NotFound(); review.Comment = dto.Comment; review.Rating = dto.Rating; var response = new Review_Response { Id = review.Id, UserId = review.UserId, BookId = review.BookId, Comment = review.Comment, Rating = review.Rating, CreatedAt = review.CreatedAt }; return Results.Json(response); } [HttpDelete("DeleteReviewById/{id}")] [SwaggerOperation(Summary = "Удалить отзыв по id", OperationId = "DeleteReviewById")] [SwaggerResponse(200, "Отзыв успешно удален")] public IResult DeleteReview(int id) { var r = _data.Reviews.FirstOrDefault(x => x.Id == id); if (r == null) return Results.NotFound(); _data.Reviews.Remove(r); return Results.Ok($"Review with ID {id} deleted."); } } }