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);
}
}