/******************************************************************************* // 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-2026 Natalia Portillo *******************************************************************************/ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Marechai.Data; 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("/consoles")] [ApiController] public class ConsolesController(MarechaiContext context) : ControllerBase { [HttpGet("count")] [AllowAnonymous] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status400BadRequest)] public Task GetConsolesCountAsync() => context.Machines.CountAsync(c => c.Type == MachineType.Console); [HttpGet("minimum-year")] [AllowAnonymous] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status400BadRequest)] public Task GetMinimumYearAsync() => context.Machines .Where(t => t.Type == MachineType.Console && t.Introduced.HasValue && t.Introduced.Value.Year > 1000) .MinAsync(t => t.Introduced.Value.Year); [HttpGet("maximum-year")] [AllowAnonymous] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status400BadRequest)] public Task GetMaximumYearAsync() => context.Machines .Where(t => t.Type == MachineType.Console && t.Introduced.HasValue && t.Introduced.Value.Year > 1000) .MaxAsync(t => t.Introduced.Value.Year); [HttpGet("by-letter/{c}")] [AllowAnonymous] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status400BadRequest)] public Task> GetConsolesByLetterAsync(char c) => context.Machines.Include(m => m.Company) .Where(m => m.Type == MachineType.Console && EF.Functions.Like(m.Name, $"{c}%")) .OrderBy(m => m.Company.Name) .ThenBy(m => m.Name) .Select(m => new MachineDto { Id = m.Id, Name = m.Name, Company = m.Company.Name }) .ToListAsync(); [HttpGet("by-year/{year:int}")] [AllowAnonymous] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status400BadRequest)] public Task> GetConsolesByYearAsync(int year) => context.Machines.Include(m => m.Company) .Where(m => m.Type == MachineType.Console && m.Introduced != null && m.Introduced.Value.Year == year) .OrderBy(m => m.Company.Name) .ThenBy(m => m.Name) .Select(m => new MachineDto { Id = m.Id, Name = m.Name, Company = m.Company.Name }) .ToListAsync(); [HttpGet] [AllowAnonymous] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status400BadRequest)] public Task> GetConsolesAsync() => context.Machines.Include(m => m.Company) .Where(m => m.Type == MachineType.Console) .OrderBy(m => m.Company.Name) .ThenBy(m => m.Name) .Select(m => new MachineDto { Id = m.Id, Name = m.Name, Company = m.Company.Name }) .ToListAsync(); }