From 293b23958fd2d83b0390a7ee373320d247876976 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=91=E5=AE=81?= <1772105645@qq.com> Date: Thu, 21 May 2026 14:49:11 +0800 Subject: [PATCH] feat: add Node and Edge CRUD endpoints --- .../WorkflowDefinition/CreateEdgeEndpoint.cs | 42 +++++++++++++++++++ .../WorkflowDefinition/CreateNodeEndpoint.cs | 41 ++++++++++++++++++ .../WorkflowDefinition/DeleteEdgeEndpoint.cs | 35 ++++++++++++++++ .../WorkflowDefinition/DeleteNodeEndpoint.cs | 35 ++++++++++++++++ .../WorkflowDefinition/UpdateEdgeEndpoint.cs | 41 ++++++++++++++++++ .../WorkflowDefinition/UpdateNodeEndpoint.cs | 40 ++++++++++++++++++ 6 files changed, 234 insertions(+) create mode 100644 src/Workflow.Api/Endpoints/WorkflowDefinition/CreateEdgeEndpoint.cs create mode 100644 src/Workflow.Api/Endpoints/WorkflowDefinition/CreateNodeEndpoint.cs create mode 100644 src/Workflow.Api/Endpoints/WorkflowDefinition/DeleteEdgeEndpoint.cs create mode 100644 src/Workflow.Api/Endpoints/WorkflowDefinition/DeleteNodeEndpoint.cs create mode 100644 src/Workflow.Api/Endpoints/WorkflowDefinition/UpdateEdgeEndpoint.cs create mode 100644 src/Workflow.Api/Endpoints/WorkflowDefinition/UpdateNodeEndpoint.cs diff --git a/src/Workflow.Api/Endpoints/WorkflowDefinition/CreateEdgeEndpoint.cs b/src/Workflow.Api/Endpoints/WorkflowDefinition/CreateEdgeEndpoint.cs new file mode 100644 index 0000000..97740a8 --- /dev/null +++ b/src/Workflow.Api/Endpoints/WorkflowDefinition/CreateEdgeEndpoint.cs @@ -0,0 +1,42 @@ +using FastEndpoints; +using MediatR; +using Workflow.Application.Features.WorkflowDefinitions.Commands; +using Workflow.Application.Features.WorkflowDefinitions.DTOs; +using Workflow.Domain.Enums; + +namespace Workflow.Api.Endpoints.WorkflowDefinition; + +public class CreateEdgeEndpoint : Endpoint +{ + private readonly IMediator _mediator; + + public CreateEdgeEndpoint(IMediator mediator) => _mediator = mediator; + + public override void Configure() + { + Post("/workflow-definitions/{DefinitionId}/edges"); + AllowAnonymous(); + Summary(s => + { + s.Summary = "Create a new edge in a workflow definition"; + }); + } + + public override async Task HandleAsync(CreateEdgeRequest req, CancellationToken ct) + { + var command = new CreateEdgeCommand(req.DefinitionId, req.SourceNodeId, req.TargetNodeId, (EdgeType)req.EdgeType, req.Label, req.Condition, req.Order); + var result = await _mediator.Send(command, ct); + await Send.ResponseAsync(result, 201, ct); + } +} + +public class CreateEdgeRequest +{ + public Guid DefinitionId { get; set; } + public Guid SourceNodeId { get; set; } + public Guid TargetNodeId { get; set; } + public int EdgeType { get; set; } + public string? Label { get; set; } + public string? Condition { get; set; } + public int Order { get; set; } +} diff --git a/src/Workflow.Api/Endpoints/WorkflowDefinition/CreateNodeEndpoint.cs b/src/Workflow.Api/Endpoints/WorkflowDefinition/CreateNodeEndpoint.cs new file mode 100644 index 0000000..fff983d --- /dev/null +++ b/src/Workflow.Api/Endpoints/WorkflowDefinition/CreateNodeEndpoint.cs @@ -0,0 +1,41 @@ +using FastEndpoints; +using MediatR; +using Workflow.Application.Features.WorkflowDefinitions.Commands; +using Workflow.Application.Features.WorkflowDefinitions.DTOs; +using Workflow.Domain.Enums; + +namespace Workflow.Api.Endpoints.WorkflowDefinition; + +public class CreateNodeEndpoint : Endpoint +{ + private readonly IMediator _mediator; + + public CreateNodeEndpoint(IMediator mediator) => _mediator = mediator; + + public override void Configure() + { + Post("/workflow-definitions/{DefinitionId}/nodes"); + AllowAnonymous(); + Summary(s => + { + s.Summary = "Create a new node in a workflow definition"; + }); + } + + public override async Task HandleAsync(CreateNodeRequest req, CancellationToken ct) + { + var command = new CreateNodeCommand(req.DefinitionId, (NodeType)req.NodeType, req.Name, req.Config, req.PositionX, req.PositionY); + var result = await _mediator.Send(command, ct); + await Send.ResponseAsync(result, 201, ct); + } +} + +public class CreateNodeRequest +{ + public Guid DefinitionId { get; set; } + public int NodeType { get; set; } + public string Name { get; set; } = string.Empty; + public string? Config { get; set; } + public int PositionX { get; set; } + public int PositionY { get; set; } +} diff --git a/src/Workflow.Api/Endpoints/WorkflowDefinition/DeleteEdgeEndpoint.cs b/src/Workflow.Api/Endpoints/WorkflowDefinition/DeleteEdgeEndpoint.cs new file mode 100644 index 0000000..3553352 --- /dev/null +++ b/src/Workflow.Api/Endpoints/WorkflowDefinition/DeleteEdgeEndpoint.cs @@ -0,0 +1,35 @@ +using FastEndpoints; +using MediatR; +using Workflow.Application.Features.WorkflowDefinitions.Commands; + +namespace Workflow.Api.Endpoints.WorkflowDefinition; + +public class DeleteEdgeEndpoint : Endpoint +{ + private readonly IMediator _mediator; + + public DeleteEdgeEndpoint(IMediator mediator) => _mediator = mediator; + + public override void Configure() + { + Delete("/workflow-definitions/{DefinitionId}/edges/{EdgeId}"); + AllowAnonymous(); + Summary(s => + { + s.Summary = "Delete an edge from a workflow definition"; + }); + } + + public override async Task HandleAsync(DeleteEdgeRequest req, CancellationToken ct) + { + var command = new DeleteEdgeCommand(req.EdgeId); + await _mediator.Send(command, ct); + await Send.OkAsync(ct); + } +} + +public class DeleteEdgeRequest +{ + public Guid DefinitionId { get; set; } + public Guid EdgeId { get; set; } +} diff --git a/src/Workflow.Api/Endpoints/WorkflowDefinition/DeleteNodeEndpoint.cs b/src/Workflow.Api/Endpoints/WorkflowDefinition/DeleteNodeEndpoint.cs new file mode 100644 index 0000000..ffc5dda --- /dev/null +++ b/src/Workflow.Api/Endpoints/WorkflowDefinition/DeleteNodeEndpoint.cs @@ -0,0 +1,35 @@ +using FastEndpoints; +using MediatR; +using Workflow.Application.Features.WorkflowDefinitions.Commands; + +namespace Workflow.Api.Endpoints.WorkflowDefinition; + +public class DeleteNodeEndpoint : Endpoint +{ + private readonly IMediator _mediator; + + public DeleteNodeEndpoint(IMediator mediator) => _mediator = mediator; + + public override void Configure() + { + Delete("/workflow-definitions/{DefinitionId}/nodes/{NodeId}"); + AllowAnonymous(); + Summary(s => + { + s.Summary = "Delete a node from a workflow definition"; + }); + } + + public override async Task HandleAsync(DeleteNodeRequest req, CancellationToken ct) + { + var command = new DeleteNodeCommand(req.NodeId); + await _mediator.Send(command, ct); + await Send.OkAsync(ct); + } +} + +public class DeleteNodeRequest +{ + public Guid DefinitionId { get; set; } + public Guid NodeId { get; set; } +} diff --git a/src/Workflow.Api/Endpoints/WorkflowDefinition/UpdateEdgeEndpoint.cs b/src/Workflow.Api/Endpoints/WorkflowDefinition/UpdateEdgeEndpoint.cs new file mode 100644 index 0000000..d4b979b --- /dev/null +++ b/src/Workflow.Api/Endpoints/WorkflowDefinition/UpdateEdgeEndpoint.cs @@ -0,0 +1,41 @@ +using FastEndpoints; +using MediatR; +using Workflow.Application.Features.WorkflowDefinitions.Commands; +using Workflow.Application.Features.WorkflowDefinitions.DTOs; +using Workflow.Domain.Enums; + +namespace Workflow.Api.Endpoints.WorkflowDefinition; + +public class UpdateEdgeEndpoint : Endpoint +{ + private readonly IMediator _mediator; + + public UpdateEdgeEndpoint(IMediator mediator) => _mediator = mediator; + + public override void Configure() + { + Put("/workflow-definitions/{DefinitionId}/edges/{EdgeId}"); + AllowAnonymous(); + Summary(s => + { + s.Summary = "Update an edge in a workflow definition"; + }); + } + + public override async Task HandleAsync(UpdateEdgeRequest req, CancellationToken ct) + { + var command = new UpdateEdgeCommand(req.EdgeId, (EdgeType)req.EdgeType, req.Label, req.Condition, req.Order); + var result = await _mediator.Send(command, ct); + await Send.OkAsync(result, ct); + } +} + +public class UpdateEdgeRequest +{ + public Guid DefinitionId { get; set; } + public Guid EdgeId { get; set; } + public int EdgeType { get; set; } + public string? Label { get; set; } + public string? Condition { get; set; } + public int Order { get; set; } +} diff --git a/src/Workflow.Api/Endpoints/WorkflowDefinition/UpdateNodeEndpoint.cs b/src/Workflow.Api/Endpoints/WorkflowDefinition/UpdateNodeEndpoint.cs new file mode 100644 index 0000000..c58b181 --- /dev/null +++ b/src/Workflow.Api/Endpoints/WorkflowDefinition/UpdateNodeEndpoint.cs @@ -0,0 +1,40 @@ +using FastEndpoints; +using MediatR; +using Workflow.Application.Features.WorkflowDefinitions.Commands; +using Workflow.Application.Features.WorkflowDefinitions.DTOs; + +namespace Workflow.Api.Endpoints.WorkflowDefinition; + +public class UpdateNodeEndpoint : Endpoint +{ + private readonly IMediator _mediator; + + public UpdateNodeEndpoint(IMediator mediator) => _mediator = mediator; + + public override void Configure() + { + Put("/workflow-definitions/{DefinitionId}/nodes/{NodeId}"); + AllowAnonymous(); + Summary(s => + { + s.Summary = "Update a node in a workflow definition"; + }); + } + + public override async Task HandleAsync(UpdateNodeRequest req, CancellationToken ct) + { + var command = new UpdateNodeCommand(req.NodeId, req.Name, req.Config, req.PositionX, req.PositionY); + var result = await _mediator.Send(command, ct); + await Send.OkAsync(result, ct); + } +} + +public class UpdateNodeRequest +{ + public Guid DefinitionId { get; set; } + public Guid NodeId { get; set; } + public string Name { get; set; } = string.Empty; + public string? Config { get; set; } + public int PositionX { get; set; } + public int PositionY { get; set; } +}