/
zykovad
/
PIR_Lab1_E-Library
Обзор
Документация
Войти
/
zykovad
/
PIR_Lab1_E-Library
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Controllers/v1/BookController.cs
146 строк
6 KB
Darya
Done Lab 1
09 окт 2025, 18:04
09 окт 2025, 18:04
48965dd
Код
Авторство
О чём код?
using libraryAPI.DataStorage.v1; using libraryAPI.DTO; using libraryAPI.Entities.v1; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.RateLimiting; using Swashbuckle.AspNetCore.Annotations; namespace libraryAPI.Controllers.v1 { [ApiController] [ApiVersion("1.0")] [Route("api/v{version:apiVersion}/[controller]")] [EnableRateLimiting("UserPolicy")] public class BooksController : ControllerBase { private readonly Data _data; public BooksController(Data data) { _data = data; } [HttpGet("GetAllBooks")] [SwaggerOperation(Summary = "Получить список всех книг", OperationId = "GetAllBooks")] [SwaggerResponse(200, "Список книг успешно получен", typeof(IEnumerable<Book_Response>))] public IResult GetBooks() { var books = _data.Books.Select(b => new Book_Response { Id = b.Id, Title = b.Title, ISBN = b.ISBN, Genre = b.Genre, Description = b.Description, PublicationYear = b.PublicationYear, Publisher = b.Publisher, Authors = b.AuthorBooks.Select(ab => $"{ab.Author.Surname} {ab.Author.Name}").ToList() }).ToList(); return Results.Json(books); } [HttpGet("GetBookById/{id}")] [SwaggerOperation(Summary = "Получить книгу по id", OperationId = "GetBookById")] [SwaggerResponse(200, "Книга найдена", typeof(Book_Response))] public IResult GetBook(int id) { var book = _data.Books.FirstOrDefault(b => b.Id == id); if (book == null) return Results.NotFound(); var dto = new Book_Response { Id = book.Id, Title = book.Title, ISBN = book.ISBN, Genre = book.Genre, Description = book.Description, PublicationYear = book.PublicationYear, Publisher = book.Publisher, Authors = book.AuthorBooks.Select(ab => $"{ab.Author.Surname} {ab.Author.Name}").ToList() }; return Results.Json(dto); } [HttpPost("CreateBook")] [SwaggerOperation(Summary = "Создать книгу", OperationId = "CreateBook")] [SwaggerResponse(200, "Книга успешно создана", typeof(Book_Response))] public IResult CreateBook(Book_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 book = new Book { Id = _data.Books.Max(b => b.Id) + 1, Title = dto.Title, ISBN = dto.ISBN, Genre = dto.Genre, Description = dto.Description, PublicationYear = dto.PublicationYear, Publisher = dto.Publisher }; _data.Books.Add(book); _data.IdempotencyCache[idempotencyKey] = book; var response = new Book_Response { Id = book.Id, Title = book.Title, ISBN = book.ISBN, Genre = book.Genre, Description = book.Description, PublicationYear = book.PublicationYear, Publisher = book.Publisher, Authors = book.AuthorBooks.Select(ab => $"{ab.Author.Surname} {ab.Author.Name}").ToList() }; return Results.Json(response); } [HttpPut("UpdateBookById/{id}")] [SwaggerOperation(Summary = "Обновить книгу по id", OperationId = "UpdateBookById")] [SwaggerResponse(200, "Книга успешно обновлена", typeof(Book_Response))] public IResult UpdateBook(int id, Book_Request dto) { var book = _data.Books.FirstOrDefault(b => b.Id == id); if (book == null) return Results.NotFound(); book.Title = dto.Title; book.ISBN = dto.ISBN; book.Genre = dto.Genre; book.Description = dto.Description; book.PublicationYear = dto.PublicationYear; book.Publisher = dto.Publisher; var response = new Book_Response { Id = book.Id, Title = book.Title, ISBN = book.ISBN, Genre = book.Genre, Description = book.Description, PublicationYear = book.PublicationYear, Publisher = book.Publisher, Authors = book.AuthorBooks.Select(ab => $"{ab.Author.Surname} {ab.Author.Name}").ToList() }; return Results.Json(response); } [HttpDelete("DeleteBookById/{id}")] [SwaggerOperation(Summary = "Удалить книгу по id", OperationId = "DeleteBookById")] [SwaggerResponse(200, "Книга успешно удалена")] public IResult DeleteBook(int id) { var book = _data.Books.FirstOrDefault(b => b.Id == id); if (book == null) return Results.NotFound(); _data.Books.Remove(book); return Results.Ok($"Book with ID {id} deleted."); } } }