using API.Controllers.DTOs; using API.Schema.ActionsContext; using API.Schema.ActionsContext.Actions; using Asp.Versioning; using Microsoft.AspNetCore.Http.HttpResults; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using static Microsoft.AspNetCore.Http.StatusCodes; using ActionRecord = API.Controllers.DTOs.ActionRecord; namespace API.Controllers; [ApiVersion(2)] [ApiController] [Route("v{v:apiVersion}/[controller]")] public class ActionsController(ActionsContext context) : Controller { /// /// Returns the available Action Types () /// /// List of action-types [HttpGet("Types")] [ProducesResponseType(Status200OK, "application/json")] public Ok GetAvailableActions() { return TypedResults.Ok(Enum.GetValues()); } public sealed record Interval(DateTime Start, DateTime End); /// /// Returns performed in /// /// List of performed actions /// Database error [HttpPost("Interval")] [ProducesResponseType>(Status200OK, "application/json")] [ProducesResponseType(Status500InternalServerError)] public async Task>, InternalServerError>> GetActionsInterval([FromBody]Interval interval) { if (await context.Actions.Where(a => a.PerformedAt >= interval.Start && a.PerformedAt <= interval.End) .ToListAsync(HttpContext.RequestAborted) is not { } actions) return TypedResults.InternalServerError(); return TypedResults.Ok(actions.Select(a => new ActionRecord(a))); } /// /// Returns with /// /// List of performed actions /// Database error [HttpGet("Type/{Type}")] [ProducesResponseType>(Status200OK, "application/json")] [ProducesResponseType(Status500InternalServerError)] public async Task>, InternalServerError>> GetActionsWithType(ActionsEnum Type) { if (await context.Actions.Where(a => a.Action == Type) .ToListAsync(HttpContext.RequestAborted) is not { } actions) return TypedResults.InternalServerError(); return TypedResults.Ok(actions.Select(a => new ActionRecord(a))); } /// /// Returns related to /// /// List of performed actions /// Database error [HttpGet("RelatedTo/Manga/{MangaId}")] [ProducesResponseType>(Status200OK, "application/json")] [ProducesResponseType(Status500InternalServerError)] public async Task>, InternalServerError>> GetActionsRelatedToManga(string MangaId) { if(await context.Actions.FromSqlInterpolated($"""SELECT * FROM public."Actions" WHERE "MangaId" = {MangaId}""").ToListAsync() is not { } actions) return TypedResults.InternalServerError(); return TypedResults.Ok(actions.Select(a => new ActionRecord(a))); } /// /// Returns related to /// /// List of performed actions /// Database error [HttpGet("RelatedTo/Chapter/{ChapterId}")] [ProducesResponseType>(Status200OK, "application/json")] [ProducesResponseType(Status500InternalServerError)] public async Task>, InternalServerError>> GetActionsRelatedToChapter(string ChapterId) { if(await context.Actions.FromSqlInterpolated($"""SELECT * FROM public."Actions" WHERE "ChapterId" = {ChapterId}""").ToListAsync() is not { } actions) return TypedResults.InternalServerError(); return TypedResults.Ok(actions.Select(a => new ActionRecord(a))); } }