diff --git a/src/designer/elsa-workflows-studio/src/components/screens/workflow-definition-editor/elsa-workflow-definition-editor-screen/elsa-workflow-definition-editor-screen.tsx b/src/designer/elsa-workflows-studio/src/components/screens/workflow-definition-editor/elsa-workflow-definition-editor-screen/elsa-workflow-definition-editor-screen.tsx index a7227ab6d..b77676ba9 100644 --- a/src/designer/elsa-workflows-studio/src/components/screens/workflow-definition-editor/elsa-workflow-definition-editor-screen/elsa-workflow-definition-editor-screen.tsx +++ b/src/designer/elsa-workflows-studio/src/components/screens/workflow-definition-editor/elsa-workflow-definition-editor-screen/elsa-workflow-definition-editor-screen.tsx @@ -248,7 +248,6 @@ export class ElsaWorkflowDefinitionEditorScreen { let workflowDefinition = this.workflowDefinition; const isNew = typeof workflowDefinition.definitionId === 'undefined' && typeof this.workflowDefinitionId === 'undefined'; - debugger; const request: SaveWorkflowDefinitionRequest = { workflowDefinitionId: workflowDefinition.definitionId || this.workflowDefinitionId, contextOptions: workflowDefinition.contextOptions, diff --git a/src/server/Elsa.Server.Api/Endpoints/WorkflowDefinitions/GetByDefinitionAndVersion.cs b/src/server/Elsa.Server.Api/Endpoints/WorkflowDefinitions/GetByDefinitionAndVersion.cs index 5118e3e18..3a9993fda 100644 --- a/src/server/Elsa.Server.Api/Endpoints/WorkflowDefinitions/GetByDefinitionAndVersion.cs +++ b/src/server/Elsa.Server.Api/Endpoints/WorkflowDefinitions/GetByDefinitionAndVersion.cs @@ -41,13 +41,7 @@ namespace Elsa.Server.Api.Endpoints.WorkflowDefinitions public async Task Handle(string workflowDefinitionId, VersionOptions versionOptions, CancellationToken cancellationToken = default) { var workflowDefinition = await _workflowDefinitionStore.FindAsync(new WorkflowDefinitionIdSpecification(workflowDefinitionId, versionOptions), cancellationToken); - - // Here we don't want to use the `PreserveReferencesHandling` setting because the model will be used by the designer "as-is" and will not resolve $id references. - // Fixes #1605. - var settings = DefaultContentSerializer.CreateDefaultJsonSerializationSettings(); - settings.PreserveReferencesHandling = PreserveReferencesHandling.None; - - return workflowDefinition == null ? NotFound() : Json(workflowDefinition, settings); + return workflowDefinition == null ? NotFound() : Json(workflowDefinition, SerializationHelper.GetSettingsForWorkflowDefinition()); } } } \ No newline at end of file diff --git a/src/server/Elsa.Server.Api/Endpoints/WorkflowDefinitions/GetByVersionId.cs b/src/server/Elsa.Server.Api/Endpoints/WorkflowDefinitions/GetByVersionId.cs index 2eb4ddf30..5d1a81ac1 100644 --- a/src/server/Elsa.Server.Api/Endpoints/WorkflowDefinitions/GetByVersionId.cs +++ b/src/server/Elsa.Server.Api/Endpoints/WorkflowDefinitions/GetByVersionId.cs @@ -7,6 +7,7 @@ using Elsa.Serialization; using Elsa.Server.Api.Swagger.Examples; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; +using Newtonsoft.Json; using Swashbuckle.AspNetCore.Annotations; using Swashbuckle.AspNetCore.Filters; @@ -40,7 +41,7 @@ namespace Elsa.Server.Api.Endpoints.WorkflowDefinitions public async Task Handle(string versionId, CancellationToken cancellationToken = default) { var workflowDefinition = await _workflowDefinitionStore.FindAsync(new WorkflowDefinitionVersionIdSpecification(versionId), cancellationToken); - return workflowDefinition == null ? NotFound() : Json(workflowDefinition, _serializer.GetSettings()); + return workflowDefinition == null ? NotFound() : Json(workflowDefinition, SerializationHelper.GetSettingsForWorkflowDefinition()); } } } \ No newline at end of file diff --git a/src/server/Elsa.Server.Api/Endpoints/WorkflowDefinitions/List.cs b/src/server/Elsa.Server.Api/Endpoints/WorkflowDefinitions/List.cs index eb46e4dd2..072dd840b 100644 --- a/src/server/Elsa.Server.Api/Endpoints/WorkflowDefinitions/List.cs +++ b/src/server/Elsa.Server.Api/Endpoints/WorkflowDefinitions/List.cs @@ -14,6 +14,7 @@ using Elsa.Server.Api.Swagger.Examples; using Elsa.Services; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; +using Newtonsoft.Json; using Swashbuckle.AspNetCore.Annotations; using Swashbuckle.AspNetCore.Filters; @@ -63,7 +64,7 @@ namespace Elsa.Server.Api.Endpoints.WorkflowDefinitions var summaries = _mapper.Map>(items); var pagedList = new PagedList(summaries, page, pageSize, totalCount); - return Json(pagedList, _serializer.GetSettings()); + return Json(pagedList, SerializationHelper.GetSettingsForWorkflowDefinition()); } private Specification GetSpecification(string? ids, VersionOptions version) diff --git a/src/server/Elsa.Server.Api/Endpoints/WorkflowDefinitions/Publish.cs b/src/server/Elsa.Server.Api/Endpoints/WorkflowDefinitions/Publish.cs index e127f317c..035e7a2f8 100644 --- a/src/server/Elsa.Server.Api/Endpoints/WorkflowDefinitions/Publish.cs +++ b/src/server/Elsa.Server.Api/Endpoints/WorkflowDefinitions/Publish.cs @@ -6,6 +6,7 @@ using Elsa.Server.Api.Swagger.Examples; using Elsa.Services; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; +using Newtonsoft.Json; using Swashbuckle.AspNetCore.Annotations; using Swashbuckle.AspNetCore.Filters; @@ -40,14 +41,14 @@ namespace Elsa.Server.Api.Endpoints.WorkflowDefinitions { // Create a draft. var draft = await _workflowPublisher.GetDraftAsync(workflowDefinitionId, cancellationToken); - + if (draft == null) return NotFound(); - + // Publish the draft. - var published = await _workflowPublisher.PublishAsync(draft, cancellationToken); - - return AcceptedAtAction("Handle", "GetByVersionId", new { versionId = published.Id, apiVersion = apiVersion.ToString() }, published); + var publishedWorkflowDefinition = await _workflowPublisher.PublishAsync(draft, cancellationToken); + + return AcceptedAtAction("Handle", "GetByVersionId", new { versionId = publishedWorkflowDefinition.Id, apiVersion = apiVersion.ToString() }, publishedWorkflowDefinition); } } } \ No newline at end of file diff --git a/src/server/Elsa.Server.Api/Endpoints/WorkflowDefinitions/Retract.cs b/src/server/Elsa.Server.Api/Endpoints/WorkflowDefinitions/Retract.cs index bad7b6d96..f0ba39d18 100644 --- a/src/server/Elsa.Server.Api/Endpoints/WorkflowDefinitions/Retract.cs +++ b/src/server/Elsa.Server.Api/Endpoints/WorkflowDefinitions/Retract.cs @@ -6,6 +6,7 @@ using Elsa.Server.Api.Swagger.Examples; using Elsa.Services; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; +using Newtonsoft.Json; using Swashbuckle.AspNetCore.Annotations; using Swashbuckle.AspNetCore.Filters; diff --git a/src/server/Elsa.Server.Api/Endpoints/WorkflowDefinitions/Save.cs b/src/server/Elsa.Server.Api/Endpoints/WorkflowDefinitions/Save.cs index f73c81746..078a9393d 100644 --- a/src/server/Elsa.Server.Api/Endpoints/WorkflowDefinitions/Save.cs +++ b/src/server/Elsa.Server.Api/Endpoints/WorkflowDefinitions/Save.cs @@ -7,6 +7,7 @@ using Elsa.Server.Api.Swagger.Examples; using Elsa.Services; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; +using Newtonsoft.Json; using Swashbuckle.AspNetCore.Annotations; using Swashbuckle.AspNetCore.Filters; @@ -20,6 +21,7 @@ namespace Elsa.Server.Api.Endpoints.WorkflowDefinitions { private readonly IWorkflowPublisher _workflowPublisher; private readonly ITenantAccessor _tenantAccessor; + public Save(IWorkflowPublisher workflowPublisher, ITenantAccessor tenantAccessor) { _workflowPublisher = workflowPublisher; @@ -40,6 +42,7 @@ namespace Elsa.Server.Api.Endpoints.WorkflowDefinitions { var workflowDefinitionId = request.WorkflowDefinitionId; var workflowDefinition = !string.IsNullOrWhiteSpace(workflowDefinitionId) ? await _workflowPublisher.GetDraftAsync(workflowDefinitionId, cancellationToken) : default; + var isNew = workflowDefinition == null; if (workflowDefinition == null) { @@ -69,7 +72,9 @@ namespace Elsa.Server.Api.Endpoints.WorkflowDefinitions else workflowDefinition = await _workflowPublisher.SaveDraftAsync(workflowDefinition, cancellationToken); - return CreatedAtAction("Handle", "GetByVersionId", new { versionId = workflowDefinition.Id, apiVersion = apiVersion.ToString() }, workflowDefinition); + return isNew + ? CreatedAtAction("Handle", "GetByVersionId", new { versionId = workflowDefinition.Id, apiVersion = apiVersion.ToString() }, workflowDefinition) + : Ok(workflowDefinition); } private IEnumerable FilterInvalidConnections(SaveWorkflowDefinitionRequest request) diff --git a/src/server/Elsa.Server.Api/SerializationHelper.cs b/src/server/Elsa.Server.Api/SerializationHelper.cs new file mode 100644 index 000000000..497e54def --- /dev/null +++ b/src/server/Elsa.Server.Api/SerializationHelper.cs @@ -0,0 +1,18 @@ +using Elsa.Serialization; +using Newtonsoft.Json; + +namespace Elsa.Server.Api +{ + public static class SerializationHelper + { + public static JsonSerializerSettings GetSettingsForWorkflowDefinition() + { + // Here we don't want to use the `PreserveReferencesHandling` setting because the model will be used by the designer "as-is" and will not resolve $id references. + // Fixes #1605. + var settings = DefaultContentSerializer.CreateDefaultJsonSerializationSettings(); + settings.PreserveReferencesHandling = PreserveReferencesHandling.None; + + return settings; + } + } +} \ No newline at end of file