Added tooling

This commit is contained in:
2026-09-05 18:24:21 +02:00
parent 415aa30cf7
commit 81c111c3c3
20 changed files with 181 additions and 59 deletions
@@ -5,6 +5,7 @@ using PostFundManagement.Domain.Errors;
using PostFundManagement.Domain.Extensions;
using PostFundManagement.Domain.Models;
using PostFundManagement.Infrastructure.Database;
using PostFundManagement.Application.Extensions;
namespace PostFundManagement.Application.Services.Governance;
@@ -131,14 +132,16 @@ public sealed class GovernanceService(IDbContextFactory<ApplicationDbContext> co
{
await using var context = await contextFactory.CreateDbContextAsync(cancellationToken);
if (await context.Organisations.AnyAsync(o => o.RegistrationNo == request.RegistrationNo, cancellationToken))
var registrationNo = request.RegistrationNo.Clean();
if (await context.Organisations.AnyAsync(o => o.RegistrationNo == registrationNo, cancellationToken))
return Result.Fail(CreateError.Create("Organisation with the same registration number already exists"));
context.Organisations.Add(new Domain.Entities.Organisation
{
Name = request.Name,
RegistrationNo = request.RegistrationNo,
Email = request.Email,
Name = request.Name.Humanize(LetterCasing.Title).Trim(),
RegistrationNo = registrationNo,
Email = request.Email.ToLower(CultureInfo.InvariantCulture).Clean(),
Type = request.Type,
Status = ActivityStatus.Active,
CreatedBy = userId,
@@ -156,9 +159,9 @@ public sealed class GovernanceService(IDbContextFactory<ApplicationDbContext> co
var changedTotal = await context.Organisations
.Where(f => f.Id == request.OrganisationId)
.ExecuteUpdateAsync(f => f
.SetProperty(u => u.Name, request.Name)
.SetProperty(u => u.RegistrationNo, request.RegistrationNo)
.SetProperty(u => u.Email, request.Email)
.SetProperty(u => u.Name, request.Name.Humanize(LetterCasing.Title).Trim())
.SetProperty(u => u.RegistrationNo, request.RegistrationNo.Clean())
.SetProperty(u => u.Email, request.Email.ToLower(CultureInfo.InvariantCulture).Clean())
.SetProperty(u => u.Type, request.Type), cancellationToken);
return Result.FailIf(changedTotal <= 0, UpdateError.New);
@@ -175,16 +178,19 @@ public sealed class GovernanceService(IDbContextFactory<ApplicationDbContext> co
if (!await context.Organisations.AnyAsync(u => u.Id == request.OrganisationId, cancellationToken))
return Result.Fail(NotFoundError.Create("Organisation not found"));
if (await context.Portfolios.AnyAsync(p => p.Name == request.Name && p.OrganisationId == request.OrganisationId, cancellationToken))
var name = request.Name.Humanize(LetterCasing.Title).Trim();
if (await context.Portfolios.AnyAsync(p => p.Name == name && p.OrganisationId == request.OrganisationId, cancellationToken))
return Result.Fail(ValidationError.Create("A portfolio with the same name exists in this organisation"));
context.Portfolios.Add(new Domain.Entities.Portfolio
{
CreatedAt = DateTime.UtcNow,
CreatedBy = userId,
OrganisationId = request.OrganisationId,
OwnedBy = request.OwnerId,
Name = request.Name,
Description = request.Description
Name = name,
Description = request.Description.Humanize(LetterCasing.Sentence).Trim()
});
return Result.FailIf(await context.SaveChangesAsync(cancellationToken) <= 0, CreateError.New);
@@ -201,11 +207,11 @@ public sealed class GovernanceService(IDbContextFactory<ApplicationDbContext> co
var changedTotal = await context.Portfolios
.Where(p => p.Id == request.PortfolioId)
.ExecuteUpdateAsync(f => f
.SetProperty(u => u.Name, request.Name)
.SetProperty(u => u.Name, request.Name.Humanize(LetterCasing.Title).Trim())
.SetProperty(u => u.OwnedBy, request.OwnerId)
.SetProperty(u => u.Description, request.Description), cancellationToken);
.SetProperty(u => u.Description, request.Description.Humanize(LetterCasing.Sentence).Trim()), cancellationToken);
return Result.FailIf(changedTotal <= 0, UpdateError.New);
return Result.FailIf(changedTotal <= 0, UpdateError.Create("Nothing was saved, no change detected."));
}));
public async ValueTask<Result<Programme[]>> GetPortfolioProgrammesAsync(string portfolioIdHash, CancellationToken cancellationToken = default) =>