diff --git a/src/core/DigitalData.TaskFlow.Application/Common/Factories/ApiEnvelopeFactory.cs b/src/core/DigitalData.TaskFlow.Application/Common/Factories/ApiEnvelopeFactory.cs new file mode 100644 index 0000000..362fa90 --- /dev/null +++ b/src/core/DigitalData.TaskFlow.Application/Common/Factories/ApiEnvelopeFactory.cs @@ -0,0 +1,49 @@ +using DigitalData.TaskFlow.Domain.Common; +using DigitalData.TaskFlow.Domain.Enums; + +namespace DigitalData.TaskFlow.Application.Common.Factories; + +/// +/// Creates standard API envelope instances with centralized meta code/message handling. +/// +public static class ApiEnvelopeFactory +{ + /// + /// Creates a successful or business-result response envelope. + /// + /// Payload type. + /// Payload data. + /// Business result code. + /// Optional custom message. If not supplied, a default message is resolved from . + /// Response envelope containing meta and payload. + public static ApiEnvelope Create(T data, MetaCode code = MetaCode.Ok, string? message = null) + { + return new ApiEnvelope + { + Meta = + [ + new MetaEntry + { + Code = (int)code, + Message = message ?? ResolveDefaultMessage(code) + } + ], + Data = data + }; + } + + private static string ResolveDefaultMessage(MetaCode code) + { + return code switch + { + MetaCode.Ok => "OK", + MetaCode.NoOpenWorkflows => "Keine offenen Workflows", + MetaCode.NoAccess => "Kein Zugriff", + MetaCode.InvalidRequest => "Ungultiger Request", + MetaCode.InternalError => "Interner Fehler", + MetaCode.NotFound => "Vorgang nicht gefunden", + MetaCode.AlreadyClosed => "Vorgang bereits abgeschlossen", + _ => "Interner Fehler" + }; + } +} diff --git a/src/core/DigitalData.TaskFlow.Application/Common/Mappings/ApplicationMappingProfile.cs b/src/core/DigitalData.TaskFlow.Application/Common/Mappings/ApplicationMappingProfile.cs index 8797642..b9ed651 100644 --- a/src/core/DigitalData.TaskFlow.Application/Common/Mappings/ApplicationMappingProfile.cs +++ b/src/core/DigitalData.TaskFlow.Application/Common/Mappings/ApplicationMappingProfile.cs @@ -1,4 +1,6 @@ using AutoMapper; +using DigitalData.TaskFlow.Application.Features.Workflows.Commands.CloseWorkflow; +using DigitalData.TaskFlow.Domain.Closing; namespace DigitalData.TaskFlow.Application.Common.Mappings; @@ -12,5 +14,6 @@ public sealed class ApplicationMappingProfile : Profile /// public ApplicationMappingProfile() { + CreateMap(); } } diff --git a/src/core/DigitalData.TaskFlow.Application/Features/Documents/Queries/GetDocument/GetDocumentQuery.cs b/src/core/DigitalData.TaskFlow.Application/Features/Documents/Queries/GetDocument/GetDocumentQuery.cs index f2dfc33..c54e6f9 100644 --- a/src/core/DigitalData.TaskFlow.Application/Features/Documents/Queries/GetDocument/GetDocumentQuery.cs +++ b/src/core/DigitalData.TaskFlow.Application/Features/Documents/Queries/GetDocument/GetDocumentQuery.cs @@ -1,7 +1,7 @@ +using DigitalData.TaskFlow.Application.Common.Factories; using DigitalData.TaskFlow.Application.Common.Interfaces; using DigitalData.TaskFlow.Domain.Common; using DigitalData.TaskFlow.Domain.Documents; -using DigitalData.TaskFlow.Domain.Enums; using FluentValidation; using MediatR; @@ -44,17 +44,6 @@ public sealed class GetDocumentQueryHandler(IDocumentRepository documentReposito { var document = await documentRepository.GetAsync(request.Id, cancellationToken); - return new ApiEnvelope - { - Meta = - [ - new MetaEntry - { - Code = (int)MetaCode.Ok, - Message = "OK" - } - ], - Data = document - }; + return ApiEnvelopeFactory.Create(document); } } diff --git a/src/core/DigitalData.TaskFlow.Application/Features/Workflows/Commands/CloseWorkflow/CloseWorkflowCommand.cs b/src/core/DigitalData.TaskFlow.Application/Features/Workflows/Commands/CloseWorkflow/CloseWorkflowCommand.cs index 9aa3067..932bd5e 100644 --- a/src/core/DigitalData.TaskFlow.Application/Features/Workflows/Commands/CloseWorkflow/CloseWorkflowCommand.cs +++ b/src/core/DigitalData.TaskFlow.Application/Features/Workflows/Commands/CloseWorkflow/CloseWorkflowCommand.cs @@ -1,7 +1,8 @@ using DigitalData.TaskFlow.Application.Common.Interfaces; +using DigitalData.TaskFlow.Application.Common.Factories; +using AutoMapper; using DigitalData.TaskFlow.Domain.Closing; using DigitalData.TaskFlow.Domain.Common; -using DigitalData.TaskFlow.Domain.Enums; using FluentValidation; using MediatR; @@ -56,7 +57,7 @@ public sealed class CloseWorkflowCommandValidator : AbstractValidator /// Handles requests. /// -public sealed class CloseWorkflowCommandHandler(IWorkflowRepository workflowRepository) +public sealed class CloseWorkflowCommandHandler(IWorkflowRepository workflowRepository, IMapper mapper) : IRequestHandler> { /// @@ -67,12 +68,7 @@ public sealed class CloseWorkflowCommandHandler(IWorkflowRepository workflowRepo /// Closing result envelope. public async Task> Handle(CloseWorkflowCommand request, CancellationToken cancellationToken) { - var decision = new CloseWorkflowDecision - { - ClosingMethodId = request.ClosingMethodId, - Comment = request.Comment, - RejectionReasonId = request.RejectionReasonId - }; + var decision = mapper.Map(request); var result = await workflowRepository.CloseAsync( request.WisagId, @@ -81,17 +77,6 @@ public sealed class CloseWorkflowCommandHandler(IWorkflowRepository workflowRepo decision, cancellationToken); - return new ApiEnvelope - { - Meta = - [ - new MetaEntry - { - Code = (int)MetaCode.Ok, - Message = "OK" - } - ], - Data = result - }; + return ApiEnvelopeFactory.Create(result); } } diff --git a/src/core/DigitalData.TaskFlow.Application/Features/Workflows/Queries/GetWorkflows/GetWorkflowsQuery.cs b/src/core/DigitalData.TaskFlow.Application/Features/Workflows/Queries/GetWorkflows/GetWorkflowsQuery.cs index 4e84b4d..cc118d4 100644 --- a/src/core/DigitalData.TaskFlow.Application/Features/Workflows/Queries/GetWorkflows/GetWorkflowsQuery.cs +++ b/src/core/DigitalData.TaskFlow.Application/Features/Workflows/Queries/GetWorkflows/GetWorkflowsQuery.cs @@ -1,6 +1,6 @@ +using DigitalData.TaskFlow.Application.Common.Factories; using DigitalData.TaskFlow.Application.Common.Interfaces; using DigitalData.TaskFlow.Domain.Common; -using DigitalData.TaskFlow.Domain.Enums; using DigitalData.TaskFlow.Domain.Workflows; using FluentValidation; using MediatR; @@ -44,17 +44,6 @@ public sealed class GetWorkflowsQueryHandler(IWorkflowRepository workflowReposit { var data = await workflowRepository.GetAsync(request.WisagId, cancellationToken); - return new ApiEnvelope - { - Meta = - [ - new MetaEntry - { - Code = (int)MetaCode.Ok, - Message = "OK" - } - ], - Data = data - }; + return ApiEnvelopeFactory.Create(data); } }