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; 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); } /// /// 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); } }