Files
predavanja/Events-WebApi/Events.WebAPI/Controllers/Generic/GetController.cs
2026-05-12 02:20:00 +02:00

91 lines
2.9 KiB
C#

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<TDto, TPK> : ControllerBase
where TPK : IEquatable<TPK>
{
/// <summary>
/// Get number of item satisfying filters
/// </summary>
/// <param name="filters">Each filter is like key(operator)value, using Sieve syntax</param>
/// <param name="mediator"></param>
/// <param name="mapper"></param>
/// <returns></returns>
[HttpGet(nameof(Count))]
public virtual async Task<int> Count(string filters, [FromServices] IMediator mediator, [FromServices] IMapper mapper)
{
var countRequest = new GetCountQuery<TDto>
{
Filters = filters,
};
int count = await mediator.Send(countRequest);
return count;
}
/// <summary>
/// Returns single item based on primary key value
/// </summary>
/// <param name="id"></param>
/// <param name="mediator"></param>
/// <returns></returns>
[HttpGet("{id}")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
public virtual async Task<ActionResult<TDto>> Get(TPK id, [FromServices] IMediator mediator)
{
var query = new GetSingleItemQuery<TDto, TPK>(id);
var item = await mediator.Send(query);
return item != null ? item : Problem(statusCode: StatusCodes.Status404NotFound, detail: $"No data for id = {id}");
}
/// <summary>
/// Get all items based on (lazy) load parameters (paging, sorting, and filtering)
/// </summary>
/// <param name="loadParams"></param>
/// <param name="mediator"></param>
/// <param name="mapper"></param>
/// <returns></returns>
[HttpGet]
public virtual async Task<Items<TDto>> GetAll([FromQuery] LoadParams loadParams, [FromServices] IMediator mediator, [FromServices] IMapper mapper)
{
loadParams ??= new();
var result = new Items<TDto>();
var countRequest = new GetCountQuery<TDto>
{
Filters = loadParams.Filters
};
result.Count = await mediator.Send(countRequest);
if (result.Count > 0)
{
var dataRequest = new GetItemsQuery<TDto>
{
Filters = loadParams.Filters,
Sort = loadParams.Sort,
Page = loadParams.Page,
PageSize = loadParams.PageSize,
Ascending = loadParams.Ascending
};
result.Data = await mediator.Send(dataRequest);
}
return result;
}
}