diff --git a/.github/workflows/deploy-nuget.yaml b/.github/workflows/deploy-nuget.yaml index 77ec112..9c9f329 100644 --- a/.github/workflows/deploy-nuget.yaml +++ b/.github/workflows/deploy-nuget.yaml @@ -1,3 +1,4 @@ +--- name: Deploy To Nuget on: @@ -19,13 +20,13 @@ jobs: build-push: name: Build and Publish needs: [test] - runs-on: ubuntu-20.04 + runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - - uses: actions/setup-dotnet@v1 + - uses: actions/setup-dotnet@v4 with: - dotnet-version: "6.0.x" + dotnet-version: "8.0.x" - name: Restore packages run: dotnet restore diff --git a/.github/workflows/sonarqube.yaml b/.github/workflows/sonarqube.yaml index 2508672..8e49654 100644 --- a/.github/workflows/sonarqube.yaml +++ b/.github/workflows/sonarqube.yaml @@ -1,3 +1,4 @@ +--- name: Run SonarQube Analysis on: @@ -13,39 +14,10 @@ concurrency: group: sonarqube-analysis jobs: - run-tests: - name: Run SonarQube Analysis - timeout-minutes: 10 - runs-on: ubuntu-latest - - env: - PROJECT_KEY: ditkrg_DIT.Workflower_AYF14rjSb80e2b0bns3t - SONARQUBE_HOST: ${{ secrets.SONARQUBE_HOST }} + test: + uses: ./.github/workflows/tests-base.yaml + with: + sonarqube: true + sonarqube_host: ${{ vars.SONARQUBE_HOST }} + secrets: SONARQUBE_TOKEN: ${{ secrets.SONARQUBE_TOKEN }} - ASPNETCORE_ENVIRONMENT: Testing - - steps: - - uses: actions/checkout@v3 - with: - fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis - - - name: Set up JDK 11 - uses: actions/setup-java@v3 - with: - distribution: "zulu" - java-version: "11" - - - name: Restore tools - run: dotnet tool restore - - - name: Run Tests (SonarQube) - run: | - dotnet tool run dotnet-sonarscanner begin -k:"$PROJECT_KEY" \ - -d:sonar.login="$SONARQUBE_TOKEN" \ - -d:sonar.host.url="$SONARQUBE_HOST" \ - -d:sonar.cs.vscoveragexml.reportsPaths=coverage.xml - - dotnet build --no-incremental - dotnet dotnet-coverage collect "dotnet test" -f xml -o "coverage.xml" - - dotnet tool run dotnet-sonarscanner end -d:sonar.login="$SONARQUBE_TOKEN" diff --git a/.github/workflows/tests-base.yaml b/.github/workflows/tests-base.yaml index cfd3a84..c97dd3e 100644 --- a/.github/workflows/tests-base.yaml +++ b/.github/workflows/tests-base.yaml @@ -12,6 +12,19 @@ on: - "!.github/workflows/tests-base.yaml" workflow_call: + inputs: + sonarqube: + type: boolean + required: false + default: false + + sonarqube_host: + type: string + required: false + + secrets: + SONARQUBE_TOKEN: + required: false jobs: run-tests: @@ -23,11 +36,44 @@ jobs: ASPNETCORE_ENVIRONMENT: Testing steps: - - uses: actions/checkout@v3 - - - uses: actions/setup-dotnet@v2 + - uses: actions/setup-dotnet@v4 with: - dotnet-version: "6.0.x" + dotnet-version: "8.0.x" + + - uses: actions/checkout@v4 + if: ${{ !inputs.sonarqube }} - name: Run tests run: dotnet test + + ############################### + ########## SONARQUBE ########## + ############################### + - name: Set up JDK + uses: actions/setup-java@v4 + if: ${{ inputs.sonarqube }} + with: + distribution: "zulu" + java-version: "17" + + - uses: actions/checkout@v4 + if: ${{ inputs.sonarqube }} + with: + fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis + + - name: Restore tools + if: ${{ inputs.sonarqube }} + run: dotnet tool restore + + - name: Run tests (SonarQube) + if: ${{ inputs.sonarqube }} + run: | + dotnet tool run dotnet-sonarscanner begin -k:"$PROJECT_KEY" \ + -d:sonar.login="$SONARQUBE_TOKEN" \ + -d:sonar.host.url="${{ inputs.sonarqube_host }}" \ + -d:sonar.cs.vscoveragexml.reportsPaths=coverage.xml + + dotnet build --no-incremental + dotnet dotnet-coverage collect "dotnet test" -f xml -o "coverage.xml" + + dotnet tool run dotnet-sonarscanner end -d:sonar.login="$SONARQUBE_TOKEN" diff --git a/src/DIT.Workflower.DependencyInjection/Abstractions/IWorkflow.cs b/src/DIT.Workflower.DependencyInjection/Abstractions/IWorkflow.cs index 598a95c..fec6118 100644 --- a/src/DIT.Workflower.DependencyInjection/Abstractions/IWorkflow.cs +++ b/src/DIT.Workflower.DependencyInjection/Abstractions/IWorkflow.cs @@ -10,6 +10,15 @@ public interface IWorkflow string Reference => $"{Id}.v{Version}"; + /// + /// Retrieves all transition definitions for the workflow. + /// + /// The type of the workflow state. + /// The type of the workflow command. + /// The type of the workflow context. + /// A list of transition definitions. + public List> GetAllTransitionDefinitions(); + /// /// Gets a list of allowed transitions without any condition checks. /// @@ -24,4 +33,13 @@ public interface IWorkflow /// The incoming state /// A list of available transitions for the current context public List> GetAllowedTransitions(TContext context, TState from); + + /// + /// Retrieves a list of allowed transitions based on the provided request. + /// + /// The type of the workflow state. + /// The type of the workflow command. + /// The request object containing the necessary information. + /// An enumerable of allowed transitions. + public IEnumerable> GetAllowedTransitions(ListTransitionsRequest request); } diff --git a/src/DIT.Workflower.DependencyInjection/DIT.Workflower.DependencyInjection.csproj b/src/DIT.Workflower.DependencyInjection/DIT.Workflower.DependencyInjection.csproj index 2600550..d4560d0 100644 --- a/src/DIT.Workflower.DependencyInjection/DIT.Workflower.DependencyInjection.csproj +++ b/src/DIT.Workflower.DependencyInjection/DIT.Workflower.DependencyInjection.csproj @@ -1,13 +1,29 @@ - net6.0 + net6.0;net7.0;net8.0 enable enable + + true + DIT.Workflower.DependencyInjection + DIT + DIT + + + true + snupkg + + + true + true + - - + + + + diff --git a/src/DIT.Workflower/DIT.Workflower.csproj b/src/DIT.Workflower/DIT.Workflower.csproj index 15526bf..57417a8 100644 --- a/src/DIT.Workflower/DIT.Workflower.csproj +++ b/src/DIT.Workflower/DIT.Workflower.csproj @@ -5,6 +5,20 @@ enable enable latest + + true + DIT.Workflower + DIT + DIT + + + true + snupkg + + + true + true + diff --git a/src/DIT.Workflower/Query.cs b/src/DIT.Workflower/Query.cs new file mode 100644 index 0000000..0b071ab --- /dev/null +++ b/src/DIT.Workflower/Query.cs @@ -0,0 +1,13 @@ +namespace DIT.Workflower; + + +public sealed class ListTransitionsRequest +{ + public TState? From { get; set; } + + public TState? To { get; set; } + + public TCommand? Command { get; set; } + + public TContext? Context { get; set; } +} diff --git a/src/DIT.Workflower/WorkflowDefinition.cs b/src/DIT.Workflower/WorkflowDefinition.cs index 1b55ded..45ce199 100644 --- a/src/DIT.Workflower/WorkflowDefinition.cs +++ b/src/DIT.Workflower/WorkflowDefinition.cs @@ -12,6 +12,8 @@ public record WorkflowDefinition _transitions = transitions; } + public List> GetAllTransitionDefinitions() => _transitions; + /// /// Lists all allowed transitions from current state for the given context. /// @@ -33,4 +35,33 @@ public record WorkflowDefinition return query.Select(x => x.ToTransition()).ToList(); } + + + public IEnumerable> GetAllowedTransitions(ListTransitionsRequest request) + { + var query = _transitions.AsQueryable(); + + if (request.From is TState from) + { + query = query.Where(doc => doc.From.Equals(from)); + } + + if (request.To is TState to) + { + query = query.Where(doc => doc.To.Equals(to)); + } + + if (request.Command is TCommand command) + { + query = query.Where(doc => doc.Command.Equals(command)); + } + + if (request.Context is not null) + { + query = query.Where(doc => doc.Conditions == null || !doc.Conditions.Any(cond => !cond(request.Context))); + } + + return query.Select(x => x.ToTransition()); + } + } diff --git a/tests/DIT.Workflower.Tests/DIT.Workflower.Tests.csproj b/tests/DIT.Workflower.Tests/DIT.Workflower.Tests.csproj index e553bdd..bb1ef17 100644 --- a/tests/DIT.Workflower.Tests/DIT.Workflower.Tests.csproj +++ b/tests/DIT.Workflower.Tests/DIT.Workflower.Tests.csproj @@ -9,14 +9,14 @@ - - - + + + runtime; build; native; contentfiles; analyzers; buildtransitive all - + runtime; build; native; contentfiles; analyzers; buildtransitive all