diff --git a/src/Squidex.Domain.Apps.Entities/Apps/Guards/GuardAppWorkflows.cs b/src/Squidex.Domain.Apps.Entities/Apps/Guards/GuardAppWorkflows.cs index 70f987498..1e675ac8e 100644 --- a/src/Squidex.Domain.Apps.Entities/Apps/Guards/GuardAppWorkflows.cs +++ b/src/Squidex.Domain.Apps.Entities/Apps/Guards/GuardAppWorkflows.cs @@ -32,6 +32,11 @@ namespace Squidex.Domain.Apps.Entities.Apps.Guards e(Not.Defined("Initial step"), $"{nameof(command.Workflow)}.{nameof(workflow.Initial)}"); } + if (workflow.Initial == Status.Published) + { + e("Initial step cannot be published step.", $"{nameof(command.Workflow)}.{nameof(workflow.Initial)}"); + } + var stepsPrefix = $"{nameof(command.Workflow)}.{nameof(workflow.Steps)}"; if (!workflow.Steps.ContainsKey(Status.Published)) diff --git a/src/Squidex/app/features/administration/services/users.service.ts b/src/Squidex/app/features/administration/services/users.service.ts index 4992334f1..c7975aa9b 100644 --- a/src/Squidex/app/features/administration/services/users.service.ts +++ b/src/Squidex/app/features/administration/services/users.service.ts @@ -19,7 +19,7 @@ import { ResultSet } from '@app/shared'; -export class UsersDto extends ResultSet { +export class UsersDto extends ResultSet { public get canCreate() { return hasAnyLink(this._links, 'create'); } diff --git a/tests/Squidex.Domain.Apps.Entities.Tests/Apps/Guards/GuardAppWorkflowTests.cs b/tests/Squidex.Domain.Apps.Entities.Tests/Apps/Guards/GuardAppWorkflowTests.cs index e9d679ed1..99f2f32ca 100644 --- a/tests/Squidex.Domain.Apps.Entities.Tests/Apps/Guards/GuardAppWorkflowTests.cs +++ b/tests/Squidex.Domain.Apps.Entities.Tests/Apps/Guards/GuardAppWorkflowTests.cs @@ -42,6 +42,23 @@ namespace Squidex.Domain.Apps.Entities.Apps.Guards new ValidationError("Initial step is required.", "Workflow.Initial")); } + [Fact] + public void CanConfigure_should_throw_exception_if_initial_step_is_published() + { + var command = new ConfigureWorkflow + { + Workflow = new Workflow( + new Dictionary + { + [Status.Published] = new WorkflowStep() + }, + Status.Published) + }; + + ValidationAssert.Throws(() => GuardAppWorkflows.CanConfigure(command), + new ValidationError("Initial step cannot be published step.", "Workflow.Initial")); + } + [Fact] public void CanConfigure_should_throw_exception_if_workflow_does_not_have_published_state() { @@ -67,9 +84,10 @@ namespace Squidex.Domain.Apps.Entities.Apps.Guards Workflow = new Workflow( new Dictionary { - [Status.Published] = null + [Status.Published] = null, + [Status.Draft] = new WorkflowStep() }, - Status.Published) + Status.Draft) }; ValidationAssert.Throws(() => GuardAppWorkflows.CanConfigure(command), @@ -88,14 +106,15 @@ namespace Squidex.Domain.Apps.Entities.Apps.Guards new WorkflowStep( new Dictionary { - [Status.Draft] = new WorkflowTransition() - }) + [Status.Archived] = new WorkflowTransition() + }), + [Status.Draft] = new WorkflowStep() }, - Status.Published) + Status.Draft) }; ValidationAssert.Throws(() => GuardAppWorkflows.CanConfigure(command), - new ValidationError("Transition has an invalid target.", "Workflow.Steps.Published.Transitions.Draft")); + new ValidationError("Transition has an invalid target.", "Workflow.Steps.Published.Transitions.Archived")); } [Fact] @@ -115,7 +134,7 @@ namespace Squidex.Domain.Apps.Entities.Apps.Guards [Status.Draft] = null }) }, - Status.Published) + Status.Draft) }; ValidationAssert.Throws(() => GuardAppWorkflows.CanConfigure(command),