using AutoMapper; using Events.Auth; using Events.WebAPI.Contract.DTOs; using Events.WebAPI.Contract.Queries.Generic; using Events.WebAPI.Models; using Events.WebAPI.Util.Middleware; using MediatR; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; namespace Events.WebAPI.Controllers.Generic; [Authorize(Policy = nameof(Policies.ReadData))] [ApiController] [Route("[controller]")] [TypeFilter(typeof(BadRequestOnRuleValidationException), Order = 20)] [TypeFilter(typeof(ProblemDetailsForSqlException), Order = 10)] [TypeFilter(typeof(ProblemDetailsForException), Order = 1)] //last one public abstract class GetController : ControllerBase where TPK : IEquatable { /// /// Get number of item satisfying filters /// /// Each filter is like key(operator)value, using Sieve syntax /// /// /// [HttpGet(nameof(Count))] public virtual async Task Count(string filters, [FromServices] IMediator mediator, [FromServices] IMapper mapper) { var countRequest = new GetCountQuery { Filters = filters, }; int count = await mediator.Send(countRequest); return count; } /// /// Returns single item based on primary key value /// /// /// /// [HttpGet("{id}")] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status404NotFound)] public virtual async Task> Get(TPK id, [FromServices] IMediator mediator) { var query = new GetSingleItemQuery(id); var item = await mediator.Send(query); return item != null ? item : Problem(statusCode: StatusCodes.Status404NotFound, detail: $"No data for id = {id}"); } /// /// Get all items based on (lazy) load parameters (paging, sorting, and filtering) /// /// /// /// /// [HttpGet] public virtual async Task> GetAll([FromQuery] LoadParams loadParams, [FromServices] IMediator mediator, [FromServices] IMapper mapper) { loadParams ??= new(); var result = new Items(); var countRequest = new GetCountQuery { Filters = loadParams.Filters }; result.Count = await mediator.Send(countRequest); if (result.Count > 0) { var dataRequest = new GetItemsQuery { Filters = loadParams.Filters, Sort = loadParams.Sort, Page = loadParams.Page, PageSize = loadParams.PageSize, Ascending = loadParams.Ascending }; result.Data = await mediator.Send(dataRequest); } return result; } }