diff --git a/NuGet.Config b/NuGet.Config index 39a5a3a..c4f65c3 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -1,4 +1,4 @@ - + @@ -7,5 +7,6 @@ + \ No newline at end of file diff --git a/src/clients/Elsa.Api.Client/Resources/WorkflowInstances/Models/WorkflowInstanceSummary.cs b/src/clients/Elsa.Api.Client/Resources/WorkflowInstances/Models/WorkflowInstanceSummary.cs index 047b6fc..7f96fad 100644 --- a/src/clients/Elsa.Api.Client/Resources/WorkflowInstances/Models/WorkflowInstanceSummary.cs +++ b/src/clients/Elsa.Api.Client/Resources/WorkflowInstances/Models/WorkflowInstanceSummary.cs @@ -12,6 +12,8 @@ public record WorkflowInstanceSummary /// The ID of the workflow instance. public string Id { get; set; } = default!; + public long? ExternalUserId { get; set; } + /// The ID of the workflow definition. public string DefinitionId { get; set; } = default!; diff --git a/src/clients/Elsa.Api.Client/Resources/WorkflowInstances/Models/WorkflowState.cs b/src/clients/Elsa.Api.Client/Resources/WorkflowInstances/Models/WorkflowState.cs index 48f1391..d7c2108 100644 --- a/src/clients/Elsa.Api.Client/Resources/WorkflowInstances/Models/WorkflowState.cs +++ b/src/clients/Elsa.Api.Client/Resources/WorkflowInstances/Models/WorkflowState.cs @@ -12,7 +12,12 @@ public class WorkflowState : Entity /// The workflow definition ID. /// public string DefinitionId { get; set; } = default!; - + + /// + /// External user's ID. + /// + public long? ExternalUserId { get; set; } + /// /// The workflow definition version. /// diff --git a/src/modules/Elsa.Dapper/Modules/Management/Records/WorkflowInstanceRecord.cs b/src/modules/Elsa.Dapper/Modules/Management/Records/WorkflowInstanceRecord.cs index e238668..8f11fb8 100644 --- a/src/modules/Elsa.Dapper/Modules/Management/Records/WorkflowInstanceRecord.cs +++ b/src/modules/Elsa.Dapper/Modules/Management/Records/WorkflowInstanceRecord.cs @@ -5,6 +5,7 @@ namespace Elsa.Dapper.Modules.Management.Records; internal class WorkflowInstanceRecord : Record { public string DefinitionId { get; set; } = null!; + public long? ExternalUserId { get; set; } public string DefinitionVersionId { get; set; } = null!; public int Version { get; set; } public string WorkflowState { get; set; } = null!; diff --git a/src/modules/Elsa.Dapper/Modules/Management/Stores/DapperWorkflowInstanceStore.cs b/src/modules/Elsa.Dapper/Modules/Management/Stores/DapperWorkflowInstanceStore.cs index 8c18734..a0a3b8f 100644 --- a/src/modules/Elsa.Dapper/Modules/Management/Stores/DapperWorkflowInstanceStore.cs +++ b/src/modules/Elsa.Dapper/Modules/Management/Stores/DapperWorkflowInstanceStore.cs @@ -217,6 +217,7 @@ internal class DapperWorkflowInstanceStore(Store store, return new() { Id = source.Id, + ExternalUserId = source.ExternalUserId, DefinitionId = source.DefinitionId, DefinitionVersionId = source.DefinitionVersionId, Version = source.Version, @@ -242,6 +243,7 @@ internal class DapperWorkflowInstanceStore(Store store, return new() { Id = source.Id, + ExternalUserId = source.ExternalUserId, DefinitionId = source.DefinitionId, DefinitionVersionId = source.DefinitionVersionId, Version = source.Version, diff --git a/src/modules/Elsa.EntityFrameworkCore.SqlServer/LICENSE.txt b/src/modules/Elsa.EntityFrameworkCore.SqlServer/LICENSE.txt new file mode 100644 index 0000000..df73626 --- /dev/null +++ b/src/modules/Elsa.EntityFrameworkCore.SqlServer/LICENSE.txt @@ -0,0 +1,3 @@ +Terms and Conditions of Use, Reproduction and Distribution are permitted only for Caspian Company. + +Copyright [2025] Caspian Company \ No newline at end of file diff --git a/src/modules/Elsa.EntityFrameworkCore.SqlServer/Migrations/Management/20250818170340_AddExternalUserId.Designer.cs b/src/modules/Elsa.EntityFrameworkCore.SqlServer/Migrations/Management/20250818170340_AddExternalUserId.Designer.cs new file mode 100644 index 0000000..4b40c43 --- /dev/null +++ b/src/modules/Elsa.EntityFrameworkCore.SqlServer/Migrations/Management/20250818170340_AddExternalUserId.Designer.cs @@ -0,0 +1,235 @@ +// +using System; +using Elsa.EntityFrameworkCore.Modules.Management; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace Elsa.EntityFrameworkCore.SqlServer.Migrations.Management +{ + [DbContext(typeof(ManagementElsaDbContext))] + [Migration("20250818170340_AddExternalUserId")] + partial class AddExternalUserId + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasDefaultSchema("Elsa") + .HasAnnotation("ProductVersion", "9.0.7") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + + modelBuilder.Entity("Elsa.Workflows.Management.Entities.WorkflowDefinition", b => + { + b.Property("Id") + .HasColumnType("nvarchar(450)"); + + b.Property("BinaryData") + .HasColumnType("varbinary(max)"); + + b.Property("CreatedAt") + .HasColumnType("datetimeoffset"); + + b.Property("Data") + .HasColumnType("nvarchar(max)"); + + b.Property("DefinitionId") + .IsRequired() + .HasColumnType("nvarchar(450)"); + + b.Property("Description") + .HasColumnType("nvarchar(max)"); + + b.Property("IsLatest") + .HasColumnType("bit"); + + b.Property("IsPublished") + .HasColumnType("bit"); + + b.Property("IsReadonly") + .HasColumnType("bit"); + + b.Property("IsSystem") + .HasColumnType("bit"); + + b.Property("MaterializerContext") + .HasColumnType("nvarchar(max)"); + + b.Property("MaterializerName") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Name") + .HasColumnType("nvarchar(450)"); + + b.Property("ProviderName") + .HasColumnType("nvarchar(max)"); + + b.Property("StringData") + .HasColumnType("nvarchar(max)"); + + b.Property("TenantId") + .HasColumnType("nvarchar(450)"); + + b.Property("ToolVersion") + .HasColumnType("nvarchar(max)"); + + b.Property("UsableAsActivity") + .HasColumnType("bit"); + + b.Property("Version") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("IsLatest") + .HasDatabaseName("IX_WorkflowDefinition_IsLatest"); + + b.HasIndex("IsPublished") + .HasDatabaseName("IX_WorkflowDefinition_IsPublished"); + + b.HasIndex("IsSystem") + .HasDatabaseName("IX_WorkflowDefinition_IsSystem"); + + b.HasIndex("Name") + .HasDatabaseName("IX_WorkflowDefinition_Name"); + + b.HasIndex("TenantId") + .HasDatabaseName("IX_WorkflowDefinition_TenantId"); + + b.HasIndex("UsableAsActivity") + .HasDatabaseName("IX_WorkflowDefinition_UsableAsActivity"); + + b.HasIndex("Version") + .HasDatabaseName("IX_WorkflowDefinition_Version"); + + b.HasIndex("DefinitionId", "Version") + .IsUnique() + .HasDatabaseName("IX_WorkflowDefinition_DefinitionId_Version"); + + b.ToTable("WorkflowDefinitions", "Elsa"); + }); + + modelBuilder.Entity("Elsa.Workflows.Management.Entities.WorkflowInstance", b => + { + b.Property("Id") + .HasColumnType("nvarchar(450)"); + + b.Property("CorrelationId") + .HasColumnType("nvarchar(450)"); + + b.Property("CreatedAt") + .HasColumnType("datetimeoffset"); + + b.Property("Data") + .HasColumnType("nvarchar(max)"); + + b.Property("DataCompressionAlgorithm") + .HasColumnType("nvarchar(max)"); + + b.Property("DefinitionId") + .IsRequired() + .HasColumnType("nvarchar(450)"); + + b.Property("DefinitionVersionId") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("ExternalUserId") + .HasColumnType("bigint"); + + b.Property("FinishedAt") + .HasColumnType("datetimeoffset"); + + b.Property("IncidentCount") + .HasColumnType("int"); + + b.Property("IsExecuting") + .HasColumnType("bit"); + + b.Property("IsSystem") + .HasColumnType("bit"); + + b.Property("Name") + .HasColumnType("nvarchar(450)"); + + b.Property("ParentWorkflowInstanceId") + .HasColumnType("nvarchar(max)"); + + b.Property("Status") + .IsRequired() + .HasColumnType("nvarchar(450)"); + + b.Property("SubStatus") + .IsRequired() + .HasColumnType("nvarchar(450)"); + + b.Property("TenantId") + .HasColumnType("nvarchar(450)"); + + b.Property("UpdatedAt") + .HasColumnType("datetimeoffset"); + + b.Property("Version") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("CorrelationId") + .HasDatabaseName("IX_WorkflowInstance_CorrelationId"); + + b.HasIndex("CreatedAt") + .HasDatabaseName("IX_WorkflowInstance_CreatedAt"); + + b.HasIndex("DefinitionId") + .HasDatabaseName("IX_WorkflowInstance_DefinitionId"); + + b.HasIndex("FinishedAt") + .HasDatabaseName("IX_WorkflowInstance_FinishedAt"); + + b.HasIndex("IsExecuting") + .HasDatabaseName("IX_WorkflowInstance_IsExecuting"); + + b.HasIndex("IsSystem") + .HasDatabaseName("IX_WorkflowInstance_IsSystem"); + + b.HasIndex("Name") + .HasDatabaseName("IX_WorkflowInstance_Name"); + + b.HasIndex("Status") + .HasDatabaseName("IX_WorkflowInstance_Status"); + + b.HasIndex("SubStatus") + .HasDatabaseName("IX_WorkflowInstance_SubStatus"); + + b.HasIndex("TenantId") + .HasDatabaseName("IX_WorkflowInstance_TenantId"); + + b.HasIndex("UpdatedAt") + .HasDatabaseName("IX_WorkflowInstance_UpdatedAt"); + + b.HasIndex("Status", "DefinitionId") + .HasDatabaseName("IX_WorkflowInstance_Status_DefinitionId"); + + b.HasIndex("Status", "SubStatus") + .HasDatabaseName("IX_WorkflowInstance_Status_SubStatus"); + + b.HasIndex("SubStatus", "DefinitionId") + .HasDatabaseName("IX_WorkflowInstance_SubStatus_DefinitionId"); + + b.HasIndex("Status", "SubStatus", "DefinitionId", "Version") + .HasDatabaseName("IX_WorkflowInstance_Status_SubStatus_DefinitionId_Version"); + + b.ToTable("WorkflowInstances", "Elsa"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/modules/Elsa.EntityFrameworkCore.SqlServer/Migrations/Management/20250818170340_AddExternalUserId.cs b/src/modules/Elsa.EntityFrameworkCore.SqlServer/Migrations/Management/20250818170340_AddExternalUserId.cs new file mode 100644 index 0000000..824619c --- /dev/null +++ b/src/modules/Elsa.EntityFrameworkCore.SqlServer/Migrations/Management/20250818170340_AddExternalUserId.cs @@ -0,0 +1,30 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Elsa.EntityFrameworkCore.SqlServer.Migrations.Management +{ + /// + public partial class AddExternalUserId : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "ExternalUserId", + schema: "Elsa", + table: "WorkflowInstances", + type: "bigint", + nullable: true); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "ExternalUserId", + schema: "Elsa", + table: "WorkflowInstances"); + } + } +} diff --git a/src/modules/Elsa.EntityFrameworkCore.SqlServer/Migrations/Management/ManagementElsaDbContextModelSnapshot.cs b/src/modules/Elsa.EntityFrameworkCore.SqlServer/Migrations/Management/ManagementElsaDbContextModelSnapshot.cs index 5bbe0d3..5a2f2fc 100644 --- a/src/modules/Elsa.EntityFrameworkCore.SqlServer/Migrations/Management/ManagementElsaDbContextModelSnapshot.cs +++ b/src/modules/Elsa.EntityFrameworkCore.SqlServer/Migrations/Management/ManagementElsaDbContextModelSnapshot.cs @@ -18,7 +18,7 @@ namespace Elsa.EntityFrameworkCore.SqlServer.Migrations.Management #pragma warning disable 612, 618 modelBuilder .HasDefaultSchema("Elsa") - .HasAnnotation("ProductVersion", "8.0.12") + .HasAnnotation("ProductVersion", "9.0.7") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); @@ -139,6 +139,9 @@ namespace Elsa.EntityFrameworkCore.SqlServer.Migrations.Management .IsRequired() .HasColumnType("nvarchar(max)"); + b.Property("ExternalUserId") + .HasColumnType("bigint"); + b.Property("FinishedAt") .HasColumnType("datetimeoffset"); diff --git a/src/modules/Elsa.EntityFrameworkCore.SqlServer/cmd.txt b/src/modules/Elsa.EntityFrameworkCore.SqlServer/cmd.txt new file mode 100644 index 0000000..309ca96 --- /dev/null +++ b/src/modules/Elsa.EntityFrameworkCore.SqlServer/cmd.txt @@ -0,0 +1,2 @@ +dotnet ef migrations add AddExternalUserId --context ManagementElsaDbContext --project D:\CaspianProjects\Caspian.Elsa.Core\src\modules\Elsa.EntityFrameworkCore.SqlServer\Elsa.EntityFrameworkCore.SqlServer.csproj --output-dir Migrations\Management +Update-Database -Context ManagementElsaDbContext \ No newline at end of file diff --git a/src/modules/Elsa.EntityFrameworkCore.SqlServer/favicon.ico b/src/modules/Elsa.EntityFrameworkCore.SqlServer/favicon.ico new file mode 100644 index 0000000..f39a7b9 Binary files /dev/null and b/src/modules/Elsa.EntityFrameworkCore.SqlServer/favicon.ico differ diff --git a/src/modules/Elsa.EntityFrameworkCore.SqlServer/gallery-icon.png b/src/modules/Elsa.EntityFrameworkCore.SqlServer/gallery-icon.png new file mode 100644 index 0000000..c401de4 Binary files /dev/null and b/src/modules/Elsa.EntityFrameworkCore.SqlServer/gallery-icon.png differ diff --git a/src/modules/Elsa.EntityFrameworkCore.SqlServer/package-icon.png b/src/modules/Elsa.EntityFrameworkCore.SqlServer/package-icon.png new file mode 100644 index 0000000..05adb12 Binary files /dev/null and b/src/modules/Elsa.EntityFrameworkCore.SqlServer/package-icon.png differ diff --git a/src/modules/Elsa.EntityFrameworkCore.SqlServer/readme.md b/src/modules/Elsa.EntityFrameworkCore.SqlServer/readme.md new file mode 100644 index 0000000..c1954a1 --- /dev/null +++ b/src/modules/Elsa.EntityFrameworkCore.SqlServer/readme.md @@ -0,0 +1,35 @@ +# Caspian.NextBank.Workflow + +Workflows for project "NextBankParsian" + +## Installation +```bash +dotnet add package Caspian.NextBank.Workflow +``` +```bash +install-package Caspian.NextBank.Workflow +``` + +## Usage Example +In your Program.cs : +```csharp +builder.Services.AddMongoLogger(builder.Configuration); + +builder.AddWorkflowServices("DefaultConnection"); + +var app = builder.Build(); + +app.UseMongoLogger(); + +app.UseWorkflow(); +``` +Then use service "WfService" + +## Features +- Start new instance of every workflow +- Publish event and get next step information +- Get last status of workflow instance + +## Version History +### 1.0.0-alfa +- Initial prerelease \ No newline at end of file diff --git a/src/modules/Elsa.MassTransit/Services/MassTransitWorkflowDispatcher.cs b/src/modules/Elsa.MassTransit/Services/MassTransitWorkflowDispatcher.cs index cfc31cc..b3af6bf 100644 --- a/src/modules/Elsa.MassTransit/Services/MassTransitWorkflowDispatcher.cs +++ b/src/modules/Elsa.MassTransit/Services/MassTransitWorkflowDispatcher.cs @@ -114,6 +114,7 @@ public class MassTransitWorkflowDispatcher( var workflowInstanceOptions = new WorkflowInstanceOptions { WorkflowInstanceId = request.WorkflowInstanceId, + ExternalUserId = request.ExternalUserId, Input = request.Input, Properties = request.Properties, CorrelationId = request.CorrelationId diff --git a/src/modules/Elsa.MongoDb/Helpers/ExpressionHelpers.cs b/src/modules/Elsa.MongoDb/Helpers/ExpressionHelpers.cs index 88db796..40ac82d 100644 --- a/src/modules/Elsa.MongoDb/Helpers/ExpressionHelpers.cs +++ b/src/modules/Elsa.MongoDb/Helpers/ExpressionHelpers.cs @@ -28,6 +28,7 @@ internal static class ExpressionHelpers workflowInstance => new() { Id = workflowInstance.Id, + ExternalUserId = workflowInstance.ExternalUserId, DefinitionId = workflowInstance.DefinitionId, DefinitionVersionId = workflowInstance.DefinitionVersionId, Version = workflowInstance.Version, diff --git a/src/modules/Elsa.Workflows.Api/Endpoints/WorkflowInstances/Get/Mappers.cs b/src/modules/Elsa.Workflows.Api/Endpoints/WorkflowInstances/Get/Mappers.cs index 9b76aa5..6e000fc 100644 --- a/src/modules/Elsa.Workflows.Api/Endpoints/WorkflowInstances/Get/Mappers.cs +++ b/src/modules/Elsa.Workflows.Api/Endpoints/WorkflowInstances/Get/Mappers.cs @@ -13,6 +13,7 @@ internal class WorkflowInstanceMapper : ResponseMapper new() { Id = e.Id, + ExternalUserId = e.ExternalUserId, DefinitionId = e.DefinitionId, DefinitionVersionId = e.DefinitionVersionId, Version = e.Version, diff --git a/src/modules/Elsa.Workflows.Api/Models/WorkflowInstanceModel.cs b/src/modules/Elsa.Workflows.Api/Models/WorkflowInstanceModel.cs index 65bdae7..92c0819 100644 --- a/src/modules/Elsa.Workflows.Api/Models/WorkflowInstanceModel.cs +++ b/src/modules/Elsa.Workflows.Api/Models/WorkflowInstanceModel.cs @@ -11,7 +11,9 @@ public class WorkflowInstanceModel /// Gets or sets the ID of the workflow instance. /// public string Id { get; set; } = default!; - + + public long? ExternalUserId { get; set; } + /// /// The ID of the workflow definition. /// diff --git a/src/modules/Elsa.Workflows.Core/Contexts/WorkflowExecutionContext.cs b/src/modules/Elsa.Workflows.Core/Contexts/WorkflowExecutionContext.cs index ada56a4..0347ffc 100644 --- a/src/modules/Elsa.Workflows.Core/Contexts/WorkflowExecutionContext.cs +++ b/src/modules/Elsa.Workflows.Core/Contexts/WorkflowExecutionContext.cs @@ -258,6 +258,8 @@ public partial class WorkflowExecutionContext : IExecutionContext /// A unique ID of the execution context. public string Id { get; set; } + public long? ExternalUserId { get; set; } + /// public IActivity Activity => Workflow; diff --git a/src/modules/Elsa.Workflows.Core/Services/WorkflowStateExtractor.cs b/src/modules/Elsa.Workflows.Core/Services/WorkflowStateExtractor.cs index f37d2a6..a94819a 100644 --- a/src/modules/Elsa.Workflows.Core/Services/WorkflowStateExtractor.cs +++ b/src/modules/Elsa.Workflows.Core/Services/WorkflowStateExtractor.cs @@ -15,6 +15,7 @@ public class WorkflowStateExtractor(ILogger logger) : IW var state = new WorkflowState { Id = workflowExecutionContext.Id, + ExternalUserId = workflowExecutionContext.ExternalUserId, DefinitionId = workflowExecutionContext.Workflow.Identity.DefinitionId, DefinitionVersionId = workflowExecutionContext.Workflow.Identity.Id, DefinitionVersion = workflowExecutionContext.Workflow.Identity.Version, @@ -47,6 +48,7 @@ public class WorkflowStateExtractor(ILogger logger) : IW public async Task ApplyAsync(WorkflowExecutionContext workflowExecutionContext, WorkflowState state) { workflowExecutionContext.Id = state.Id; + workflowExecutionContext.ExternalUserId = state.ExternalUserId; workflowExecutionContext.CorrelationId = state.CorrelationId; workflowExecutionContext.Name = state.Name; workflowExecutionContext.ParentWorkflowInstanceId = state.ParentWorkflowInstanceId; diff --git a/src/modules/Elsa.Workflows.Core/State/WorkflowState.cs b/src/modules/Elsa.Workflows.Core/State/WorkflowState.cs index 0ab6fc5..2eb2780 100644 --- a/src/modules/Elsa.Workflows.Core/State/WorkflowState.cs +++ b/src/modules/Elsa.Workflows.Core/State/WorkflowState.cs @@ -13,6 +13,11 @@ public class WorkflowState /// public string Id { get; set; } = null!; + /// + /// External user's ID. + /// + public long? ExternalUserId { get; set; } + /// /// The workflow definition ID. /// diff --git a/src/modules/Elsa.Workflows.Management/Entities/WorkflowInstance.cs b/src/modules/Elsa.Workflows.Management/Entities/WorkflowInstance.cs index 8c34f71..cdf77de 100644 --- a/src/modules/Elsa.Workflows.Management/Entities/WorkflowInstance.cs +++ b/src/modules/Elsa.Workflows.Management/Entities/WorkflowInstance.cs @@ -8,6 +8,11 @@ namespace Elsa.Workflows.Management.Entities; /// public class WorkflowInstance : Entity { + /// + /// External user's id + /// + public long? ExternalUserId { get; set; } + /// /// The ID of the workflow definition. /// diff --git a/src/modules/Elsa.Workflows.Management/Filters/WorkflowInstanceFilter.cs b/src/modules/Elsa.Workflows.Management/Filters/WorkflowInstanceFilter.cs index c225a1b..f7e0352 100644 --- a/src/modules/Elsa.Workflows.Management/Filters/WorkflowInstanceFilter.cs +++ b/src/modules/Elsa.Workflows.Management/Filters/WorkflowInstanceFilter.cs @@ -16,6 +16,8 @@ public class WorkflowInstanceFilter /// public string? Id { get; set; } + public long? ExternalUserId { get; set; } + /// /// Filter workflow instances by IDs. /// @@ -130,6 +132,7 @@ public class WorkflowInstanceFilter var filter = this; if (!string.IsNullOrWhiteSpace(filter.Id)) query = query.Where(x => x.Id == filter.Id); + if (filter.ExternalUserId.HasValue) query = query.Where(x => x.ExternalUserId == filter.ExternalUserId); if (filter.Ids != null) query = query.Where(x => filter.Ids.Contains(x.Id)); if (!string.IsNullOrWhiteSpace(filter.DefinitionId)) query = query.Where(x => x.DefinitionId == filter.DefinitionId); if (!string.IsNullOrWhiteSpace(filter.DefinitionVersionId)) query = query.Where(x => x.DefinitionVersionId == filter.DefinitionVersionId); diff --git a/src/modules/Elsa.Workflows.Management/Mappers/WorkflowStateMapper.cs b/src/modules/Elsa.Workflows.Management/Mappers/WorkflowStateMapper.cs index deccb81..8e1a409 100644 --- a/src/modules/Elsa.Workflows.Management/Mappers/WorkflowStateMapper.cs +++ b/src/modules/Elsa.Workflows.Management/Mappers/WorkflowStateMapper.cs @@ -14,7 +14,7 @@ public class WorkflowStateMapper /// [Obsolete("This constant is obsolete and retained only for backward compatibility. Avoid using it in new code.")] private const string WorkflowInstanceNameKey = "WorkflowInstanceName"; - + /// /// Maps a workflow state to a workflow instance. /// @@ -35,6 +35,7 @@ public class WorkflowStateMapper public void Apply(WorkflowState source, WorkflowInstance target) { target.Id = source.Id; + target.ExternalUserId = source.ExternalUserId; target.CreatedAt = source.CreatedAt; target.DefinitionId = source.DefinitionId; target.DefinitionVersionId = source.DefinitionVersionId; @@ -50,7 +51,7 @@ public class WorkflowStateMapper target.UpdatedAt = source.UpdatedAt; target.FinishedAt = source.FinishedAt; target.WorkflowState = source; - + // Keep for backward compatibility with workflow instances created before the introduction of the Name property. if (source.Properties.TryGetValue(WorkflowInstanceNameKey, out var name)) target.Name = name; @@ -66,6 +67,7 @@ public class WorkflowStateMapper var workflowState = source.WorkflowState; workflowState.Id = source.Id; + workflowState.ExternalUserId = source.ExternalUserId; workflowState.CreatedAt = source.CreatedAt; workflowState.DefinitionId = source.DefinitionId; workflowState.DefinitionVersionId = source.DefinitionVersionId; diff --git a/src/modules/Elsa.Workflows.Management/Models/WorkflowInstanceSummary.cs b/src/modules/Elsa.Workflows.Management/Models/WorkflowInstanceSummary.cs index ef67312..6a9aa5f 100644 --- a/src/modules/Elsa.Workflows.Management/Models/WorkflowInstanceSummary.cs +++ b/src/modules/Elsa.Workflows.Management/Models/WorkflowInstanceSummary.cs @@ -16,6 +16,7 @@ public class WorkflowInstanceSummary return new() { Id = workflowInstance.Id, + ExternalUserId = workflowInstance.ExternalUserId, DefinitionId = workflowInstance.DefinitionId, DefinitionVersionId = workflowInstance.DefinitionVersionId, Version = workflowInstance.Version, @@ -36,6 +37,7 @@ public class WorkflowInstanceSummary public static Expression> FromInstanceExpression() => workflowInstance => new() { Id = workflowInstance.Id, + ExternalUserId = workflowInstance.ExternalUserId, DefinitionId = workflowInstance.DefinitionId, DefinitionVersionId = workflowInstance.DefinitionVersionId, Version = workflowInstance.Version, @@ -53,6 +55,8 @@ public class WorkflowInstanceSummary /// The ID of the workflow instance. public string Id { get; set; } = null!; + public long? ExternalUserId { get; set; } + /// The ID of the workflow definition. public string DefinitionId { get; set; } = null!; diff --git a/src/modules/Elsa.Workflows.Management/Options/WorkflowInstanceOptions.cs b/src/modules/Elsa.Workflows.Management/Options/WorkflowInstanceOptions.cs index 76051ae..dc42b6a 100644 --- a/src/modules/Elsa.Workflows.Management/Options/WorkflowInstanceOptions.cs +++ b/src/modules/Elsa.Workflows.Management/Options/WorkflowInstanceOptions.cs @@ -13,6 +13,8 @@ public class WorkflowInstanceOptions /// public string? CorrelationId { get; set; } + public long? ExternalUserId { get; set; } + /// /// The name of the workflow instance. /// diff --git a/src/modules/Elsa.Workflows.Management/Services/WorkflowInstanceFactory.cs b/src/modules/Elsa.Workflows.Management/Services/WorkflowInstanceFactory.cs index aada085..87357e8 100644 --- a/src/modules/Elsa.Workflows.Management/Services/WorkflowInstanceFactory.cs +++ b/src/modules/Elsa.Workflows.Management/Services/WorkflowInstanceFactory.cs @@ -17,6 +17,7 @@ public class WorkflowInstanceFactory(IIdentityGenerator identityGenerator, ISyst return new() { Id = string.IsNullOrEmpty(options?.WorkflowInstanceId) ? identityGenerator.GenerateId() : options.WorkflowInstanceId, + ExternalUserId = options?.ExternalUserId, DefinitionId = workflow.Identity.DefinitionId, DefinitionVersionId = workflow.Identity.Id, DefinitionVersion = workflow.Identity.Version, @@ -40,6 +41,7 @@ public class WorkflowInstanceFactory(IIdentityGenerator identityGenerator, ISyst return new() { Id = workflowState.Id, + ExternalUserId = workflowState.ExternalUserId, ParentWorkflowInstanceId = workflowState.ParentWorkflowInstanceId, WorkflowState = workflowState, DefinitionId = workflowState.DefinitionId, diff --git a/src/modules/Elsa.Workflows.Runtime/Messages/CreateWorkflowInstanceRequest.cs b/src/modules/Elsa.Workflows.Runtime/Messages/CreateWorkflowInstanceRequest.cs index 8cebf9d..2b3fdd9 100644 --- a/src/modules/Elsa.Workflows.Runtime/Messages/CreateWorkflowInstanceRequest.cs +++ b/src/modules/Elsa.Workflows.Runtime/Messages/CreateWorkflowInstanceRequest.cs @@ -19,6 +19,8 @@ public class CreateWorkflowInstanceRequest /// public string? CorrelationId { get; set; } + public long? ExternalUserId { get; set; } + /// /// The name of the workflow instance to be created. /// diff --git a/src/modules/Elsa.Workflows.Runtime/Requests/DispatchTriggerWorkflowsRequest.cs b/src/modules/Elsa.Workflows.Runtime/Requests/DispatchTriggerWorkflowsRequest.cs index 1644f6a..261c9e5 100644 --- a/src/modules/Elsa.Workflows.Runtime/Requests/DispatchTriggerWorkflowsRequest.cs +++ b/src/modules/Elsa.Workflows.Runtime/Requests/DispatchTriggerWorkflowsRequest.cs @@ -26,4 +26,6 @@ public class DispatchTriggerWorkflowsRequest(string activityTypeName, object boo /// Any properties to attach to the workflow instance. /// public IDictionary? Properties { get; set; } + + public long? ExternalUserId { get; set; } } \ No newline at end of file diff --git a/src/modules/Elsa.Workflows.Runtime/Services/LocalWorkflowClient.cs b/src/modules/Elsa.Workflows.Runtime/Services/LocalWorkflowClient.cs index f7446ee..f2a7f28 100644 --- a/src/modules/Elsa.Workflows.Runtime/Services/LocalWorkflowClient.cs +++ b/src/modules/Elsa.Workflows.Runtime/Services/LocalWorkflowClient.cs @@ -35,6 +35,7 @@ public class LocalWorkflowClient( var options = new WorkflowInstanceOptions { WorkflowInstanceId = WorkflowInstanceId, + ExternalUserId = request.ExternalUserId, CorrelationId = request.CorrelationId, Name = request.Name, ParentWorkflowInstanceId = request.ParentId, @@ -153,6 +154,7 @@ public class LocalWorkflowClient( var options = new WorkflowInstanceOptions { WorkflowInstanceId = WorkflowInstanceId, + ExternalUserId = request.ExternalUserId, CorrelationId = request.CorrelationId, Name = request.Name, ParentWorkflowInstanceId = request.ParentId,