using FastEndpoints;
using FrameworkBLL.AuditQuery;
using FrameworkDAL.DTO.AuditQuery;
using GB5Shared.DTO.Framework.Login;
using GB5Shared.DTO.Framework.ResponseStandard;
using GB5Shared.FastEndPoint;
using System;
using System.Threading;
using System.Threading.Tasks;
using static FrameworkDAL.Constant.Constant;
namespace FrameworkSL.Endpoints.Audit
{
///
/// Full-featured audit search.
/// All filter parameters are optional and AND-ed.
/// When DateFrom predates the retention boundary, results fan out across
/// TEVENTLOG + TEVENTLOG_ARCHIVE and are merged newest-first.
///
public class SearchAudit : BaseEndpoint>
{
private readonly IAuditQueryBLL _bll;
public SearchAudit(IAuditQueryBLL bll) => _bll = bll;
public override void Configure()
{
Get("/Audit/SearchAudit");
AllowAnonymous();
}
public record Params(
[property: FromHeader] string Login,
[property: QueryParam] DateTime? DateFrom = null,
[property: QueryParam] DateTime? DateTo = null,
[property: QueryParam] int? UserId = null,
[property: QueryParam] int? EntityType = null,
[property: QueryParam] int? EntityId = null,
[property: QueryParam] int? EventTypeId = null,
[property: QueryParam] string? FieldName = null,
[property: QueryParam] int PageOffset = 0,
[property: QueryParam] int PageSize = 50
);
protected override async Task> ExecuteAsync(
Params req, LoginDTO login, CancellationToken ct)
{
try
{
var criteria = new AuditSearchCriteriaDTO
{
DateFrom = req.DateFrom,
DateTo = req.DateTo,
UserId = req.UserId,
EntityType = req.EntityType,
EntityId = req.EntityId,
EventTypeId = req.EventTypeId,
FieldName = req.FieldName,
PageOffset = req.PageOffset,
PageSize = req.PageSize
};
var result = await _bll.SearchAsync(criteria, login, ct);
return await GB5Shared.ResponseStandard.Response.CreateSuccessResponse(
result, CacheKeyLevel.UserLevel, login);
}
catch (Exception ex)
{
return await GB5Shared.ResponseStandard.Response.CreateExceptionError(
ex, CacheKeyLevel.UserLevel, login, ex.Message, 500);
}
}
}
}