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,