diff --git a/PostFundManagement.Application/Abstractions/S3ServiceBase.cs b/PostFundManagement.Application/Abstractions/S3ServiceBase.cs index 6063984..d700573 100644 --- a/PostFundManagement.Application/Abstractions/S3ServiceBase.cs +++ b/PostFundManagement.Application/Abstractions/S3ServiceBase.cs @@ -12,8 +12,8 @@ public abstract class S3ServiceBase(IAmazonS3 amazonS3) public string GenerateCdnUrl(string fileKey) => $"{CdnBaseUrl}/{fileKey}"; - public virtual async ValueTask> GeneratePresignedUrlAsync(string fileKey, TimeSpan duration, string? contentType = null, CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public virtual async Task> GeneratePresignedUrlAsync(string fileKey, TimeSpan duration, string? contentType = null, CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { if (string.IsNullOrWhiteSpace(BucketName)) return Result.Fail(ValidationError.Create("Bucket name is not configured.")); @@ -51,8 +51,8 @@ public abstract class S3ServiceBase(IAmazonS3 amazonS3) : $"{cleanSubPath}/{fileHash.ToLower(CultureInfo.InvariantCulture)}_{fileName}"; } - public virtual async ValueTask> UploadFileAsync(string fileName, string subPath, Stream fileStream, string contentType, CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public virtual async Task> UploadFileAsync(string fileName, string subPath, Stream fileStream, string contentType, CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { if (string.IsNullOrWhiteSpace(BucketName)) return Result.Fail(ValidationError.Create("Bucket name is not configured.")); @@ -92,8 +92,8 @@ public abstract class S3ServiceBase(IAmazonS3 amazonS3) : Result.Ok(fileKey); })); - public virtual async ValueTask DeleteFileAsync(string fileKey, CancellationToken cancellationToken = default) => - await Result.Try((Func>)(async () => + public virtual async Task DeleteFileAsync(string fileKey, CancellationToken cancellationToken = default) => + await Result.Try((Func>)(async () => { if (string.IsNullOrWhiteSpace(BucketName)) return Result.Fail(NotFoundError.Create("Bucket name is not configured.")); diff --git a/PostFundManagement.Application/Abstractions/Services/ICommunicationsService.cs b/PostFundManagement.Application/Abstractions/Services/ICommunicationsService.cs index 10aebbb..238f392 100644 --- a/PostFundManagement.Application/Abstractions/Services/ICommunicationsService.cs +++ b/PostFundManagement.Application/Abstractions/Services/ICommunicationsService.cs @@ -1,18 +1,16 @@ using PostFundManagement.Application.Services.Communications; using PostFundManagement.Domain; -using PostFundManagement.Domain.Attributes; using PostFundManagement.Domain.Models; namespace PostFundManagement.Application.Abstractions.Services; public interface ICommunicationsService -{ - [Audit] - ValueTask> SendInviteAsync(InviteRequest request, Guid userId, CancellationToken cancellationToken = default); +{ + Task> SendInviteAsync(InviteRequest request, Guid userId, CancellationToken cancellationToken = default); - ValueTask> GetInvitesAsync(Pagination pagination, CancellationToken cancellationToken = default); + Task> GetInvitesAsync(Pagination pagination, CancellationToken cancellationToken = default); - ValueTask> GetApplicantInviteAsync(Guid applicantUserId, CancellationToken cancellationToken = default); + Task> GetApplicantInviteAsync(Guid applicantUserId, CancellationToken cancellationToken = default); - ValueTask> GetApplicantInvitesAsync(Guid applicantUserId, CancellationToken cancellationToken = default); + Task> GetApplicantInvitesAsync(Guid applicantUserId, CancellationToken cancellationToken = default); } diff --git a/PostFundManagement.Application/Abstractions/Services/IEvidenceService.cs b/PostFundManagement.Application/Abstractions/Services/IEvidenceService.cs index 751e11b..59ce49b 100644 --- a/PostFundManagement.Application/Abstractions/Services/IEvidenceService.cs +++ b/PostFundManagement.Application/Abstractions/Services/IEvidenceService.cs @@ -1,38 +1,32 @@ using PostFundManagement.Application.Services.Evidence; using PostFundManagement.Domain; -using PostFundManagement.Domain.Attributes; using PostFundManagement.Domain.Models; namespace PostFundManagement.Application.Abstractions.Services; public interface IEvidenceService -{ - [Audit] - ValueTask CreateEvidenceAsync(Guid userId, IFormCollection form, IFormFile file, CancellationToken cancellationToken = default); +{ + Task CreateEvidenceAsync(Guid userId, IFormCollection form, IFormFile file, CancellationToken cancellationToken = default); + + Task RecordIndicatorActualAmountAsync(string indicatorIdHash, decimal amount, Guid userId, CancellationToken cancellationToken = default); - [Audit] - ValueTask RecordIndicatorActualAmountAsync(string indicatorIdHash, decimal amount, Guid userId, CancellationToken cancellationToken = default); + Task> GetIndicatorsAsync(Pagination pagination, CancellationToken cancellationToken = default); - ValueTask> GetIndicatorsAsync(Pagination pagination, CancellationToken cancellationToken = default); + Task> GetEvidenceFilesAsync(Pagination pagination, CancellationToken cancellationToken = default); - ValueTask> GetEvidenceFilesAsync(Pagination pagination, CancellationToken cancellationToken = default); + Task CreateMilestoneAsync(CreateMilestoneRequest request, Guid userId, CancellationToken cancellationToken = default); - [Audit] - ValueTask CreateMilestoneAsync(CreateMilestoneRequest request, Guid userId, CancellationToken cancellationToken = default); + Task CreateIndicatorAsync(CreateIndicatorRequest request, Guid userId, CancellationToken cancellationToken = default); - [Audit] - ValueTask CreateIndicatorAsync(CreateIndicatorRequest request, Guid userId, CancellationToken cancellationToken = default); + Task> GetIndicatorAsync(string indicatorId, CancellationToken cancellationToken); - ValueTask> GetIndicatorAsync(string indicatorId, CancellationToken cancellationToken); + Task> GetEvidenceAsync(string evidenceId, CancellationToken cancellationToken = default); - ValueTask> GetEvidenceAsync(string evidenceId, CancellationToken cancellationToken = default); + Task> GetMilestoneEvidencesAsync(string milestoneIdHash, CancellationToken cancellationToken = default); - ValueTask> GetMilestoneEvidencesAsync(string milestoneIdHash, CancellationToken cancellationToken = default); + Task> GetProjectEvidencesAsync(string projectIdHash, CancellationToken cancellationToken = default); - ValueTask> GetProjectEvidencesAsync(string projectIdHash, CancellationToken cancellationToken = default); + Task UpdateEvidenceAsync(UpdateEvidenceRequest request, Guid userId, CancellationToken cancellationToken = default); - [Audit] - ValueTask UpdateEvidenceAsync(UpdateEvidenceRequest request, Guid userId, CancellationToken cancellationToken = default); - - ValueTask> GetEvidenceUrlAsync(string evidenceIdHash, CancellationToken cancellationToken = default); + Task> GetEvidenceUrlAsync(string evidenceIdHash, CancellationToken cancellationToken = default); } diff --git a/PostFundManagement.Application/Abstractions/Services/IExecutionService.cs b/PostFundManagement.Application/Abstractions/Services/IExecutionService.cs index 6cd37bc..d611c66 100644 --- a/PostFundManagement.Application/Abstractions/Services/IExecutionService.cs +++ b/PostFundManagement.Application/Abstractions/Services/IExecutionService.cs @@ -1,32 +1,26 @@ using PostFundManagement.Application.Services.Execution; using PostFundManagement.Domain; -using PostFundManagement.Domain.Attributes; using PostFundManagement.Domain.Models; namespace PostFundManagement.Application.Abstractions.Services; public interface IExecutionService { - ValueTask> GetRisksAsync(Pagination pagination, CancellationToken cancellationToken = default); + Task> GetRisksAsync(Pagination pagination, CancellationToken cancellationToken = default); - ValueTask> GetDisbursementsAsync(Pagination pagination, CancellationToken cancellationToken = default); + Task> GetDisbursementsAsync(Pagination pagination, CancellationToken cancellationToken = default); - [Audit] - ValueTask CreateRiskAsync(CreateRiskRequest request, Guid userId, CancellationToken cancellationToken = default); + Task CreateRiskAsync(CreateRiskRequest request, Guid userId, CancellationToken cancellationToken = default); - [Audit] - ValueTask CreateDisbursementAsync(CreateDisbursementRequest request, Guid userId, CancellationToken cancellationToken = default); + Task CreateDisbursementAsync(CreateDisbursementRequest request, Guid userId, CancellationToken cancellationToken = default); - [Audit] - ValueTask ApproveDisbursementAsync(string disbursementIdHash, Guid userId, CancellationToken cancellationToken = default); + Task ApproveDisbursementAsync(string disbursementIdHash, Guid userId, CancellationToken cancellationToken = default); - ValueTask> GetDisbursementAsync(string disbursementIdHash, CancellationToken cancellationToken = default); + Task> GetDisbursementAsync(string disbursementIdHash, CancellationToken cancellationToken = default); - ValueTask> GetRiskAsync(string riskIdHash, CancellationToken cancellationToken = default); + Task> GetRiskAsync(string riskIdHash, CancellationToken cancellationToken = default); - [Audit] - ValueTask UpdateRiskAsync(UpdateRiskRequest request, CancellationToken cancellationToken = default); + Task UpdateRiskAsync(UpdateRiskRequest request, CancellationToken cancellationToken = default); - [Audit] - ValueTask UpdateDisbursementAsync(UpdateDisbursementRequest request, Guid userId, CancellationToken cancellationToken = default); + Task UpdateDisbursementAsync(UpdateDisbursementRequest request, Guid userId, CancellationToken cancellationToken = default); } diff --git a/PostFundManagement.Application/Abstractions/Services/IGovernanceService.cs b/PostFundManagement.Application/Abstractions/Services/IGovernanceService.cs index 477125e..08039ec 100644 --- a/PostFundManagement.Application/Abstractions/Services/IGovernanceService.cs +++ b/PostFundManagement.Application/Abstractions/Services/IGovernanceService.cs @@ -1,37 +1,32 @@ using PostFundManagement.Application.Services.Governance; using PostFundManagement.Domain; -using PostFundManagement.Domain.Attributes; using PostFundManagement.Domain.Models; namespace PostFundManagement.Application.Abstractions.Services; public interface IGovernanceService { - ValueTask> GetProgrammesAsync(string portfolioIdHash, CancellationToken cancellationToken = default); + Task> GetProgrammesAsync(string portfolioIdHash, CancellationToken cancellationToken = default); - ValueTask> GetPorfoliosAsync(string organisationIdHash, CancellationToken cancellationToken = default); + Task> GetPorfoliosAsync(string organisationIdHash, CancellationToken cancellationToken = default); - ValueTask> GetOrganisationsAsync(Pagination pagination, CancellationToken cancellationToken = default); + Task> GetOrganisationsAsync(Pagination pagination, CancellationToken cancellationToken = default); - ValueTask> GetOrganisationAsync(string organisationIdHash, CancellationToken cancellationToken = default); + Task> GetOrganisationAsync(string organisationIdHash, CancellationToken cancellationToken = default); - ValueTask> GetInstrumentsAsync(string programmeIdHash, CancellationToken cancellationToken = default); + Task> GetInstrumentsAsync(string programmeIdHash, CancellationToken cancellationToken = default); - ValueTask> GetDashboardAsync(CancellationToken cancellationToken = default); + Task> GetDashboardAsync(CancellationToken cancellationToken = default); - [Audit] - ValueTask CreateOrganisationAsync(CreateOrganisationRequest request, Guid userId, CancellationToken cancellationToken = default); + Task CreateOrganisationAsync(CreateOrganisationRequest request, Guid userId, CancellationToken cancellationToken = default); - [Audit] - ValueTask> UpdateOrganisationAsync(UpdateOrganisationRequest request, CancellationToken cancellationToken = default); + Task> UpdateOrganisationAsync(UpdateOrganisationRequest request, CancellationToken cancellationToken = default); - [Audit] - ValueTask CreatePortfolioAsync(CreatePortfolioRequest request, Guid userId, CancellationToken cancellationToken = default); + Task CreatePortfolioAsync(CreatePortfolioRequest request, Guid userId, CancellationToken cancellationToken = default); - [Audit] - ValueTask UpdatePortfolioAsync(UpdatePortfolioRequest request, Guid userId, CancellationToken cancellationToken = default); + Task UpdatePortfolioAsync(UpdatePortfolioRequest request, Guid userId, CancellationToken cancellationToken = default); - ValueTask> GetPortfolioProgrammesAsync(string portfolioIdHash, CancellationToken cancellationToken = default); + Task> GetPortfolioProgrammesAsync(string portfolioIdHash, CancellationToken cancellationToken = default); - ValueTask> GetPortfolioAsync(string portfolioIdHash, CancellationToken cancellationToken = default); + Task> GetPortfolioAsync(string portfolioIdHash, CancellationToken cancellationToken = default); } diff --git a/PostFundManagement.Application/Abstractions/Services/IGrantsService.cs b/PostFundManagement.Application/Abstractions/Services/IGrantsService.cs index 22dce48..b7e0556 100644 --- a/PostFundManagement.Application/Abstractions/Services/IGrantsService.cs +++ b/PostFundManagement.Application/Abstractions/Services/IGrantsService.cs @@ -1,41 +1,34 @@ using PostFundManagement.Application.Services.Grants; using PostFundManagement.Domain; -using PostFundManagement.Domain.Attributes; using PostFundManagement.Domain.Models; namespace PostFundManagement.Application.Abstractions.Services; public interface IGrantsService { - ValueTask> GetContractsAsync(Pagination pagination, CancellationToken cancellationToken = default); + Task> GetContractsAsync(Pagination pagination, CancellationToken cancellationToken = default); - ValueTask> GetContractAsync(string contractIdHash, CancellationToken cancellationToken = default); + Task> GetContractAsync(string contractIdHash, CancellationToken cancellationToken = default); - ValueTask> GetBudgetsAsync(Pagination pagination, CancellationToken cancellationToken = default); + Task> GetBudgetsAsync(Pagination pagination, CancellationToken cancellationToken = default); - ValueTask> GetBudgetAsync(string budgetIdHash, CancellationToken cancellationToken = default); + Task> GetBudgetAsync(string budgetIdHash, CancellationToken cancellationToken = default); - ValueTask> GetAwardsAsync(Pagination pagination, CancellationToken cancellationToken = default); + Task> GetAwardsAsync(Pagination pagination, CancellationToken cancellationToken = default); - ValueTask> GetAwardAsync(string awardIdHash, CancellationToken cancellationToken = default); + Task> GetAwardAsync(string awardIdHash, CancellationToken cancellationToken = default); - [Audit] - ValueTask ExecuteContractAsync(ExecuteContractRequest request, Guid userId, CancellationToken cancellationToken = default); + Task ExecuteContractAsync(ExecuteContractRequest request, Guid userId, CancellationToken cancellationToken = default); - [Audit] - ValueTask CreateContractAsync(CreateContractRequest request, Guid userId, CancellationToken cancellationToken = default); + Task CreateContractAsync(CreateContractRequest request, Guid userId, CancellationToken cancellationToken = default); - [Audit] - ValueTask CreateBudgetAsync(CreateBudgetRequest request, Guid userId, CancellationToken cancellationToken = default); + Task CreateBudgetAsync(CreateBudgetRequest request, Guid userId, CancellationToken cancellationToken = default); - [Audit] - ValueTask CreateAwardAsync(CreateAwardRequest request, Guid userId, CancellationToken cancellationToken = default); + Task CreateAwardAsync(CreateAwardRequest request, Guid userId, CancellationToken cancellationToken = default); - ValueTask> GetContractUrlAsync(string contractIdHash, CancellationToken cancellationToken = default); + Task> GetContractUrlAsync(string contractIdHash, CancellationToken cancellationToken = default); - [Audit] - ValueTask UploadContractAsync(string contractIdHash, Guid userId, IFormFile file, CancellationToken cancellationToken = default); + Task UploadContractAsync(string contractIdHash, Guid userId, IFormFile file, CancellationToken cancellationToken = default); - [Audit] - ValueTask UpdateContractAsync(UpdateContractRequest request, CancellationToken cancellationToken = default); + Task UpdateContractAsync(UpdateContractRequest request, CancellationToken cancellationToken = default); } diff --git a/PostFundManagement.Application/Abstractions/Services/IIdentityService.cs b/PostFundManagement.Application/Abstractions/Services/IIdentityService.cs index 9056366..d4efd5a 100644 --- a/PostFundManagement.Application/Abstractions/Services/IIdentityService.cs +++ b/PostFundManagement.Application/Abstractions/Services/IIdentityService.cs @@ -5,5 +5,5 @@ namespace PostFundManagement.Application.Abstractions.Services; public interface IIdentityService { [Audit] - ValueTask UserIsAuthorisedAsync(Guid userId, CancellationToken cancellationToken = default); + Task UserIsAuthorisedAsync(Guid userId, CancellationToken cancellationToken = default); } diff --git a/PostFundManagement.Application/Abstractions/Services/IProjectService.cs b/PostFundManagement.Application/Abstractions/Services/IProjectService.cs index b5f80d5..4656f3d 100644 --- a/PostFundManagement.Application/Abstractions/Services/IProjectService.cs +++ b/PostFundManagement.Application/Abstractions/Services/IProjectService.cs @@ -1,54 +1,46 @@ using PostFundManagement.Application.Services.Projects; using PostFundManagement.Domain; -using PostFundManagement.Domain.Attributes; using PostFundManagement.Domain.Models; namespace PostFundManagement.Application.Abstractions.Services; public interface IProjectService { - [Audit] - ValueTask UpdateProjectStatusAsync(UpdateProjectStatusRequest request, Guid userId, CancellationToken cancellationToken = default); + Task UpdateProjectStatusAsync(UpdateProjectStatusRequest request, Guid userId, CancellationToken cancellationToken = default); - ValueTask> GetProjectsAsync(Pagination pagination, CancellationToken cancellationToken = default); + Task> GetProjectsAsync(Pagination pagination, CancellationToken cancellationToken = default); - ValueTask> GetProjectAsync(string projectIdHash, CancellationToken cancellationToken = default); + Task> GetProjectAsync(string projectIdHash, CancellationToken cancellationToken = default); - ValueTask> GetActivitiesAsync(string projectIdHash, CancellationToken cancellationToken = default); + Task> GetActivitiesAsync(string projectIdHash, CancellationToken cancellationToken = default); - [Audit] - ValueTask CreateProjectAsync(CreateProjectRequest request, Guid userId, CancellationToken cancellationToken = default); + Task CreateProjectAsync(CreateProjectRequest request, Guid userId, CancellationToken cancellationToken = default); - [Audit] - ValueTask CreateActivityAsync(CreateActivityRequest request, Guid userId, CancellationToken cancellationToken = default); + Task CreateActivityAsync(CreateActivityRequest request, Guid userId, CancellationToken cancellationToken = default); - ValueTask> GetProjectMilestonesAsync(string projectIdHash, CancellationToken cancellationToken = default); + Task> GetProjectMilestonesAsync(string projectIdHash, CancellationToken cancellationToken = default); - ValueTask> GetProjectIndicatorsAsync(string projectIdHash, CancellationToken cancellationToken = default); + Task> GetProjectIndicatorsAsync(string projectIdHash, CancellationToken cancellationToken = default); - ValueTask> GetMilestoneAsync(string milestoneIdHash, CancellationToken cancellationToken = default); + Task> GetMilestoneAsync(string milestoneIdHash, CancellationToken cancellationToken = default); - ValueTask> GetMilestonesAsync(Pagination pagination, CancellationToken cancellationToken = default); + Task> GetMilestonesAsync(Pagination pagination, CancellationToken cancellationToken = default); - [Audit] - ValueTask UpdateMilestoneAsync(UpdateMilestoneRequest request, Guid userId, CancellationToken cancellationToken = default); + Task UpdateMilestoneAsync(UpdateMilestoneRequest request, Guid userId, CancellationToken cancellationToken = default); - [Audit] - ValueTask UpdateProjectAsync(UpdateProjectRequest request, Guid userId, CancellationToken cancellationToken = default); + Task UpdateProjectAsync(UpdateProjectRequest request, Guid userId, CancellationToken cancellationToken = default); - ValueTask> GetActivityAsync(string activityIdHash, CancellationToken cancellationToken = default); + Task> GetActivityAsync(string activityIdHash, CancellationToken cancellationToken = default); - ValueTask> GetProjectRisksAsync(string projectIdHash, CancellationToken cancellationToken = default); + Task> GetProjectRisksAsync(string projectIdHash, CancellationToken cancellationToken = default); - [Audit] - ValueTask CreateProgrammeAsync(CreateProgrammeRequest request, Guid userId, CancellationToken cancellationToken = default); + Task CreateProgrammeAsync(CreateProgrammeRequest request, Guid userId, CancellationToken cancellationToken = default); - [Audit] - ValueTask UpdateProgrammeAsync(UpdateProgrammeRequest request, Guid userId, CancellationToken cancellationToken = default); + Task UpdateProgrammeAsync(UpdateProgrammeRequest request, Guid userId, CancellationToken cancellationToken = default); - ValueTask> GetProgrammeAsync(string programmeIdHash, CancellationToken cancellationToken = default); + Task> GetProgrammeAsync(string programmeIdHash, CancellationToken cancellationToken = default); - ValueTask> GetProgrammesAsync(Pagination pagination, CancellationToken cancellationToken = default); + Task> GetProgrammesAsync(Pagination pagination, CancellationToken cancellationToken = default); - ValueTask> GetProgrammeProjectsAsync(string programmeIdHash, CancellationToken cancellationToken = default); + Task> GetProgrammeProjectsAsync(string programmeIdHash, CancellationToken cancellationToken = default); } diff --git a/PostFundManagement.Application/Abstractions/Services/IToolService.cs b/PostFundManagement.Application/Abstractions/Services/IToolService.cs index 6fdfb0d..c848b6f 100644 --- a/PostFundManagement.Application/Abstractions/Services/IToolService.cs +++ b/PostFundManagement.Application/Abstractions/Services/IToolService.cs @@ -2,5 +2,5 @@ public interface IToolService { - ValueTask> EncodeLong(long id, CancellationToken cancellationToken); + Task> EncodeLong(long id, CancellationToken cancellationToken); } diff --git a/PostFundManagement.Application/Abstractions/Services/IUserService.cs b/PostFundManagement.Application/Abstractions/Services/IUserService.cs index 9b6d5c3..e9f2da8 100644 --- a/PostFundManagement.Application/Abstractions/Services/IUserService.cs +++ b/PostFundManagement.Application/Abstractions/Services/IUserService.cs @@ -1,19 +1,16 @@ using PostFundManagement.Application.Services.Users; using PostFundManagement.Domain; -using PostFundManagement.Domain.Attributes; using PostFundManagement.Domain.Models; namespace PostFundManagement.Application.Abstractions.Services; public interface IUserService { - [Audit] - ValueTask SyncUserAsync(Guid userId, string email, CancellationToken cancellationToken = default); + Task SyncUserAsync(Guid userId, string email, CancellationToken cancellationToken = default); - ValueTask> GetUsersAsync(Pagination pagination, UserFilterRequest request, CancellationToken cancellationToken = default); + Task> GetUsersAsync(Pagination pagination, UserFilterRequest request, CancellationToken cancellationToken = default); - [Audit] - ValueTask UpdateUserStatusAsync(Guid userId, ActivityStatus status, CancellationToken cancellationToken = default); + Task UpdateUserStatusAsync(Guid userId, ActivityStatus status, CancellationToken cancellationToken = default); - ValueTask> GetUserAsync(Guid userId, CancellationToken cancellationToken); + Task> GetUserAsync(Guid userId, CancellationToken cancellationToken); } diff --git a/PostFundManagement.Application/Interceptors/AuditInterceptor.cs b/PostFundManagement.Application/Interceptors/AuditInterceptor.cs index 02f2aab..5b30abc 100644 --- a/PostFundManagement.Application/Interceptors/AuditInterceptor.cs +++ b/PostFundManagement.Application/Interceptors/AuditInterceptor.cs @@ -73,7 +73,7 @@ public sealed class AuditInterceptor(AuditService auditService, IHttpContextAcce { var genericDef = returnType.GetGenericTypeDefinition(); - if (genericDef == typeof(Task<>) || genericDef == typeof(ValueTask<>)) + if (genericDef == typeof(Task<>) || genericDef == typeof(Task<>)) innerType = returnType.GetGenericArguments()[0]; } diff --git a/PostFundManagement.Application/Services/Communications/CommunicationsCacheService.cs b/PostFundManagement.Application/Services/Communications/CommunicationsCacheService.cs index 4d98bae..303ff65 100644 --- a/PostFundManagement.Application/Services/Communications/CommunicationsCacheService.cs +++ b/PostFundManagement.Application/Services/Communications/CommunicationsCacheService.cs @@ -3,6 +3,7 @@ using PostFundManagement.Application.Abstractions.Services; using PostFundManagement.Application.Extensions; using PostFundManagement.Application.Services.Shared; using PostFundManagement.Domain; +using PostFundManagement.Domain.Attributes; using PostFundManagement.Domain.Models; using static PostFundManagement.Domain.Extensions.Constants; @@ -11,8 +12,8 @@ namespace PostFundManagement.Application.Services.Communications; public sealed class CommunicationsCacheService(CommunicationsService service, IDistributedCache cache, IFeatureManager featureManager) : ServiceCacheBase, ICommunicationsService { - public async ValueTask> GetApplicantInviteAsync(Guid applicantUserId, CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public async Task> GetApplicantInviteAsync(Guid applicantUserId, CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { if (!await featureManager.IsEnabledAsync(ServiceCachingFeature)) return await service.GetApplicantInviteAsync(applicantUserId, cancellationToken); @@ -33,8 +34,8 @@ public sealed class CommunicationsCacheService(CommunicationsService service, ID return Result.Ok(cached!.FromJson()); })); - public async ValueTask> GetApplicantInvitesAsync(Guid applicantUserId, CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public async Task> GetApplicantInvitesAsync(Guid applicantUserId, CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { if (!await featureManager.IsEnabledAsync(ServiceCachingFeature)) return await service.GetApplicantInvitesAsync(applicantUserId, cancellationToken); @@ -57,8 +58,8 @@ public sealed class CommunicationsCacheService(CommunicationsService service, ID return Result.Ok(cached.FromJson()); })); - public async ValueTask> GetInvitesAsync(Pagination pagination, CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public async Task> GetInvitesAsync(Pagination pagination, CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { if (!await featureManager.IsEnabledAsync(ServiceCachingFeature)) return await service.GetInvitesAsync(pagination, cancellationToken); @@ -81,6 +82,7 @@ public sealed class CommunicationsCacheService(CommunicationsService service, ID return Result.Ok(cached.FromJson()); })); - public async ValueTask> SendInviteAsync(InviteRequest request, Guid userId, CancellationToken cancellationToken = default) => + [Audit] + public async Task> SendInviteAsync(InviteRequest request, Guid userId, CancellationToken cancellationToken = default) => await service.SendInviteAsync(request, userId, cancellationToken); } diff --git a/PostFundManagement.Application/Services/Communications/CommunicationsService.cs b/PostFundManagement.Application/Services/Communications/CommunicationsService.cs index 3cdf506..0de5db7 100644 --- a/PostFundManagement.Application/Services/Communications/CommunicationsService.cs +++ b/PostFundManagement.Application/Services/Communications/CommunicationsService.cs @@ -8,9 +8,9 @@ using PostFundManagement.Infrastructure.Database; namespace PostFundManagement.Application.Services.Communications; public sealed class CommunicationsService(IDbContextFactory contextFactory) : ICommunicationsService -{ - public async ValueTask> SendInviteAsync(InviteRequest request, Guid userId, CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => +{ + public async Task> SendInviteAsync(InviteRequest request, Guid userId, CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { await using var context = await contextFactory.CreateDbContextAsync(cancellationToken); @@ -42,8 +42,8 @@ public sealed class CommunicationsService(IDbContextFactory> GetInvitesAsync(Pagination pagination, CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public async Task> GetInvitesAsync(Pagination pagination, CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { await using var context = await contextFactory.CreateDbContextAsync(cancellationToken); @@ -56,8 +56,8 @@ public sealed class CommunicationsService(IDbContextFactory i.Map()).ToArray()); })); - public async ValueTask> GetApplicantInviteAsync(Guid applicantUserId, CancellationToken cancellationToken) => - await Result.Try((Func>>)(async () => + public async Task> GetApplicantInviteAsync(Guid applicantUserId, CancellationToken cancellationToken) => + await Result.Try((Func>>)(async () => { await using var context = await contextFactory.CreateDbContextAsync(cancellationToken); @@ -67,8 +67,8 @@ public sealed class CommunicationsService(IDbContextFactory> GetApplicantInvitesAsync(Guid applicantUserId, CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public async Task> GetApplicantInvitesAsync(Guid applicantUserId, CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { await using var context = await contextFactory.CreateDbContextAsync(cancellationToken); diff --git a/PostFundManagement.Application/Services/Evidence/EvidenceCacheService.cs b/PostFundManagement.Application/Services/Evidence/EvidenceCacheService.cs index 57a39d9..8aea3fb 100644 --- a/PostFundManagement.Application/Services/Evidence/EvidenceCacheService.cs +++ b/PostFundManagement.Application/Services/Evidence/EvidenceCacheService.cs @@ -3,6 +3,7 @@ using PostFundManagement.Application.Abstractions.Services; using PostFundManagement.Application.Extensions; using PostFundManagement.Application.Services.Shared; using PostFundManagement.Domain; +using PostFundManagement.Domain.Attributes; using PostFundManagement.Domain.Models; using static PostFundManagement.Domain.Extensions.Constants; @@ -11,17 +12,20 @@ namespace PostFundManagement.Application.Services.Evidence; public sealed class EvidenceCacheService(EvidenceService service, IDistributedCache cache, IFeatureManager featureManager) : ServiceCacheBase, IEvidenceService { - public async ValueTask CreateEvidenceAsync(Guid userId, IFormCollection form, IFormFile file, CancellationToken cancellationToken = default) => + [Audit] + public async Task CreateEvidenceAsync(Guid userId, IFormCollection form, IFormFile file, CancellationToken cancellationToken = default) => await service.CreateEvidenceAsync(userId, form, file, cancellationToken); - public async ValueTask CreateIndicatorAsync(CreateIndicatorRequest request, Guid userId, CancellationToken cancellationToken = default) => + [Audit] + public async Task CreateIndicatorAsync(CreateIndicatorRequest request, Guid userId, CancellationToken cancellationToken = default) => await service.CreateIndicatorAsync(request, userId, cancellationToken); - public async ValueTask CreateMilestoneAsync(CreateMilestoneRequest request, Guid userId, CancellationToken cancellationToken = default) => + [Audit] + public async Task CreateMilestoneAsync(CreateMilestoneRequest request, Guid userId, CancellationToken cancellationToken = default) => await service.CreateMilestoneAsync(request, userId, cancellationToken); - public async ValueTask> GetEvidenceAsync(string evidenceId, CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public async Task> GetEvidenceAsync(string evidenceId, CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { if (!await featureManager.IsEnabledAsync(ServiceCachingFeature)) return await service.GetEvidenceAsync(evidenceId, cancellationToken); @@ -44,8 +48,8 @@ public sealed class EvidenceCacheService(EvidenceService service, IDistributedCa return Result.Ok(cached.FromJson()); })); - public async ValueTask> GetEvidenceFilesAsync(Pagination pagination, CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public async Task> GetEvidenceFilesAsync(Pagination pagination, CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { if (!await featureManager.IsEnabledAsync(ServiceCachingFeature)) return await service.GetEvidenceFilesAsync(pagination, cancellationToken); @@ -68,8 +72,8 @@ public sealed class EvidenceCacheService(EvidenceService service, IDistributedCa return Result.Ok(cached.FromJson()); })); - public async ValueTask> GetEvidenceUrlAsync(string evidenceIdHash, CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public async Task> GetEvidenceUrlAsync(string evidenceIdHash, CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { if (!await featureManager.IsEnabledAsync(ServiceCachingFeature)) return await service.GetEvidenceUrlAsync(evidenceIdHash, cancellationToken); @@ -92,8 +96,8 @@ public sealed class EvidenceCacheService(EvidenceService service, IDistributedCa return Result.Ok(cached); })); - public async ValueTask> GetIndicatorAsync(string indicatorId, CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public async Task> GetIndicatorAsync(string indicatorId, CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { if (!await featureManager.IsEnabledAsync(ServiceCachingFeature)) return await service.GetIndicatorAsync(indicatorId, cancellationToken); @@ -116,8 +120,8 @@ public sealed class EvidenceCacheService(EvidenceService service, IDistributedCa return Result.Ok(cached.FromJson()); })); - public async ValueTask> GetIndicatorsAsync(Pagination pagination, CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public async Task> GetIndicatorsAsync(Pagination pagination, CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { if (!await featureManager.IsEnabledAsync(ServiceCachingFeature)) return await service.GetIndicatorsAsync(pagination, cancellationToken); @@ -140,8 +144,8 @@ public sealed class EvidenceCacheService(EvidenceService service, IDistributedCa return Result.Ok(cached.FromJson()); })); - public async ValueTask> GetMilestoneEvidencesAsync(string milestoneIdHash, CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public async Task> GetMilestoneEvidencesAsync(string milestoneIdHash, CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { if (!await featureManager.IsEnabledAsync(ServiceCachingFeature)) return await service.GetMilestoneEvidencesAsync(milestoneIdHash, cancellationToken); @@ -164,8 +168,8 @@ public sealed class EvidenceCacheService(EvidenceService service, IDistributedCa return Result.Ok(cached.FromJson()); })); - public async ValueTask> GetProjectEvidencesAsync(string projectIdHash, CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public async Task> GetProjectEvidencesAsync(string projectIdHash, CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { if (!await featureManager.IsEnabledAsync(ServiceCachingFeature)) return await service.GetProjectEvidencesAsync(projectIdHash, cancellationToken); @@ -188,9 +192,11 @@ public sealed class EvidenceCacheService(EvidenceService service, IDistributedCa return Result.Ok(cached.FromJson()); })); - public async ValueTask RecordIndicatorActualAmountAsync(string indicatorIdHash, decimal amount, Guid userId, CancellationToken cancellationToken = default) => + [Audit] + public async Task RecordIndicatorActualAmountAsync(string indicatorIdHash, decimal amount, Guid userId, CancellationToken cancellationToken = default) => await service.RecordIndicatorActualAmountAsync(indicatorIdHash, amount, userId, cancellationToken); - public async ValueTask UpdateEvidenceAsync(UpdateEvidenceRequest request, Guid userId, CancellationToken cancellationToken = default) => + [Audit] + public async Task UpdateEvidenceAsync(UpdateEvidenceRequest request, Guid userId, CancellationToken cancellationToken = default) => await service.UpdateEvidenceAsync(request, userId, cancellationToken); } diff --git a/PostFundManagement.Application/Services/Evidence/EvidenceService.cs b/PostFundManagement.Application/Services/Evidence/EvidenceService.cs index 851275b..e293722 100644 --- a/PostFundManagement.Application/Services/Evidence/EvidenceService.cs +++ b/PostFundManagement.Application/Services/Evidence/EvidenceService.cs @@ -12,8 +12,8 @@ namespace PostFundManagement.Application.Services.Evidence; public sealed class EvidenceService(IDbContextFactory contextFactory, HashService hashService, [FromKeyedServices(Constants.GeneralBucketName)] IS3Service s3Service) : IEvidenceService { - public async ValueTask CreateEvidenceAsync(Guid userId, IFormCollection form, IFormFile file, CancellationToken cancellationToken = default) => - await Result.Try((Func>)(async () => + public async Task CreateEvidenceAsync(Guid userId, IFormCollection form, IFormFile file, CancellationToken cancellationToken = default) => + await Result.Try((Func>)(async () => { if (!long.TryParse(form["projectId"], out var projectId) || !long.TryParse(form["milestoneId"], out var milestoneId) || !long.TryParse(form["indicatorId"], out var indicatorId) || !long.TryParse(form["activityId"], out var activityId) || @@ -49,8 +49,8 @@ public sealed class EvidenceService(IDbContextFactory cont return Result.OkIf(await context.SaveChangesAsync(cancellationToken) > 0, CreateError.New); })); - public async ValueTask RecordIndicatorActualAmountAsync(string indicatorIdHash, decimal amount, Guid userId, CancellationToken cancellationToken = default) => - await Result.Try((Func>)(async () => + public async Task RecordIndicatorActualAmountAsync(string indicatorIdHash, decimal amount, Guid userId, CancellationToken cancellationToken = default) => + await Result.Try((Func>)(async () => { var decodeResult = hashService.DecodeLongIdHash(indicatorIdHash); @@ -68,8 +68,8 @@ public sealed class EvidenceService(IDbContextFactory cont return Result.OkIf(changedTotal > 0, UpdateError.New); })); - public async ValueTask> GetIndicatorsAsync(Pagination pagination, CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public async Task> GetIndicatorsAsync(Pagination pagination, CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { await using var context = await contextFactory.CreateDbContextAsync(cancellationToken); @@ -82,8 +82,8 @@ public sealed class EvidenceService(IDbContextFactory cont return Result.Ok(indicators.Select(i => i.Map()).ToArray()); })); - public async ValueTask> GetEvidenceFilesAsync(Pagination pagination, CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public async Task> GetEvidenceFilesAsync(Pagination pagination, CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { await using var context = await contextFactory.CreateDbContextAsync(cancellationToken); @@ -96,8 +96,8 @@ public sealed class EvidenceService(IDbContextFactory cont return Result.Ok(evidence.Select(i => i.Map()).ToArray()); })); - public async ValueTask CreateMilestoneAsync(CreateMilestoneRequest request, Guid userId, CancellationToken cancellationToken = default) => - await Result.Try((Func>)(async () => + public async Task CreateMilestoneAsync(CreateMilestoneRequest request, Guid userId, CancellationToken cancellationToken = default) => + await Result.Try((Func>)(async () => { await using var context = await contextFactory.CreateDbContextAsync(cancellationToken); @@ -122,8 +122,8 @@ public sealed class EvidenceService(IDbContextFactory cont CreateError.Create("No record could be created.")); })); - public async ValueTask CreateIndicatorAsync(CreateIndicatorRequest request, Guid userId, CancellationToken cancellationToken = default) => - await Result.Try((Func>)(async () => + public async Task CreateIndicatorAsync(CreateIndicatorRequest request, Guid userId, CancellationToken cancellationToken = default) => + await Result.Try((Func>)(async () => { await using var context = await contextFactory.CreateDbContextAsync(cancellationToken); @@ -145,8 +145,8 @@ public sealed class EvidenceService(IDbContextFactory cont return Result.OkIf(await context.SaveChangesAsync(cancellationToken) > 0, CreateError.New); })); - public async ValueTask> GetIndicatorAsync(string indicatorId, CancellationToken cancellationToken) => - await Result.Try((Func>>)(async () => + public async Task> GetIndicatorAsync(string indicatorId, CancellationToken cancellationToken) => + await Result.Try((Func>>)(async () => { var decodeResult = hashService.DecodeLongIdHash(indicatorId); @@ -162,8 +162,8 @@ public sealed class EvidenceService(IDbContextFactory cont .ToResult(indicator!.Map()); })); - public async ValueTask> GetEvidenceAsync(string evidenceId, CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public async Task> GetEvidenceAsync(string evidenceId, CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { var decodeResult = hashService.DecodeLongIdHash(evidenceId); @@ -179,8 +179,8 @@ public sealed class EvidenceService(IDbContextFactory cont .ToResult(evidence!.Map()); })); - public async ValueTask> GetMilestoneEvidencesAsync(string milestoneIdHash, CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public async Task> GetMilestoneEvidencesAsync(string milestoneIdHash, CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { var decodeResult = hashService.DecodeLongIdHash(milestoneIdHash); @@ -199,8 +199,8 @@ public sealed class EvidenceService(IDbContextFactory cont return Result.Ok(evidences.Select(e => e.Map()).ToArray()); })); - public async ValueTask> GetProjectEvidencesAsync(string projectIdHash, CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public async Task> GetProjectEvidencesAsync(string projectIdHash, CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { var decodeResult = hashService.DecodeLongIdHash(projectIdHash); @@ -219,8 +219,8 @@ public sealed class EvidenceService(IDbContextFactory cont return Result.Ok(evidences.Select(e => e.Map()).ToArray()); })); - public async ValueTask UpdateEvidenceAsync(UpdateEvidenceRequest request, Guid userId, CancellationToken cancellationToken = default) => - await Result.Try((Func>)(async () => + public async Task UpdateEvidenceAsync(UpdateEvidenceRequest request, Guid userId, CancellationToken cancellationToken = default) => + await Result.Try((Func>)(async () => { await using var context = await contextFactory.CreateDbContextAsync(cancellationToken); @@ -238,8 +238,8 @@ public sealed class EvidenceService(IDbContextFactory cont return Result.OkIf(changedTotal > 0, UpdateError.New); })); - public async ValueTask> GetEvidenceUrlAsync(string evidenceIdHash, CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public async Task> GetEvidenceUrlAsync(string evidenceIdHash, CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { var decodeResult = hashService.DecodeLongIdHash(evidenceIdHash); diff --git a/PostFundManagement.Application/Services/Execution/ExecutionCacheService.cs b/PostFundManagement.Application/Services/Execution/ExecutionCacheService.cs index acf9f19..c15cb68 100644 --- a/PostFundManagement.Application/Services/Execution/ExecutionCacheService.cs +++ b/PostFundManagement.Application/Services/Execution/ExecutionCacheService.cs @@ -3,6 +3,7 @@ using PostFundManagement.Application.Abstractions.Services; using PostFundManagement.Application.Extensions; using PostFundManagement.Application.Services.Shared; using PostFundManagement.Domain; +using PostFundManagement.Domain.Attributes; using PostFundManagement.Domain.Models; using static PostFundManagement.Domain.Extensions.Constants; @@ -11,17 +12,20 @@ namespace PostFundManagement.Application.Services.Execution; public sealed class ExecutionCacheService(ExecutionService service, IDistributedCache cache, IFeatureManager featureManager) : ServiceCacheBase, IExecutionService { - public async ValueTask ApproveDisbursementAsync(string disbursementIdHash, Guid userId, CancellationToken cancellationToken = default) => + [Audit] + public async Task ApproveDisbursementAsync(string disbursementIdHash, Guid userId, CancellationToken cancellationToken = default) => await service.ApproveDisbursementAsync(disbursementIdHash, userId, cancellationToken); - public async ValueTask CreateDisbursementAsync(CreateDisbursementRequest request, Guid userId, CancellationToken cancellationToken = default) => + [Audit] + public async Task CreateDisbursementAsync(CreateDisbursementRequest request, Guid userId, CancellationToken cancellationToken = default) => await service.CreateDisbursementAsync(request, userId, cancellationToken); - public async ValueTask CreateRiskAsync(CreateRiskRequest request, Guid userId, CancellationToken cancellationToken = default) => + [Audit] + public async Task CreateRiskAsync(CreateRiskRequest request, Guid userId, CancellationToken cancellationToken = default) => await service.CreateRiskAsync(request, userId, cancellationToken); - public async ValueTask> GetDisbursementAsync(string disbursementIdHash, CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public async Task> GetDisbursementAsync(string disbursementIdHash, CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { if (!await featureManager.IsEnabledAsync(ServiceCachingFeature)) return await service.GetDisbursementAsync(disbursementIdHash, cancellationToken); @@ -44,8 +48,8 @@ public sealed class ExecutionCacheService(ExecutionService service, IDistributed return Result.Ok(cached.FromJson()); })); - public async ValueTask> GetDisbursementsAsync(Pagination pagination, CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public async Task> GetDisbursementsAsync(Pagination pagination, CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { if (!await featureManager.IsEnabledAsync(ServiceCachingFeature)) return await service.GetDisbursementsAsync(pagination, cancellationToken); @@ -68,8 +72,8 @@ public sealed class ExecutionCacheService(ExecutionService service, IDistributed return Result.Ok(cached.FromJson()); })); - public async ValueTask> GetRiskAsync(string riskIdHash, CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public async Task> GetRiskAsync(string riskIdHash, CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { if (!await featureManager.IsEnabledAsync(ServiceCachingFeature)) return await service.GetRiskAsync(riskIdHash, cancellationToken); @@ -92,8 +96,8 @@ public sealed class ExecutionCacheService(ExecutionService service, IDistributed return Result.Ok(cached.FromJson()); })); - public async ValueTask> GetRisksAsync(Pagination pagination, CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public async Task> GetRisksAsync(Pagination pagination, CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { if (!await featureManager.IsEnabledAsync(ServiceCachingFeature)) return await service.GetRisksAsync(pagination, cancellationToken); @@ -116,9 +120,11 @@ public sealed class ExecutionCacheService(ExecutionService service, IDistributed return Result.Ok(cached.FromJson()); })); - public async ValueTask UpdateDisbursementAsync(UpdateDisbursementRequest request, Guid userId, CancellationToken cancellationToken = default) => + [Audit] + public async Task UpdateDisbursementAsync(UpdateDisbursementRequest request, Guid userId, CancellationToken cancellationToken = default) => await service.UpdateDisbursementAsync(request, userId, cancellationToken); - public async ValueTask UpdateRiskAsync(UpdateRiskRequest request, CancellationToken cancellationToken = default) => + [Audit] + public async Task UpdateRiskAsync(UpdateRiskRequest request, CancellationToken cancellationToken = default) => await service.UpdateRiskAsync(request, cancellationToken); } diff --git a/PostFundManagement.Application/Services/Execution/ExecutionService.cs b/PostFundManagement.Application/Services/Execution/ExecutionService.cs index 952a32d..b1fd278 100644 --- a/PostFundManagement.Application/Services/Execution/ExecutionService.cs +++ b/PostFundManagement.Application/Services/Execution/ExecutionService.cs @@ -10,8 +10,8 @@ namespace PostFundManagement.Application.Services.Execution; public sealed class ExecutionService(IDbContextFactory contextFactory, HashService hashService) : IExecutionService { - public async ValueTask> GetRisksAsync(Pagination pagination, CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public async Task> GetRisksAsync(Pagination pagination, CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { await using var context = await contextFactory.CreateDbContextAsync(cancellationToken); @@ -24,8 +24,8 @@ public sealed class ExecutionService(IDbContextFactory con return Result.Ok(risks.Select(i => i.Map()).ToArray()); })); - public async ValueTask> GetDisbursementsAsync(Pagination pagination, CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public async Task> GetDisbursementsAsync(Pagination pagination, CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { await using var context = await contextFactory.CreateDbContextAsync(cancellationToken); @@ -37,9 +37,9 @@ public sealed class ExecutionService(IDbContextFactory con return Result.Ok(disbursements.Select(i => i.Map()).ToArray()); })); - - public async ValueTask CreateRiskAsync(CreateRiskRequest request, Guid userId, CancellationToken cancellationToken = default) => - await Result.Try((Func>)(async () => + + public async Task CreateRiskAsync(CreateRiskRequest request, Guid userId, CancellationToken cancellationToken = default) => + await Result.Try((Func>)(async () => { await using var context = await contextFactory.CreateDbContextAsync(cancellationToken); @@ -60,8 +60,8 @@ public sealed class ExecutionService(IDbContextFactory con return Result.OkIf(await context.SaveChangesAsync(cancellationToken) > 0, CreateError.New); })); - public async ValueTask CreateDisbursementAsync(CreateDisbursementRequest request, Guid userId, CancellationToken cancellationToken = default) => - await Result.Try((Func>)(async () => + public async Task CreateDisbursementAsync(CreateDisbursementRequest request, Guid userId, CancellationToken cancellationToken = default) => + await Result.Try((Func>)(async () => { await using var context = await contextFactory.CreateDbContextAsync(cancellationToken); @@ -81,8 +81,8 @@ public sealed class ExecutionService(IDbContextFactory con return Result.OkIf(await context.SaveChangesAsync(cancellationToken) > 0, CreateError.New); })); - public async ValueTask ApproveDisbursementAsync(string disbursementIdHash, Guid userId, CancellationToken cancellationToken = default) => - await Result.Try((Func>)(async () => + public async Task ApproveDisbursementAsync(string disbursementIdHash, Guid userId, CancellationToken cancellationToken = default) => + await Result.Try((Func>)(async () => { var decodeResult = hashService.DecodeLongIdHash(disbursementIdHash); @@ -101,8 +101,8 @@ public sealed class ExecutionService(IDbContextFactory con return Result.OkIf(changedTotal > 0, UpdateError.New); })); - public async ValueTask> GetDisbursementAsync(string disbursementIdHash, CancellationToken cancellationToken) => - await Result.Try((Func>>)(async () => + public async Task> GetDisbursementAsync(string disbursementIdHash, CancellationToken cancellationToken) => + await Result.Try((Func>>)(async () => { var decodeResult = hashService.DecodeLongIdHash(disbursementIdHash); @@ -119,8 +119,8 @@ public sealed class ExecutionService(IDbContextFactory con .ToResult(disbursement!.Map()); })); - public async ValueTask> GetRiskAsync(string riskIdHash, CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public async Task> GetRiskAsync(string riskIdHash, CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { var decodeResult = hashService.DecodeLongIdHash(riskIdHash); @@ -137,8 +137,8 @@ public sealed class ExecutionService(IDbContextFactory con .ToResult(risk!.Map()); })); - public async ValueTask UpdateRiskAsync(UpdateRiskRequest request, CancellationToken cancellationToken = default) => - await Result.Try((Func>)(async () => + public async Task UpdateRiskAsync(UpdateRiskRequest request, CancellationToken cancellationToken = default) => + await Result.Try((Func>)(async () => { await using var context = await contextFactory.CreateDbContextAsync(cancellationToken); @@ -153,8 +153,8 @@ public sealed class ExecutionService(IDbContextFactory con return Result.OkIf(changedTotal > 0, UpdateError.New); })); - public async ValueTask UpdateDisbursementAsync(UpdateDisbursementRequest request, Guid userId, CancellationToken cancellationToken = default) => - await Result.Try((Func>)(async () => + public async Task UpdateDisbursementAsync(UpdateDisbursementRequest request, Guid userId, CancellationToken cancellationToken = default) => + await Result.Try((Func>)(async () => { await using var context = await contextFactory.CreateDbContextAsync(cancellationToken); diff --git a/PostFundManagement.Application/Services/Governance/GovernanceCacheService.cs b/PostFundManagement.Application/Services/Governance/GovernanceCacheService.cs index 283d047..8c6e154 100644 --- a/PostFundManagement.Application/Services/Governance/GovernanceCacheService.cs +++ b/PostFundManagement.Application/Services/Governance/GovernanceCacheService.cs @@ -3,6 +3,7 @@ using PostFundManagement.Application.Abstractions.Services; using PostFundManagement.Application.Extensions; using PostFundManagement.Application.Services.Shared; using PostFundManagement.Domain; +using PostFundManagement.Domain.Attributes; using PostFundManagement.Domain.Models; using static PostFundManagement.Domain.Extensions.Constants; @@ -11,14 +12,16 @@ namespace PostFundManagement.Application.Services.Governance; public sealed class GovernanceCacheService(GovernanceService service, IDistributedCache cache, IFeatureManager featureManager) : ServiceCacheBase, IGovernanceService { - public async ValueTask CreateOrganisationAsync(CreateOrganisationRequest request, Guid userId, CancellationToken cancellationToken = default) => + [Audit] + public async Task CreateOrganisationAsync(CreateOrganisationRequest request, Guid userId, CancellationToken cancellationToken = default) => await service.CreateOrganisationAsync(request, userId, cancellationToken); - public async ValueTask CreatePortfolioAsync(CreatePortfolioRequest request, Guid userId, CancellationToken cancellationToken = default) => + [Audit] + public async Task CreatePortfolioAsync(CreatePortfolioRequest request, Guid userId, CancellationToken cancellationToken = default) => await service.CreatePortfolioAsync(request, userId, cancellationToken); - public async ValueTask> GetDashboardAsync(CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public async Task> GetDashboardAsync(CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { if (!await featureManager.IsEnabledAsync(ServiceCachingFeature)) return await service.GetDashboardAsync(cancellationToken); @@ -41,8 +44,8 @@ public sealed class GovernanceCacheService(GovernanceService service, IDistribut return Result.Ok(cached.FromJson()); })); - public async ValueTask> GetInstrumentsAsync(string programmeIdHash, CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public async Task> GetInstrumentsAsync(string programmeIdHash, CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { if (!await featureManager.IsEnabledAsync(ServiceCachingFeature)) return await service.GetInstrumentsAsync(programmeIdHash, cancellationToken); @@ -65,8 +68,8 @@ public sealed class GovernanceCacheService(GovernanceService service, IDistribut return Result.Ok(cached.FromJson()); })); - public async ValueTask> GetOrganisationAsync(string organisationIdHash, CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public async Task> GetOrganisationAsync(string organisationIdHash, CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { if (!await featureManager.IsEnabledAsync(ServiceCachingFeature)) return await service.GetOrganisationAsync(organisationIdHash, cancellationToken); @@ -89,8 +92,8 @@ public sealed class GovernanceCacheService(GovernanceService service, IDistribut return Result.Ok(cached.FromJson()); })); - public async ValueTask> GetOrganisationsAsync(Pagination pagination, CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public async Task> GetOrganisationsAsync(Pagination pagination, CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { if (!await featureManager.IsEnabledAsync(ServiceCachingFeature)) return await service.GetOrganisationsAsync(pagination, cancellationToken); @@ -113,8 +116,8 @@ public sealed class GovernanceCacheService(GovernanceService service, IDistribut return Result.Ok(cached.FromJson()); })); - public async ValueTask> GetPorfoliosAsync(string organisationIdHash, CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public async Task> GetPorfoliosAsync(string organisationIdHash, CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { if (!await featureManager.IsEnabledAsync(ServiceCachingFeature)) return await service.GetPorfoliosAsync(organisationIdHash, cancellationToken); @@ -137,8 +140,8 @@ public sealed class GovernanceCacheService(GovernanceService service, IDistribut return Result.Ok(cached.FromJson()); })); - public async ValueTask> GetPortfolioAsync(string portfolioIdHash, CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public async Task> GetPortfolioAsync(string portfolioIdHash, CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { if (!await featureManager.IsEnabledAsync(ServiceCachingFeature)) return await service.GetPortfolioAsync(portfolioIdHash, cancellationToken); @@ -161,8 +164,8 @@ public sealed class GovernanceCacheService(GovernanceService service, IDistribut return Result.Ok(cached.FromJson()); })); - public async ValueTask> GetPortfolioProgrammesAsync(string portfolioIdHash, CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public async Task> GetPortfolioProgrammesAsync(string portfolioIdHash, CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { if (!await featureManager.IsEnabledAsync(ServiceCachingFeature)) return await service.GetPortfolioProgrammesAsync(portfolioIdHash, cancellationToken); @@ -185,8 +188,8 @@ public sealed class GovernanceCacheService(GovernanceService service, IDistribut return Result.Ok(cached.FromJson()); })); - public async ValueTask> GetProgrammesAsync(string portfolioIdHash, CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public async Task> GetProgrammesAsync(string portfolioIdHash, CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { if (!await featureManager.IsEnabledAsync(ServiceCachingFeature)) return await service.GetProgrammesAsync(portfolioIdHash, cancellationToken); @@ -209,9 +212,11 @@ public sealed class GovernanceCacheService(GovernanceService service, IDistribut return Result.Ok(cached.FromJson()); })); - public async ValueTask> UpdateOrganisationAsync(UpdateOrganisationRequest request, CancellationToken cancellationToken = default) => + [Audit] + public async Task> UpdateOrganisationAsync(UpdateOrganisationRequest request, CancellationToken cancellationToken = default) => await service.UpdateOrganisationAsync(request, cancellationToken); - public async ValueTask UpdatePortfolioAsync(UpdatePortfolioRequest request, Guid userId, CancellationToken cancellationToken = default) => + [Audit] + public async Task UpdatePortfolioAsync(UpdatePortfolioRequest request, Guid userId, CancellationToken cancellationToken = default) => await service.UpdatePortfolioAsync(request, userId, cancellationToken); } diff --git a/PostFundManagement.Application/Services/Governance/GovernanceService.cs b/PostFundManagement.Application/Services/Governance/GovernanceService.cs index 53e1e03..ae6fe56 100644 --- a/PostFundManagement.Application/Services/Governance/GovernanceService.cs +++ b/PostFundManagement.Application/Services/Governance/GovernanceService.cs @@ -1,18 +1,18 @@ using PostFundManagement.Application.Abstractions.Services; +using PostFundManagement.Application.Extensions; using PostFundManagement.Application.Services.Shared; using PostFundManagement.Domain; 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; public sealed class GovernanceService(IDbContextFactory contextFactory, HashService hashService) : IGovernanceService { - public async ValueTask> GetProgrammesAsync(string portfolioIdHash, CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public async Task> GetProgrammesAsync(string portfolioIdHash, CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { var decodeResult = hashService.DecodeLongIdHash(portfolioIdHash); @@ -30,8 +30,8 @@ public sealed class GovernanceService(IDbContextFactory co return Result.Ok(programmes.Select(p => p.Map()).ToArray()); })); - public async ValueTask> GetPorfoliosAsync(string organisationIdHash, CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public async Task> GetPorfoliosAsync(string organisationIdHash, CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { var decodeResult = hashService.DecodeLongIdHash(organisationIdHash); @@ -49,8 +49,8 @@ public sealed class GovernanceService(IDbContextFactory co return Result.Ok(portfolios.Select(p => p.Map()).ToArray()); })); - public async ValueTask> GetOrganisationsAsync(Pagination pagination, CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public async Task> GetOrganisationsAsync(Pagination pagination, CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { await using var context = await contextFactory.CreateDbContextAsync(cancellationToken); @@ -63,8 +63,8 @@ public sealed class GovernanceService(IDbContextFactory co return Result.Ok(organisations.Select(o => o.Map()).ToArray()); })); - public async ValueTask> GetOrganisationAsync(string organisationIdHash, CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public async Task> GetOrganisationAsync(string organisationIdHash, CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { var decodeResult = hashService.DecodeLongIdHash(organisationIdHash); @@ -81,8 +81,8 @@ public sealed class GovernanceService(IDbContextFactory co .ToResult(organisation!.Map()); })); - public async ValueTask> GetInstrumentsAsync(string programmeIdHash, CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public async Task> GetInstrumentsAsync(string programmeIdHash, CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { var decodeResult = hashService.DecodeLongIdHash(programmeIdHash); @@ -100,8 +100,8 @@ public sealed class GovernanceService(IDbContextFactory co return Result.Ok(instruments.Select(i => i.Map()).ToArray()); })); - public async ValueTask> GetDashboardAsync(CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public async Task> GetDashboardAsync(CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { await using var context = await contextFactory.CreateDbContextAsync(cancellationToken); @@ -126,8 +126,8 @@ public sealed class GovernanceService(IDbContextFactory co disbursedAmount, onTrackPercentage, atRiskCount, beneficiariesReached)); })); - public async ValueTask CreateOrganisationAsync(CreateOrganisationRequest request, Guid userId, CancellationToken cancellationToken = default) => - await Result.Try((Func>)(async () => + public async Task CreateOrganisationAsync(CreateOrganisationRequest request, Guid userId, CancellationToken cancellationToken = default) => + await Result.Try((Func>)(async () => { await using var context = await contextFactory.CreateDbContextAsync(cancellationToken); @@ -150,8 +150,8 @@ public sealed class GovernanceService(IDbContextFactory co return Result.OkIf(await context.SaveChangesAsync(cancellationToken) > 0, CreateError.New); })); - public async ValueTask> UpdateOrganisationAsync(UpdateOrganisationRequest request, CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public async Task> UpdateOrganisationAsync(UpdateOrganisationRequest request, CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { await using var context = await contextFactory.CreateDbContextAsync(cancellationToken); @@ -166,8 +166,8 @@ public sealed class GovernanceService(IDbContextFactory co return Result.OkIf(changedTotal > 0, UpdateError.New); })); - public async ValueTask CreatePortfolioAsync(CreatePortfolioRequest request, Guid userId, CancellationToken cancellationToken = default) => - await Result.Try((Func>)(async () => + public async Task CreatePortfolioAsync(CreatePortfolioRequest request, Guid userId, CancellationToken cancellationToken = default) => + await Result.Try((Func>)(async () => { await using var context = await contextFactory.CreateDbContextAsync(cancellationToken); @@ -195,8 +195,8 @@ public sealed class GovernanceService(IDbContextFactory co return Result.OkIf(await context.SaveChangesAsync(cancellationToken) > 0, CreateError.New); })); - public async ValueTask UpdatePortfolioAsync(UpdatePortfolioRequest request, Guid userId, CancellationToken cancellationToken = default) => - await Result.Try((Func>)(async () => + public async Task UpdatePortfolioAsync(UpdatePortfolioRequest request, Guid userId, CancellationToken cancellationToken = default) => + await Result.Try((Func>)(async () => { await using var context = await contextFactory.CreateDbContextAsync(cancellationToken); @@ -213,8 +213,8 @@ public sealed class GovernanceService(IDbContextFactory co return Result.OkIf(changedTotal > 0, UpdateError.Create("Nothing was saved, no change detected.")); })); - public async ValueTask> GetPortfolioProgrammesAsync(string portfolioIdHash, CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public async Task> GetPortfolioProgrammesAsync(string portfolioIdHash, CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { var decodeResult = hashService.DecodeLongIdHash(portfolioIdHash); @@ -232,8 +232,8 @@ public sealed class GovernanceService(IDbContextFactory co return Result.Ok(programmes.Select(p => p.Map()).ToArray()); })); - public async ValueTask> GetPortfolioAsync(string portfolioIdHash, CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public async Task> GetPortfolioAsync(string portfolioIdHash, CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { var decodeResult = hashService.DecodeLongIdHash(portfolioIdHash); diff --git a/PostFundManagement.Application/Services/Grants/GrantsCacheService.cs b/PostFundManagement.Application/Services/Grants/GrantsCacheService.cs index 2427f04..c002711 100644 --- a/PostFundManagement.Application/Services/Grants/GrantsCacheService.cs +++ b/PostFundManagement.Application/Services/Grants/GrantsCacheService.cs @@ -3,6 +3,7 @@ using PostFundManagement.Application.Abstractions.Services; using PostFundManagement.Application.Extensions; using PostFundManagement.Application.Services.Shared; using PostFundManagement.Domain; +using PostFundManagement.Domain.Attributes; using PostFundManagement.Domain.Models; using static PostFundManagement.Domain.Extensions.Constants; @@ -11,20 +12,24 @@ namespace PostFundManagement.Application.Services.Grants; public sealed class GrantsCacheService(GrantsService service, IDistributedCache cache, IFeatureManager featureManager) : ServiceCacheBase, IGrantsService { - public async ValueTask CreateAwardAsync(CreateAwardRequest request, Guid userId, CancellationToken cancellationToken = default) => + [Audit] + public async Task CreateAwardAsync(CreateAwardRequest request, Guid userId, CancellationToken cancellationToken = default) => await service.CreateAwardAsync(request, userId, cancellationToken); - public async ValueTask CreateBudgetAsync(CreateBudgetRequest request, Guid userId, CancellationToken cancellationToken = default) => + [Audit] + public async Task CreateBudgetAsync(CreateBudgetRequest request, Guid userId, CancellationToken cancellationToken = default) => await service.CreateBudgetAsync(request, userId, cancellationToken); - public async ValueTask CreateContractAsync(CreateContractRequest request, Guid userId, CancellationToken cancellationToken = default) => + [Audit] + public async Task CreateContractAsync(CreateContractRequest request, Guid userId, CancellationToken cancellationToken = default) => await service.CreateContractAsync(request, userId, cancellationToken); - public async ValueTask ExecuteContractAsync(ExecuteContractRequest request, Guid userId, CancellationToken cancellationToken = default) => + [Audit] + public async Task ExecuteContractAsync(ExecuteContractRequest request, Guid userId, CancellationToken cancellationToken = default) => await service.ExecuteContractAsync(request, userId, cancellationToken); - public async ValueTask> GetAwardAsync(string awardIdHash, CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public async Task> GetAwardAsync(string awardIdHash, CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { if (!await featureManager.IsEnabledAsync(ServiceCachingFeature)) return await service.GetAwardAsync(awardIdHash, cancellationToken); @@ -47,8 +52,8 @@ public sealed class GrantsCacheService(GrantsService service, IDistributedCache return Result.Ok(cached.FromJson()); })); - public async ValueTask> GetAwardsAsync(Pagination pagination, CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public async Task> GetAwardsAsync(Pagination pagination, CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { if (!await featureManager.IsEnabledAsync(ServiceCachingFeature)) return await service.GetAwardsAsync(pagination, cancellationToken); @@ -71,8 +76,8 @@ public sealed class GrantsCacheService(GrantsService service, IDistributedCache return Result.Ok(cached.FromJson()); })); - public async ValueTask> GetBudgetAsync(string budgetIdHash, CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public async Task> GetBudgetAsync(string budgetIdHash, CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { if (!await featureManager.IsEnabledAsync(ServiceCachingFeature)) return await service.GetBudgetAsync(budgetIdHash, cancellationToken); @@ -95,8 +100,8 @@ public sealed class GrantsCacheService(GrantsService service, IDistributedCache return Result.Ok(cached.FromJson()); })); - public async ValueTask> GetBudgetsAsync(Pagination pagination, CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public async Task> GetBudgetsAsync(Pagination pagination, CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { if (!await featureManager.IsEnabledAsync(ServiceCachingFeature)) return await service.GetBudgetsAsync(pagination, cancellationToken); @@ -119,8 +124,8 @@ public sealed class GrantsCacheService(GrantsService service, IDistributedCache return Result.Ok(cached.FromJson()); })); - public async ValueTask> GetContractAsync(string contractIdHash, CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public async Task> GetContractAsync(string contractIdHash, CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { if (!await featureManager.IsEnabledAsync(ServiceCachingFeature)) return await service.GetContractAsync(contractIdHash, cancellationToken); @@ -143,8 +148,8 @@ public sealed class GrantsCacheService(GrantsService service, IDistributedCache return Result.Ok(cached.FromJson()); })); - public async ValueTask> GetContractsAsync(Pagination pagination, CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public async Task> GetContractsAsync(Pagination pagination, CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { if (!await featureManager.IsEnabledAsync(ServiceCachingFeature)) return await service.GetContractsAsync(pagination, cancellationToken); @@ -167,8 +172,8 @@ public sealed class GrantsCacheService(GrantsService service, IDistributedCache return Result.Ok(cached.FromJson()); })); - public async ValueTask> GetContractUrlAsync(string contractIdHash, CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public async Task> GetContractUrlAsync(string contractIdHash, CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { if (!await featureManager.IsEnabledAsync(ServiceCachingFeature)) return await service.GetContractUrlAsync(contractIdHash, cancellationToken); @@ -191,9 +196,11 @@ public sealed class GrantsCacheService(GrantsService service, IDistributedCache return Result.Ok(cached!); })); - public async ValueTask UpdateContractAsync(UpdateContractRequest request, CancellationToken cancellationToken = default) => + [Audit] + public async Task UpdateContractAsync(UpdateContractRequest request, CancellationToken cancellationToken = default) => await service.UpdateContractAsync(request, cancellationToken); - public async ValueTask UploadContractAsync(string contractIdHash, Guid userId, IFormFile file, CancellationToken cancellationToken = default) => + [Audit] + public async Task UploadContractAsync(string contractIdHash, Guid userId, IFormFile file, CancellationToken cancellationToken = default) => await service.UploadContractAsync(contractIdHash, userId, file, cancellationToken); } diff --git a/PostFundManagement.Application/Services/Grants/GrantsService.cs b/PostFundManagement.Application/Services/Grants/GrantsService.cs index ac31e32..3784947 100644 --- a/PostFundManagement.Application/Services/Grants/GrantsService.cs +++ b/PostFundManagement.Application/Services/Grants/GrantsService.cs @@ -12,8 +12,8 @@ namespace PostFundManagement.Application.Services.Grants; public sealed class GrantsService(IDbContextFactory contextFactory, HashService hashService, [FromKeyedServices(Constants.GeneralBucketName)] IS3Service s3Service) : IGrantsService { - public async ValueTask> GetContractsAsync(Pagination pagination, CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public async Task> GetContractsAsync(Pagination pagination, CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { await using var context = await contextFactory.CreateDbContextAsync(cancellationToken); @@ -26,8 +26,8 @@ public sealed class GrantsService(IDbContextFactory contex return Result.Ok(contracts.Select(c => c.Map()).ToArray()); })); - public async ValueTask> GetContractAsync(string contractIdHash, CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public async Task> GetContractAsync(string contractIdHash, CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { var decodeResult = hashService.DecodeLongIdHash(contractIdHash); @@ -44,8 +44,8 @@ public sealed class GrantsService(IDbContextFactory contex .ToResult(contract!.Map()); })); - public async ValueTask> GetBudgetsAsync(Pagination pagination, CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public async Task> GetBudgetsAsync(Pagination pagination, CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { await using var context = await contextFactory.CreateDbContextAsync(cancellationToken); @@ -58,8 +58,8 @@ public sealed class GrantsService(IDbContextFactory contex return Result.Ok(budgets.Select(b => b.Map()).ToArray()); })); - public async ValueTask> GetBudgetAsync(string budgetIdHash, CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public async Task> GetBudgetAsync(string budgetIdHash, CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { var decodeResult = hashService.DecodeLongIdHash(budgetIdHash); @@ -76,8 +76,8 @@ public sealed class GrantsService(IDbContextFactory contex .ToResult(budget!.Map()); })); - public async ValueTask> GetAwardsAsync(Pagination pagination, CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public async Task> GetAwardsAsync(Pagination pagination, CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { await using var context = await contextFactory.CreateDbContextAsync(cancellationToken); @@ -90,8 +90,8 @@ public sealed class GrantsService(IDbContextFactory contex return Result.Ok(awards.Select(a => a.Map()).ToArray()); })); - public async ValueTask> GetAwardAsync(string awardIdHash, CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public async Task> GetAwardAsync(string awardIdHash, CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { var decodeResult = hashService.DecodeLongIdHash(awardIdHash); @@ -107,8 +107,8 @@ public sealed class GrantsService(IDbContextFactory contex .ToResult(award!.Map()); })); - public async ValueTask ExecuteContractAsync(ExecuteContractRequest request, Guid userId, CancellationToken cancellationToken = default) => - await Result.Try((Func>)(async () => + public async Task ExecuteContractAsync(ExecuteContractRequest request, Guid userId, CancellationToken cancellationToken = default) => + await Result.Try((Func>)(async () => { await using var context = await contextFactory.CreateDbContextAsync(cancellationToken); @@ -123,8 +123,8 @@ public sealed class GrantsService(IDbContextFactory contex return Result.OkIf(await context.SaveChangesAsync(cancellationToken) > 0, UpdateError.New); })); - public async ValueTask CreateContractAsync(CreateContractRequest request, Guid userId, CancellationToken cancellationToken = default) => - await Result.Try((Func>)(async () => + public async Task CreateContractAsync(CreateContractRequest request, Guid userId, CancellationToken cancellationToken = default) => + await Result.Try((Func>)(async () => { await using var context = await contextFactory.CreateDbContextAsync(cancellationToken); @@ -150,8 +150,8 @@ public sealed class GrantsService(IDbContextFactory contex return Result.OkIf(await context.SaveChangesAsync(cancellationToken) > 0, CreateError.New); })); - public async ValueTask CreateBudgetAsync(CreateBudgetRequest request, Guid userId, CancellationToken cancellationToken = default) => - await Result.Try((Func>)(async () => + public async Task CreateBudgetAsync(CreateBudgetRequest request, Guid userId, CancellationToken cancellationToken = default) => + await Result.Try((Func>)(async () => { if (request.Amount <= 0) return Result.Fail(ValidationError.Create("Budget amount must be greater than zero.")); @@ -175,8 +175,8 @@ public sealed class GrantsService(IDbContextFactory contex return Result.OkIf(await context.SaveChangesAsync(cancellationToken) > 0, CreateError.New); })); - public async ValueTask CreateAwardAsync(CreateAwardRequest request, Guid userId, CancellationToken cancellationToken = default) => - await Result.Try((Func>)(async () => + public async Task CreateAwardAsync(CreateAwardRequest request, Guid userId, CancellationToken cancellationToken = default) => + await Result.Try((Func>)(async () => { if (request.Amount <= 0) return Result.Fail(ValidationError.Create("Approved amount must be greater than zero.")); @@ -204,8 +204,8 @@ public sealed class GrantsService(IDbContextFactory contex return Result.OkIf(await context.SaveChangesAsync(cancellationToken) > 0, CreateError.New); })); - public async ValueTask> GetContractUrlAsync(string contractIdHash, CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public async Task> GetContractUrlAsync(string contractIdHash, CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { var decodeResult = hashService.DecodeLongIdHash(contractIdHash); @@ -231,8 +231,8 @@ public sealed class GrantsService(IDbContextFactory contex .ToResult(secureDownloadUrlResult.Value); })); - public async ValueTask UploadContractAsync(string contractIdHash, Guid userId, IFormFile file, CancellationToken cancellationToken = default) => - await Result.Try((Func>)(async () => + public async Task UploadContractAsync(string contractIdHash, Guid userId, IFormFile file, CancellationToken cancellationToken = default) => + await Result.Try((Func>)(async () => { var decodeResult = hashService.DecodeLongIdHash(contractIdHash); @@ -261,8 +261,8 @@ public sealed class GrantsService(IDbContextFactory contex CreateError.Create("Failed to upload contract file")); })); - public async ValueTask UpdateContractAsync(UpdateContractRequest request, CancellationToken cancellationToken = default) => - await Result.Try((Func>)(async () => + public async Task UpdateContractAsync(UpdateContractRequest request, CancellationToken cancellationToken = default) => + await Result.Try((Func>)(async () => { await using var context = await contextFactory.CreateDbContextAsync(cancellationToken); diff --git a/PostFundManagement.Application/Services/Projects/ProjectCacheService.cs b/PostFundManagement.Application/Services/Projects/ProjectCacheService.cs index 6dd75d2..e19e611 100644 --- a/PostFundManagement.Application/Services/Projects/ProjectCacheService.cs +++ b/PostFundManagement.Application/Services/Projects/ProjectCacheService.cs @@ -3,6 +3,7 @@ using PostFundManagement.Application.Abstractions.Services; using PostFundManagement.Application.Extensions; using PostFundManagement.Application.Services.Shared; using PostFundManagement.Domain; +using PostFundManagement.Domain.Attributes; using PostFundManagement.Domain.Models; using static PostFundManagement.Domain.Extensions.Constants; @@ -11,17 +12,20 @@ namespace PostFundManagement.Application.Services.Projects; public sealed class ProjectCacheService(ProjectService service, IDistributedCache cache, IFeatureManager featureManager) : ServiceCacheBase, IProjectService { - public async ValueTask CreateActivityAsync(CreateActivityRequest request, Guid userId, CancellationToken cancellationToken = default) => + [Audit] + public async Task CreateActivityAsync(CreateActivityRequest request, Guid userId, CancellationToken cancellationToken = default) => await service.CreateActivityAsync(request, userId, cancellationToken); - public async ValueTask CreateProgrammeAsync(CreateProgrammeRequest request, Guid userId, CancellationToken cancellationToken = default) => + [Audit] + public async Task CreateProgrammeAsync(CreateProgrammeRequest request, Guid userId, CancellationToken cancellationToken = default) => await service.CreateProgrammeAsync(request, userId, cancellationToken); - public async ValueTask CreateProjectAsync(CreateProjectRequest request, Guid userId, CancellationToken cancellationToken = default) => + [Audit] + public async Task CreateProjectAsync(CreateProjectRequest request, Guid userId, CancellationToken cancellationToken = default) => await service.CreateProjectAsync(request, userId, cancellationToken); - public async ValueTask> GetActivitiesAsync(string projectIdHash, CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public async Task> GetActivitiesAsync(string projectIdHash, CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { if (!await featureManager.IsEnabledAsync(ServiceCachingFeature)) return await service.GetActivitiesAsync(projectIdHash, cancellationToken); @@ -44,8 +48,8 @@ public sealed class ProjectCacheService(ProjectService service, IDistributedCach return Result.Ok(cached.FromJson()); })); - public async ValueTask> GetActivityAsync(string activityIdHash, CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public async Task> GetActivityAsync(string activityIdHash, CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { if (!await featureManager.IsEnabledAsync(ServiceCachingFeature)) return await service.GetActivityAsync(activityIdHash, cancellationToken); @@ -68,8 +72,8 @@ public sealed class ProjectCacheService(ProjectService service, IDistributedCach return Result.Ok(cached.FromJson()); })); - public async ValueTask> GetMilestoneAsync(string milestoneIdHash, CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public async Task> GetMilestoneAsync(string milestoneIdHash, CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { if (!await featureManager.IsEnabledAsync(ServiceCachingFeature)) return await service.GetMilestoneAsync(milestoneIdHash, cancellationToken); @@ -92,8 +96,8 @@ public sealed class ProjectCacheService(ProjectService service, IDistributedCach return Result.Ok(cached.FromJson()); })); - public async ValueTask> GetMilestonesAsync(Pagination pagination, CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public async Task> GetMilestonesAsync(Pagination pagination, CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { if (!await featureManager.IsEnabledAsync(ServiceCachingFeature)) return await service.GetMilestonesAsync(pagination, cancellationToken); @@ -116,8 +120,8 @@ public sealed class ProjectCacheService(ProjectService service, IDistributedCach return Result.Ok(cached.FromJson()); })); - public async ValueTask> GetProgrammeAsync(string programmeIdHash, CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public async Task> GetProgrammeAsync(string programmeIdHash, CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { if (!await featureManager.IsEnabledAsync(ServiceCachingFeature)) return await service.GetProgrammeAsync(programmeIdHash, cancellationToken); @@ -140,8 +144,8 @@ public sealed class ProjectCacheService(ProjectService service, IDistributedCach return Result.Ok(cached!.FromJson()); })); - public async ValueTask> GetProgrammeProjectsAsync(string programmeIdHash, CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public async Task> GetProgrammeProjectsAsync(string programmeIdHash, CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { if (!await featureManager.IsEnabledAsync(ServiceCachingFeature)) return await service.GetProgrammeProjectsAsync(programmeIdHash, cancellationToken); @@ -164,8 +168,8 @@ public sealed class ProjectCacheService(ProjectService service, IDistributedCach return Result.Ok(cached.FromJson()); })); - public async ValueTask> GetProgrammesAsync(Pagination pagination, CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public async Task> GetProgrammesAsync(Pagination pagination, CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { if (!await featureManager.IsEnabledAsync(ServiceCachingFeature)) return await service.GetProgrammesAsync(pagination, cancellationToken); @@ -188,8 +192,8 @@ public sealed class ProjectCacheService(ProjectService service, IDistributedCach return Result.Ok(cached.FromJson()); })); - public async ValueTask> GetProjectAsync(string projectIdHash, CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public async Task> GetProjectAsync(string projectIdHash, CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { if (!await featureManager.IsEnabledAsync(ServiceCachingFeature)) return await service.GetProjectAsync(projectIdHash, cancellationToken); @@ -212,8 +216,8 @@ public sealed class ProjectCacheService(ProjectService service, IDistributedCach return Result.Ok(cached.FromJson()); })); - public async ValueTask> GetProjectIndicatorsAsync(string projectIdHash, CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public async Task> GetProjectIndicatorsAsync(string projectIdHash, CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { if (!await featureManager.IsEnabledAsync(ServiceCachingFeature)) return await service.GetProjectIndicatorsAsync(projectIdHash, cancellationToken); @@ -236,8 +240,8 @@ public sealed class ProjectCacheService(ProjectService service, IDistributedCach return Result.Ok(cached.FromJson()); })); - public async ValueTask> GetProjectMilestonesAsync(string projectIdHash, CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public async Task> GetProjectMilestonesAsync(string projectIdHash, CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { if (!await featureManager.IsEnabledAsync(ServiceCachingFeature)) return await service.GetProjectMilestonesAsync(projectIdHash, cancellationToken); @@ -260,8 +264,8 @@ public sealed class ProjectCacheService(ProjectService service, IDistributedCach return Result.Ok(cached.FromJson()); })); - public async ValueTask> GetProjectRisksAsync(string projectIdHash, CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public async Task> GetProjectRisksAsync(string projectIdHash, CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { if (!await featureManager.IsEnabledAsync(ServiceCachingFeature)) return await service.GetProjectRisksAsync(projectIdHash, cancellationToken); @@ -284,8 +288,8 @@ public sealed class ProjectCacheService(ProjectService service, IDistributedCach return Result.Ok(cached.FromJson()); })); - public async ValueTask> GetProjectsAsync(Pagination pagination, CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public async Task> GetProjectsAsync(Pagination pagination, CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { if (!await featureManager.IsEnabledAsync(ServiceCachingFeature)) return await service.GetProjectsAsync(pagination, cancellationToken); @@ -308,15 +312,19 @@ public sealed class ProjectCacheService(ProjectService service, IDistributedCach return Result.Ok(cached.FromJson()); })); - public async ValueTask UpdateMilestoneAsync(UpdateMilestoneRequest request, Guid userId, CancellationToken cancellationToken = default) => + [Audit] + public async Task UpdateMilestoneAsync(UpdateMilestoneRequest request, Guid userId, CancellationToken cancellationToken = default) => await service.UpdateMilestoneAsync(request, userId, cancellationToken); - public async ValueTask UpdateProgrammeAsync(UpdateProgrammeRequest request, Guid userId, CancellationToken cancellationToken = default) => + [Audit] + public async Task UpdateProgrammeAsync(UpdateProgrammeRequest request, Guid userId, CancellationToken cancellationToken = default) => await service.UpdateProgrammeAsync(request, userId, cancellationToken); - public async ValueTask UpdateProjectAsync(UpdateProjectRequest request, Guid userId, CancellationToken cancellationToken = default) => + [Audit] + public async Task UpdateProjectAsync(UpdateProjectRequest request, Guid userId, CancellationToken cancellationToken = default) => await service.UpdateProjectAsync(request, userId, cancellationToken); - public async ValueTask UpdateProjectStatusAsync(UpdateProjectStatusRequest request, Guid userId, CancellationToken cancellationToken = default) => + [Audit] + public async Task UpdateProjectStatusAsync(UpdateProjectStatusRequest request, Guid userId, CancellationToken cancellationToken = default) => await service.UpdateProjectStatusAsync(request, userId, cancellationToken); } diff --git a/PostFundManagement.Application/Services/Projects/ProjectService.cs b/PostFundManagement.Application/Services/Projects/ProjectService.cs index a53a5e4..60d41b3 100644 --- a/PostFundManagement.Application/Services/Projects/ProjectService.cs +++ b/PostFundManagement.Application/Services/Projects/ProjectService.cs @@ -10,8 +10,8 @@ namespace PostFundManagement.Application.Services.Projects; public sealed class ProjectService(IDbContextFactory contextFactory, HashService hashService) : IProjectService { - public async ValueTask UpdateProjectStatusAsync(UpdateProjectStatusRequest request, Guid userId, CancellationToken cancellationToken = default) => - await Result.Try((Func>)(async () => + public async Task UpdateProjectStatusAsync(UpdateProjectStatusRequest request, Guid userId, CancellationToken cancellationToken = default) => + await Result.Try((Func>)(async () => { await using var context = await contextFactory.CreateDbContextAsync(cancellationToken); @@ -28,8 +28,8 @@ public sealed class ProjectService(IDbContextFactory conte return Result.OkIf(changedTotal > 0, UpdateError.Create("No changes detected, update cancelled.")); })); - public async ValueTask> GetProjectsAsync(Pagination pagination, CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public async Task> GetProjectsAsync(Pagination pagination, CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { await using var context = await contextFactory.CreateDbContextAsync(cancellationToken); @@ -41,8 +41,8 @@ public sealed class ProjectService(IDbContextFactory conte return Result.Ok(projects.Select(p => p.Map()).ToArray()); })); - public async ValueTask> GetProjectAsync(string projectIdHash, CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public async Task> GetProjectAsync(string projectIdHash, CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { var decodeResult = hashService.DecodeLongIdHash(projectIdHash); @@ -59,8 +59,8 @@ public sealed class ProjectService(IDbContextFactory conte .ToResult(project!.Map()); })); - public async ValueTask> GetActivitiesAsync(string projectIdHash, CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public async Task> GetActivitiesAsync(string projectIdHash, CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { var decodeResult = hashService.DecodeLongIdHash(projectIdHash); @@ -77,8 +77,8 @@ public sealed class ProjectService(IDbContextFactory conte return Result.Ok(activities.Select(a => a.Map()).ToArray()); })); - public async ValueTask CreateProjectAsync(CreateProjectRequest request, Guid userId, CancellationToken cancellationToken = default) => - await Result.Try((Func>)(async () => + public async Task CreateProjectAsync(CreateProjectRequest request, Guid userId, CancellationToken cancellationToken = default) => + await Result.Try((Func>)(async () => { using var context = await contextFactory.CreateDbContextAsync(cancellationToken); @@ -108,8 +108,8 @@ public sealed class ProjectService(IDbContextFactory conte CreateError.Create("No changes detected, update cancelled.")); })); - public async ValueTask CreateActivityAsync(CreateActivityRequest request, Guid userId, CancellationToken cancellationToken = default) => - await Result.Try((Func>)(async () => + public async Task CreateActivityAsync(CreateActivityRequest request, Guid userId, CancellationToken cancellationToken = default) => + await Result.Try((Func>)(async () => { await using var context = await contextFactory.CreateDbContextAsync(cancellationToken); @@ -138,8 +138,8 @@ public sealed class ProjectService(IDbContextFactory conte CreateError.Create("No record was created.")); })); - public async ValueTask> GetProjectMilestonesAsync(string projectIdHash, CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public async Task> GetProjectMilestonesAsync(string projectIdHash, CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { var decodeResult = hashService.DecodeLongIdHash(projectIdHash); @@ -157,8 +157,8 @@ public sealed class ProjectService(IDbContextFactory conte return Result.Ok(milestones.Select(i => i.Map()).ToArray()); })); - public async ValueTask> GetProjectIndicatorsAsync(string projectIdHash, CancellationToken cancellationToken) => - await Result.Try((Func>>)(async () => + public async Task> GetProjectIndicatorsAsync(string projectIdHash, CancellationToken cancellationToken) => + await Result.Try((Func>>)(async () => { var decodeResult = hashService.DecodeLongIdHash(projectIdHash); @@ -176,8 +176,8 @@ public sealed class ProjectService(IDbContextFactory conte return Result.Ok(evidences.Select(e => e.Map()).ToArray()); })); - public async ValueTask> GetMilestoneAsync(string milestoneIdHash, CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public async Task> GetMilestoneAsync(string milestoneIdHash, CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { var decodeResult = hashService.DecodeLongIdHash(milestoneIdHash); @@ -193,8 +193,8 @@ public sealed class ProjectService(IDbContextFactory conte .ToResult(milestone!.Map()); })); - public async ValueTask> GetMilestonesAsync(Pagination pagination, CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public async Task> GetMilestonesAsync(Pagination pagination, CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { await using var context = await contextFactory.CreateDbContextAsync(cancellationToken); @@ -207,8 +207,8 @@ public sealed class ProjectService(IDbContextFactory conte return Result.Ok(milestones.Select(i => i.Map()).ToArray()); })); - public async ValueTask UpdateMilestoneAsync(UpdateMilestoneRequest request, Guid userId, CancellationToken cancellationToken = default) => - await Result.Try((Func>)(async () => + public async Task UpdateMilestoneAsync(UpdateMilestoneRequest request, Guid userId, CancellationToken cancellationToken = default) => + await Result.Try((Func>)(async () => { await using var context = await contextFactory.CreateDbContextAsync(cancellationToken); @@ -227,8 +227,8 @@ public sealed class ProjectService(IDbContextFactory conte return Result.OkIf(changedTotal > 0, UpdateError.Create("No changes detected, update cancelled.")); })); - public async ValueTask UpdateProjectAsync(UpdateProjectRequest request, Guid userId, CancellationToken cancellationToken = default) => - await Result.Try((Func>)(async () => + public async Task UpdateProjectAsync(UpdateProjectRequest request, Guid userId, CancellationToken cancellationToken = default) => + await Result.Try((Func>)(async () => { await using var context = await contextFactory.CreateDbContextAsync(cancellationToken); @@ -246,8 +246,8 @@ public sealed class ProjectService(IDbContextFactory conte return Result.OkIf(changedTotal > 0, UpdateError.Create("No changes detected, update cancelled.")); })); - public async ValueTask> GetActivityAsync(string activityIdHash, CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public async Task> GetActivityAsync(string activityIdHash, CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { var decodeResult = hashService.DecodeLongIdHash(activityIdHash); @@ -264,8 +264,8 @@ public sealed class ProjectService(IDbContextFactory conte .ToResult(activity!.Map()); })); - public async ValueTask> GetProjectRisksAsync(string projectIdHash, CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public async Task> GetProjectRisksAsync(string projectIdHash, CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { var decodeResult = hashService.DecodeLongIdHash(projectIdHash); @@ -283,8 +283,8 @@ public sealed class ProjectService(IDbContextFactory conte return Result.Ok(risks.Select(i => i.Map()).ToArray()); })); - public async ValueTask CreateProgrammeAsync(CreateProgrammeRequest request, Guid userId, CancellationToken cancellationToken = default) => - await Result.Try((Func>)(async () => + public async Task CreateProgrammeAsync(CreateProgrammeRequest request, Guid userId, CancellationToken cancellationToken = default) => + await Result.Try((Func>)(async () => { await using var context = await contextFactory.CreateDbContextAsync(cancellationToken); @@ -309,8 +309,8 @@ public sealed class ProjectService(IDbContextFactory conte return Result.OkIf(await context.SaveChangesAsync(cancellationToken) > 0, CreateError.New); })); - public async ValueTask UpdateProgrammeAsync(UpdateProgrammeRequest request, Guid userId, CancellationToken cancellationToken = default) => - await Result.Try((Func>)(async () => + public async Task UpdateProgrammeAsync(UpdateProgrammeRequest request, Guid userId, CancellationToken cancellationToken = default) => + await Result.Try((Func>)(async () => { await using var context = await contextFactory.CreateDbContextAsync(cancellationToken); @@ -328,8 +328,8 @@ public sealed class ProjectService(IDbContextFactory conte return Result.OkIf(changedTotal > 0, UpdateError.Create("No changes detected, update cancelled.")); })); - public async ValueTask> GetProgrammeAsync(string programmeIdHash, CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public async Task> GetProgrammeAsync(string programmeIdHash, CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { var decodeResult = hashService.DecodeLongIdHash(programmeIdHash); @@ -344,8 +344,8 @@ public sealed class ProjectService(IDbContextFactory conte .ToResult(programme!.Map()); })); - public async ValueTask> GetProgrammesAsync(Pagination pagination, CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public async Task> GetProgrammesAsync(Pagination pagination, CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { await using var context = await contextFactory.CreateDbContextAsync(cancellationToken); @@ -358,8 +358,8 @@ public sealed class ProjectService(IDbContextFactory conte return Result.Ok(programmes.Select(i => i.Map()).ToArray()); })); - public async ValueTask> GetProgrammeProjectsAsync(string programmeIdHash, CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public async Task> GetProgrammeProjectsAsync(string programmeIdHash, CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { var decodeResult = hashService.DecodeLongIdHash(programmeIdHash); diff --git a/PostFundManagement.Application/Services/Shared/AuditService.cs b/PostFundManagement.Application/Services/Shared/AuditService.cs index 5104493..25ce543 100644 --- a/PostFundManagement.Application/Services/Shared/AuditService.cs +++ b/PostFundManagement.Application/Services/Shared/AuditService.cs @@ -6,8 +6,8 @@ namespace PostFundManagement.Application.Services.Shared; public sealed class AuditService(IDbContextFactory contextFactory, ITenantContextService tenantContextService) : IService { - public async ValueTask LogActionAsync(string entityId, string entityName, string action, string[] changes, Guid performedBy, CancellationToken cancellationToken = default) => - await Result.Try((Func>)(async () => + 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); diff --git a/PostFundManagement.Application/Services/Shared/BrowserLocalStorageService.cs b/PostFundManagement.Application/Services/Shared/BrowserLocalStorageService.cs index 54cf872..981e343 100644 --- a/PostFundManagement.Application/Services/Shared/BrowserLocalStorageService.cs +++ b/PostFundManagement.Application/Services/Shared/BrowserLocalStorageService.cs @@ -4,32 +4,32 @@ namespace PostFundManagement.Application.Services.Shared; public sealed class BrowserLocalStorageService(ProtectedLocalStorage storage) { - public async ValueTask DeleteAsync(string key) => - await Result.Try((Func>)(async () => + public async Task DeleteAsync(string key) => + await Result.Try((Func>)(async () => { await storage.DeleteAsync(key); return Result.Ok(); })); - public async ValueTask SaveAsync(string key, string value) => - await Result.Try((Func>)(async () => + public async Task SaveAsync(string key, string value) => + await Result.Try((Func>)(async () => { await storage.SetAsync(key, value); return Result.Ok(); })); - public async ValueTask SaveAsync(string key, TValue value) where TValue : class => - await Result.Try((Func>)(async () => + public async Task SaveAsync(string key, TValue value) where TValue : class => + await Result.Try((Func>)(async () => { await storage.SetAsync(key, value); return Result.Ok(); })); - public async ValueTask> GetAsync(string key) => - await Result.Try((Func>>)(async () => + public async Task> GetAsync(string key) => + await Result.Try((Func>>)(async () => { var retrieval = await storage.GetAsync(key); @@ -38,8 +38,8 @@ public sealed class BrowserLocalStorageService(ProtectedLocalStorage storage) .ToResult(retrieval.Value!); })); - public async ValueTask> GetAsync(string key) where TValue : class => - await Result.Try((Func>>)(async () => + public async Task> GetAsync(string key) where TValue : class => + await Result.Try((Func>>)(async () => { var retrieval = await storage.GetAsync(key); diff --git a/PostFundManagement.Application/Services/Shared/EmailService.cs b/PostFundManagement.Application/Services/Shared/EmailService.cs index 4d00835..fb5badd 100644 --- a/PostFundManagement.Application/Services/Shared/EmailService.cs +++ b/PostFundManagement.Application/Services/Shared/EmailService.cs @@ -17,7 +17,7 @@ public sealed class EmailService(IOptions options) : IDisposable public EmailStatuses Status { get; private set; } = EmailStatuses.Disconnected; - public async ValueTask> SendEmailAsync(Message message, CancellationToken cancellationToken = default) + public async Task> SendEmailAsync(Message message, CancellationToken cancellationToken = default) { using var activity = EmailTelemetry.Source.StartActivity("Email Send"); @@ -121,7 +121,7 @@ public sealed class EmailService(IOptions options) : IDisposable return Result.Fail(response); } - public async ValueTask> ConnectAsync(CancellationToken cancellationToken = default) + public async Task> ConnectAsync(CancellationToken cancellationToken = default) { using var activity = EmailTelemetry.Source.StartActivity("Email Connect"); activity?.SetTag("email.smtp.connect", settings.Host); @@ -174,7 +174,7 @@ public sealed class EmailService(IOptions options) : IDisposable } } - public async ValueTask DisconnectAsync(CancellationToken cancellationToken = default) + public async Task DisconnectAsync(CancellationToken cancellationToken = default) { using var activity = EmailTelemetry.Source.StartActivity("Email Disconnect"); activity?.SetTag("email.smtp.disconnect", settings.Host); diff --git a/PostFundManagement.Application/Services/Shared/HashService.cs b/PostFundManagement.Application/Services/Shared/HashService.cs index f3d63a3..ca489d2 100644 --- a/PostFundManagement.Application/Services/Shared/HashService.cs +++ b/PostFundManagement.Application/Services/Shared/HashService.cs @@ -67,7 +67,7 @@ public sealed partial class HashService(IHashids hasher) : IService } public async Task> DecodeHexHash(string hex) => - await Result.Try((Func>>)(async () => + await Result.Try((Func>>)(async () => { string decoded = hasher.DecodeHex(hex); diff --git a/PostFundManagement.Application/Services/Shared/IdentityCacheService.cs b/PostFundManagement.Application/Services/Shared/IdentityCacheService.cs index d69eb62..5a92865 100644 --- a/PostFundManagement.Application/Services/Shared/IdentityCacheService.cs +++ b/PostFundManagement.Application/Services/Shared/IdentityCacheService.cs @@ -5,6 +5,6 @@ namespace PostFundManagement.Application.Services.Shared; public sealed class IdentityCacheService(IdentityService service) : ServiceCacheBase, IIdentityService { - public async ValueTask UserIsAuthorisedAsync(Guid userId, CancellationToken cancellationToken = default) => + public async Task UserIsAuthorisedAsync(Guid userId, CancellationToken cancellationToken = default) => await service.UserIsAuthorisedAsync(userId, cancellationToken); } diff --git a/PostFundManagement.Application/Services/Shared/IdentityService.cs b/PostFundManagement.Application/Services/Shared/IdentityService.cs index e2d59ac..cfe216d 100644 --- a/PostFundManagement.Application/Services/Shared/IdentityService.cs +++ b/PostFundManagement.Application/Services/Shared/IdentityService.cs @@ -7,8 +7,8 @@ namespace PostFundManagement.Application.Services.Shared; public sealed class IdentityService(IDbContextFactory contextFactory) : IIdentityService { - public async ValueTask UserIsAuthorisedAsync(Guid userId, CancellationToken cancellationToken = default) => - await Result.Try((Func>)(async () => + public async Task UserIsAuthorisedAsync(Guid userId, CancellationToken cancellationToken = default) => + await Result.Try((Func>)(async () => { await using var context = await contextFactory.CreateDbContextAsync(cancellationToken); diff --git a/PostFundManagement.Application/Services/Shared/TokenService.cs b/PostFundManagement.Application/Services/Shared/TokenService.cs index ccae082..aab6d3c 100644 --- a/PostFundManagement.Application/Services/Shared/TokenService.cs +++ b/PostFundManagement.Application/Services/Shared/TokenService.cs @@ -9,8 +9,8 @@ public sealed class TokenService(ISecurityConnectApi connectApi, IOptions> GenerateAsync(CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public async Task> GenerateAsync(CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { using var response = await connectApi.GetToken(new Domain.Security.Models.TokenRequest { @@ -34,7 +34,7 @@ public sealed class TokenService(ISecurityConnectApi connectApi, IOptions>>)(async () => + return await Result.Try((Func>>)(async () => { var errorResult = JsonSerializer.Deserialize(contentRaw); diff --git a/PostFundManagement.Application/Services/Tools/ToolCacheService.cs b/PostFundManagement.Application/Services/Tools/ToolCacheService.cs index 92b0ef0..22a3b3f 100644 --- a/PostFundManagement.Application/Services/Tools/ToolCacheService.cs +++ b/PostFundManagement.Application/Services/Tools/ToolCacheService.cs @@ -8,8 +8,8 @@ namespace PostFundManagement.Application.Services.Tools; public sealed class ToolCacheService(ToolService service, IDistributedCache cache, IFeatureManager featureManager) : ServiceCacheBase, IToolService { - public async ValueTask> EncodeLong(long id, CancellationToken cancellationToken) => - await Result.Try((Func>>)(async () => + public async Task> EncodeLong(long id, CancellationToken cancellationToken) => + await Result.Try((Func>>)(async () => { if (!await featureManager.IsEnabledAsync(ServiceCachingFeature)) return await service.EncodeLong(id, cancellationToken); diff --git a/PostFundManagement.Application/Services/Tools/ToolService.cs b/PostFundManagement.Application/Services/Tools/ToolService.cs index 4b3aacb..b6a494f 100644 --- a/PostFundManagement.Application/Services/Tools/ToolService.cs +++ b/PostFundManagement.Application/Services/Tools/ToolService.cs @@ -5,6 +5,6 @@ namespace PostFundManagement.Application.Services.Tools; public sealed class ToolService(HashService service) : IToolService { - public ValueTask> EncodeLong(long id, CancellationToken cancellationToken = default) => - ValueTask.FromResult(service.HashEncodeLongId(id)); + public Task> EncodeLong(long id, CancellationToken cancellationToken = default) => + Task.FromResult(service.HashEncodeLongId(id)); } diff --git a/PostFundManagement.Application/Services/Users/UserCacheService.cs b/PostFundManagement.Application/Services/Users/UserCacheService.cs index a5d3ac3..00a9bfd 100644 --- a/PostFundManagement.Application/Services/Users/UserCacheService.cs +++ b/PostFundManagement.Application/Services/Users/UserCacheService.cs @@ -3,6 +3,7 @@ using PostFundManagement.Application.Abstractions.Services; using PostFundManagement.Application.Extensions; using PostFundManagement.Application.Services.Shared; using PostFundManagement.Domain; +using PostFundManagement.Domain.Attributes; using PostFundManagement.Domain.Models; using static PostFundManagement.Domain.Extensions.Constants; @@ -11,8 +12,8 @@ namespace PostFundManagement.Application.Services.Users; public sealed class UserCacheService(UserService service, IDistributedCache cache, IFeatureManager featureManager) : ServiceCacheBase, IUserService { - public async ValueTask> GetUserAsync(Guid userId, CancellationToken cancellationToken) => - await Result.Try((Func>>)(async () => + public async Task> GetUserAsync(Guid userId, CancellationToken cancellationToken) => + await Result.Try((Func>>)(async () => { if (!await featureManager.IsEnabledAsync(ServiceCachingFeature)) return await service.GetUserAsync(userId, cancellationToken); @@ -35,8 +36,8 @@ public sealed class UserCacheService(UserService service, IDistributedCache cach return Result.Ok(cached.FromJson()); })); - public async ValueTask> GetUsersAsync(Pagination pagination, UserFilterRequest request, CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public async Task> GetUsersAsync(Pagination pagination, UserFilterRequest request, CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { if (!await featureManager.IsEnabledAsync(ServiceCachingFeature)) return await service.GetUsersAsync(pagination, request, cancellationToken); @@ -61,9 +62,11 @@ public sealed class UserCacheService(UserService service, IDistributedCache cach return Result.Ok(cached.FromJson()); })); - public async ValueTask SyncUserAsync(Guid userId, string email, CancellationToken cancellationToken = default) => + [Audit] + public async Task SyncUserAsync(Guid userId, string email, CancellationToken cancellationToken = default) => await service.SyncUserAsync(userId, email, cancellationToken); - public async ValueTask UpdateUserStatusAsync(Guid userId, ActivityStatus status, CancellationToken cancellationToken = default) => + [Audit] + public async Task UpdateUserStatusAsync(Guid userId, ActivityStatus status, CancellationToken cancellationToken = default) => await service.UpdateUserStatusAsync(userId, status, cancellationToken); } diff --git a/PostFundManagement.Application/Services/Users/UserService.cs b/PostFundManagement.Application/Services/Users/UserService.cs index 05efdf5..a156c37 100644 --- a/PostFundManagement.Application/Services/Users/UserService.cs +++ b/PostFundManagement.Application/Services/Users/UserService.cs @@ -9,8 +9,8 @@ namespace PostFundManagement.Application.Services.Users; public sealed class UserService(IDbContextFactory contextFactory) : IUserService { - public async ValueTask SyncUserAsync(Guid userId, string email, CancellationToken cancellationToken = default) => - await Result.Try((Func>)(async () => + public async Task SyncUserAsync(Guid userId, string email, CancellationToken cancellationToken = default) => + await Result.Try((Func>)(async () => { await using var context = await contextFactory.CreateDbContextAsync(cancellationToken); @@ -35,8 +35,8 @@ public sealed class UserService(IDbContextFactory contextF return Result.OkIf(await context.SaveChangesAsync(cancellationToken) > 0, CreateError.New); })); - public async ValueTask> GetUsersAsync(Pagination pagination, UserFilterRequest request, CancellationToken cancellationToken = default) => - await Result.Try((Func>>)(async () => + public async Task> GetUsersAsync(Pagination pagination, UserFilterRequest request, CancellationToken cancellationToken = default) => + await Result.Try((Func>>)(async () => { await using var context = await contextFactory.CreateDbContextAsync(cancellationToken); @@ -65,8 +65,8 @@ public sealed class UserService(IDbContextFactory contextF return Result.Ok(users.Select(u => u.Map()).ToArray()); })); - public async ValueTask UpdateUserStatusAsync(Guid userId, ActivityStatus status, CancellationToken cancellationToken = default) => - await Result.Try((Func>)(async () => + public async Task UpdateUserStatusAsync(Guid userId, ActivityStatus status, CancellationToken cancellationToken = default) => + await Result.Try((Func>)(async () => { await using var context = await contextFactory.CreateDbContextAsync(cancellationToken); @@ -77,8 +77,8 @@ public sealed class UserService(IDbContextFactory contextF return Result.OkIf(changedTotal > 0, UpdateError.New); })); - public async ValueTask> GetUserAsync(Guid userId, CancellationToken cancellationToken) => - await Result.Try((Func>>)(async () => + public async Task> GetUserAsync(Guid userId, CancellationToken cancellationToken) => + await Result.Try((Func>>)(async () => { await using var context = await contextFactory.CreateDbContextAsync(cancellationToken); diff --git a/PostFundManagement.Domain/Abstractions/IS3Service.cs b/PostFundManagement.Domain/Abstractions/IS3Service.cs index 89d00ba..2cee9f2 100644 --- a/PostFundManagement.Domain/Abstractions/IS3Service.cs +++ b/PostFundManagement.Domain/Abstractions/IS3Service.cs @@ -3,7 +3,7 @@ namespace PostFundManagement.Domain.Abstractions; public interface IS3Service { string GenerateCdnUrl(string fileKey); - ValueTask> GeneratePresignedUrlAsync(string fileKey, TimeSpan duration, string? contentType = null, CancellationToken cancellationToken = default); - ValueTask> UploadFileAsync(string fileName, string subPath, Stream fileStream, string contentType, CancellationToken cancellationToken = default); - ValueTask DeleteFileAsync(string fileKey, CancellationToken cancellationToken = default); + Task> GeneratePresignedUrlAsync(string fileKey, TimeSpan duration, string? contentType = null, CancellationToken cancellationToken = default); + Task> UploadFileAsync(string fileName, string subPath, Stream fileStream, string contentType, CancellationToken cancellationToken = default); + Task DeleteFileAsync(string fileKey, CancellationToken cancellationToken = default); } \ No newline at end of file diff --git a/PostFundManagement.Domain/Entities/AuditLog.cs b/PostFundManagement.Domain/Entities/AuditLog.cs index 7d8d833..fc61504 100644 --- a/PostFundManagement.Domain/Entities/AuditLog.cs +++ b/PostFundManagement.Domain/Entities/AuditLog.cs @@ -3,12 +3,7 @@ using static PostFundManagement.Domain.Extensions.Constants; namespace PostFundManagement.Domain.Entities; [EntityTypeConfiguration] -public class AuditLog : Models.AuditLog -{ - public virtual Tenant? Tenant { get; set; } - - public virtual User? Performer { get; set; } -} +public class AuditLog : Models.AuditLog; public sealed class AuditLogConfiguration : IEntityTypeConfiguration { @@ -24,17 +19,5 @@ public sealed class AuditLogConfiguration : IEntityTypeConfiguration builder.Property(f => f.Changes).IsRequired(false).HasColumnType("jsonb"); builder.Property(f => f.PerformedBy).IsRequired(); builder.Property(f => f.Timestamp).IsRequired().HasDefaultValueSql("now()"); - - builder.HasOne(f => f.Tenant) - .WithMany() - .HasForeignKey(fk => fk.TenantId) - .IsRequired(false) - .OnDelete(DeleteBehavior.NoAction); - - builder.HasOne(f => f.Performer) - .WithMany() - .HasForeignKey(fk => fk.PerformedBy) - .IsRequired() - .OnDelete(DeleteBehavior.Restrict); } } \ No newline at end of file diff --git a/PostFundManagement.Infrastructure/Database/Migrations/20260922033954_RemovedRelationshipsFromAuditLog.Designer.cs b/PostFundManagement.Infrastructure/Database/Migrations/20260922033954_RemovedRelationshipsFromAuditLog.Designer.cs new file mode 100644 index 0000000..945a040 --- /dev/null +++ b/PostFundManagement.Infrastructure/Database/Migrations/20260922033954_RemovedRelationshipsFromAuditLog.Designer.cs @@ -0,0 +1,2224 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; +using PostFundManagement.Infrastructure.Database; + +#nullable disable + +namespace PostFundManagement.Infrastructure.Database.Migrations +{ + [DbContext(typeof(ApplicationDbContext))] + [Migration("20260922033954_RemovedRelationshipsFromAuditLog")] + partial class RemovedRelationshipsFromAuditLog + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "10.0.12") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("PostFundManagement.Domain.Entities.Activity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Amount") + .HasPrecision(18, 2) + .HasColumnType("numeric(18,2)"); + + b.Property("ApprovedBy") + .HasColumnType("uuid"); + + b.Property("Category") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("CreatedAt") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("now()"); + + b.Property("CreatedBy") + .HasColumnType("uuid"); + + b.Property("Description") + .IsRequired() + .HasMaxLength(1024) + .HasColumnType("character varying(1024)"); + + b.Property("MilestoneId") + .HasColumnType("bigint"); + + b.Property("PerformedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("ProjectId") + .HasColumnType("bigint"); + + b.Property("Status") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasDefaultValueSql("1"); + + b.Property("Title") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("UpdatedBy") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("ApprovedBy"); + + b.HasIndex("CreatedBy"); + + b.HasIndex("MilestoneId"); + + b.HasIndex("ProjectId"); + + b.HasIndex("UpdatedBy"); + + b.ToTable("Activities", (string)null); + }); + + modelBuilder.Entity("PostFundManagement.Domain.Entities.AuditLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Action") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.PrimitiveCollection("Changes") + .HasColumnType("jsonb"); + + b.Property("EntityId") + .IsRequired() + .HasColumnType("text"); + + b.Property("EntityName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("PerformedBy") + .HasColumnType("uuid"); + + b.Property("TenantId") + .HasColumnType("bigint"); + + b.Property("Timestamp") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("now()"); + + b.HasKey("Id"); + + b.ToTable("AuditLogs", (string)null); + }); + + modelBuilder.Entity("PostFundManagement.Domain.Entities.Award", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Amount") + .HasPrecision(18, 2) + .HasColumnType("numeric(18,2)"); + + b.Property("ApprovedBy") + .HasColumnType("uuid"); + + b.Property("CreatedAt") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("now()"); + + b.Property("CreatedBy") + .HasColumnType("uuid"); + + b.Property("OrganisationId") + .HasColumnType("bigint"); + + b.Property("ProgrammeId") + .HasColumnType("bigint"); + + b.Property("ProjectId") + .HasColumnType("bigint"); + + b.Property("Status") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasDefaultValueSql("1"); + + b.Property("TenantId") + .HasColumnType("bigint"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("UpdatedBy") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("ApprovedBy"); + + b.HasIndex("CreatedBy"); + + b.HasIndex("OrganisationId"); + + b.HasIndex("ProgrammeId"); + + b.HasIndex("ProjectId"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedBy"); + + b.ToTable("Awards", (string)null); + }); + + modelBuilder.Entity("PostFundManagement.Domain.Entities.Beneficiary", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Category") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("CreatedAt") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("now()"); + + b.Property("CreatedBy") + .HasColumnType("uuid"); + + b.Property("Location") + .IsRequired() + .HasColumnType("text"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ProjectId") + .HasColumnType("bigint"); + + b.Property("ReachedCount") + .HasColumnType("integer"); + + b.Property("TargetCount") + .HasColumnType("integer"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("CreatedBy"); + + b.HasIndex("ProjectId"); + + b.HasIndex("UserId"); + + b.ToTable("Beneficiaries", (string)null); + }); + + modelBuilder.Entity("PostFundManagement.Domain.Entities.Budget", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Amount") + .HasPrecision(18, 2) + .HasColumnType("numeric(18,2)"); + + b.Property("ApprovedBy") + .HasColumnType("uuid"); + + b.Property("CreatedAt") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("now()"); + + b.Property("CreatedBy") + .HasColumnType("uuid"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ProjectId") + .HasColumnType("bigint"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.HasIndex("ApprovedBy"); + + b.HasIndex("CreatedBy"); + + b.HasIndex("ProjectId"); + + b.ToTable("Budgets", (string)null); + }); + + modelBuilder.Entity("PostFundManagement.Domain.Entities.ChangeRequest", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ApprovedBy") + .HasColumnType("uuid"); + + b.Property("CreatedAt") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("now()"); + + b.Property("CreatedBy") + .HasColumnType("uuid"); + + b.Property("Justification") + .IsRequired() + .HasMaxLength(1024) + .HasColumnType("character varying(1024)"); + + b.Property("ProjectId") + .HasColumnType("bigint"); + + b.Property("RevisedBudget") + .HasPrecision(18, 2) + .HasColumnType("numeric(18,2)"); + + b.Property("RevisedEndedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Status") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasDefaultValueSql("1"); + + b.Property("Title") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.HasIndex("ApprovedBy"); + + b.HasIndex("CreatedBy"); + + b.HasIndex("ProjectId"); + + b.ToTable("ChangeRequests", (string)null); + }); + + modelBuilder.Entity("PostFundManagement.Domain.Entities.ComplianceItem", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("now()"); + + b.Property("CreatedBy") + .HasColumnType("uuid"); + + b.Property("ProjectId") + .HasColumnType("bigint"); + + b.Property("Requirements") + .IsRequired() + .HasMaxLength(2048) + .HasColumnType("character varying(2048)"); + + b.Property("Status") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasDefaultValueSql("1"); + + b.Property("Title") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("VerifiedBy") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("CreatedBy"); + + b.HasIndex("ProjectId"); + + b.HasIndex("VerifiedBy"); + + b.ToTable("ComplianceItems", (string)null); + }); + + modelBuilder.Entity("PostFundManagement.Domain.Entities.Contract", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AwardId") + .HasColumnType("bigint"); + + b.Property("CreatedAt") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("now()"); + + b.Property("CreatedBy") + .HasColumnType("uuid"); + + b.Property("EffectiveAt") + .HasColumnType("timestamp with time zone"); + + b.Property("ExpiresAt") + .HasColumnType("timestamp with time zone"); + + b.Property("ExternalSignatureId") + .HasColumnType("text"); + + b.Property("SignedDocumentUrl") + .HasColumnType("text"); + + b.Property("Status") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasDefaultValueSql("1"); + + b.Property("TotalValue") + .HasPrecision(18, 2) + .HasColumnType("numeric(18,2)"); + + b.HasKey("Id"); + + b.HasIndex("AwardId") + .IsUnique(); + + b.HasIndex("CreatedBy"); + + b.ToTable("Contracts", (string)null); + }); + + modelBuilder.Entity("PostFundManagement.Domain.Entities.Disbursement", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Amount") + .HasPrecision(18, 2) + .HasColumnType("numeric(18,2)"); + + b.Property("CreatedAt") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("now()"); + + b.Property("CreatedBy") + .HasColumnType("uuid"); + + b.Property("MilestoneId") + .HasColumnType("bigint"); + + b.Property("ProjectId") + .HasColumnType("bigint"); + + b.Property("Status") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasDefaultValueSql("1"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("UpdatedBy") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("CreatedBy"); + + b.HasIndex("MilestoneId"); + + b.HasIndex("ProjectId"); + + b.HasIndex("UpdatedBy"); + + b.ToTable("Disbursements", (string)null); + }); + + modelBuilder.Entity("PostFundManagement.Domain.Entities.Evidence", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ActivityId") + .HasColumnType("bigint"); + + b.Property("CreatedAt") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("now()"); + + b.Property("CreatedBy") + .HasColumnType("uuid"); + + b.Property("DocumentUrl") + .IsRequired() + .HasColumnType("text"); + + b.Property("IndicatorId") + .HasColumnType("bigint"); + + b.Property("MilestoneId") + .HasColumnType("bigint"); + + b.Property("ProjectId") + .HasColumnType("bigint"); + + b.Property("Status") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasDefaultValueSql("1"); + + b.Property("Type") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasDefaultValueSql("9"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("UpdatedBy") + .HasColumnType("uuid"); + + b.Property("Version") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasDefaultValue(1); + + b.HasKey("Id"); + + b.HasIndex("ActivityId"); + + b.HasIndex("CreatedBy"); + + b.HasIndex("IndicatorId"); + + b.HasIndex("MilestoneId"); + + b.HasIndex("ProjectId"); + + b.HasIndex("UpdatedBy"); + + b.ToTable("Evidences", (string)null); + }); + + modelBuilder.Entity("PostFundManagement.Domain.Entities.Indicator", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ActualAmount") + .HasPrecision(18, 2) + .HasColumnType("numeric(18,2)"); + + b.Property("BaselineAmount") + .HasPrecision(18, 2) + .HasColumnType("numeric(18,2)"); + + b.Property("CreatedAt") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("now()"); + + b.Property("CreatedBy") + .HasColumnType("uuid"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ProjectId") + .HasColumnType("bigint"); + + b.Property("TargetAmount") + .HasPrecision(18, 2) + .HasColumnType("numeric(18,2)"); + + b.Property("UnitOfMeasure") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasDefaultValueSql("2"); + + b.HasKey("Id"); + + b.HasIndex("CreatedBy"); + + b.HasIndex("ProjectId"); + + b.ToTable("Indicators", (string)null); + }); + + modelBuilder.Entity("PostFundManagement.Domain.Entities.Instrument", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Code") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("CreatedAt") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("now()"); + + b.Property("CreatedBy") + .HasColumnType("uuid"); + + b.Property("Description") + .HasMaxLength(1024) + .HasColumnType("character varying(1024)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ProgrammeId") + .HasColumnType("bigint"); + + b.Property("Status") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasDefaultValueSql("2"); + + b.HasKey("Id"); + + b.HasIndex("CreatedBy"); + + b.HasIndex("ProgrammeId"); + + b.ToTable("Instruments", (string)null); + }); + + modelBuilder.Entity("PostFundManagement.Domain.Entities.Invite", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AwardId") + .HasColumnType("bigint"); + + b.Property("ContractId") + .HasColumnType("bigint"); + + b.Property("CreatedAt") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("now()"); + + b.Property("CreatedBy") + .HasColumnType("uuid"); + + b.Property("InvitedOrganisationId") + .HasColumnType("bigint"); + + b.Property("OrganisationId") + .HasColumnType("bigint"); + + b.Property("Recipient") + .HasColumnType("uuid"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("UpdatedBy") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("AwardId"); + + b.HasIndex("ContractId"); + + b.HasIndex("InvitedOrganisationId"); + + b.HasIndex("OrganisationId"); + + b.HasIndex("Recipient"); + + b.ToTable("Invites", (string)null); + }); + + modelBuilder.Entity("PostFundManagement.Domain.Entities.Issue", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AssignedTo") + .HasColumnType("uuid"); + + b.Property("CreatedAt") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("now()"); + + b.Property("CreatedBy") + .HasColumnType("uuid"); + + b.Property("Description") + .IsRequired() + .HasMaxLength(1024) + .HasColumnType("character varying(1024)"); + + b.Property("Priority") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasDefaultValueSql("1"); + + b.Property("ProjectId") + .HasColumnType("bigint"); + + b.Property("Resolution") + .IsRequired() + .HasColumnType("text"); + + b.Property("ResolvedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Status") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasDefaultValueSql("1"); + + b.Property("Title") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("AssignedTo"); + + b.HasIndex("CreatedBy"); + + b.HasIndex("ProjectId"); + + b.ToTable("Issues", (string)null); + }); + + modelBuilder.Entity("PostFundManagement.Domain.Entities.Milestone", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("now()"); + + b.Property("CreatedBy") + .HasColumnType("uuid"); + + b.Property("DueAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Priority") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasDefaultValueSql("1"); + + b.Property("ProjectId") + .HasColumnType("bigint"); + + b.Property("Status") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasDefaultValueSql("1"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("UpdatedBy") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("CreatedBy"); + + b.HasIndex("ProjectId"); + + b.HasIndex("UpdatedBy"); + + b.ToTable("Milestones", (string)null); + }); + + modelBuilder.Entity("PostFundManagement.Domain.Entities.Notification", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("now()"); + + b.Property("Destination") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Error") + .HasColumnType("text"); + + b.Property("Message") + .IsRequired() + .HasMaxLength(4096) + .HasColumnType("character varying(4096)"); + + b.Property("OrganisationId") + .HasColumnType("bigint"); + + b.Property("Platform") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasDefaultValueSql("1"); + + b.Property("Recipient") + .HasColumnType("uuid"); + + b.Property("SentAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Status") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasDefaultValueSql("1"); + + b.Property("Subject") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("TenantId") + .HasColumnType("bigint"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.HasIndex("OrganisationId"); + + b.HasIndex("Recipient"); + + b.HasIndex("TenantId"); + + b.ToTable("Notifications", (string)null); + }); + + modelBuilder.Entity("PostFundManagement.Domain.Entities.Organisation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("now()"); + + b.Property("CreatedBy") + .HasColumnType("uuid"); + + b.Property("Email") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("RegistrationNo") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Status") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasDefaultValueSql("1"); + + b.Property("Type") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasDefaultValueSql("5"); + + b.HasKey("Id"); + + b.HasIndex("CreatedBy"); + + b.ToTable("Organisations", (string)null); + }); + + modelBuilder.Entity("PostFundManagement.Domain.Entities.Outcome", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("BeneficiaryId") + .HasColumnType("bigint"); + + b.Property("CreatedAt") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("now()"); + + b.Property("CreatedBy") + .HasColumnType("uuid"); + + b.Property("Description") + .IsRequired() + .HasMaxLength(1024) + .HasColumnType("character varying(1024)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("BeneficiaryId"); + + b.HasIndex("CreatedBy"); + + b.ToTable("Outcomes", (string)null); + }); + + modelBuilder.Entity("PostFundManagement.Domain.Entities.Portfolio", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("now()"); + + b.Property("CreatedBy") + .HasColumnType("uuid"); + + b.Property("Description") + .HasMaxLength(1024) + .HasColumnType("character varying(1024)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("OrganisationId") + .HasColumnType("bigint"); + + b.Property("OwnedBy") + .HasColumnType("uuid"); + + b.Property("TenantId") + .HasColumnType("bigint"); + + b.HasKey("Id"); + + b.HasIndex("CreatedBy"); + + b.HasIndex("OrganisationId"); + + b.HasIndex("OwnedBy"); + + b.HasIndex("TenantId"); + + b.ToTable("Portfolios", (string)null); + }); + + modelBuilder.Entity("PostFundManagement.Domain.Entities.Programme", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("now()"); + + b.Property("CreatedBy") + .HasColumnType("uuid"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("OwnedBy") + .HasColumnType("uuid"); + + b.Property("PortfolioId") + .HasColumnType("bigint"); + + b.Property("Status") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasDefaultValueSql("1"); + + b.Property("TenantId") + .HasColumnType("bigint"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("UpdatedBy") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("CreatedBy"); + + b.HasIndex("OwnedBy"); + + b.HasIndex("PortfolioId"); + + b.HasIndex("TenantId"); + + b.ToTable("Programmes", (string)null); + }); + + modelBuilder.Entity("PostFundManagement.Domain.Entities.Project", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("now()"); + + b.Property("CreatedBy") + .HasColumnType("uuid"); + + b.Property("Description") + .IsRequired() + .HasMaxLength(1024) + .HasColumnType("character varying(1024)"); + + b.Property("EndedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ProgrammeId") + .HasColumnType("bigint"); + + b.Property("ProjectType") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasDefaultValueSql("10"); + + b.Property("Sector") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasDefaultValueSql("11"); + + b.Property("StartedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Status") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasDefaultValueSql("1"); + + b.Property("TenantId") + .HasColumnType("bigint"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("UpdatedBy") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("CreatedBy"); + + b.HasIndex("ProgrammeId"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedBy"); + + b.ToTable("Projects", (string)null); + }); + + modelBuilder.Entity("PostFundManagement.Domain.Entities.Risk", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("now()"); + + b.Property("CreatedBy") + .HasColumnType("uuid"); + + b.Property("Description") + .IsRequired() + .HasMaxLength(1024) + .HasColumnType("character varying(1024)"); + + b.Property("Impact") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasDefaultValueSql("1"); + + b.Property("Likelihood") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasDefaultValueSql("3"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ProjectId") + .HasColumnType("bigint"); + + b.HasKey("Id"); + + b.HasIndex("CreatedBy"); + + b.HasIndex("ProjectId"); + + b.ToTable("Risks", (string)null); + }); + + modelBuilder.Entity("PostFundManagement.Domain.Entities.Rule", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("now()"); + + b.Property("CreatedBy") + .HasColumnType("uuid"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ProgrammeId") + .HasColumnType("bigint"); + + b.Property("Status") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasDefaultValueSql("2"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("UpdatedBy") + .HasColumnType("uuid"); + + b.Property("Version") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasDefaultValue(1); + + b.HasKey("Id"); + + b.HasIndex("CreatedBy"); + + b.HasIndex("ProgrammeId"); + + b.HasIndex("UpdatedBy"); + + b.ToTable("Rules", (string)null); + }); + + modelBuilder.Entity("PostFundManagement.Domain.Entities.SiteVisit", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("now()"); + + b.Property("CreatedBy") + .HasColumnType("uuid"); + + b.Property("Findings") + .HasMaxLength(4096) + .HasColumnType("character varying(4096)"); + + b.Property("InspectorName") + .IsRequired() + .HasColumnType("text"); + + b.Property("ProjectId") + .HasColumnType("bigint"); + + b.Property("Status") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasDefaultValueSql("1"); + + b.Property("VisitedAt") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.HasIndex("CreatedBy"); + + b.HasIndex("ProjectId"); + + b.ToTable("SiteVisits", (string)null); + }); + + modelBuilder.Entity("PostFundManagement.Domain.Entities.Tenant", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("now()"); + + b.Property("CreatedBy") + .HasColumnType("uuid"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Status") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasDefaultValueSql("1"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("UpdatedBy") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("CreatedBy"); + + b.HasIndex("UpdatedBy"); + + b.ToTable("Tenants", (string)null); + }); + + modelBuilder.Entity("PostFundManagement.Domain.Entities.TenantOrganisation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("now()"); + + b.Property("CreatedBy") + .HasColumnType("uuid"); + + b.Property("OrganisationId") + .HasColumnType("bigint"); + + b.Property("Status") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasDefaultValueSql("1"); + + b.Property("TenantId") + .HasColumnType("bigint"); + + b.HasKey("Id"); + + b.HasIndex("CreatedBy"); + + b.HasIndex("OrganisationId"); + + b.HasIndex("TenantId"); + + b.ToTable("TenantOrganisations", (string)null); + }); + + modelBuilder.Entity("PostFundManagement.Domain.Entities.TenantUser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("now()"); + + b.Property("CreatedBy") + .HasColumnType("uuid"); + + b.Property("Status") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasDefaultValueSql("1"); + + b.Property("TenantId") + .HasColumnType("bigint"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("CreatedBy"); + + b.HasIndex("TenantId"); + + b.HasIndex("UserId"); + + b.ToTable("TenantUsers", (string)null); + }); + + modelBuilder.Entity("PostFundManagement.Domain.Entities.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Email") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("LastLoginAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Status") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasDefaultValueSql("2"); + + b.HasKey("Id"); + + b.ToTable("Users", (string)null); + }); + + modelBuilder.Entity("PostFundManagement.Domain.Entities.Activity", b => + { + b.HasOne("PostFundManagement.Domain.Entities.User", "Approver") + .WithMany() + .HasForeignKey("ApprovedBy") + .OnDelete(DeleteBehavior.NoAction); + + b.HasOne("PostFundManagement.Domain.Entities.User", "Creator") + .WithMany() + .HasForeignKey("CreatedBy") + .OnDelete(DeleteBehavior.NoAction) + .IsRequired(); + + b.HasOne("PostFundManagement.Domain.Entities.Milestone", "Milestone") + .WithMany() + .HasForeignKey("MilestoneId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("PostFundManagement.Domain.Entities.Project", "Project") + .WithMany() + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("PostFundManagement.Domain.Entities.User", "Updator") + .WithMany() + .HasForeignKey("UpdatedBy") + .OnDelete(DeleteBehavior.NoAction); + + b.Navigation("Approver"); + + b.Navigation("Creator"); + + b.Navigation("Milestone"); + + b.Navigation("Project"); + + b.Navigation("Updator"); + }); + + modelBuilder.Entity("PostFundManagement.Domain.Entities.Award", b => + { + b.HasOne("PostFundManagement.Domain.Entities.User", "Approver") + .WithMany() + .HasForeignKey("ApprovedBy") + .OnDelete(DeleteBehavior.NoAction); + + b.HasOne("PostFundManagement.Domain.Entities.User", "Creator") + .WithMany() + .HasForeignKey("CreatedBy") + .OnDelete(DeleteBehavior.NoAction) + .IsRequired(); + + b.HasOne("PostFundManagement.Domain.Entities.Organisation", "Organisation") + .WithMany() + .HasForeignKey("OrganisationId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("PostFundManagement.Domain.Entities.Programme", "Programme") + .WithMany("Awards") + .HasForeignKey("ProgrammeId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("PostFundManagement.Domain.Entities.Project", "Project") + .WithMany("Awards") + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.SetNull); + + b.HasOne("PostFundManagement.Domain.Entities.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("PostFundManagement.Domain.Entities.User", "Updator") + .WithMany() + .HasForeignKey("UpdatedBy") + .OnDelete(DeleteBehavior.NoAction); + + b.Navigation("Approver"); + + b.Navigation("Creator"); + + b.Navigation("Organisation"); + + b.Navigation("Programme"); + + b.Navigation("Project"); + + b.Navigation("Tenant"); + + b.Navigation("Updator"); + }); + + modelBuilder.Entity("PostFundManagement.Domain.Entities.Beneficiary", b => + { + b.HasOne("PostFundManagement.Domain.Entities.User", "Creator") + .WithMany() + .HasForeignKey("CreatedBy") + .OnDelete(DeleteBehavior.NoAction) + .IsRequired(); + + b.HasOne("PostFundManagement.Domain.Entities.Project", "Project") + .WithMany() + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("PostFundManagement.Domain.Entities.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.NoAction) + .IsRequired(); + + b.Navigation("Creator"); + + b.Navigation("Project"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("PostFundManagement.Domain.Entities.Budget", b => + { + b.HasOne("PostFundManagement.Domain.Entities.User", "Approver") + .WithMany() + .HasForeignKey("ApprovedBy") + .OnDelete(DeleteBehavior.NoAction); + + b.HasOne("PostFundManagement.Domain.Entities.User", "Creator") + .WithMany() + .HasForeignKey("CreatedBy") + .OnDelete(DeleteBehavior.NoAction) + .IsRequired(); + + b.HasOne("PostFundManagement.Domain.Entities.Project", "Project") + .WithMany() + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.Navigation("Approver"); + + b.Navigation("Creator"); + + b.Navigation("Project"); + }); + + modelBuilder.Entity("PostFundManagement.Domain.Entities.ChangeRequest", b => + { + b.HasOne("PostFundManagement.Domain.Entities.User", "Approver") + .WithMany() + .HasForeignKey("ApprovedBy") + .OnDelete(DeleteBehavior.NoAction); + + b.HasOne("PostFundManagement.Domain.Entities.User", "Creator") + .WithMany() + .HasForeignKey("CreatedBy") + .OnDelete(DeleteBehavior.NoAction) + .IsRequired(); + + b.HasOne("PostFundManagement.Domain.Entities.Project", "Project") + .WithMany() + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.Navigation("Approver"); + + b.Navigation("Creator"); + + b.Navigation("Project"); + }); + + modelBuilder.Entity("PostFundManagement.Domain.Entities.ComplianceItem", b => + { + b.HasOne("PostFundManagement.Domain.Entities.User", "Creator") + .WithMany() + .HasForeignKey("CreatedBy") + .OnDelete(DeleteBehavior.NoAction) + .IsRequired(); + + b.HasOne("PostFundManagement.Domain.Entities.Project", "Project") + .WithMany() + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("PostFundManagement.Domain.Entities.User", "Verifier") + .WithMany() + .HasForeignKey("VerifiedBy") + .OnDelete(DeleteBehavior.NoAction); + + b.Navigation("Creator"); + + b.Navigation("Project"); + + b.Navigation("Verifier"); + }); + + modelBuilder.Entity("PostFundManagement.Domain.Entities.Contract", b => + { + b.HasOne("PostFundManagement.Domain.Entities.Award", "Award") + .WithOne("Contract") + .HasForeignKey("PostFundManagement.Domain.Entities.Contract", "AwardId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("PostFundManagement.Domain.Entities.User", "Creator") + .WithMany() + .HasForeignKey("CreatedBy") + .OnDelete(DeleteBehavior.NoAction) + .IsRequired(); + + b.Navigation("Award"); + + b.Navigation("Creator"); + }); + + modelBuilder.Entity("PostFundManagement.Domain.Entities.Disbursement", b => + { + b.HasOne("PostFundManagement.Domain.Entities.User", "Creator") + .WithMany() + .HasForeignKey("CreatedBy") + .OnDelete(DeleteBehavior.NoAction) + .IsRequired(); + + b.HasOne("PostFundManagement.Domain.Entities.Milestone", "Milestone") + .WithMany() + .HasForeignKey("MilestoneId") + .OnDelete(DeleteBehavior.Restrict); + + b.HasOne("PostFundManagement.Domain.Entities.Project", "Project") + .WithMany() + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("PostFundManagement.Domain.Entities.User", "Updator") + .WithMany() + .HasForeignKey("UpdatedBy") + .OnDelete(DeleteBehavior.NoAction); + + b.Navigation("Creator"); + + b.Navigation("Milestone"); + + b.Navigation("Project"); + + b.Navigation("Updator"); + }); + + modelBuilder.Entity("PostFundManagement.Domain.Entities.Evidence", b => + { + b.HasOne("PostFundManagement.Domain.Entities.Activity", "Activity") + .WithMany("Evidences") + .HasForeignKey("ActivityId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("PostFundManagement.Domain.Entities.User", "Creator") + .WithMany() + .HasForeignKey("CreatedBy") + .OnDelete(DeleteBehavior.NoAction) + .IsRequired(); + + b.HasOne("PostFundManagement.Domain.Entities.Indicator", "Indicator") + .WithMany() + .HasForeignKey("IndicatorId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("PostFundManagement.Domain.Entities.Milestone", "Milestone") + .WithMany() + .HasForeignKey("MilestoneId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("PostFundManagement.Domain.Entities.Project", "Project") + .WithMany() + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("PostFundManagement.Domain.Entities.User", "Updator") + .WithMany() + .HasForeignKey("UpdatedBy") + .OnDelete(DeleteBehavior.NoAction); + + b.Navigation("Activity"); + + b.Navigation("Creator"); + + b.Navigation("Indicator"); + + b.Navigation("Milestone"); + + b.Navigation("Project"); + + b.Navigation("Updator"); + }); + + modelBuilder.Entity("PostFundManagement.Domain.Entities.Indicator", b => + { + b.HasOne("PostFundManagement.Domain.Entities.User", "Creator") + .WithMany() + .HasForeignKey("CreatedBy") + .OnDelete(DeleteBehavior.NoAction) + .IsRequired(); + + b.HasOne("PostFundManagement.Domain.Entities.Project", "Project") + .WithMany() + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.Navigation("Creator"); + + b.Navigation("Project"); + }); + + modelBuilder.Entity("PostFundManagement.Domain.Entities.Instrument", b => + { + b.HasOne("PostFundManagement.Domain.Entities.User", "Creator") + .WithMany() + .HasForeignKey("CreatedBy") + .OnDelete(DeleteBehavior.NoAction) + .IsRequired(); + + b.HasOne("PostFundManagement.Domain.Entities.Programme", "Programme") + .WithMany("Instruments") + .HasForeignKey("ProgrammeId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.Navigation("Creator"); + + b.Navigation("Programme"); + }); + + modelBuilder.Entity("PostFundManagement.Domain.Entities.Invite", b => + { + b.HasOne("PostFundManagement.Domain.Entities.Award", "Award") + .WithMany() + .HasForeignKey("AwardId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("PostFundManagement.Domain.Entities.Contract", "Contract") + .WithMany() + .HasForeignKey("ContractId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("PostFundManagement.Domain.Entities.Organisation", "InvitedOrganisation") + .WithMany() + .HasForeignKey("InvitedOrganisationId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("PostFundManagement.Domain.Entities.Organisation", "Organisation") + .WithMany() + .HasForeignKey("OrganisationId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("PostFundManagement.Domain.Entities.User", "RecipientUser") + .WithMany() + .HasForeignKey("Recipient") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.Navigation("Award"); + + b.Navigation("Contract"); + + b.Navigation("InvitedOrganisation"); + + b.Navigation("Organisation"); + + b.Navigation("RecipientUser"); + }); + + modelBuilder.Entity("PostFundManagement.Domain.Entities.Issue", b => + { + b.HasOne("PostFundManagement.Domain.Entities.User", "Assignee") + .WithMany() + .HasForeignKey("AssignedTo") + .OnDelete(DeleteBehavior.SetNull) + .IsRequired(); + + b.HasOne("PostFundManagement.Domain.Entities.User", "Creator") + .WithMany() + .HasForeignKey("CreatedBy") + .OnDelete(DeleteBehavior.NoAction) + .IsRequired(); + + b.HasOne("PostFundManagement.Domain.Entities.Project", "Project") + .WithMany() + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.Navigation("Assignee"); + + b.Navigation("Creator"); + + b.Navigation("Project"); + }); + + modelBuilder.Entity("PostFundManagement.Domain.Entities.Milestone", b => + { + b.HasOne("PostFundManagement.Domain.Entities.User", "Creator") + .WithMany() + .HasForeignKey("CreatedBy") + .OnDelete(DeleteBehavior.NoAction) + .IsRequired(); + + b.HasOne("PostFundManagement.Domain.Entities.Project", "Project") + .WithMany() + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("PostFundManagement.Domain.Entities.User", "Updator") + .WithMany() + .HasForeignKey("UpdatedBy") + .OnDelete(DeleteBehavior.NoAction); + + b.Navigation("Creator"); + + b.Navigation("Project"); + + b.Navigation("Updator"); + }); + + modelBuilder.Entity("PostFundManagement.Domain.Entities.Notification", b => + { + b.HasOne("PostFundManagement.Domain.Entities.Organisation", "Organisation") + .WithMany() + .HasForeignKey("OrganisationId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("PostFundManagement.Domain.Entities.User", "RecipientUser") + .WithMany() + .HasForeignKey("Recipient") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("PostFundManagement.Domain.Entities.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.Navigation("Organisation"); + + b.Navigation("RecipientUser"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("PostFundManagement.Domain.Entities.Organisation", b => + { + b.HasOne("PostFundManagement.Domain.Entities.User", "Creator") + .WithMany() + .HasForeignKey("CreatedBy") + .OnDelete(DeleteBehavior.NoAction) + .IsRequired(); + + b.Navigation("Creator"); + }); + + modelBuilder.Entity("PostFundManagement.Domain.Entities.Outcome", b => + { + b.HasOne("PostFundManagement.Domain.Entities.Beneficiary", "Beneficiary") + .WithMany() + .HasForeignKey("BeneficiaryId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("PostFundManagement.Domain.Entities.User", "Creator") + .WithMany() + .HasForeignKey("CreatedBy") + .OnDelete(DeleteBehavior.NoAction) + .IsRequired(); + + b.Navigation("Beneficiary"); + + b.Navigation("Creator"); + }); + + modelBuilder.Entity("PostFundManagement.Domain.Entities.Portfolio", b => + { + b.HasOne("PostFundManagement.Domain.Entities.User", "Creator") + .WithMany() + .HasForeignKey("CreatedBy") + .OnDelete(DeleteBehavior.NoAction) + .IsRequired(); + + b.HasOne("PostFundManagement.Domain.Entities.Organisation", "Organisation") + .WithMany() + .HasForeignKey("OrganisationId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("PostFundManagement.Domain.Entities.User", "Owner") + .WithMany() + .HasForeignKey("OwnedBy") + .OnDelete(DeleteBehavior.NoAction) + .IsRequired(); + + b.HasOne("PostFundManagement.Domain.Entities.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.Navigation("Creator"); + + b.Navigation("Organisation"); + + b.Navigation("Owner"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("PostFundManagement.Domain.Entities.Programme", b => + { + b.HasOne("PostFundManagement.Domain.Entities.User", "Creator") + .WithMany() + .HasForeignKey("CreatedBy") + .OnDelete(DeleteBehavior.NoAction) + .IsRequired(); + + b.HasOne("PostFundManagement.Domain.Entities.User", "Owner") + .WithMany() + .HasForeignKey("OwnedBy") + .OnDelete(DeleteBehavior.NoAction) + .IsRequired(); + + b.HasOne("PostFundManagement.Domain.Entities.Portfolio", "Portfolio") + .WithMany("Programmes") + .HasForeignKey("PortfolioId") + .OnDelete(DeleteBehavior.NoAction) + .IsRequired(); + + b.HasOne("PostFundManagement.Domain.Entities.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.NoAction) + .IsRequired(); + + b.Navigation("Creator"); + + b.Navigation("Owner"); + + b.Navigation("Portfolio"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("PostFundManagement.Domain.Entities.Project", b => + { + b.HasOne("PostFundManagement.Domain.Entities.User", "Creator") + .WithMany() + .HasForeignKey("CreatedBy") + .OnDelete(DeleteBehavior.NoAction) + .IsRequired(); + + b.HasOne("PostFundManagement.Domain.Entities.Programme", "Programme") + .WithMany("Projects") + .HasForeignKey("ProgrammeId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("PostFundManagement.Domain.Entities.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("PostFundManagement.Domain.Entities.User", "Updator") + .WithMany() + .HasForeignKey("UpdatedBy") + .OnDelete(DeleteBehavior.NoAction); + + b.Navigation("Creator"); + + b.Navigation("Programme"); + + b.Navigation("Tenant"); + + b.Navigation("Updator"); + }); + + modelBuilder.Entity("PostFundManagement.Domain.Entities.Risk", b => + { + b.HasOne("PostFundManagement.Domain.Entities.User", "Creator") + .WithMany() + .HasForeignKey("CreatedBy") + .OnDelete(DeleteBehavior.NoAction) + .IsRequired(); + + b.HasOne("PostFundManagement.Domain.Entities.Project", "Project") + .WithMany() + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.Navigation("Creator"); + + b.Navigation("Project"); + }); + + modelBuilder.Entity("PostFundManagement.Domain.Entities.Rule", b => + { + b.HasOne("PostFundManagement.Domain.Entities.User", "Creator") + .WithMany() + .HasForeignKey("CreatedBy") + .OnDelete(DeleteBehavior.NoAction) + .IsRequired(); + + b.HasOne("PostFundManagement.Domain.Entities.Programme", "Programme") + .WithMany("Rules") + .HasForeignKey("ProgrammeId") + .OnDelete(DeleteBehavior.NoAction) + .IsRequired(); + + b.HasOne("PostFundManagement.Domain.Entities.User", "Updator") + .WithMany() + .HasForeignKey("UpdatedBy") + .OnDelete(DeleteBehavior.NoAction); + + b.Navigation("Creator"); + + b.Navigation("Programme"); + + b.Navigation("Updator"); + }); + + modelBuilder.Entity("PostFundManagement.Domain.Entities.SiteVisit", b => + { + b.HasOne("PostFundManagement.Domain.Entities.User", "Creator") + .WithMany() + .HasForeignKey("CreatedBy") + .OnDelete(DeleteBehavior.NoAction) + .IsRequired(); + + b.HasOne("PostFundManagement.Domain.Entities.Project", "Project") + .WithMany() + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.Navigation("Creator"); + + b.Navigation("Project"); + }); + + modelBuilder.Entity("PostFundManagement.Domain.Entities.Tenant", b => + { + b.HasOne("PostFundManagement.Domain.Entities.User", "Creator") + .WithMany() + .HasForeignKey("CreatedBy") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("PostFundManagement.Domain.Entities.User", "Updator") + .WithMany() + .HasForeignKey("UpdatedBy") + .OnDelete(DeleteBehavior.Restrict); + + b.Navigation("Creator"); + + b.Navigation("Updator"); + }); + + modelBuilder.Entity("PostFundManagement.Domain.Entities.TenantOrganisation", b => + { + b.HasOne("PostFundManagement.Domain.Entities.User", "Creator") + .WithMany() + .HasForeignKey("CreatedBy") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("PostFundManagement.Domain.Entities.Organisation", "Organisation") + .WithMany() + .HasForeignKey("OrganisationId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("PostFundManagement.Domain.Entities.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.Navigation("Creator"); + + b.Navigation("Organisation"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("PostFundManagement.Domain.Entities.TenantUser", b => + { + b.HasOne("PostFundManagement.Domain.Entities.User", "Creator") + .WithMany() + .HasForeignKey("CreatedBy") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("PostFundManagement.Domain.Entities.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("PostFundManagement.Domain.Entities.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.Navigation("Creator"); + + b.Navigation("Tenant"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("PostFundManagement.Domain.Entities.Activity", b => + { + b.Navigation("Evidences"); + }); + + modelBuilder.Entity("PostFundManagement.Domain.Entities.Award", b => + { + b.Navigation("Contract"); + }); + + modelBuilder.Entity("PostFundManagement.Domain.Entities.Portfolio", b => + { + b.Navigation("Programmes"); + }); + + modelBuilder.Entity("PostFundManagement.Domain.Entities.Programme", b => + { + b.Navigation("Awards"); + + b.Navigation("Instruments"); + + b.Navigation("Projects"); + + b.Navigation("Rules"); + }); + + modelBuilder.Entity("PostFundManagement.Domain.Entities.Project", b => + { + b.Navigation("Awards"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/PostFundManagement.Infrastructure/Database/Migrations/20260922033954_RemovedRelationshipsFromAuditLog.cs b/PostFundManagement.Infrastructure/Database/Migrations/20260922033954_RemovedRelationshipsFromAuditLog.cs new file mode 100644 index 0000000..6917c8c --- /dev/null +++ b/PostFundManagement.Infrastructure/Database/Migrations/20260922033954_RemovedRelationshipsFromAuditLog.cs @@ -0,0 +1,59 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace PostFundManagement.Infrastructure.Database.Migrations +{ + /// + public partial class RemovedRelationshipsFromAuditLog : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_AuditLogs_Tenants_TenantId", + table: "AuditLogs"); + + migrationBuilder.DropForeignKey( + name: "FK_AuditLogs_Users_PerformedBy", + table: "AuditLogs"); + + migrationBuilder.DropIndex( + name: "IX_AuditLogs_PerformedBy", + table: "AuditLogs"); + + migrationBuilder.DropIndex( + name: "IX_AuditLogs_TenantId", + table: "AuditLogs"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateIndex( + name: "IX_AuditLogs_PerformedBy", + table: "AuditLogs", + column: "PerformedBy"); + + migrationBuilder.CreateIndex( + name: "IX_AuditLogs_TenantId", + table: "AuditLogs", + column: "TenantId"); + + migrationBuilder.AddForeignKey( + name: "FK_AuditLogs_Tenants_TenantId", + table: "AuditLogs", + column: "TenantId", + principalTable: "Tenants", + principalColumn: "Id"); + + migrationBuilder.AddForeignKey( + name: "FK_AuditLogs_Users_PerformedBy", + table: "AuditLogs", + column: "PerformedBy", + principalTable: "Users", + principalColumn: "Id", + onDelete: ReferentialAction.Restrict); + } + } +} diff --git a/PostFundManagement.Infrastructure/Database/Migrations/ApplicationDbContextModelSnapshot.cs b/PostFundManagement.Infrastructure/Database/Migrations/ApplicationDbContextModelSnapshot.cs index 36cd197..81a90d7 100644 --- a/PostFundManagement.Infrastructure/Database/Migrations/ApplicationDbContextModelSnapshot.cs +++ b/PostFundManagement.Infrastructure/Database/Migrations/ApplicationDbContextModelSnapshot.cs @@ -133,10 +133,6 @@ namespace PostFundManagement.Infrastructure.Database.Migrations b.HasKey("Id"); - b.HasIndex("PerformedBy"); - - b.HasIndex("TenantId"); - b.ToTable("AuditLogs", (string)null); }); @@ -1495,24 +1491,6 @@ namespace PostFundManagement.Infrastructure.Database.Migrations b.Navigation("Updator"); }); - modelBuilder.Entity("PostFundManagement.Domain.Entities.AuditLog", b => - { - b.HasOne("PostFundManagement.Domain.Entities.User", "Performer") - .WithMany() - .HasForeignKey("PerformedBy") - .OnDelete(DeleteBehavior.Restrict) - .IsRequired(); - - b.HasOne("PostFundManagement.Domain.Entities.Tenant", "Tenant") - .WithMany() - .HasForeignKey("TenantId") - .OnDelete(DeleteBehavior.NoAction); - - b.Navigation("Performer"); - - b.Navigation("Tenant"); - }); - modelBuilder.Entity("PostFundManagement.Domain.Entities.Award", b => { b.HasOne("PostFundManagement.Domain.Entities.User", "Approver")