From d0d40129fe88b3df2abde56aaee95fb25608217e Mon Sep 17 00:00:00 2001 From: Behzad Alizadeh Date: Mon, 18 Aug 2025 20:40:36 +0330 Subject: [PATCH] Add field "ExternalUserId" to table "WorkflowInstance" and change related classes --- NuGet.Config | 3 +- .../Models/WorkflowInstanceSummary.cs | 2 + .../WorkflowInstances/Models/WorkflowState.cs | 7 +- .../Records/WorkflowInstanceRecord.cs | 1 + .../Stores/DapperWorkflowInstanceStore.cs | 2 + .../LICENSE.txt | 3 + ...250818170340_AddExternalUserId.Designer.cs | 235 ++++++++++++++++++ .../20250818170340_AddExternalUserId.cs | 30 +++ .../ManagementElsaDbContextModelSnapshot.cs | 5 +- .../cmd.txt | 2 + .../favicon.ico | Bin 0 -> 1150 bytes .../gallery-icon.png | Bin 0 -> 4535 bytes .../package-icon.png | Bin 0 -> 12783 bytes .../readme.md | 35 +++ .../Services/MassTransitWorkflowDispatcher.cs | 1 + .../Elsa.MongoDb/Helpers/ExpressionHelpers.cs | 1 + .../WorkflowInstances/Get/Mappers.cs | 1 + .../Models/WorkflowInstanceModel.cs | 4 +- .../Contexts/WorkflowExecutionContext.cs | 2 + .../Services/WorkflowStateExtractor.cs | 2 + .../State/WorkflowState.cs | 5 + .../Entities/WorkflowInstance.cs | 5 + .../Filters/WorkflowInstanceFilter.cs | 3 + .../Mappers/WorkflowStateMapper.cs | 6 +- .../Models/WorkflowInstanceSummary.cs | 4 + .../Options/WorkflowInstanceOptions.cs | 2 + .../Services/WorkflowInstanceFactory.cs | 2 + .../Messages/CreateWorkflowInstanceRequest.cs | 2 + .../DispatchTriggerWorkflowsRequest.cs | 2 + .../Services/LocalWorkflowClient.cs | 2 + 30 files changed, 363 insertions(+), 6 deletions(-) create mode 100644 src/modules/Elsa.EntityFrameworkCore.SqlServer/LICENSE.txt create mode 100644 src/modules/Elsa.EntityFrameworkCore.SqlServer/Migrations/Management/20250818170340_AddExternalUserId.Designer.cs create mode 100644 src/modules/Elsa.EntityFrameworkCore.SqlServer/Migrations/Management/20250818170340_AddExternalUserId.cs create mode 100644 src/modules/Elsa.EntityFrameworkCore.SqlServer/cmd.txt create mode 100644 src/modules/Elsa.EntityFrameworkCore.SqlServer/favicon.ico create mode 100644 src/modules/Elsa.EntityFrameworkCore.SqlServer/gallery-icon.png create mode 100644 src/modules/Elsa.EntityFrameworkCore.SqlServer/package-icon.png create mode 100644 src/modules/Elsa.EntityFrameworkCore.SqlServer/readme.md 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 0000000000000000000000000000000000000000..f39a7b93d37dd9e9a9d508ec22c39fd1ad644019 GIT binary patch literal 1150 zcmah|dq`7Z6hHQoFdv1K1erY~6N(^21u4`XRuX{{q7_AdXi;ez1fd90^HG|qX}XCs z-Ey{BYHB$(AAw1wNt)Z;-MzbeXo~sFl#*`eGrm~;QQ!D>w%_@kbM866a{(OiX%3q&@D4&*2^iRI*rmC>?XZ z%L=yl%?@{NVe(KPDdv#Eq#k+WeK{eNBh-iHG8m`B9?ebBu@t9v#?-KlEyP&Vm#^@6 z!D9W9mWX8HXHa{kK1#}?}g1cb4P$K+^|0Es4Ng~0KmQ=fFM*fU=bh? XZ}9>^25xXKzI9#Q_};hzEMn|Wr8BQk literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..c401de4ecb789d526ef9342692bc919f74287cd7 GIT binary patch literal 4535 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 E0OKfCh5!Hn literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..05adb12c955740886ab4ed72187d3df41f3d4cee GIT binary patch literal 12783 zcmZ{rQ*b5D6Ypc3SR326ZQI#!W81cUVx8EwH{RH`?Txd^{rz8V)qS`%HS?|Nu21(= zO-e`RVk)Di2nOau^`AWq4D9`X z{xdKzcNQ?P3u7=azDzJMY^U5VRe}E;Fu&xbCBVM_H$c7RssCAE-DDLdVb7u90L1u_ zkPIeZU@Wt;5~3Pj8`r&_nWfV1r{9%#eYc8vW##46)Zz119Oz=`V(=(r2@v(4!;d5)D40o8sey8m_hS7Mh>aDK_gm&zOh)t5oe1QHi-9NfBe*|0*VAiI(oD-w(ttsiyVrX!?`Hz8j(|CPAyw-G!^4}903v)xXgBKppjpY*)Xv1Wrv7d-v+BOQYZJu<9y5^y?@Stz71I3pJ(G2wLmy(Wx--sc;O zYAfXigS6ujOfH--mOsjKWq* zfE-6}BmNnCbjDQ0S#*QS7BW4YD$2hkUlw^;U#^w9}zE<>n{QSA5tpk=O1o&k=8YyzFuA18!`e#2P za?8WsN8)GEj*`L#D8Pw0Gwh{ccOY=v?W?DKtf&7@v0ae%yTu+=^DJ~8rU;7*lMP<^ z16hdtk3^1Slw0_cxmVtCu>l>XflTqnUQZfl-)jt({sM1c@jy@SSzB_%=Z*HwX|fM> z+nT6~28UfLOEXZKAe53{-Z91Wo43@+;=teLVYdibS#k_$IN8b4r=NQ#bBprbpRxsg zooy^oK^6tGU9!k*Vde%Kz99Pbe0=)2qWO4ek)M(AdD)iT^Dgf>un}KTlQ57xB1TI$ z|3{6YVXv7B&zcU-7{@WV(YzZysph!Gxz<*swTih&G#pCem0`e~Hj~T>Wwg+3#YP)) zG^DAMEzS%Tq7Qx?jw8oAR8Kq-iAGPc5r_tbre`Z5FdadznyqIKv|*^IfRvRch44ua zx{cgcerT)4e#olEp7s8idPCUpI~9NEyuA%Nz8t`0u|@*!jfPb$&AT4QkscBC4>e>B zg6@M>@i=&PFKVlnU9VZ9LWhqgiqwlV3K1yPICPt_l#?*CIZ2Ay=W=%uVi8F3vE7{< zj8HB!Je;k0Gd(14_%bIF3h7?1x5gG>VLF+k*ZNF_Et#wC>id1LurW_(Y6Z#xcL|O{ z6a_vDqTjk_g$6o@ve9~izf7wgS3T zEPPOUjSbbQrQvbSU5q(e?k>9h`xE(fylLBc;z~kqhxSXbM29a%4+30_dVJKkIn8qV zZ-H&&D4s~Ba)g+N&|bn(l~8e1tU$V?686id!@5=S?SVI%qMzWz*8jBq(0X7_2RgUX z2$p}oB*sHbfBGU#0D8F&)8u39^cRM(VgdTCuS*gB?YG29&Dhh5xF<)2v;VHzkA+sn zD_dfu4pG~VWK!8=WRjLd5h~%!zm2o@2yjr&;{I*p%{22k+JVpgg(k0|HLtm-Y-sDA zDsuVVh3u4~ZD1QO7cRjTBRNU0HKVA^Z@_w)CisEyGV#1Y)Tf~Fj) zsZL0roJ!sXNC{GHcx4II!;nH}I!o+u)6L4Lzdndq-hN!j{O)rVA>wz7f_>(Dj<720P}G_ReYGM`yLM8tk{o`eLwi14>jJkT?H+8b|SsoX1e@@muq#0nr@xzlVrexs?=q5bu z$1$U|j>or*g3nw!^_(uW_V^DK>0?Y(@}xKC_-&f zYD@u*EZ%|3(YHKA$p^EP7tyN7k-`~rXYoKl(G6OK%EYEppjO0DA*;SoE07@iR9Jvh zaDoP6u}gZs-w`^SiY!}qsQ)#5``i+Fe|x@wK32rqu#MP~*3SiXp;EwNASNJ5B`>WJ z6GfDT1-j!)^U_iJkNg52uO4dP_R4}y-Ubp31X@l>lyBm_PC#>*&}ln8+TCFG0_ix% zrs(x(rYQ8qUT%$H$_IWls{s3l$_a!y7qElGGejX1{q?l*9Fn;`LAoa>B^dx+Vys!n z1MUVCPv!6Yg1b6whSS4-r~Mk*0a?K_{LSZy>Mv&mkAE-}@eN#*>3j;7P&ls17kpmf zX{fTl(Sq(J$dw-~nFSMt`|geg%i4*mCNhY;(}{0!4+})2o%Ua+=gzbb#cr5uHId}w=YtOp)Egy zY9oKGzb^Z-`UuK;qiW(yRo110{61E`GP}8~e&Iu_fM->Sy9ce-RNj4MbupI6Bt!&#kl}y1yIq_ zfXP33$!`Xt^xqv-Sg`lK6@5QptpEB50$^T9WKqXsslg>vI55Am1v_FdGcK%4t8L2; z-0aQP=}i;cXX+k1_*sa2T_opy8f(k>uncN+Ib%TzN!f-flIj0AYz?L1-f+V3Z6=Xp z&jPYY=TBCWgf#uAh4?$i!sW(cM|glm0^4CydzW@;Aw)TKHY(ir81Q!2mh`JQRf-3$ z4LgFMDw7nt;PFBE?@{!Y+&ESth;dpfuk{$Op#R3M&XB{u`elqiKdF6}cTl_=3DXyz zj;Ik{Xg&-+>c_9tLWs~9=$<|ISk{^Zg6za2s$4Q?usb3~WB|AjT1zEJ6Y`kh{Eo=5 zkL_@?|ML?U%VC4t-_}#S?qebJtS>-@t*6l&sF>QVZGKTM6-~VoLKiO6DqBci?tWVnOATh@(X$e%$CnL3EutEG0s6>`m82($SOWIG zgGXnRtrM}K4fiQU){%(>b@mNB9rCn7TWY~PS0#i3Zj}ptaVcm`Q1{&Cq(0i)j9E>5 zq8K%c3)?cjZ;Q1?WdO``JAIGREh@Eb@3Je?;GRE*v_jD0}?1x z?q}DUH~d@0+#tH5A9R%jQlK!TOn&-wH)IJ-M5^xkNaYUW1l_QR!KcLjb5 z)?MGlxBU24`fW=k7Srmk4+{I z+d(`S4O@T?mEIC4==eGsYQI{-DEseYpi2Kc@h8ZW^R>g>l3yWzD?6cwigT!<1k#9x znyPM=~FIR=OJqDvHKG-}juRcGnlNO?)w(!7uQA?h!Tramcx0 zyC4?2)obRO2Uo0bojtAZp%pa+j!9~mrXm{6p?I&ZdPG%QB62B!c@v9Z{LLhE=QsIL z*JCVa(!vShcLqBvWOO>g8G|7%nfbjC`J?+B@-AizQezrKR?sX# zqoIs!OovqbFv{sbY2`&RRfePrPHiDy6tmky`^&XM^$+z8Fr!^w8qaHwxy^Xx)bmN* z|4y(_4f4sq2F1hWklBd+dgc8wGCz&q<3u8lwG2G+?;pcjRb_4j0BhRPeYSClT9$b9Op9+gBd~j^{^eb`r%=A zdnn`qIu3|$Hr>(s*H(M2mRkq5IOf~A@l@Ezd#0uP>ay>##LwOqqbsI%hi8;SZPD(t zM_>g&L3BHC2_^>aveDtJXm`?RL0UP_L&=lu*D#L$M@j{K(Vk6<(Jgm(b%-;TpQpb+ z(MZS3C3&LX-znqsep{K{<_8Ep7QiS+OIBXVo~FoBR)Tje=yg{%4$CFcbNe>78|5@Lkwpte{I71#m8p=GVx1+pI%&iDeOR)v zy1VmjmD|PMajYf$c>wnL&-eEs-f@VE>*5hEfdLL?OsOn&WC$=~hCKuh50BG|h%64& zPT-Xw73Qq8*1+8>lvjW`Ri8G{R{DQ^!Fx$b=Pq7_SlDT6NJ5!h*A)@A2l)&_^G-!&x3OW*el|vzmm9zAbe~ z4eo}hj>F2~jw0C_+TZcq^xxI@cTbl8`VuX22{xNr6WUK5CE&nFlE4i4$Ds&)rH12; zSoP6SB79^&D;TRdncf_bthyQW%{~N^gV6I!RrTM=weRs`Vj?;%3OcK7=dy(KZ?m{g zsyHmUcsdjm-T)n}&L)=@H0P-sw@YINVL>yIa-QX>N|orrN-nh)t6(0gI3JSQ2k8u^ z%tq9kP3|ZpIXKFaZIZ-_A!5uzqCrew5UvS|;6#r0a_3@UvasA|G%ZO#PAslMO^n8C|+9paA^?P@AnvYq`22e~}to-H+=7P)3aN#r^ zAVcf6xG(?X0{16AeESU{?*+It?eBJE0-*geU)g-F&mY3wN2Wu1q3t`KQ`#qs&-d)F z)GEJJzXKGpSj|N=5&Eu^{R5^EX{H@5vfl7!#WuT zjc0?m^mRpbf?5#22aN=y)Fqw$6AxCXixv1aBJ@v+N5wir-J_bF)Xh@Y3KLKRm{g=p zibr|@UAt%rR=hk0({_U&*XAK`ZyMjHkToieOb;E{A@FgI8AT4=I4Bn~{{C8h9ba6> zD+li2YX^(Tuo7YK!NdQB6JDOpMM|)z%(UaRfW_ShFGSw(<0nJgDK>U6YkJCx2CTGl z7eP5*zsFanjWz2)7Gf=Ai&oU+M&B-dI8Fukh4eoUAcUO|4hA%-EdQf$%584)%3aOF z+G}>qVfIey3(y@)><)LMh0Rr=G?}rW6L0gG5XZsW4+Vw0e5j2_(0SV>{*|tf?tl&U z+79(0a!kQ--j zz!CkU@2e~Jq;spyyX_m;k@*tf`&a`!)i}Ujtq*z^^(%vSx4j*~e84e6tki0drw?eM z&SI#K4&3rr30}+$8EI*SPyv|^R)`qOcVOZO{;B3>$V!tlS|SBybEL%m>1+YUAfS$V-5zv1Cnm_kk^IS)=_hpCURbGB0(bATtEH3x#W(K z7ACrt)lRef4r(-CvFLp?J++`6t;_7ofVer|KYw;stQKIp zw35EU;Vp9^xpC&h+sEa5Hh6^4?v3*db@}~lu7E#ZNq_|}hKv#eLZ@U-X1Gt;l-3K| zqAlUeu(8fVNVB^n>IzA!%~WiX5jsO-J>A!BdOj5L=L?ai?P;F6iENu_u59RTF+E(^ zAew=5UvIG+evcpaAhXOAr_JR@>bofE7bnEx1Nr3in_3*T=>7jm(u=B1m`YGs*FKJ^ z&*pY8B1Dsy<&@;k6-$Hs;BWn{xQXBIv$)X(+RN3G%P@UQA|h176zLmEc#H*QTu&psn%qH_{O$=o=!Y zxIhGVUQaBwj{4vcHj24iywU3M=3BY%=hg(KMSeRdsTa8#@1{9gLn27pSEWqQJ&Ymp zDt+;#`#Pw$ez(11)a0lZpWBPEYky~d&d^ZmtZy#Lac+)c3aUaSoyxcoUR4tJ{TJIK zE+K>|>>TSFkVp0x}cX2`6?Z?%<}60pfC z=nCf3l>y|s*Y@sN97-O?c?c)j8`x|*1_5xfSXxZ}d`0Bh&%)-sMeA5z~`?o%DW)+&@D}3G_OakqoY<3VK88WGjwLE^E_Wa?g0Puw8?0sHd ztKziQK&Dw290Rp886H<$(^tJn%`8Rqfb?>Lu!?R#V%tuc{&U09;h@~vXM;|(Jg-65 ze1d}EqCwv;pO6!Shr^F2iK7l|$NVUwz`C|^lZ6c^Mlm9vPr*zxr8VA0l}{P+`E2C7ojpPSaw9cT8xj^?c&Qz&#w<;79ob?Qi^L8=OQoPV7? z1SFZ)=6anCeYb%pBa%WMM~A%eJ{%j>8T|n?!`|w(=Cm|hzLVMWN$Vhr*vxH@w~3B% z8ug#H5I|2+sL9~-JS_Y!3K=4Nx`W#rYjV0A>UP-h>5Kc=b7v7|>#pcm_J4mmU6gFa z`quUiv0_|oihBgWNq|RB&)EP)RvWdP$C}X```!u{mEa#XyfwN{>Eq*n&{4};SVNwo zY${R@ykTh2Mt<1BW_`JV z@hF!e8oH+}Gwk5GY5zGTQh3cF{7|N+l(EAFPR{CQR{h#gRsjQdrcrYl;vMUNz=Yi7 z+oci~GHA6%q|Z3n*Ctf8rLx~<|Jl(pTjd*gt@k4#4mE?UsATD2QW@iL*wPxQK}@kzu=!U0u^xI9l)hBIfz8|ZiF|7ci$Xj1Xx^xVc$ zg;~YQ@tm1x2n{ph4SuZ(OPH&VP#Q97_Cd)KF}?$7cYt8;Q%?2Y=4IXfU;?2`jjCa* z6pMATIMq#ift*b3Je#}5^`TB{5dSmq_3mF{{*PjjW<%4_Q+m4aJslmP2qY(2oe9Qa zjsNP8Zlj=3&rF=%h9Fnw>RM^MH2RfTvAUT3pQb2t%`vw@~Ay$SMd&O!Oq&f1L$q_Df z_z0(lj|UnK`XN^BZBfB`{Nx(%Yt*dTTT(2tMPS}R5IUjfd;H+u{2+aT$rEB*k6EN) z_)S5fPKz@Z^>eUbH{e1#m|9B17GM>a@w}#q_aNRtg(^3OWjsCzc-2$lm;oni0} z8;6tQT^K!g{(Jf2uvYPPhYsuOu@{2cG6aGfMtu!3wFDQ8U>R#4@}{XdQoi*)(a?^s z^+gsnE_b{F7;|`y>5esl*Xil1c&95Ol?B->!iZprl$NB3EDhBvU-KXLLhX^S)@TR5 zZw26NC?5^Ld6~=F=V-Lc4q~)G8|e&L5(zrVUA`=-Tn;zm9-UzZG3?jm54H4;8?5lU z&?QN>`(_qT#7p0*(Rked9e7`QnZo$GlC-SeHQZGcSg<-iT>KN49*wspDnsvgQ2wE$ z>)*zKUTJwE!9SE3&Fa_*m&AEq4;%~3DFMSzC1Ts8P>jLJYb!O$suI<*F$W_&ScCI399&ZO#Va9G zEKRh!z2DHEix}k=cx#`3NhGovDi1?F7XB*LLCDS9Q+v+I0-Vk}&7+_jk^DCMPPSZD z;<0v^jfH7n*WY0{8Il?`@7x<^RmKj~k1%~>+uWgS8 ziW~EkujeMyM5@p*#Mg$>3vsRHWDgP`IdL7Jbc&-JIw2ISXBCc+X`*cP8@wL+;{SW# zjUG>Gw6BY<(5O1Fw=fGO5_(}O;lhOl27I>QgMoSNx~^8l@Aecr#<3m;UKNe+f@KqChiq`lz`k%V} zGeR36@z=EK$|{ZOd!>CNy+SLZiX!3>lv$v`^xIwFIgruY@z)7=Bhtthh>8q_oG$C$ zfXbU*hh5Dg+<#IiW_>Q2E6EEOsbiGY6)=;jXuGRh+jh9|Uk}A+Pgsp$HJ>DlwSn&dKc}5A4nnuJEe};w zlVA_8@Ez0I@sF?<#Nlb$U3UBqe-K^!wLBa>n#l@D?Bx+Y>!uF0&L7|edl?06r{BnY z+a&9%Pfj`%%R=s#i!L}@41JA+G-*NC?cYauFow$uFbq)@$|Y!l>nYFlGBe)12?<2A zM~t`6xpZk#U4;~@ixEUO_?q!?WOd3YnQ`^;l9*OOgC3XrdFgvXb?|`Wi>J9Q<&UY< zd+j!}wEe?4$arKSr|+3X2fT)q5H^`AS9Fb^r>xa0xEZ)>L1siSL6OyD+}pb%SbJ7P zuS{I zL&HEEid8BXNA<*b+3F^W*c%a1E>RN?KwJB;zSbXp1cw?>zf=}^c+9E1CKXXcPbI_p z0A2pRrf~??JrlR`(q4QrjW~#Sh4vH$FU+c5Q*RA_TcS|dof|G*B%KZHT90kT+TN$H>>8b}X4fdTw+=NRhm=k$1;vtxa{ zDa$4nAbWGZg!kvd4fDi;{EF}c_9(CYI^;$&iQspZQ%o~%Vo>(ot<1zGms|eb14i3f z?CNvn>EFL(Lg5VIb};Zc;H7ML5s5-PgD9Q_KG^pv?6Xu=Pnih57ku74e#&@@ywV>e zfw!aAuY&+POfp&yceFt_JQ(jjN1ma%d4b>E1+E8f|I|IsJq_KMG^Ax6c z)I!)0hpHY+u6Dy7jL*vwVKE_#g+!hnf<=f!$@a*iN6mS)y z(ztpO$o8P`>1K(S?H=9{-g&#rU&0u3crvVLwyai&dCo5bRB|zzx0ZTDY(ZtX- z`VhXDQ~`I0L`S#(K6B8&+meT3m)Fm@_QF~H#^rU5dVFs>){=jBNUD%T5o`=DIIxq- zH1^_gldiqp86NysY%aZqpR(4P4dY+~Udf#35GrI#c3Cu7A?&G?bf?k8V6%9!W%M!8 zuvh6x%ab&P&4zsNfrAH<@gQm}1v;XtzW6c$)Didc?@{pcdgw7V&SdvX31Fx?&XG2y z;vDhIf+qJY)rK#vbO|T8W1+CF9aY8DB7}ydUSh3$2M>rFMyPaW3bhNOU#ZP<#uakjWq&we z{sL=%R|^?P^1)O%A#XX(Pyw;W9J8&ZG)-lfNDJi2OI}T zDK@qa=fVI%=!$}hBo8XP(~mWG<3^cZ;Cbvn9wZBTjoLa4flpROV_7qwcKsxoA@x+5 z8sZ@5t^_evr;rRVJi*~Ix%PmF**-7Adclt=!E0MG2cn9J?!NA{$jBeYA!NzuYDiMc zEEG%nrT@~cXsg_jS^3MP_wxLSD)g}REma2 zPPnJ7m!v0lC3vbmA#UfZ`*-#4bI7z?$@|l|Ypti9G~;{dA3Dir3d7;$wUR*8MFD%b#utDp}7g;>i1a!f)LHL{)N-)0d z+ttw@+gNr!#@i~(5jB%daR)dy`<*8f$q7nc+*<_<=QyytU*0EionPPl@@fE>gx8!G z_Jzh~0KH!jwC{7|Eypmpe|Fse4)VL%QSIw<$L^aGM|Dq?Qz&7}bv6?MS#`_kV^GWb z{=6MyrILw%4w>b!4Hf*nL^^fdmnDkiw-xgnSPdj=zhzU=Q7YY&fq}g@5wWn#&-&Gc z`nx-~ksL7pgGS6JN@SI%-q`!!J4Am|0Q6~^W#GshQ{UfV(zm0~kJo!5=_)!E0BNPk z9FM8UL#^u?TpF!JYvYWt8mgfxkd13|+Dhjask?*s2py9ipMUYK%vAPXKz4M`d93ge zwKMY>a?QjXpvT!vHwQc(10I|OeGe#I8TZ?qf>WNgNq^NdYPJ6IAObQOs{yfxPUJ%MM~XLnw+ zFuVYph@Y1`-0cxGS87wV20cDh^VQu|y$|su?B)2Mdpd zh>+TCEl4%>02x^vlE$N{t$JoX4d{x^U~J$>EiW&Y=fl^{n0yd_2zTP<&Oc$5|Z*5 zCeAt%G-=`8!;-8Q!zms8N};Ut=0U1nXmN~thkPree*2OL-a{9Z%{zv!e3pGT_%GwD z`HF>)`dtU$7ba5adM!G+c?qO$0{euj2w8KfOK8~ft``ZS_S)1wJQz0_?SV~_Utd%x)iDy9;fzcm zi(hw(27rHYVo-i@0RAKjXq2*cgmzo*OMZ2s7y8-#x8qKXrJk1GmPEc%JI{ILg$+dJ z$fO)1PfjigAq8kr;+Kd8k~H|}CGIKvF!cu2ukXx`xsT6T?MxlsG|9WKC%tyH?u7^l zcL8y^vnKdfesGTL()(F(Sv-!FTdk+rYjVQtHwHSw!_r(&k2mtOdD!4n)j(q9$m9O) zFH9pp92yVxC0eEgSvoWh4!Q+6WWtD7i^0D$V}g(*V#fTk{*dO8B>ZLzT# z7N4_<*v*xWUj#qPOLF|}KazTme|oYmG@=zxNQ{f7)P%GNdAivur=#;TP;ZPZN}%Ls;}Dy@E>TJRe2%yQJ-Qo^!1+Vx1Dr$zmWljkrnu{HhyE zc!=ca=tVd>d6QLT-JduoruF@q+Ap5DDQ!H*7}qGsD@UIF-zJ} z_~Bz>RXAicQix5;-2znHbR_gQHrDy?fz94DdyPLBZ6JT)e9w7phnQ#fnT-Eh&v z6TEU6YL7G!wda=Kyi8`+hp@nh_yw%a0D4_h+P;RyH)FKr(dVv&^P?B|>;?ImT$*n2 zmXKUS7=-;fvNRy0LCehte%`VqP?#uf&9Tuc3D4gNeAeI7QJb~(p_MxGfh~vCz{JDg z55h1DIHGY2+}hPK!CHpd%|?k4MN3DRc3OS}^tA;B`J$9w37(N$M*Lz1zKE)gzDCJF zQHa9=EJ@~Zi=eH|WK^K+=Snhpe)}SIMXYjS;s)PRaRF+@Gz^?X0jiVY>vm#WARSp9 z?Fb`-&9T<%4Ci$LJ|_zVOa0))aN;X|3T|Sa;dFo4^@k2~jSQR=Ft_wbOMm)a9~hFe zikR{>zMIitd+4$Sn%RbHjx`&ire~rwJ`FY*ZPxuFbMrc#=x5MNdnE zf!^n%!(slaA@+Y=1gEdOO2nT=e80n};n^lQ{_A$2bd%I^Gc$2B=QDLN|4+c!SlBoj zSvVM3cr;j9_}E$b*tqFgSom028i!UW{~y5K(ahSy`~MI8&UeWA51{$K8QiSx&0XD0 Z?4ADqOh&A-)PD?^tfZ1eotSaR{{fwDWHkT) literal 0 HcmV?d00001 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,