Files
Distribution_GL/Services/AuditLogService.cs
T

64 lines
2.9 KiB
C#

using General_Ledger_Service.DTOs.AuditLog;
using General_Ledger_Service.DTOs.Common;
using General_Ledger_Service.Enums;
using General_Ledger_Service.Interfaces.Repositories;
using General_Ledger_Service.Interfaces.Services;
namespace General_Ledger_Service.Services
{
public class AuditLogService(IAuditLogRepository auditLogRepository) : IAuditLogService
{
private readonly IAuditLogRepository _auditLogRepository = auditLogRepository;
public async Task<ApiResponse> ListAsync(ListAuditLogRequest request)
{
// No default page/pageSize - paging is only applied when the caller explicitly
// supplies both (RepositoryHelpers.ApplyPaging); a non-positive value is treated as
// "not supplied" rather than silently substituted with one.
var page = request.Page is > 0 ? request.Page : null;
var pageSize = request.PageSize is > 0 ? request.PageSize : null;
var paged = page.HasValue && pageSize.HasValue;
List<AuditCategory> categories;
if (request.Category is null || request.Category.Count == 0)
{
categories = [AuditCategory.Ledger, AuditCategory.Administrative];
}
else
{
categories = [.. request.Category
.Select(c => Enum.TryParse<AuditCategory>(c, ignoreCase: true, out var parsed) ? (AuditCategory?)parsed : null)
.Where(c => c.HasValue)
.Select(c => c!.Value)
.Distinct()];
// A typo'd category matches nothing, rather than falling back to "match everything".
if (categories.Count == 0)
{
return EmptyResponse(paged ? page : null, paged ? pageSize : null);
}
}
AuditAction? action = null;
if (!string.IsNullOrWhiteSpace(request.Action))
{
if (!Enum.TryParse<AuditAction>(request.Action, ignoreCase: true, out var parsedAction))
{
return EmptyResponse(paged ? page : null, paged ? pageSize : null);
}
action = parsedAction;
}
var (items, totalCount) = await _auditLogRepository.ListAsync(
categories, request.EntityName, action, request.PerformedBy, request.From, request.To, page, pageSize);
return ResponseHelpers.Ok("Audit log retrieved successfully",
new AuditLogListResponse { Items = items, TotalCount = totalCount, Page = paged ? page : null, PageSize = paged ? pageSize : null });
}
private static ApiResponse EmptyResponse(int? page, int? pageSize) =>
ResponseHelpers.Ok("Audit log retrieved successfully",
new AuditLogListResponse { Items = [], TotalCount = 0, Page = page, PageSize = pageSize });
}
}