using PostFundManagement.Domain; using PostFundManagement.Domain.Abstractions; using PostFundManagement.Domain.Errors; using PostFundManagement.Domain.Extensions; using PostFundManagement.Domain.Models; using PostFundManagement.Infrastructure.Database; namespace PostFundManagement.Application.Services.Shared; public sealed class AuditService(IDbContextFactory contextFactory, ITenantContextService tenantContextService) : IService { public async Task> GetAuditLogsAsync(CancellationToken cancellationToken = default) => await Result.Try((Func>>)(async () => { await using var context = await contextFactory.CreateDbContextAsync(cancellationToken); var pagination = new Pagination { Page = 1, PageSize = 500, Index = 1 }; var logs = await context.AuditLogs .OrderByDescending(o => o.Id) .Skip((pagination.Page - 1) * pagination.PageSize) .Take(pagination.PageSize) .ToListAsync(cancellationToken); return Result.Ok(logs.Select(p => p.Map()).ToArray()); })); public async Task> GetAuditLogsAsync(Pagination pagination, CancellationToken cancellationToken = default) => await Result.Try((Func>>)(async () => { await using var context = await contextFactory.CreateDbContextAsync(cancellationToken); var logs = await context.AuditLogs .OrderByDescending(o => o.Id) .Skip((pagination.Page - 1) * pagination.PageSize) .Take(pagination.PageSize) .ToListAsync(cancellationToken); return Result.Ok(logs.Select(p => p.Map()).ToArray()); })); public async Task LogActionAsync(string entityId, string entityName, string action, string[] changes, Guid performedBy, CancellationToken cancellationToken = default) => await Result.Try((Func>)(async () => { await using var context = await contextFactory.CreateDbContextAsync(cancellationToken); context.Add(new Domain.Entities.AuditLog { EntityId = entityId, Action = action, Changes = changes, EntityName = entityName, PerformedBy = performedBy, Timestamp = DateTime.UtcNow, TenantId = tenantContextService.TenantId > 0 ? tenantContextService.TenantId : null, }); return Result.FailIf(await context.SaveChangesAsync(cancellationToken) <= 0, CreateError.New); })); }