diff --git a/e-suite.API.Common/e-suite.API.Common/CreateWorkflowTemplateVersion.cs b/e-suite.API.Common/e-suite.API.Common/CreateWorkflowTemplateVersion.cs new file mode 100644 index 0000000..839c04a --- /dev/null +++ b/e-suite.API.Common/e-suite.API.Common/CreateWorkflowTemplateVersion.cs @@ -0,0 +1,17 @@ +using e_suite.Database.Core.Models; +using eSuite.Core.Miscellaneous; + +namespace e_suite.API.Common; + +public class CreateWorkflowTemplateVersion +{ + public List Tasks { get; set; } = []; + + public required string WorkflowName { get; set; } + + public required GeneralIdRef DomainId { get; set; } + + public string Description { get; set; } = String.Empty; + + public required string ActivityNameTemplate { get; set; } = String.Empty; +} \ No newline at end of file diff --git a/e-suite.API.Common/e-suite.API.Common/GetWorkflowTemplateVersion.cs b/e-suite.API.Common/e-suite.API.Common/GetWorkflowTemplateVersion.cs new file mode 100644 index 0000000..261c8f0 --- /dev/null +++ b/e-suite.API.Common/e-suite.API.Common/GetWorkflowTemplateVersion.cs @@ -0,0 +1,50 @@ +using e_suite.Database.Core.Extensions; +using e_suite.Database.Core.Models; +using e_suite.Database.Core.Tables.Workflow; +using eSuite.Core.Miscellaneous; + +namespace e_suite.API.Common; + +public class GetWorkflowTemplateVersion : IGeneralId +{ + public GetWorkflowTemplateVersion() + { + + } + + public GetWorkflowTemplateVersion(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; } = string.Empty; + + public GeneralIdRef WorkflowId { get; set; } = null!; + + public long Version { get; set; } + + public DateTimeOffset LastUpdated { get; set; } + + public GeneralIdRef DomainId { get; set; } = null!; + + public string Description { get; set; } = string.Empty; + + public string ActivityNameTemplate { get; set; } = string.Empty; + + public bool Deleted { get; set; } + + 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/IWorkflowTemplateManager.cs b/e-suite.API.Common/e-suite.API.Common/IWorkflowTemplateManager.cs index cb395c1..26e5b5e 100644 --- a/e-suite.API.Common/e-suite.API.Common/IWorkflowTemplateManager.cs +++ b/e-suite.API.Common/e-suite.API.Common/IWorkflowTemplateManager.cs @@ -1,91 +1,9 @@ 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 GetWorkflowTemplateVersion : IGeneralId -{ - public GetWorkflowTemplateVersion() - { - - } - - public GetWorkflowTemplateVersion(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; } = string.Empty; - - public GeneralIdRef WorkflowId { get; set; } = null!; - - public long Version { get; set; } - - public DateTimeOffset LastUpdated { get; set; } - - public GeneralIdRef DomainId { get; set; } = null!; - - public string Description { get; set; } = string.Empty; - - public string ActivityNameTemplate { get; set; } = string.Empty; - - public bool Deleted { get; set; } - - public long Id { get; set; } - public Guid Guid { get; set; } -} - -public class PatchWorkflowTemplateVersion -{ - - public string? WorkflowName { get; set; } - - public GeneralIdRef? DomainId { get; set; } - - public string? Description { get; set; } - - public string? ActivityNameTemplate { get; set; } -} - -public class CreateWorkflowTemplateVersion -{ - public List Tasks { get; set; } = []; - - public required string WorkflowName { get; set; } - - public required GeneralIdRef DomainId { get; set; } - - public string Description { get; set; } = String.Empty; - - public required string ActivityNameTemplate { get; set; } = String.Empty; -} - -public class TaskMetadata -{ - public string TaskType { get; set; } - public string DisplayName { get; set; } - public List Capabilities { get; set; } = []; - - public string OutcomeLabel { get; set; } - public List Outcomes { get; set; } = []; -} - public interface IWorkflowTemplateManager { Task> GetWorkflowTemplatesAsync(Paging paging, CancellationToken cancellationToken); @@ -97,4 +15,5 @@ public interface IWorkflowTemplateManager Task PostTemplateVersion(AuditUserDetails auditUserDetails, CreateWorkflowTemplateVersion template, CancellationToken cancellationToken); Task DeleteTemplateVersion(AuditUserDetails auditUserDetails, IGeneralIdRef templateId, CancellationToken cancellationToken); Task> GetAllowedTaskMetadataList(string taskType, CancellationToken cancellationToken); + Task DeleteTemplate(AuditUserDetails auditUserDetails, GeneralIdRef templateId, CancellationToken cancellationToken); } \ No newline at end of file diff --git a/e-suite.API.Common/e-suite.API.Common/PatchWorkflowTemplateVersion.cs b/e-suite.API.Common/e-suite.API.Common/PatchWorkflowTemplateVersion.cs new file mode 100644 index 0000000..958fd7f --- /dev/null +++ b/e-suite.API.Common/e-suite.API.Common/PatchWorkflowTemplateVersion.cs @@ -0,0 +1,15 @@ +using eSuite.Core.Miscellaneous; + +namespace e_suite.API.Common; + +public class PatchWorkflowTemplateVersion +{ + + public string? WorkflowName { get; set; } + + public GeneralIdRef? DomainId { get; set; } + + public string? Description { get; set; } + + public string? ActivityNameTemplate { get; set; } +} \ No newline at end of file diff --git a/e-suite.API.Common/e-suite.API.Common/TaskMetadata.cs b/e-suite.API.Common/e-suite.API.Common/TaskMetadata.cs new file mode 100644 index 0000000..767e4cc --- /dev/null +++ b/e-suite.API.Common/e-suite.API.Common/TaskMetadata.cs @@ -0,0 +1,11 @@ +namespace e_suite.API.Common; + +public class TaskMetadata +{ + public string TaskType { get; set; } + public string DisplayName { get; set; } + public List Capabilities { get; set; } = []; + + public string OutcomeLabel { get; set; } + public List Outcomes { 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 e69b3ac..bab4609 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 @@ -11,4 +11,5 @@ public interface IWorkflowTemplateRepository : IRepository Task EditWorkflowVersionAsync(AuditUserDetails auditUserDetails, WorkflowVersion workflowVersion, CancellationToken cancellationToken); Task AddWorkflow(AuditUserDetails auditUserDetails, Database.Core.Tables.Workflow.Workflow workflow, CancellationToken cancellationToken); Task AddWorkflowVersion(AuditUserDetails auditUserDetails, WorkflowVersion workflowVersion, CancellationToken cancellationToken); + Task EditWorkflowAsync(AuditUserDetails auditUserDetails, Database.Core.Tables.Workflow.Workflow workflow, CancellationToken cancellationToken); } \ No newline at end of file diff --git a/e-suite.API/eSuite.API/Controllers/WorkflowTemplateController.cs b/e-suite.API/eSuite.API/Controllers/WorkflowTemplateController.cs index 3cc583d..87e8cd0 100644 --- a/e-suite.API/eSuite.API/Controllers/WorkflowTemplateController.cs +++ b/e-suite.API/eSuite.API/Controllers/WorkflowTemplateController.cs @@ -39,6 +39,26 @@ public class WorkflowTemplateController : ESuiteControllerBase return Ok(result); } + /// + /// Use this to deactivate a template + /// + /// + /// + [Route("template")] + [HttpDelete] + [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status404NotFound, Type = typeof(ProblemDetails))] + [ProducesResponseType(StatusCodes.Status400BadRequest, Type = typeof(ProblemDetails))] + [AccessKey(SecurityAccess.DeleteWorkflowTemplate)] + public async Task DeleteWorkflowTemplate( + [FromBody] GeneralIdRef templateId, + CancellationToken cancellationToken = default! + ) + { + await _workflowTemplateManager.DeleteTemplate(AuditUserDetails, templateId, cancellationToken); + return Ok(); + } + /// /// Get a list of workflow templates /// diff --git a/e-suite.Modules.WorkflowTemplatesManager/Repository/WorkflowTemplateRepository.cs b/e-suite.Modules.WorkflowTemplatesManager/Repository/WorkflowTemplateRepository.cs index 2b6e315..712da30 100644 --- a/e-suite.Modules.WorkflowTemplatesManager/Repository/WorkflowTemplateRepository.cs +++ b/e-suite.Modules.WorkflowTemplatesManager/Repository/WorkflowTemplateRepository.cs @@ -30,7 +30,7 @@ public class WorkflowTemplateRepository : RepositoryBase, IWorkflowTemplateRepos { await DatabaseDbContext.SaveChangesAsync(auditUserDetails, cancellationToken); } - + public async Task AddWorkflow(AuditUserDetails auditUserDetails, Database.Core.Tables.Workflow.Workflow workflow, CancellationToken cancellationToken) { DatabaseDbContext.Workflows.Add(workflow); @@ -46,4 +46,9 @@ public class WorkflowTemplateRepository : RepositoryBase, IWorkflowTemplateRepos DatabaseDbContext.WorkflowVersions.Add(workflowVersion); await DatabaseDbContext.SaveChangesAsync(auditUserDetails, cancellationToken); } + + public async Task EditWorkflowAsync(AuditUserDetails auditUserDetails, Database.Core.Tables.Workflow.Workflow workflow, 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 69a6cd1..5431df8 100644 --- a/e-suite.Modules.WorkflowTemplatesManager/WorkflowTemplateManager.cs +++ b/e-suite.Modules.WorkflowTemplatesManager/WorkflowTemplateManager.cs @@ -168,15 +168,13 @@ public class WorkflowTemplateManager : IWorkflowTemplateManager }; //This will attempt to parse the data onto the internal workflow structure. - //Workflow.Core.WorkflowVersion? workflowTemplate = _workflowConverter.DeserialiseFromDatabase(dbWorkflowTemplate); - //if (workflowTemplate is null) - //{ - // throw new InvalidDataException("The workflow template is not valid"); - //} + Workflow.Core.WorkflowVersion? workflowTemplate = _workflowConverter.DeserialiseFromDatabase(dbWorkflowTemplate); + if (workflowTemplate is null) + { + throw new InvalidDataException("The workflow template is not valid"); + } await _workflowTemplateRepository.AddWorkflowVersion(auditUserDetails, dbWorkflowTemplate, cancellationToken); - - } ); } @@ -203,7 +201,7 @@ public class WorkflowTemplateManager : IWorkflowTemplateManager var workflowVersion = await _workflowTemplateRepository.GetWorkflowVersions() .FindByGeneralIdRefAsync(generalIdRef, cancellationToken) ?? - throw new NotFoundException("SsoProvider with this id does not exists"); + throw new NotFoundException("WorkflowVersion with this id does not exists"); var newVersion = await applyChanges(workflowVersion); if (newVersion != workflowVersion) @@ -269,4 +267,36 @@ public class WorkflowTemplateManager : IWorkflowTemplateManager return Task.FromResult(result); } + + private async Task AlterWorkflowTemplateAsync( + AuditUserDetails auditUserDetails, + IGeneralIdRef generalIdRef, + Func> applyChanges, + CancellationToken cancellationToken + ) + { + await _workflowTemplateRepository.TransactionAsync(async () => + { + var workflow = + await _workflowTemplateRepository.GetWorkflows() + .FindByGeneralIdRefAsync(generalIdRef, cancellationToken) ?? + throw new NotFoundException("Workflow with this id does not exists"); + + var newWorkflow = await applyChanges(workflow); + if (newWorkflow != workflow) + await _workflowTemplateRepository.AddWorkflow(auditUserDetails, newWorkflow, cancellationToken); + else + await _workflowTemplateRepository.EditWorkflowAsync(auditUserDetails, workflow, + cancellationToken); + }); + } + public async Task DeleteTemplate(AuditUserDetails auditUserDetails, GeneralIdRef templateId, CancellationToken cancellationToken) + { + await AlterWorkflowTemplateAsync(auditUserDetails, templateId, async version => + { + version.Deleted = true; + return version; + }, cancellationToken); + } } \ No newline at end of file diff --git a/e-suite.Service.WorkflowProcessor/WorkflowProcessor.cs b/e-suite.Service.WorkflowProcessor/WorkflowProcessor.cs index dd4e8b1..e57f2b9 100644 --- a/e-suite.Service.WorkflowProcessor/WorkflowProcessor.cs +++ b/e-suite.Service.WorkflowProcessor/WorkflowProcessor.cs @@ -59,18 +59,8 @@ public class WorkflowProcessor : IWorkflowProcessor return; } - WorkflowVersion workflowVersion; - try - { - workflowVersion = _workflowConverter.DeserialiseFromDatabase(activityInstance.WorkflowVersion); - } - catch (Exception e) - { - _logger.LogError("{DateTime}: Failed to Deserialise Json {messageId} - {messageId}", _clock.GetNow, activityId, e.ToString()); - throw; - } + WorkflowVersion workflowVersion = _workflowConverter.DeserialiseFromDatabase(activityInstance.WorkflowVersion); - var hasCompletableTask = false; await _activityRepository.TransactionAsync(async () => diff --git a/e-suite.Workflow.Core/Extensions/TaskExtensions.cs b/e-suite.Workflow.Core/Extensions/TaskExtensions.cs index f40fc68..534b1be 100644 --- a/e-suite.Workflow.Core/Extensions/TaskExtensions.cs +++ b/e-suite.Workflow.Core/Extensions/TaskExtensions.cs @@ -83,14 +83,7 @@ public static class TaskExtensions else { // Deserialize JSON into the target type (handles lists, objects, primitives) - try - { - value = JsonSerializer.Deserialize(je.GetRawText(), targetType, jsonSerializerOptions); - } - catch (Exception e) - { - throw; - } + value = JsonSerializer.Deserialize(je.GetRawText(), targetType, jsonSerializerOptions); } }