diff --git a/Elsa.sln b/Elsa.sln index 121101abe..76886232a 100644 --- a/Elsa.sln +++ b/Elsa.sln @@ -235,8 +235,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "aspnetcore", "aspnetcore", EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ElsaDashboard.Samples.AspNetCore.Monolith", "src\samples\dashboard\aspnetcore\ElsaDashboard.Samples.AspNetCore.Monolith\ElsaDashboard.Samples.AspNetCore.Monolith.csproj", "{F1EF5639-021A-4D22-9D4A-73D57C88EBFA}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ElsaDashboard.Samples.AspNetCore.Monolith", "src\samples\dashboard\aspnetcore\ElsaDashboard.Samples.AspNetCore.Monolith\ElsaDashboard.Samples.AspNetCore.Monolith.csproj", "{F1EF5639-021A-4D22-9D4A-73D57C88EBFA}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Samples.Persistence.YesSql", "src\samples\persistence\Elsa.Samples.Persistence.YesSql\Elsa.Samples.Persistence.YesSql.csproj", "{3A30EFFE-32D8-40B8-9C62-427037BB5424}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Designer.Components.Web", "src\designer\bindings\aspnet\Elsa.Designer.Components.Web\Elsa.Designer.Components.Web.csproj", "{3DF05CFC-AC77-489F-9A42-C4FDB599AA69}" @@ -303,19 +301,19 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Webhooks.Persistence.M EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Webhooks.Persistence.YesSql", "src\activities\webhooks\Elsa.Webhooks.Persistence.YesSql\Elsa.Webhooks.Persistence.YesSql.csproj", "{EE147504-555D-4EFC-A79A-34748666AA6C}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ElsaDashboard.Web", "src\dashboards\ElsaDashboard\ElsaDashboard.Web.csproj", "{1129868E-BA72-44C4-941C-A28D9001504B}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ElsaDashboard.Web", "src\dashboards\ElsaDashboard\ElsaDashboard.Web.csproj", "{1129868E-BA72-44C4-941C-A28D9001504B}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ElsaDashboard.Samples.BlazorWasm", "src\samples\dashboard\blazor\ElsaDashboard.Samples.BlazorWasm\ElsaDashboard.Samples.BlazorWasm.csproj", "{24A99602-F743-4B1A-AC96-599F34AE916C}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ElsaDashboard.Samples.BlazorWasm", "src\samples\dashboard\blazor\ElsaDashboard.Samples.BlazorWasm\ElsaDashboard.Samples.BlazorWasm.csproj", "{24A99602-F743-4B1A-AC96-599F34AE916C}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "html", "html", "{8E6215AB-FDD3-4011-B598-B6BB63F294BB}" -ProjectSection(SolutionItems) = preProject - src\samples\dashboard\html\index.html = src\samples\dashboard\html\index.html - src\samples\dashboard\html\package.json = src\samples\dashboard\html\package.json -EndProjectSection + ProjectSection(SolutionItems) = preProject + src\samples\dashboard\html\index.html = src\samples\dashboard\html\index.html + src\samples\dashboard\html\package.json = src\samples\dashboard\html\package.json + EndProjectSection EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ElsaDashboard.Samples.BlazorServer", "src\samples\dashboard\blazor\ElsaDashboard.Samples.BlazorServer\ElsaDashboard.Samples.BlazorServer.csproj", "{6A03B177-09E0-4421-9704-945E6248AB69}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ElsaDashboard.Samples.BlazorServer", "src\samples\dashboard\blazor\ElsaDashboard.Samples.BlazorServer\ElsaDashboard.Samples.BlazorServer.csproj", "{6A03B177-09E0-4421-9704-945E6248AB69}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.FaultyWorkflows", "src\samples\aspnet\Elsa.Samples.FaultyWorkflows\Elsa.Samples.FaultyWorkflows.csproj", "{84751112-C2B7-41D4-98F5-D87D7C2E1DAE}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Samples.FaultyWorkflows", "src\samples\aspnet\Elsa.Samples.FaultyWorkflows\Elsa.Samples.FaultyWorkflows.csproj", "{84751112-C2B7-41D4-98F5-D87D7C2E1DAE}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/src/activities/webhooks/Elsa.Activities.Webhooks/Endpoints/WebhookDefinitions/Update.cs b/src/activities/webhooks/Elsa.Activities.Webhooks/Endpoints/WebhookDefinitions/Update.cs new file mode 100644 index 000000000..b4ee30d5e --- /dev/null +++ b/src/activities/webhooks/Elsa.Activities.Webhooks/Endpoints/WebhookDefinitions/Update.cs @@ -0,0 +1,56 @@ +using System.Threading; +using System.Threading.Tasks; +using Elsa.Persistence.Specifications; +using Elsa.Server.Api.Swagger.Examples; +using Elsa.Webhooks.Abstractions.Models; +using Elsa.Webhooks.Abstractions.Persistence; +using Elsa.Webhooks.Abstractions.Services; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Swashbuckle.AspNetCore.Annotations; +using Swashbuckle.AspNetCore.Filters; + +namespace Elsa.Activities.Webhooks.Endpoints.WebhookDefinitions +{ + [ApiController] + [ApiVersion("1")] + [Route("v{apiVersion:apiVersion}/webhook-definitions")] + [Produces("application/json")] + public partial class Update : ControllerBase + { + private readonly IWebhookDefinitionStore _webhookDefinitionStore; + private readonly IWebhookPublisher _webhookPublisher; + + public Update(IWebhookDefinitionStore webhookDefinitionStore, IWebhookPublisher webhookPublisher) + { + _webhookDefinitionStore = webhookDefinitionStore; + _webhookPublisher = webhookPublisher; + } + + [HttpPut] + [ProducesResponseType(StatusCodes.Status201Created, Type = typeof(WebhookDefinition))] + [SwaggerResponseExample(StatusCodes.Status200OK, typeof(WebhookDefinitionExample))] + [SwaggerOperation( + Summary = "Updates an existing webhook.", + Description = + "Creates a new webhook definition or updates an existing one.", + OperationId = "WebhookDefinitions.Put", + Tags = new[] { "WebhookDefinitions" }) + ] + public async Task> Handle([FromBody] SaveRequest request, [FromRoute] ApiVersion apiVersion, CancellationToken cancellationToken) + { + var webhookId = request.Id; + var webhookDefinition = !string.IsNullOrWhiteSpace(webhookId) ? await _webhookDefinitionStore.FindAsync(new EntityIdSpecification(webhookId), cancellationToken) : default; + + webhookDefinition.Name = request.Name?.Trim(); + webhookDefinition.Path = request.Path?.Trim(); + webhookDefinition.Description = request.Description?.Trim(); + webhookDefinition.PayloadTypeName = request.PayloadTypeName?.Trim(); + webhookDefinition.IsEnabled = request.IsEnabled; + + webhookDefinition = await _webhookPublisher.UpdateAsync(webhookDefinition, cancellationToken); + + return CreatedAtAction("Handle", "Get", new { id = webhookDefinition.Id, apiVersion = apiVersion.ToString() }, webhookDefinition); + } + } +} \ No newline at end of file diff --git a/src/activities/webhooks/Elsa.Activities.Webhooks/Services/WebhookPublisher.cs b/src/activities/webhooks/Elsa.Activities.Webhooks/Services/WebhookPublisher.cs index e29911135..a7dbad680 100644 --- a/src/activities/webhooks/Elsa.Activities.Webhooks/Services/WebhookPublisher.cs +++ b/src/activities/webhooks/Elsa.Activities.Webhooks/Services/WebhookPublisher.cs @@ -44,6 +44,15 @@ namespace Elsa.Activities.Webhooks.Services return webhook; } + public async Task UpdateAsync(WebhookDefinition webhookDefinition, CancellationToken cancellationToken = default) + { + var webhook = webhookDefinition; + webhook = Initialize(webhook); + + await _webhookDefinitionStore.UpdateAsync(webhook, cancellationToken); + return webhook; + } + public async Task DeleteAsync(string webhookId, CancellationToken cancellationToken = default) { var webhookDefinition = New(); diff --git a/src/activities/webhooks/Elsa.Webhooks.Abstractions/Services/IWebhookPublisher.cs b/src/activities/webhooks/Elsa.Webhooks.Abstractions/Services/IWebhookPublisher.cs index fd5405243..60d1eadc4 100644 --- a/src/activities/webhooks/Elsa.Webhooks.Abstractions/Services/IWebhookPublisher.cs +++ b/src/activities/webhooks/Elsa.Webhooks.Abstractions/Services/IWebhookPublisher.cs @@ -8,6 +8,7 @@ namespace Elsa.Webhooks.Abstractions.Services { WebhookDefinition New(); Task SaveAsync(WebhookDefinition webhookDefinition, CancellationToken cancellationToken = default); + Task UpdateAsync(WebhookDefinition webhookDefinition, CancellationToken cancellationToken = default); Task DeleteAsync(string webhookId, CancellationToken cancellationToken = default); Task DeleteAsync(WebhookDefinition webhookDefinition, CancellationToken cancellationToken = default); } diff --git a/src/designer/elsa-workflows-studio/src/components/screens/webhook-definition-editor/elsa-webhook-definition-editor-screen/elsa-webhook-definition-editor-screen.tsx b/src/designer/elsa-workflows-studio/src/components/screens/webhook-definition-editor/elsa-webhook-definition-editor-screen/elsa-webhook-definition-editor-screen.tsx index dc0bd2a09..f99812138 100644 --- a/src/designer/elsa-workflows-studio/src/components/screens/webhook-definition-editor/elsa-webhook-definition-editor-screen/elsa-webhook-definition-editor-screen.tsx +++ b/src/designer/elsa-workflows-studio/src/components/screens/webhook-definition-editor/elsa-webhook-definition-editor-screen/elsa-webhook-definition-editor-screen.tsx @@ -94,12 +94,14 @@ export class ElsaWebhookDefinitionEditorScreen { this.saving = true; try { - debugger - webhookDefinition = await client.webhookDefinitionsApi.save(request); + + if (request.id == null) + webhookDefinition = await client.webhookDefinitionsApi.save(request); + else + webhookDefinition = await client.webhookDefinitionsApi.update(request); this.saving = false; this.saved = true; - //this.webhookDefinitionInternal = webhookDefinition; setTimeout(() => this.saved = false, 500); } catch (e) { diff --git a/src/designer/elsa-workflows-studio/src/components/screens/workflow-definition-list/elsa-workflow-definitions-screen/elsa-workflow-definitions-list-screen.tsx b/src/designer/elsa-workflows-studio/src/components/screens/workflow-definition-list/elsa-workflow-definitions-screen/elsa-workflow-definitions-list-screen.tsx index 7157c1711..1885c7699 100644 --- a/src/designer/elsa-workflows-studio/src/components/screens/workflow-definition-list/elsa-workflow-definitions-screen/elsa-workflow-definitions-list-screen.tsx +++ b/src/designer/elsa-workflows-studio/src/components/screens/workflow-definition-list/elsa-workflow-definitions-screen/elsa-workflow-definitions-list-screen.tsx @@ -44,7 +44,7 @@ export class ElsaWorkflowDefinitionsListScreen { render() { const workflowDefinitions = this.workflowDefinitions.items; - const groupings = collection.groupBy(workflowDefinitions, 'id'); + const groupings = collection.groupBy(workflowDefinitions, 'definitionId'); return (
@@ -134,4 +134,4 @@ export class ElsaWorkflowDefinitionsListScreen {
); } -} +} \ No newline at end of file diff --git a/src/designer/elsa-workflows-studio/src/services/elsa-client.ts b/src/designer/elsa-workflows-studio/src/services/elsa-client.ts index d8cc30f6b..27075cf06 100644 --- a/src/designer/elsa-workflows-studio/src/services/elsa-client.ts +++ b/src/designer/elsa-workflows-studio/src/services/elsa-client.ts @@ -90,6 +90,10 @@ export const createElsaClient = function (serverUrl: string): ElsaClient { const response = await httpClient.post('v1/webhook-definitions', request); return response.data; }, + update: async request => { + const response = await httpClient.put('v1/webhook-definitions', request); + return response.data; + }, delete: async webhookId => { await httpClient.delete(`v1/webhook-definitions/${webhookId}`); }, @@ -228,6 +232,8 @@ export interface WebhookDefinitionsApi { getByWebhookId(webhookId: string): Promise; save(request: SaveWebhookDefinitionRequest): Promise; + + update(request: SaveWebhookDefinitionRequest): Promise; delete(webhookId: string): Promise; }