Hardened API and catered for Partner role query filter bypass

This commit is contained in:
2026-10-04 08:18:43 +02:00
parent 8d069c2da0
commit 8100518549
62 changed files with 232 additions and 193 deletions
@@ -59,7 +59,7 @@ public sealed class ExecutionService(IDbContextFactory<ApplicationDbContext> con
CreatedAt = DateTime.UtcNow
});
return Result.OkIf(await context.SaveChangesAsync(cancellationToken) > 0, CreateError.New);
return Result.OkIf(await context.SaveChangesAsync(cancellationToken) > 0, CreateError.Create("Failed to create risk."));
}));
public async Task<Result> CreateDisbursementAsync(CreateDisbursementRequest request, Guid userId, CancellationToken cancellationToken = default) =>
@@ -80,7 +80,7 @@ public sealed class ExecutionService(IDbContextFactory<ApplicationDbContext> con
CreatedAt = DateTime.UtcNow
});
return Result.OkIf(await context.SaveChangesAsync(cancellationToken) > 0, CreateError.New);
return Result.OkIf(await context.SaveChangesAsync(cancellationToken) > 0, CreateError.Create("Failed to create disbursement."));
}));
public async Task<Result> ApproveDisbursementAsync(string disbursementIdHash, Guid userId, CancellationToken cancellationToken = default) =>
@@ -100,7 +100,7 @@ public sealed class ExecutionService(IDbContextFactory<ApplicationDbContext> con
.SetProperty(f => f.UpdatedBy, userId)
.SetProperty(f => f.UpdatedAt, DateTime.UtcNow), cancellationToken);
return Result.OkIf(changedTotal > 0, UpdateError.New);
return Result.OkIf(changedTotal > 0, UpdateError.Create("Failed to approve disbursement."));
}));
public async Task<Result<Disbursement>> GetDisbursementAsync(string disbursementIdHash, CancellationToken cancellationToken) =>
@@ -117,8 +117,8 @@ public sealed class ExecutionService(IDbContextFactory<ApplicationDbContext> con
var disbursement = await context.Disbursements.AsNoTracking()
.FirstOrDefaultAsync(d => d.Id == decodeResult.Value, cancellationToken);
return Result.FailIf(disbursement is null, NotFoundError.New)
.ToResult(disbursement!.Map());
return Result.FailIf(disbursement is null, NotFoundError.Create("Disbursement not found."))
.ToResult(disbursement?.Map()!);
}));
public async Task<Result<Risk>> GetRiskAsync(string riskIdHash, CancellationToken cancellationToken = default) =>
@@ -135,8 +135,8 @@ public sealed class ExecutionService(IDbContextFactory<ApplicationDbContext> con
var risk = await context.Risks.AsNoTracking()
.FirstOrDefaultAsync(r => r.Id == decodeResult.Value, cancellationToken);
return Result.FailIf(risk is null, NotFoundError.New)
.ToResult(risk!.Map());
return Result.FailIf(risk is null, NotFoundError.Create("Risk not found."))
.ToResult(risk?.Map()!);
}));
public async Task<Result> UpdateRiskAsync(UpdateRiskRequest request, CancellationToken cancellationToken = default) =>
@@ -152,7 +152,7 @@ public sealed class ExecutionService(IDbContextFactory<ApplicationDbContext> con
.SetProperty(u => u.Likelihood, request.Likelihood)
.SetProperty(u => u.Impact, request.Impact), cancellationToken);
return Result.OkIf(changedTotal > 0, UpdateError.New);
return Result.OkIf(changedTotal > 0, UpdateError.Create("Failed to update risk."));
}));
public async Task<Result> UpdateDisbursementAsync(UpdateDisbursementRequest request, Guid userId, CancellationToken cancellationToken = default) =>
@@ -168,7 +168,7 @@ public sealed class ExecutionService(IDbContextFactory<ApplicationDbContext> con
.SetProperty(d => d.UpdatedAt, DateTime.UtcNow)
.SetProperty(d => d.UpdatedBy, userId), cancellationToken);
return Result.OkIf(changedTotal > 0, UpdateError.New);
return Result.OkIf(changedTotal > 0, UpdateError.Create("Failed to update disbursement."));
}));
public async Task<Result> CreateRuleAsync(CreateRuleRequest request, Guid userId, CancellationToken cancellationToken = default) =>
@@ -231,8 +231,8 @@ public sealed class ExecutionService(IDbContextFactory<ApplicationDbContext> con
var rule = await context.Rules.AsNoTracking().FirstOrDefaultAsync(r => r.Id == decodeResult.Value, cancellationToken);
return Result.FailIf(rule is null, NotFoundError.New)
.ToResult(rule!.Map());
return Result.FailIf(rule is null, NotFoundError.Create("Rule not found."))
.ToResult(rule?.Map()!);
}));
public async Task<Result<Rule[]>> GetRulesAsync(Pagination pagination, CancellationToken cancellationToken = default) =>