diff --git a/Marechai.Server/Controllers/BooksByMachineController.cs b/Marechai.Server/Controllers/BooksByMachineController.cs new file mode 100644 index 00000000..6253b4b5 --- /dev/null +++ b/Marechai.Server/Controllers/BooksByMachineController.cs @@ -0,0 +1,104 @@ +/****************************************************************************** +// MARECHAI: Master repository of computing history artifacts information +// ---------------------------------------------------------------------------- +// +// Author(s) : Natalia Portillo +// +// --[ License ] -------------------------------------------------------------- +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2003-2025 Natalia Portillo +*******************************************************************************/ + +using System.Collections.Generic; +using System.Linq; +using System.Security.Claims; +using System.Threading.Tasks; +using Marechai.Data.Dtos; +using Marechai.Database.Models; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Microsoft.EntityFrameworkCore; + +namespace Marechai.Server.Controllers; + +[Route("/machines/books")] +[ApiController] +public class BooksByMachineController(MarechaiContext context) : ControllerBase +{ + [HttpGet("/books/{bookId:long}/machines")] + [ProducesResponseType(typeof(List), StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + public Task> GetByBook(long bookId) => context.BooksByMachines.Where(p => p.BookId == bookId) + .Select(p => new BookByMachineDto + { + Id = p.Id, + BookId = p.BookId, + MachineId = p.MachineId, + Machine = p.Machine.Name + }) + .OrderBy(p => p.Machine) + .ToListAsync(); + + [HttpDelete("{id:long}")] + [Authorize(Roles = "Admin,UberAdmin")] + [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + public async Task DeleteAsync(long id) + { + string userId = User.FindFirstValue(ClaimTypes.Sid); + + if(userId is null) return Unauthorized(); + + BooksByMachine item = await context.BooksByMachines.FindAsync(id); + + if(item is null) return NotFound(); + + context.BooksByMachines.Remove(item); + + await context.SaveChangesWithUserAsync(userId); + + return Ok(); + } + + [HttpPost] + [Authorize(Roles = "Admin,UberAdmin")] + [ProducesResponseType(typeof(int), StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [Consumes("application/json")] + [Produces("application/json")] + public async Task> CreateAsync([FromBody] BookByMachineDto dto) + { + string userId = User.FindFirstValue(ClaimTypes.Sid); + + if(userId is null) return Unauthorized(); + + var item = new BooksByMachine + { + MachineId = dto.MachineId, + BookId = dto.BookId + }; + + await context.BooksByMachines.AddAsync(item); + await context.SaveChangesWithUserAsync(userId); + + return item.Id; + } +} \ No newline at end of file