From 17aea93370b68fcb948bb3ab7f84cf53284aa206 Mon Sep 17 00:00:00 2001 From: Colin Dawson Date: Thu, 5 Feb 2026 22:09:48 +0000 Subject: [PATCH] More refactoring and more work towards implementing the workflowtemplate controller --- .../e-suite.API.Common/ISsoManager.cs | 1 + .../IWorkflowTemplateManager.cs | 111 +++++++++++++++- .../models/PatchSsoProvider.cs | 18 +++ .../models/ReadSsoProvider.cs | 19 +++ .../repository/IWorkflowTemplateRepository.cs | 7 +- .../Controllers/SsoManagerController.cs | 20 +++ .../Controllers/WorkflowTemplateController.cs | 45 ++++--- .../Helpers/SsoManagerTestBase.cs | 14 ++- .../AddSsoProviderAsyncUnitTests.cs | 2 +- .../EditSsoProviderAsyncUnitTests.cs | 2 +- .../GetSsoProviderAsyncUnitTests.cs | 2 +- .../GetSsoProvidersAsyncUnitTests.cs | 2 +- .../RemoveSsoProviderAsyncUnitTests.cs | 2 +- .../e-suite.Modules.SSOManager/SsoManager.cs | 94 +++++++------- .../Repository/WorkflowTemplateRepository.cs | 12 ++ .../WorkflowTemplateManager.cs | 119 ++++++++++++++++++ 16 files changed, 400 insertions(+), 70 deletions(-) create mode 100644 e-suite.API.Common/e-suite.API.Common/models/PatchSsoProvider.cs diff --git a/e-suite.API.Common/e-suite.API.Common/ISsoManager.cs b/e-suite.API.Common/e-suite.API.Common/ISsoManager.cs index 18b52fb..46cf596 100644 --- a/e-suite.API.Common/e-suite.API.Common/ISsoManager.cs +++ b/e-suite.API.Common/e-suite.API.Common/ISsoManager.cs @@ -12,4 +12,5 @@ public interface ISsoManager Task AddSsoProviderAsync(AuditUserDetails auditUserDetails, CreateSsoProvider ssoProvider, CancellationToken cancellationToken); Task EditSsoProviderAsync(AuditUserDetails auditUserDetails, EditSsoProvider ssoProvider, CancellationToken cancellationToken); Task RemoveSsoProviderAsync( AuditUserDetails auditUserDetails, IGeneralIdRef generalIdRef, CancellationToken cancellationToken); + Task PatchSsoProviderAsync(AuditUserDetails auditUserDetails, GeneralIdRef generalIdRef, PatchSsoProvider patchSsoProvider, CancellationToken cancellationToken); } \ No newline at end of file diff --git a/e-suite.API.Common/e-suite.API.Common/IWorkflowTemplateManager.cs b/e-suite.API.Common/e-suite.API.Common/IWorkflowTemplateManager.cs index 4584d31..84e575a 100644 --- a/e-suite.API.Common/e-suite.API.Common/IWorkflowTemplateManager.cs +++ b/e-suite.API.Common/e-suite.API.Common/IWorkflowTemplateManager.cs @@ -1,6 +1,113 @@ -namespace e_suite.API.Common; +using e_suite.Database.Audit; +using e_suite.Database.Core.Extensions; +using e_suite.Database.Core.Models; +using e_suite.Database.Core.Tables.Workflow; +using e_suite.Utilities.Pagination; +using eSuite.Core.Miscellaneous; + +namespace e_suite.API.Common; + +public class GetWorkflowTemplate : IGeneralId +{ + public GetWorkflowTemplate() + { + + } + + public GetWorkflowTemplate(WorkflowVersion workflowVersion) + { + Id = workflowVersion.Id; + Guid = workflowVersion.Guid; + Deleted = workflowVersion.Deleted; + ActivityNameTemplate = workflowVersion.ActivityNameTemplate; + Description = workflowVersion.Description; + DomainId = workflowVersion.Domain.ToGeneralIdRef(); + LastUpdated = workflowVersion.LastUpdated; + Version = workflowVersion.Version; + WorkflowId = workflowVersion.Workflow.ToGeneralIdRef(); + WorkflowName = workflowVersion.Workflow.Name; + Tasks = workflowVersion.Tasks; + } + + public List Tasks { get; set; } + + public string WorkflowName { get; set; } + + public GeneralIdRef? WorkflowId { get; set; } + + public long Version { get; set; } + + public DateTimeOffset LastUpdated { get; set; } + + public GeneralIdRef? DomainId { get; set; } + + public string Description { get; set; } + + public string ActivityNameTemplate { get; set; } + + public bool Deleted { get; set; } + + public long Id { get; set; } + public Guid Guid { get; set; } +} + +public class EditWorkflowTemplate : IGeneralId +{ + public long Id { get; set; } + public Guid Guid { get; set; } + + public string WorkflowName { get; set; } + + public GeneralIdRef? WorkflowId { get; set; } + + public long Version { get; set; } + + public GeneralIdRef? DomainId { get; set; } + + public string Description { get; set; } + + public string ActivityNameTemplate { get; set; } +} + +public class PatchWorkflowTemplate +{ + + public string? WorkflowName { get; set; } + + public GeneralIdRef? DomainId { get; set; } + + public string? Description { get; set; } + + public string? ActivityNameTemplate { get; set; } +} + +public class CreateWorkflowTemplate +{ + public List Tasks { get; set; } + + public string WorkflowName { get; set; } + + public GeneralIdRef? WorkflowId { get; set; } + + public long Version { get; set; } + + public DateTimeOffset LastUpdated { get; set; } + + public GeneralIdRef? DomainId { get; set; } + + public string Description { get; set; } + + public string ActivityNameTemplate { get; set; } + + public bool Deleted { get; set; } +} public interface IWorkflowTemplateManager { - + Task> GetWorkflowTemplatesAsync(Paging paging, CancellationToken cancellationToken); + Task GetWorkflowTemplateAsync(GeneralIdRef generalIdRef, CancellationToken cancellationToken); + Task EditTemplate(AuditUserDetails auditUserDetails, EditWorkflowTemplate template, CancellationToken cancellationToken); + Task PatchTemplate(AuditUserDetails auditUserDetails, IGeneralIdRef templateId, PatchWorkflowTemplate patchTemplate, CancellationToken cancellationToken); + Task PostTemplate(AuditUserDetails auditUserDetails, CreateWorkflowTemplate template, CancellationToken cancellationToken); + Task DeleteTemplate(AuditUserDetails auditUserDetails, IGeneralIdRef templateId, CancellationToken cancellationToken); } \ No newline at end of file diff --git a/e-suite.API.Common/e-suite.API.Common/models/PatchSsoProvider.cs b/e-suite.API.Common/e-suite.API.Common/models/PatchSsoProvider.cs new file mode 100644 index 0000000..136c19b --- /dev/null +++ b/e-suite.API.Common/e-suite.API.Common/models/PatchSsoProvider.cs @@ -0,0 +1,18 @@ +namespace e_suite.API.Common.models; + +public class PatchSsoProvider +{ + public string? Name { get; set; } + + public string? ClientId { get; set; } + + public string? ClientSecret { get; set; } + + public string? ValidIssuer { get; set; } + + public string? AuthorizationEndpoint { get; set; } + + public string? TokenEndpoint { get; set; } + + public bool? IsPublic { get; set; } +} \ No newline at end of file diff --git a/e-suite.API.Common/e-suite.API.Common/models/ReadSsoProvider.cs b/e-suite.API.Common/e-suite.API.Common/models/ReadSsoProvider.cs index 3fcd42c..b250d25 100644 --- a/e-suite.API.Common/e-suite.API.Common/models/ReadSsoProvider.cs +++ b/e-suite.API.Common/e-suite.API.Common/models/ReadSsoProvider.cs @@ -1,10 +1,29 @@ using e_suite.API.Common.models.@base; using e_suite.Database.Core.Models; +using e_suite.Database.Core.Tables.UserManager; namespace e_suite.API.Common.models; public class ReadSsoProvider : SsoProviderBase, IGeneralId { + public ReadSsoProvider() + { + + } + + public ReadSsoProvider(SsoProvider ssoProvider) + { + Id = ssoProvider.Id; + AuthorizationEndpoint = ssoProvider.AuthorizationEndpoint; + ClientId = ssoProvider.ClientId; + ClientSecret = ssoProvider.ClientSecret; + IsPublic = ssoProvider.IsPublic; + Name = ssoProvider.Name; + TokenEndpoint = ssoProvider.TokenEndpoint; + ValidIssuer = ssoProvider.ValidIssuer; + Guid = ssoProvider.Guid; + } + public long Id { get; set; } public Guid Guid { get; set; } } \ No newline at end of file diff --git a/e-suite.API.Common/e-suite.API.Common/repository/IWorkflowTemplateRepository.cs b/e-suite.API.Common/e-suite.API.Common/repository/IWorkflowTemplateRepository.cs index ef029df..7fd6d61 100644 --- a/e-suite.API.Common/e-suite.API.Common/repository/IWorkflowTemplateRepository.cs +++ b/e-suite.API.Common/e-suite.API.Common/repository/IWorkflowTemplateRepository.cs @@ -1,8 +1,11 @@ -using e_suite.Database.Core; +using e_suite.Database.Audit; +using e_suite.Database.Core; +using e_suite.Database.Core.Tables.Workflow; namespace e_suite.API.Common.repository; public interface IWorkflowTemplateRepository : IRepository { - + IQueryable GetWorkflowVersions(); + Task EditWorkflowVersionAsync(AuditUserDetails auditUserDetails, WorkflowVersion workflowVersion, CancellationToken cancellationToken); } \ No newline at end of file diff --git a/e-suite.API/eSuite.API/Controllers/SsoManagerController.cs b/e-suite.API/eSuite.API/Controllers/SsoManagerController.cs index ab0bb4e..2c140d8 100644 --- a/e-suite.API/eSuite.API/Controllers/SsoManagerController.cs +++ b/e-suite.API/eSuite.API/Controllers/SsoManagerController.cs @@ -101,6 +101,26 @@ public class SsoManagerController : ESuiteControllerBase return Ok(); } + /// + /// Edit SsoProvider + /// + /// + /// + /// + [Route("ssoProvider")] + [HttpPatch] + [AccessKey(SecurityAccess.EditSsoProvider)] + [ProducesResponseType(StatusCodes.Status200OK)] + public async Task PatchSsoProvider( + [FromQuery] GeneralIdRef generalIdRef, + [FromBody] PatchSsoProvider patchSsoProvider, + CancellationToken cancellationToken = default! + ) + { + await _ssoManager.PatchSsoProviderAsync(AuditUserDetails, generalIdRef, patchSsoProvider, cancellationToken); + return Ok(); + } + /// /// Delete SsoProvider /// diff --git a/e-suite.API/eSuite.API/Controllers/WorkflowTemplateController.cs b/e-suite.API/eSuite.API/Controllers/WorkflowTemplateController.cs index 95e2c3c..81ae8c8 100644 --- a/e-suite.API/eSuite.API/Controllers/WorkflowTemplateController.cs +++ b/e-suite.API/eSuite.API/Controllers/WorkflowTemplateController.cs @@ -1,4 +1,7 @@ -using e_suite.API.Common.models; +using e_suite.API.Common; +using e_suite.API.Common.models; +using e_suite.Database.Core.Tables.UserManager; +using e_suite.Modules.SSOManager; using e_suite.Utilities.Pagination; using eSuite.API.Models; using eSuite.API.security; @@ -6,6 +9,7 @@ using eSuite.API.Utilities; using eSuite.Core.Miscellaneous; using eSuite.Core.Security; using Microsoft.AspNetCore.Mvc; +using System.Net.NetworkInformation; namespace eSuite.API.Controllers; @@ -16,6 +20,13 @@ namespace eSuite.API.Controllers; [ApiController] public class WorkflowTemplateController : ESuiteControllerBase { + private readonly IWorkflowTemplateManager _workflowTemplateManager; + + public WorkflowTemplateController(IWorkflowTemplateManager workflowTemplateManager) + { + _workflowTemplateManager = workflowTemplateManager; + } + /// /// Get a list of workflow templates /// @@ -28,7 +39,8 @@ public class WorkflowTemplateController : ESuiteControllerBase [HttpGet] public async Task GetWorkflowTemplates([FromQuery] Paging paging,CancellationToken cancellationToken = default!) { - throw new NotImplementedException(); + var result = await _workflowTemplateManager.GetWorkflowTemplatesAsync(paging, cancellationToken); + return Ok(result); } /// @@ -43,12 +55,13 @@ public class WorkflowTemplateController : ESuiteControllerBase [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status400BadRequest)] [ProducesResponseType(StatusCodes.Status404NotFound)] - public async Task GetUser( + public async Task GetWorkflowTemplate( [FromQuery] GeneralIdRef generalIdRef, CancellationToken cancellationToken = default! ) { - throw new NotImplementedException(); + var result = await _workflowTemplateManager.GetWorkflowTemplateAsync(generalIdRef, cancellationToken); + return Ok(result); } /// @@ -62,9 +75,10 @@ public class WorkflowTemplateController : ESuiteControllerBase [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status400BadRequest)] [AccessKey(SecurityAccess.EditWorkflowTemplate)] - public async Task EditTemplate(EditUser template, CancellationToken cancellationToken = default!) + public async Task EditTemplate(EditWorkflowTemplate template, CancellationToken cancellationToken = default!) { - throw new NotImplementedException(); + await _workflowTemplateManager.EditTemplate(AuditUserDetails, template, cancellationToken); + return Ok(); } /// @@ -78,9 +92,10 @@ public class WorkflowTemplateController : ESuiteControllerBase [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status400BadRequest)] [AccessKey(SecurityAccess.EditWorkflowTemplate)] - public async Task PatchUser([FromQuery] IGeneralIdRef templateId, [FromBody] PatchUser patchTemplate, CancellationToken cancellationToken = default!) + public async Task PatchWorkflowTemplate([FromQuery] IGeneralIdRef templateId, [FromBody] PatchWorkflowTemplate patchTemplate, CancellationToken cancellationToken = default!) { - throw new NotImplementedException(); + await _workflowTemplateManager.PatchTemplate(AuditUserDetails, templateId, patchTemplate, cancellationToken); + return Ok(); } /// @@ -95,12 +110,13 @@ public class WorkflowTemplateController : ESuiteControllerBase [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status400BadRequest, Type = typeof(ProblemDetails))] [AccessKey(SecurityAccess.AddWorkflowTemplate)] - public async Task CreateUser( - [FromBody] UserRegistration userRegistration, + public async Task CreateWorkflowTemplate( + [FromBody] CreateWorkflowTemplate template, CancellationToken cancellationToken = default! ) { - throw new NotImplementedException(); + await _workflowTemplateManager.PostTemplate(AuditUserDetails, template, cancellationToken); + return Ok(); } /// @@ -114,11 +130,12 @@ public class WorkflowTemplateController : ESuiteControllerBase [ProducesResponseType(StatusCodes.Status404NotFound, Type = typeof(ProblemDetails))] [ProducesResponseType(StatusCodes.Status400BadRequest, Type = typeof(ProblemDetails))] [AccessKey(SecurityAccess.DeleteWorkflowTemplate)] - public async Task DeactivateUser( - [FromBody] EmailAddress email, + public async Task DeleteWorkflowTemplate( + [FromBody] IGeneralIdRef templateId, CancellationToken cancellationToken = default! ) { - throw new NotImplementedException(); + await _workflowTemplateManager.DeleteTemplate(AuditUserDetails, templateId, cancellationToken); + return Ok(); } } \ No newline at end of file diff --git a/e-suite.Modules.SSOManager/SSOManager.UnitTests/Helpers/SsoManagerTestBase.cs b/e-suite.Modules.SSOManager/SSOManager.UnitTests/Helpers/SsoManagerTestBase.cs index 61a3e76..3d3b4bc 100644 --- a/e-suite.Modules.SSOManager/SSOManager.UnitTests/Helpers/SsoManagerTestBase.cs +++ b/e-suite.Modules.SSOManager/SSOManager.UnitTests/Helpers/SsoManagerTestBase.cs @@ -1,13 +1,17 @@ using e_suite.API.Common; using e_suite.Database.Audit; using e_suite.UnitTestCore; +using Moq; namespace SSOManager.UnitTests.Helpers; -public class SsoManagerTestBase : TestBase +public class SsoManagerTestBase : TestBase { protected FakeSsoManagerRepository SsoManagerRepository = null!; + public Mock PatchFactoryMock = null!; + public Mock> PatchMock { get; set; } + protected AuditUserDetails AuditUserDetails = null!; protected ISsoManager SsoManager = null!; @@ -23,8 +27,14 @@ public class SsoManagerTestBase : TestBase Comment = "Test comment" }; + PatchFactoryMock = new Mock(); + PatchMock = new Mock>(); + PatchFactoryMock + .Setup(f => f.Create(It.IsAny())) + .Returns(PatchMock.Object); + SsoManagerRepository = new FakeSsoManagerRepository(); - SsoManager = new e_suite.Modules.SSOManager.SsoManager(SsoManagerRepository); + SsoManager = new e_suite.Modules.SSOManager.SsoManager(SsoManagerRepository, PatchFactoryMock.Object); } } \ No newline at end of file diff --git a/e-suite.Modules.SSOManager/SSOManager.UnitTests/SsoManager/AddSsoProviderAsyncUnitTests.cs b/e-suite.Modules.SSOManager/SSOManager.UnitTests/SsoManager/AddSsoProviderAsyncUnitTests.cs index d629c23..57ed646 100644 --- a/e-suite.Modules.SSOManager/SSOManager.UnitTests/SsoManager/AddSsoProviderAsyncUnitTests.cs +++ b/e-suite.Modules.SSOManager/SSOManager.UnitTests/SsoManager/AddSsoProviderAsyncUnitTests.cs @@ -6,7 +6,7 @@ using SSOManager.UnitTests.Helpers; namespace SSOManager.UnitTests.SsoManager; [TestFixture] -public class AddSsoProviderAsyncUnitTests : SsoManagerTestBase +public class AddSsoProviderAsyncUnitTests : SsoManagerTestBase { [SetUp] public override async Task Setup() diff --git a/e-suite.Modules.SSOManager/SSOManager.UnitTests/SsoManager/EditSsoProviderAsyncUnitTests.cs b/e-suite.Modules.SSOManager/SSOManager.UnitTests/SsoManager/EditSsoProviderAsyncUnitTests.cs index 5046f63..b6a9411 100644 --- a/e-suite.Modules.SSOManager/SSOManager.UnitTests/SsoManager/EditSsoProviderAsyncUnitTests.cs +++ b/e-suite.Modules.SSOManager/SSOManager.UnitTests/SsoManager/EditSsoProviderAsyncUnitTests.cs @@ -8,7 +8,7 @@ using SSOManager.UnitTests.Helpers; namespace SSOManager.UnitTests.SsoManager; [TestFixture] -public class EditSsoProviderAsyncUnitTests : SsoManagerTestBase +public class EditSsoProviderAsyncUnitTests : SsoManagerTestBase { [SetUp] public override async Task Setup() diff --git a/e-suite.Modules.SSOManager/SSOManager.UnitTests/SsoManager/GetSsoProviderAsyncUnitTests.cs b/e-suite.Modules.SSOManager/SSOManager.UnitTests/SsoManager/GetSsoProviderAsyncUnitTests.cs index 65db054..bcc9e69 100644 --- a/e-suite.Modules.SSOManager/SSOManager.UnitTests/SsoManager/GetSsoProviderAsyncUnitTests.cs +++ b/e-suite.Modules.SSOManager/SSOManager.UnitTests/SsoManager/GetSsoProviderAsyncUnitTests.cs @@ -7,7 +7,7 @@ using SSOManager.UnitTests.Helpers; namespace SSOManager.UnitTests.SsoManager; [TestFixture] -public class GetSsoProviderAsyncUnitTests : SsoManagerTestBase +public class GetSsoProviderAsyncUnitTests : SsoManagerTestBase { [SetUp] public override async Task Setup() diff --git a/e-suite.Modules.SSOManager/SSOManager.UnitTests/SsoManager/GetSsoProvidersAsyncUnitTests.cs b/e-suite.Modules.SSOManager/SSOManager.UnitTests/SsoManager/GetSsoProvidersAsyncUnitTests.cs index 6f450d4..6bfe4a7 100644 --- a/e-suite.Modules.SSOManager/SSOManager.UnitTests/SsoManager/GetSsoProvidersAsyncUnitTests.cs +++ b/e-suite.Modules.SSOManager/SSOManager.UnitTests/SsoManager/GetSsoProvidersAsyncUnitTests.cs @@ -5,7 +5,7 @@ using SSOManager.UnitTests.Helpers; namespace SSOManager.UnitTests.SsoManager; [TestFixture] -public class GetSsoProvidersAsyncUnitTests : SsoManagerTestBase +public class GetSsoProvidersAsyncUnitTests : SsoManagerTestBase { [SetUp] public override async Task Setup() diff --git a/e-suite.Modules.SSOManager/SSOManager.UnitTests/SsoManager/RemoveSsoProviderAsyncUnitTests.cs b/e-suite.Modules.SSOManager/SSOManager.UnitTests/SsoManager/RemoveSsoProviderAsyncUnitTests.cs index 8adcec5..c918e8c 100644 --- a/e-suite.Modules.SSOManager/SSOManager.UnitTests/SsoManager/RemoveSsoProviderAsyncUnitTests.cs +++ b/e-suite.Modules.SSOManager/SSOManager.UnitTests/SsoManager/RemoveSsoProviderAsyncUnitTests.cs @@ -7,7 +7,7 @@ using SSOManager.UnitTests.Helpers; namespace SSOManager.UnitTests.SsoManager; [TestFixture] -public class RemoveSsoProviderAsyncUnitTests : SsoManagerTestBase +public class RemoveSsoProviderAsyncUnitTests : SsoManagerTestBase { [SetUp] public override async Task Setup() diff --git a/e-suite.Modules.SSOManager/e-suite.Modules.SSOManager/SsoManager.cs b/e-suite.Modules.SSOManager/e-suite.Modules.SSOManager/SsoManager.cs index a9e52a1..768bbdb 100644 --- a/e-suite.Modules.SSOManager/e-suite.Modules.SSOManager/SsoManager.cs +++ b/e-suite.Modules.SSOManager/e-suite.Modules.SSOManager/SsoManager.cs @@ -1,66 +1,44 @@ -using e_suite.Database.Audit; +using e_suite.API.Common; +using e_suite.API.Common.exceptions; +using e_suite.API.Common.models; +using e_suite.API.Common.repository; +using e_suite.Database.Audit; +using e_suite.Database.Core.Extensions; using e_suite.Database.Core.Tables.UserManager; using e_suite.Utilities.Pagination; using eSuite.Core.Miscellaneous; using System.Linq.Expressions; -using e_suite.API.Common; -using e_suite.API.Common.exceptions; -using e_suite.API.Common.models; -using e_suite.API.Common.repository; -using e_suite.Database.Core.Extensions; namespace e_suite.Modules.SSOManager; public class SsoManager : ISsoManager { private readonly ISsoManagerRepository _ssoManagerRepository; + private readonly IPatchFactory _patchFactory; - public SsoManager(ISsoManagerRepository ssoManagerRepository) + public SsoManager(ISsoManagerRepository ssoManagerRepository, IPatchFactory patchFactory) { _ssoManagerRepository = ssoManagerRepository; + _patchFactory = patchFactory; } public async Task> GetSsoProvidersAsync(Paging paging, CancellationToken cancellationToken) { var ssoProviders = _ssoManagerRepository.GetSsoProviders().Where(x => x.Deleted == false); - var paginatedData = await PaginatedData.Paginate(ssoProviders, paging, + var paginatedData = await PaginatedData.Paginate(ssoProviders, paging, KeySelector, cancellationToken); - var paginatedResult = new PaginatedData - { - Count = paginatedData.Count, - Page = paginatedData.Page, - PageSize = paginatedData.PageSize, - Data = paginatedData.Data.Select(MapSsoProvider) - }; - return paginatedResult; + return paginatedData; } public async Task GetSsoProviderAsync( IGeneralIdRef generalIdRef, CancellationToken cancellationToken ) { var ssoProvider = await _ssoManagerRepository.GetSsoProviders().FindByGeneralIdRefAsync(generalIdRef, cancellationToken) ?? throw new NotFoundException("Unable to find SsoProvider"); - return MapSsoProvider(ssoProvider); - } - - private ReadSsoProvider MapSsoProvider(SsoProvider ssoProvider) - { - var readSsoProvider = new ReadSsoProvider - { - Id = ssoProvider.Id, - AuthorizationEndpoint = ssoProvider.AuthorizationEndpoint, - ClientId = ssoProvider.ClientId, - ClientSecret = ssoProvider.ClientSecret, - IsPublic = ssoProvider.IsPublic, - Name = ssoProvider.Name, - TokenEndpoint = ssoProvider.TokenEndpoint, - ValidIssuer = ssoProvider.ValidIssuer, - Guid = ssoProvider.Guid - }; - - return readSsoProvider; + return new ReadSsoProvider(ssoProvider); } + private Expression> KeySelector(string? sortKey) { return sortKey?.ToLowerInvariant() switch @@ -105,12 +83,8 @@ public class SsoManager : ISsoManager CancellationToken cancellationToken ) { - await _ssoManagerRepository.TransactionAsync(async () => + await AlterSsoProviderAsync(auditUserDetails, editSsoProvider.Id, ssoProvider => { - var ssoProvider = await _ssoManagerRepository.GetSsoProviderAsync(editSsoProvider.Id, cancellationToken); - if (ssoProvider is null) - throw new NotFoundException("SsoProvider with this id does not exists"); - ssoProvider.AuthorizationEndpoint = editSsoProvider.AuthorizationEndpoint; ssoProvider.Name = editSsoProvider.Name; ssoProvider.ClientId = editSsoProvider.ClientId; @@ -120,12 +94,32 @@ public class SsoManager : ISsoManager ssoProvider.TokenEndpoint = editSsoProvider.TokenEndpoint; ssoProvider.IsPublic = editSsoProvider.IsPublic; ssoProvider.Deleted = false; - - await _ssoManagerRepository.EditNewSsoProviderAsync(auditUserDetails, ssoProvider, cancellationToken); - }); + return Task.CompletedTask; + }, + cancellationToken ); } - public async Task RemoveSsoProviderAsync(AuditUserDetails auditUserDetails, IGeneralIdRef generalIdRef, CancellationToken cancellationToken) + public async Task PatchSsoProviderAsync( + AuditUserDetails auditUserDetails, + GeneralIdRef generalIdRef, + PatchSsoProvider patchSsoProvider, + CancellationToken cancellationToken + ) + { + var patch = _patchFactory.Create(patchSsoProvider); + await AlterSsoProviderAsync(auditUserDetails, generalIdRef, async ssoProvider => + { + await patch.ApplyTo(ssoProvider); + }, + cancellationToken); + } + + private async Task AlterSsoProviderAsync( + AuditUserDetails auditUserDetails, + IGeneralIdRef generalIdRef, + Func applyChanges, + CancellationToken cancellationToken + ) { await _ssoManagerRepository.TransactionAsync(async () => { @@ -133,8 +127,18 @@ public class SsoManager : ISsoManager if (ssoProvider is null) throw new NotFoundException("SsoProvider with this id does not exists"); - ssoProvider.Deleted = true; + await applyChanges(ssoProvider); + await _ssoManagerRepository.EditNewSsoProviderAsync(auditUserDetails, ssoProvider, cancellationToken); }); } + + public async Task RemoveSsoProviderAsync(AuditUserDetails auditUserDetails, IGeneralIdRef generalIdRef, CancellationToken cancellationToken) + { + await AlterSsoProviderAsync(auditUserDetails, generalIdRef, async ssoProvider => + { + ssoProvider.Deleted = true; + }, + cancellationToken); + } } \ No newline at end of file diff --git a/e-suite.Modules.WorkflowTemplatesManager/Repository/WorkflowTemplateRepository.cs b/e-suite.Modules.WorkflowTemplatesManager/Repository/WorkflowTemplateRepository.cs index a6614b4..b787f46 100644 --- a/e-suite.Modules.WorkflowTemplatesManager/Repository/WorkflowTemplateRepository.cs +++ b/e-suite.Modules.WorkflowTemplatesManager/Repository/WorkflowTemplateRepository.cs @@ -1,5 +1,7 @@ using e_suite.API.Common.repository; +using e_suite.Database.Audit; using e_suite.Database.Core; +using e_suite.Database.Core.Tables.Workflow; namespace e_suite.Modules.WorkflowTemplatesManager.Repository; @@ -8,4 +10,14 @@ public class WorkflowTemplateRepository : RepositoryBase, IWorkflowTemplateRepos public WorkflowTemplateRepository(IEsuiteDatabaseDbContext databaseDbContext) : base(databaseDbContext) { } + + public IQueryable GetWorkflowVersions() + { + return DatabaseDbContext.WorkflowVersions; + } + + public async Task EditWorkflowVersionAsync(AuditUserDetails auditUserDetails, WorkflowVersion workflowVersion, CancellationToken cancellationToken) + { + await DatabaseDbContext.SaveChangesAsync(auditUserDetails, cancellationToken); + } } \ No newline at end of file diff --git a/e-suite.Modules.WorkflowTemplatesManager/WorkflowTemplateManager.cs b/e-suite.Modules.WorkflowTemplatesManager/WorkflowTemplateManager.cs index 7aec9d9..02d72b3 100644 --- a/e-suite.Modules.WorkflowTemplatesManager/WorkflowTemplateManager.cs +++ b/e-suite.Modules.WorkflowTemplatesManager/WorkflowTemplateManager.cs @@ -1,8 +1,127 @@ using e_suite.API.Common; +using e_suite.API.Common.exceptions; +using e_suite.API.Common.repository; +using e_suite.Database.Audit; +using e_suite.Database.Core.Extensions; +using e_suite.Database.Core.Tables.Workflow; +using e_suite.Utilities.Pagination; +using eSuite.Core.Miscellaneous; +using System.Linq.Expressions; namespace e_suite.Modules.WorkflowTemplatesManager; public class WorkflowTemplateManager : IWorkflowTemplateManager { + private readonly IWorkflowTemplateRepository _workflowTemplateRepository; + private readonly IDomainRepository _domainRepository; + private readonly IPatchFactory _patchFactory; + public WorkflowTemplateManager(IWorkflowTemplateRepository workflowTemplateRepository, IPatchFactory patchFactory, IDomainRepository domainRepository) + { + _workflowTemplateRepository = workflowTemplateRepository; + _patchFactory = patchFactory; + _domainRepository = domainRepository; + } + + public async Task> GetWorkflowTemplatesAsync(Paging paging, CancellationToken cancellationToken) + { + var ssoProviders = _workflowTemplateRepository.GetWorkflowVersions().Where(x => x.Deleted == false); + + var paginatedData = await PaginatedData.Paginate(ssoProviders, paging, + KeySelector, cancellationToken); + + return paginatedData; + } + + private Expression> KeySelector(string sortKey) + { + return sortKey?.ToLowerInvariant() switch + { + "id" => x => x.Id, + "activitynametemplate" => x => x.ActivityNameTemplate, + "description" => x => x.Description, + "domain.name" => x => x.Domain.Name, + "workflow.name" => x => x.Workflow.Name, + _ => x => x.Id + }; + } + + public async Task GetWorkflowTemplateAsync(GeneralIdRef generalIdRef, CancellationToken cancellationToken) + { + var workflowTemplate = await _workflowTemplateRepository.GetWorkflowVersions().FindByGeneralIdRefAsync(generalIdRef, cancellationToken) + ?? throw new NotFoundException("Unable to find Workflow Version"); + return new GetWorkflowTemplate(workflowTemplate); + } + + public async Task EditTemplate( + AuditUserDetails auditUserDetails, + EditWorkflowTemplate template, + CancellationToken cancellationToken + ) + { + await AlterWorkflowTemplateVersionAsync(auditUserDetails, template.ToGeneralIdRef()!, async version => + { + var domain = await _domainRepository.GetDomainById(template.DomainId, cancellationToken); + if (domain is null) + throw new NotFoundException("Unable to find Domain with provided id"); + + version.Domain = domain; + version.DomainId = domain.Id; + version.Description = template.Description; + version.ActivityNameTemplate = template.ActivityNameTemplate; + version.Deleted = false; + version.Version = template.Version; + //version.WorkflowId + }, cancellationToken); + } + + public async Task PatchTemplate( + AuditUserDetails auditUserDetails, + IGeneralIdRef templateId, + PatchWorkflowTemplate patchTemplate, + CancellationToken cancellationToken + ) + { + var patch = _patchFactory.Create(patchTemplate); + await AlterWorkflowTemplateVersionAsync(auditUserDetails, templateId, async version => + { + patch.ApplyTo(version); + }, cancellationToken); + } + + public async Task PostTemplate( + AuditUserDetails auditUserDetails, + CreateWorkflowTemplate template, + CancellationToken cancellationToken + ) + { + throw new NotImplementedException(); + } + + public async Task DeleteTemplate(AuditUserDetails auditUserDetails, IGeneralIdRef templateId, CancellationToken cancellationToken) + { + await AlterWorkflowTemplateVersionAsync(auditUserDetails, templateId, async version => + { + version.Deleted = true; + }, cancellationToken); + } + + private async Task AlterWorkflowTemplateVersionAsync( + AuditUserDetails auditUserDetails, + IGeneralIdRef generalIdRef, + Func applyChanges, + CancellationToken cancellationToken + ) + { + await _workflowTemplateRepository.TransactionAsync(async () => + { + var workflowVersion = await _workflowTemplateRepository.GetWorkflowVersions().FindByGeneralIdRefAsync(generalIdRef, cancellationToken); + if (workflowVersion is null) + throw new NotFoundException("SsoProvider with this id does not exists"); + + await applyChanges(workflowVersion); + + await _workflowTemplateRepository.EditWorkflowVersionAsync(auditUserDetails, workflowVersion, cancellationToken); + }); + } } \ No newline at end of file