diff --git a/Elsa.sln b/Elsa.sln index 1cb78cfe1..553c72892 100644 --- a/Elsa.sln +++ b/Elsa.sln @@ -30,12 +30,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Api", "src\api\Elsa.Ap EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "persistence", "persistence", "{9B7776E2-0014-4C87-B1F4-22FB0BC076F1}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Persistence.InMemory", "src\persistence\Elsa.Persistence.InMemory\Elsa.Persistence.InMemory.csproj", "{BC97FD3A-1351-443C-9EAE-0F28F8204A6C}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "runtime", "runtime", "{04584653-8E42-47DB-850B-7C6C37B307B7}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Persistence.Abstractions", "src\persistence\Elsa.Persistence.Abstractions\Elsa.Persistence.Abstractions.csproj", "{C0226CDD-DF79-4767-A4A5-3D9037535929}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "dsl", "dsl", "{CE121DFD-72D4-4DB7-968F-C0DB320D08FB}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Dsl", "src\dsl\Elsa.Dsl\Elsa.Dsl.csproj", "{61F5C50C-C572-46AB-8F37-54D1F84CC31D}" @@ -58,10 +54,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Management", "src\core EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "efcore", "efcore", "{9F8AE7FB-E5F9-4DCB-9CF8-0362B3D18DAA}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Persistence.EntityFrameworkCore", "src\persistence\Elsa.Persistence.EntityFrameworkCore\Elsa.Persistence.EntityFrameworkCore.csproj", "{D8130816-C1D9-40A3-9079-F2887FE35EA9}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Persistence.EntityFrameworkCore.Sqlite", "src\persistence\Elsa.Persistence.EntityFrameworkCore.Sqlite\Elsa.Persistence.EntityFrameworkCore.Sqlite.csproj", "{820016B7-01CD-4032-8239-6A4E53F1A352}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Scripting.Liquid", "src\scripting\Elsa.Scripting.Liquid\Elsa.Scripting.Liquid.csproj", "{A7473430-F228-4534-AEA5-AA8D80E09364}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "modules", "modules", "{5BA4A8FA-F7F4-45B3-AEC8-8886D35AAC79}" @@ -84,8 +76,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Modules.Hangfire", "sr EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Modules.WorkflowContexts", "src\modules\Elsa.Modules.WorkflowContexts\Elsa.Modules.WorkflowContexts.csproj", "{302BFC43-ED2F-43AE-8AD4-FCD481B0AC67}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Modules.SetName", "src\modules\Elsa.Modules.SetName\Elsa.Modules.SetName.csproj", "{E4EB94A0-E6F6-4EFA-BE55-7CEED1D8431A}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Modules.Activities", "src\modules\Elsa.Modules.Activities\Elsa.Modules.Activities.csproj", "{05249066-9125-47D8-847B-A86887B1D269}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.ServiceBus.Abstractions", "src\core\Elsa.ServiceBus.Abstractions\Elsa.ServiceBus.Abstractions.csproj", "{61FAFEED-A477-4D8F-A293-C0196F11EA0F}" @@ -108,6 +98,16 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.AllInOne.Web", "src\ap EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Runtime", "src\core\Elsa.Runtime\Elsa.Runtime.csproj", "{B3C22F07-C20C-440A-91EF-57685B6BFB42}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Persistence.Abstractions", "src\core\Elsa.Persistence.Abstractions\Elsa.Persistence.Abstractions.csproj", "{904FF38F-32AE-4046-AD80-474D0E702C7C}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "memory", "memory", "{1B264AAB-D41D-4457-988D-CBEB34EA4A9E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Persistence.InMemory", "src\persistence\memory\Elsa.Persistence.InMemory\Elsa.Persistence.InMemory.csproj", "{5F00DBC2-12B5-483C-A875-A5BC7CDCA8C0}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Persistence.EntityFrameworkCore", "src\persistence\efcore\Elsa.Persistence.EntityFrameworkCore\Elsa.Persistence.EntityFrameworkCore.csproj", "{92CC542F-942B-4EF4-A4DE-970332B68394}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Persistence.EntityFrameworkCore.Sqlite", "src\persistence\efcore\Elsa.Persistence.EntityFrameworkCore.Sqlite\Elsa.Persistence.EntityFrameworkCore.Sqlite.csproj", "{C81E2148-283E-409F-BFE7-60CD2E227887}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -130,14 +130,6 @@ Global {39C6C4A2-077E-48C2-B295-DFE357EC38B2}.Debug|Any CPU.Build.0 = Debug|Any CPU {39C6C4A2-077E-48C2-B295-DFE357EC38B2}.Release|Any CPU.ActiveCfg = Release|Any CPU {39C6C4A2-077E-48C2-B295-DFE357EC38B2}.Release|Any CPU.Build.0 = Release|Any CPU - {BC97FD3A-1351-443C-9EAE-0F28F8204A6C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BC97FD3A-1351-443C-9EAE-0F28F8204A6C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BC97FD3A-1351-443C-9EAE-0F28F8204A6C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BC97FD3A-1351-443C-9EAE-0F28F8204A6C}.Release|Any CPU.Build.0 = Release|Any CPU - {C0226CDD-DF79-4767-A4A5-3D9037535929}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C0226CDD-DF79-4767-A4A5-3D9037535929}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C0226CDD-DF79-4767-A4A5-3D9037535929}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C0226CDD-DF79-4767-A4A5-3D9037535929}.Release|Any CPU.Build.0 = Release|Any CPU {61F5C50C-C572-46AB-8F37-54D1F84CC31D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {61F5C50C-C572-46AB-8F37-54D1F84CC31D}.Debug|Any CPU.Build.0 = Debug|Any CPU {61F5C50C-C572-46AB-8F37-54D1F84CC31D}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -170,14 +162,6 @@ Global {03C2D8B9-C61F-4750-8107-765E3FE02ADA}.Debug|Any CPU.Build.0 = Debug|Any CPU {03C2D8B9-C61F-4750-8107-765E3FE02ADA}.Release|Any CPU.ActiveCfg = Release|Any CPU {03C2D8B9-C61F-4750-8107-765E3FE02ADA}.Release|Any CPU.Build.0 = Release|Any CPU - {D8130816-C1D9-40A3-9079-F2887FE35EA9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D8130816-C1D9-40A3-9079-F2887FE35EA9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D8130816-C1D9-40A3-9079-F2887FE35EA9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D8130816-C1D9-40A3-9079-F2887FE35EA9}.Release|Any CPU.Build.0 = Release|Any CPU - {820016B7-01CD-4032-8239-6A4E53F1A352}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {820016B7-01CD-4032-8239-6A4E53F1A352}.Debug|Any CPU.Build.0 = Debug|Any CPU - {820016B7-01CD-4032-8239-6A4E53F1A352}.Release|Any CPU.ActiveCfg = Release|Any CPU - {820016B7-01CD-4032-8239-6A4E53F1A352}.Release|Any CPU.Build.0 = Release|Any CPU {A7473430-F228-4534-AEA5-AA8D80E09364}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A7473430-F228-4534-AEA5-AA8D80E09364}.Debug|Any CPU.Build.0 = Debug|Any CPU {A7473430-F228-4534-AEA5-AA8D80E09364}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -218,10 +202,6 @@ Global {302BFC43-ED2F-43AE-8AD4-FCD481B0AC67}.Debug|Any CPU.Build.0 = Debug|Any CPU {302BFC43-ED2F-43AE-8AD4-FCD481B0AC67}.Release|Any CPU.ActiveCfg = Release|Any CPU {302BFC43-ED2F-43AE-8AD4-FCD481B0AC67}.Release|Any CPU.Build.0 = Release|Any CPU - {E4EB94A0-E6F6-4EFA-BE55-7CEED1D8431A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E4EB94A0-E6F6-4EFA-BE55-7CEED1D8431A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E4EB94A0-E6F6-4EFA-BE55-7CEED1D8431A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E4EB94A0-E6F6-4EFA-BE55-7CEED1D8431A}.Release|Any CPU.Build.0 = Release|Any CPU {05249066-9125-47D8-847B-A86887B1D269}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {05249066-9125-47D8-847B-A86887B1D269}.Debug|Any CPU.Build.0 = Debug|Any CPU {05249066-9125-47D8-847B-A86887B1D269}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -258,6 +238,22 @@ Global {B3C22F07-C20C-440A-91EF-57685B6BFB42}.Debug|Any CPU.Build.0 = Debug|Any CPU {B3C22F07-C20C-440A-91EF-57685B6BFB42}.Release|Any CPU.ActiveCfg = Release|Any CPU {B3C22F07-C20C-440A-91EF-57685B6BFB42}.Release|Any CPU.Build.0 = Release|Any CPU + {904FF38F-32AE-4046-AD80-474D0E702C7C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {904FF38F-32AE-4046-AD80-474D0E702C7C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {904FF38F-32AE-4046-AD80-474D0E702C7C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {904FF38F-32AE-4046-AD80-474D0E702C7C}.Release|Any CPU.Build.0 = Release|Any CPU + {5F00DBC2-12B5-483C-A875-A5BC7CDCA8C0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5F00DBC2-12B5-483C-A875-A5BC7CDCA8C0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5F00DBC2-12B5-483C-A875-A5BC7CDCA8C0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5F00DBC2-12B5-483C-A875-A5BC7CDCA8C0}.Release|Any CPU.Build.0 = Release|Any CPU + {92CC542F-942B-4EF4-A4DE-970332B68394}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {92CC542F-942B-4EF4-A4DE-970332B68394}.Debug|Any CPU.Build.0 = Debug|Any CPU + {92CC542F-942B-4EF4-A4DE-970332B68394}.Release|Any CPU.ActiveCfg = Release|Any CPU + {92CC542F-942B-4EF4-A4DE-970332B68394}.Release|Any CPU.Build.0 = Release|Any CPU + {C81E2148-283E-409F-BFE7-60CD2E227887}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C81E2148-283E-409F-BFE7-60CD2E227887}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C81E2148-283E-409F-BFE7-60CD2E227887}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C81E2148-283E-409F-BFE7-60CD2E227887}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(NestedProjects) = preSolution {155227F0-A33B-40AA-A4B4-06F813EB921B} = {61017E64-6D00-49CB-9E81-5002DC8F7D5F} @@ -270,9 +266,7 @@ Global {298BA226-B766-40AE-933F-EB9AFCDE051C} = {61017E64-6D00-49CB-9E81-5002DC8F7D5F} {39C6C4A2-077E-48C2-B295-DFE357EC38B2} = {298BA226-B766-40AE-933F-EB9AFCDE051C} {9B7776E2-0014-4C87-B1F4-22FB0BC076F1} = {61017E64-6D00-49CB-9E81-5002DC8F7D5F} - {BC97FD3A-1351-443C-9EAE-0F28F8204A6C} = {9B7776E2-0014-4C87-B1F4-22FB0BC076F1} {04584653-8E42-47DB-850B-7C6C37B307B7} = {61017E64-6D00-49CB-9E81-5002DC8F7D5F} - {C0226CDD-DF79-4767-A4A5-3D9037535929} = {9B7776E2-0014-4C87-B1F4-22FB0BC076F1} {CE121DFD-72D4-4DB7-968F-C0DB320D08FB} = {61017E64-6D00-49CB-9E81-5002DC8F7D5F} {61F5C50C-C572-46AB-8F37-54D1F84CC31D} = {CE121DFD-72D4-4DB7-968F-C0DB320D08FB} {48960E35-903C-4EF0-A8F4-3871B000B12D} = {873BFC3E-63C2-4495-A503-5EC05DCD84E4} @@ -284,8 +278,6 @@ Global {5CC45C6C-0751-4A33-8306-758BB17417F7} = {C6658DE0-2B2F-47F0-BB61-2CA66D435C09} {03C2D8B9-C61F-4750-8107-765E3FE02ADA} = {C6658DE0-2B2F-47F0-BB61-2CA66D435C09} {9F8AE7FB-E5F9-4DCB-9CF8-0362B3D18DAA} = {9B7776E2-0014-4C87-B1F4-22FB0BC076F1} - {D8130816-C1D9-40A3-9079-F2887FE35EA9} = {9F8AE7FB-E5F9-4DCB-9CF8-0362B3D18DAA} - {820016B7-01CD-4032-8239-6A4E53F1A352} = {9F8AE7FB-E5F9-4DCB-9CF8-0362B3D18DAA} {A7473430-F228-4534-AEA5-AA8D80E09364} = {2633B8B9-4AEC-4A54-8832-1C940B54E041} {5BA4A8FA-F7F4-45B3-AEC8-8886D35AAC79} = {61017E64-6D00-49CB-9E81-5002DC8F7D5F} {7D5A49B4-9A9B-496E-803B-DEB85B2C3132} = {5BA4A8FA-F7F4-45B3-AEC8-8886D35AAC79} @@ -297,7 +289,6 @@ Global {D31581AB-A6C1-4B73-AB63-45667F6C82AE} = {5BA4A8FA-F7F4-45B3-AEC8-8886D35AAC79} {0601A2A6-2C62-418B-9104-8CDE497E5283} = {5BA4A8FA-F7F4-45B3-AEC8-8886D35AAC79} {302BFC43-ED2F-43AE-8AD4-FCD481B0AC67} = {5BA4A8FA-F7F4-45B3-AEC8-8886D35AAC79} - {E4EB94A0-E6F6-4EFA-BE55-7CEED1D8431A} = {5BA4A8FA-F7F4-45B3-AEC8-8886D35AAC79} {05249066-9125-47D8-847B-A86887B1D269} = {5BA4A8FA-F7F4-45B3-AEC8-8886D35AAC79} {61FAFEED-A477-4D8F-A293-C0196F11EA0F} = {C6658DE0-2B2F-47F0-BB61-2CA66D435C09} {BB983D0B-A939-4008-B9E3-C7C172BCF83A} = {5BA4A8FA-F7F4-45B3-AEC8-8886D35AAC79} @@ -308,5 +299,10 @@ Global {2CA48C3F-1B7C-454B-BEA8-58718090B4EB} = {61017E64-6D00-49CB-9E81-5002DC8F7D5F} {8CB06629-BD00-46FF-B727-FC86B286A07E} = {2CA48C3F-1B7C-454B-BEA8-58718090B4EB} {B3C22F07-C20C-440A-91EF-57685B6BFB42} = {C6658DE0-2B2F-47F0-BB61-2CA66D435C09} + {904FF38F-32AE-4046-AD80-474D0E702C7C} = {C6658DE0-2B2F-47F0-BB61-2CA66D435C09} + {1B264AAB-D41D-4457-988D-CBEB34EA4A9E} = {9B7776E2-0014-4C87-B1F4-22FB0BC076F1} + {5F00DBC2-12B5-483C-A875-A5BC7CDCA8C0} = {1B264AAB-D41D-4457-988D-CBEB34EA4A9E} + {92CC542F-942B-4EF4-A4DE-970332B68394} = {9F8AE7FB-E5F9-4DCB-9CF8-0362B3D18DAA} + {C81E2148-283E-409F-BFE7-60CD2E227887} = {9F8AE7FB-E5F9-4DCB-9CF8-0362B3D18DAA} EndGlobalSection EndGlobal diff --git a/src/api/Elsa.Api/Endpoints/WorkflowInstances/Delete.cs b/src/api/Elsa.Api/Endpoints/WorkflowInstances/Delete.cs index e44bd5e77..c32e9e962 100644 --- a/src/api/Elsa.Api/Endpoints/WorkflowInstances/Delete.cs +++ b/src/api/Elsa.Api/Endpoints/WorkflowInstances/Delete.cs @@ -1,26 +1,23 @@ using System.Threading; using System.Threading.Tasks; -using Elsa.Management.Services; -using Elsa.Mediator.Services; -using Elsa.Persistence.Requests; +using Elsa.Persistence.Services; using Microsoft.AspNetCore.Http; namespace Elsa.Api.Endpoints.WorkflowInstances; public static partial class WorkflowInstances { - public static async Task DeleteAsync(string id, IRequestSender requestSender, - IWorkflowInstancePublisher workflowInstancePublisher, CancellationToken cancellationToken) + public static async Task DeleteAsync( + string id, + IWorkflowInstanceStore workflowInstanceStore, + CancellationToken cancellationToken) { - var request = new FindWorkflowInstance(id); - var workflowInstance = await requestSender.RequestAsync(request, cancellationToken); + var workflowInstance = await workflowInstanceStore.FindByIdAsync(id, cancellationToken); if (workflowInstance == null) - { return Results.NotFound(); - } - await workflowInstancePublisher.DeleteAsync(id, cancellationToken); + await workflowInstanceStore.DeleteAsync(id, cancellationToken); return Results.NoContent(); } } \ No newline at end of file diff --git a/src/api/Elsa.Api/Endpoints/WorkflowInstances/Get.cs b/src/api/Elsa.Api/Endpoints/WorkflowInstances/Get.cs index a3efe6a68..be2021696 100644 --- a/src/api/Elsa.Api/Endpoints/WorkflowInstances/Get.cs +++ b/src/api/Elsa.Api/Endpoints/WorkflowInstances/Get.cs @@ -1,7 +1,6 @@ using System.Threading; using System.Threading.Tasks; -using Elsa.Mediator.Services; -using Elsa.Persistence.Requests; +using Elsa.Persistence.Services; using Elsa.Serialization; using Microsoft.AspNetCore.Http; @@ -9,11 +8,10 @@ namespace Elsa.Api.Endpoints.WorkflowInstances; public static partial class WorkflowInstances { - public static async Task GetAsync(IRequestSender requestSender, WorkflowSerializerOptionsProvider serializerOptionsProvider, string id, CancellationToken cancellationToken) + public static async Task GetAsync(IWorkflowInstanceStore workflowInstanceStore, WorkflowSerializerOptionsProvider serializerOptionsProvider, string id, CancellationToken cancellationToken) { var serializerOptions = serializerOptionsProvider.CreateApiOptions(); - var request = new FindWorkflowInstance(id); - var workflowInstance = await requestSender.RequestAsync(request, cancellationToken); + var workflowInstance = await workflowInstanceStore.FindByIdAsync(id, cancellationToken); return workflowInstance != null ? Results.Json(workflowInstance, serializerOptions, statusCode: StatusCodes.Status200OK) : Results.NotFound(); } } \ No newline at end of file diff --git a/src/api/Elsa.Api/Endpoints/WorkflowInstances/List.cs b/src/api/Elsa.Api/Endpoints/WorkflowInstances/List.cs index c34697a63..e65af5846 100644 --- a/src/api/Elsa.Api/Endpoints/WorkflowInstances/List.cs +++ b/src/api/Elsa.Api/Endpoints/WorkflowInstances/List.cs @@ -1,10 +1,9 @@ using System.Threading; using System.Threading.Tasks; -using Elsa.Mediator.Services; using Elsa.Models; using Elsa.Persistence.Entities; using Elsa.Persistence.Models; -using Elsa.Persistence.Requests; +using Elsa.Persistence.Services; using Elsa.Serialization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; @@ -14,7 +13,7 @@ namespace Elsa.Api.Endpoints.WorkflowInstances; public static partial class WorkflowInstances { public static async Task ListAsync( - IRequestSender requestSender, + IWorkflowInstanceStore workflowInstanceStore, WorkflowSerializerOptionsProvider serializerOptionsProvider, CancellationToken cancellationToken, [FromQuery] int? page, @@ -31,7 +30,7 @@ public static partial class WorkflowInstances var serializerOptions = serializerOptionsProvider.CreateApiOptions(); var pageArgs = new PageArgs(page, pageSize); - var request = new ListWorkflowInstanceSummaries( + var request = new FindWorkflowInstancesArgs( searchTerm, definitionId, version, @@ -42,7 +41,7 @@ public static partial class WorkflowInstances orderBy ?? OrderBy.Created, orderDirection ?? OrderDirection.Ascending); - var summaries = await requestSender.RequestAsync(request, cancellationToken); + var summaries = await workflowInstanceStore.FindManyAsync(request, cancellationToken); return Results.Json(summaries, serializerOptions, statusCode: StatusCodes.Status200OK); } diff --git a/src/api/Elsa.Api/Endpoints/Workflows/Delete.cs b/src/api/Elsa.Api/Endpoints/Workflows/Delete.cs index eec93c626..ce283a8d9 100644 --- a/src/api/Elsa.Api/Endpoints/Workflows/Delete.cs +++ b/src/api/Elsa.Api/Endpoints/Workflows/Delete.cs @@ -1,16 +1,15 @@ using System.Threading; using System.Threading.Tasks; -using Elsa.Mediator.Services; -using Elsa.Persistence.Commands; +using Elsa.Persistence.Services; using Microsoft.AspNetCore.Http; namespace Elsa.Api.Endpoints.Workflows; public static partial class Workflows { - public static async Task DeleteAsync(string definitionId, ICommandSender commandSender, CancellationToken cancellationToken) + public static async Task DeleteAsync(string definitionId, IWorkflowDefinitionStore workflowDefinitionStore, CancellationToken cancellationToken) { - var result = await commandSender.ExecuteAsync(new DeleteWorkflowDefinition(definitionId), cancellationToken); - return !result ? Results.NotFound() : Results.NoContent(); + var result = await workflowDefinitionStore.DeleteByDefinitionIdAsync(definitionId, cancellationToken); + return result == 0 ? Results.NotFound() : Results.NoContent(); } } \ No newline at end of file diff --git a/src/api/Elsa.Api/Endpoints/Workflows/Get.cs b/src/api/Elsa.Api/Endpoints/Workflows/Get.cs index 08a20c035..c92fbff30 100644 --- a/src/api/Elsa.Api/Endpoints/Workflows/Get.cs +++ b/src/api/Elsa.Api/Endpoints/Workflows/Get.cs @@ -1,8 +1,7 @@ using System.Threading; using System.Threading.Tasks; -using Elsa.Mediator.Services; using Elsa.Persistence.Models; -using Elsa.Persistence.Requests; +using Elsa.Persistence.Services; using Elsa.Serialization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; @@ -12,7 +11,7 @@ namespace Elsa.Api.Endpoints.Workflows; public static partial class Workflows { public static async Task Get( - IRequestSender requestSender, + IWorkflowDefinitionStore workflowDefinitionStore, WorkflowSerializerOptionsProvider serializerOptionsProvider, CancellationToken cancellationToken, [FromRoute] string definitionId, @@ -20,7 +19,7 @@ public static partial class Workflows { var serializerOptions = serializerOptionsProvider.CreateApiOptions(); var parsedVersionOptions = versionOptions != null ? VersionOptions.FromString(versionOptions) : VersionOptions.Latest; - var workflow = await requestSender.RequestAsync(new FindWorkflowDefinitionByDefinitionId(definitionId, parsedVersionOptions), cancellationToken); + var workflow = await workflowDefinitionStore.FindByDefinitionIdAsync(definitionId, parsedVersionOptions, cancellationToken); return workflow == null ? Results.NotFound() : Results.Json(workflow, serializerOptions, statusCode: StatusCodes.Status200OK); } } \ No newline at end of file diff --git a/src/api/Elsa.Api/Endpoints/Workflows/GetMany.cs b/src/api/Elsa.Api/Endpoints/Workflows/GetMany.cs index f7b859e75..82ddab661 100644 --- a/src/api/Elsa.Api/Endpoints/Workflows/GetMany.cs +++ b/src/api/Elsa.Api/Endpoints/Workflows/GetMany.cs @@ -1,9 +1,8 @@ using System; using System.Threading; using System.Threading.Tasks; -using Elsa.Mediator.Services; using Elsa.Persistence.Models; -using Elsa.Persistence.Requests; +using Elsa.Persistence.Services; using Elsa.Serialization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; @@ -13,7 +12,7 @@ namespace Elsa.Api.Endpoints.Workflows; public static partial class Workflows { public static async Task GetManyAsync( - IRequestSender requestSender, + IWorkflowDefinitionStore workflowDefinitionStore, WorkflowSerializerOptionsProvider serializerOptionsProvider, CancellationToken cancellationToken, [FromQuery] string? definitionIds = default, @@ -22,7 +21,7 @@ public static partial class Workflows var serializerOptions = serializerOptionsProvider.CreateApiOptions(); var splitIds = definitionIds?.Split(',', StringSplitOptions.RemoveEmptyEntries) ?? Array.Empty(); var parsedVersionOptions = versionOptions != null ? VersionOptions.FromString(versionOptions) : VersionOptions.Latest; - var workflowSummaries = await requestSender.RequestAsync(new FindManyWorkflowDefinitions(splitIds, parsedVersionOptions), cancellationToken); + var workflowSummaries = await workflowDefinitionStore.FindManySummariesAsync(splitIds, parsedVersionOptions, cancellationToken); return Results.Json(workflowSummaries, serializerOptions, statusCode: StatusCodes.Status200OK); } diff --git a/src/api/Elsa.Api/Endpoints/Workflows/List.cs b/src/api/Elsa.Api/Endpoints/Workflows/List.cs index 019e2d360..b656e1921 100644 --- a/src/api/Elsa.Api/Endpoints/Workflows/List.cs +++ b/src/api/Elsa.Api/Endpoints/Workflows/List.cs @@ -1,8 +1,7 @@ using System.Threading; using System.Threading.Tasks; -using Elsa.Mediator.Services; using Elsa.Persistence.Models; -using Elsa.Persistence.Requests; +using Elsa.Persistence.Services; using Elsa.Serialization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; @@ -12,7 +11,7 @@ namespace Elsa.Api.Endpoints.Workflows; public static partial class Workflows { public static async Task ListAsync( - IRequestSender requestSender, + IWorkflowDefinitionStore workflowDefinitionStore, WorkflowSerializerOptionsProvider serializerOptionsProvider, CancellationToken cancellationToken, [FromQuery] string? versionOptions, @@ -22,7 +21,7 @@ public static partial class Workflows var serializerOptions = serializerOptionsProvider.CreateApiOptions(); var pageArgs = new PageArgs(page, pageSize); var parsedVersionOptions = versionOptions != null ? VersionOptions.FromString(versionOptions) : default; - var workflowSummaries = await requestSender.RequestAsync(new ListWorkflowDefinitionSummaries(parsedVersionOptions, pageArgs), cancellationToken); + var workflowSummaries = await workflowDefinitionStore.ListSummariesAsync(parsedVersionOptions, pageArgs, cancellationToken); return Results.Json(workflowSummaries, serializerOptions, statusCode: StatusCodes.Status200OK); } diff --git a/src/api/Elsa.Api/Endpoints/Workflows/Publish.cs b/src/api/Elsa.Api/Endpoints/Workflows/Publish.cs index 3f9179018..441b8ea1b 100644 --- a/src/api/Elsa.Api/Endpoints/Workflows/Publish.cs +++ b/src/api/Elsa.Api/Endpoints/Workflows/Publish.cs @@ -1,9 +1,8 @@ using System.Threading; using System.Threading.Tasks; using Elsa.Management.Services; -using Elsa.Mediator.Services; using Elsa.Persistence.Models; -using Elsa.Persistence.Requests; +using Elsa.Persistence.Services; using Elsa.Serialization; using Microsoft.AspNetCore.Http; @@ -14,11 +13,11 @@ public static partial class Workflows public static async Task PublishAsync( string definitionId, WorkflowSerializerOptionsProvider serializerOptionsProvider, - IRequestSender requestSender, + IWorkflowDefinitionStore workflowDefinitionStore, IWorkflowPublisher workflowPublisher, CancellationToken cancellationToken) { - var definition = await requestSender.RequestAsync(new FindWorkflowDefinitionByDefinitionId(definitionId, VersionOptions.Latest), cancellationToken); + var definition = await workflowDefinitionStore.FindByDefinitionIdAsync(definitionId, VersionOptions.Latest, cancellationToken); if (definition == null) return Results.NotFound(); diff --git a/src/api/Elsa.Api/Endpoints/Workflows/Retract.cs b/src/api/Elsa.Api/Endpoints/Workflows/Retract.cs index e2fea64e2..06d9a5f76 100644 --- a/src/api/Elsa.Api/Endpoints/Workflows/Retract.cs +++ b/src/api/Elsa.Api/Endpoints/Workflows/Retract.cs @@ -1,9 +1,8 @@ using System.Threading; using System.Threading.Tasks; using Elsa.Management.Services; -using Elsa.Mediator.Services; using Elsa.Persistence.Models; -using Elsa.Persistence.Requests; +using Elsa.Persistence.Services; using Elsa.Runtime.Services; using Elsa.Serialization; using Microsoft.AspNetCore.Http; @@ -15,12 +14,12 @@ public static partial class Workflows public static async Task RetractAsync( string definitionId, WorkflowSerializerOptionsProvider serializerOptionsProvider, - IRequestSender requestSender, + IWorkflowDefinitionStore workflowDefinitionStore, IWorkflowPublisher workflowPublisher, IWorkflowDefinitionService workflowDefinitionService, CancellationToken cancellationToken) { - var definition = await requestSender.RequestAsync(new FindWorkflowDefinitionByDefinitionId(definitionId, VersionOptions.LatestOrPublished), cancellationToken); + var definition = await workflowDefinitionStore.FindByDefinitionIdAsync(definitionId, VersionOptions.LatestOrPublished, cancellationToken); if (definition == null) return Results.NotFound(); diff --git a/src/apps/all-in-one-web/Elsa.AllInOne.Web.csproj b/src/apps/all-in-one-web/Elsa.AllInOne.Web.csproj index ec8f8010b..ca04ae4ae 100644 --- a/src/apps/all-in-one-web/Elsa.AllInOne.Web.csproj +++ b/src/apps/all-in-one-web/Elsa.AllInOne.Web.csproj @@ -9,7 +9,6 @@ - diff --git a/src/core/Elsa.Management/Elsa.Management.csproj b/src/core/Elsa.Management/Elsa.Management.csproj index eb3c36847..51a094ada 100644 --- a/src/core/Elsa.Management/Elsa.Management.csproj +++ b/src/core/Elsa.Management/Elsa.Management.csproj @@ -13,7 +13,7 @@ - + diff --git a/src/core/Elsa.Management/Extensions/ServiceCollectionExtensions.cs b/src/core/Elsa.Management/Extensions/ServiceCollectionExtensions.cs index 60c586a71..1458f8dfd 100644 --- a/src/core/Elsa.Management/Extensions/ServiceCollectionExtensions.cs +++ b/src/core/Elsa.Management/Extensions/ServiceCollectionExtensions.cs @@ -16,7 +16,6 @@ public static class ServiceCollectionExtensions { return services .AddSingleton() - .AddSingleton() .AddSingleton() .AddSingleton() .AddSingleton() diff --git a/src/core/Elsa.Management/Implementations/WorkflowInstancePublisher.cs b/src/core/Elsa.Management/Implementations/WorkflowInstancePublisher.cs deleted file mode 100644 index d4323fa3c..000000000 --- a/src/core/Elsa.Management/Implementations/WorkflowInstancePublisher.cs +++ /dev/null @@ -1,25 +0,0 @@ -using Elsa.Management.Services; -using Elsa.Mediator.Services; -using Elsa.Persistence.Commands; - -namespace Elsa.Management.Implementations; - -public class WorkflowInstancePublisher : IWorkflowInstancePublisher -{ - private readonly IMediator _mediator; - - public WorkflowInstancePublisher(IMediator mediator) - { - _mediator = mediator; - } - public async Task DeleteAsync(string instanceId, CancellationToken cancellationToken = default) - { - await _mediator.ExecuteAsync(new DeleteWorkflowInstance(instanceId), - cancellationToken); - } - - public async Task BulkDeleteAsync(IEnumerable instanceIds, CancellationToken cancellationToken = default) - { - await _mediator.ExecuteAsync(new DeleteWorkflowInstances(instanceIds), cancellationToken); - } -} \ No newline at end of file diff --git a/src/core/Elsa.Management/Implementations/WorkflowPublisher.cs b/src/core/Elsa.Management/Implementations/WorkflowPublisher.cs index a8e831974..c5bc4b478 100644 --- a/src/core/Elsa.Management/Implementations/WorkflowPublisher.cs +++ b/src/core/Elsa.Management/Implementations/WorkflowPublisher.cs @@ -4,10 +4,9 @@ using Elsa.Management.Materializers; using Elsa.Management.Notifications; using Elsa.Management.Services; using Elsa.Mediator.Services; -using Elsa.Persistence.Commands; using Elsa.Persistence.Entities; using Elsa.Persistence.Models; -using Elsa.Persistence.Requests; +using Elsa.Persistence.Services; using Elsa.Serialization; using Elsa.Services; @@ -15,14 +14,21 @@ namespace Elsa.Management.Implementations { public class WorkflowPublisher : IWorkflowPublisher { - private readonly IMediator _mediator; + private readonly IWorkflowDefinitionStore _workflowDefinitionStore; + private readonly IEventPublisher _eventPublisher; private readonly IIdentityGenerator _identityGenerator; private readonly WorkflowSerializerOptionsProvider _workflowSerializerOptionsProvider; private readonly ISystemClock _systemClock; - public WorkflowPublisher(IMediator mediator, IIdentityGenerator identityGenerator, WorkflowSerializerOptionsProvider workflowSerializerOptionsProvider, ISystemClock systemClock) + public WorkflowPublisher( + IWorkflowDefinitionStore workflowDefinitionStore, + IEventPublisher eventPublisher, + IIdentityGenerator identityGenerator, + WorkflowSerializerOptionsProvider workflowSerializerOptionsProvider, + ISystemClock systemClock) { - _mediator = mediator; + _workflowDefinitionStore = workflowDefinitionStore; + _eventPublisher = eventPublisher; _identityGenerator = identityGenerator; _workflowSerializerOptionsProvider = workflowSerializerOptionsProvider; _systemClock = systemClock; @@ -49,7 +55,7 @@ namespace Elsa.Management.Implementations public async Task PublishAsync(string definitionId, CancellationToken cancellationToken = default) { - var definition = await _mediator.RequestAsync(new FindWorkflowDefinitionByDefinitionId(definitionId, VersionOptions.Latest), cancellationToken); + var definition = await _workflowDefinitionStore.FindByDefinitionIdAsync(definitionId, VersionOptions.Latest, cancellationToken); if (definition == null) return null; @@ -62,13 +68,13 @@ namespace Elsa.Management.Implementations var definitionId = definition.DefinitionId; // Reset current latest and published definitions. - var publishedAndOrLatestWorkflows = await _mediator.RequestAsync(new FindLatestAndPublishedWorkflows(definitionId), cancellationToken); + var publishedAndOrLatestWorkflows = await _workflowDefinitionStore.FindLatestAndPublishedByDefinitionIdAsync(definitionId, cancellationToken); foreach (var publishedAndOrLatestWorkflow in publishedAndOrLatestWorkflows) { publishedAndOrLatestWorkflow.IsPublished = false; publishedAndOrLatestWorkflow.IsLatest = false; - await _mediator.ExecuteAsync(new SaveWorkflowDefinition(publishedAndOrLatestWorkflow), cancellationToken); + await _workflowDefinitionStore.SaveAsync(publishedAndOrLatestWorkflow, cancellationToken); } if (definition.IsPublished) @@ -79,15 +85,15 @@ namespace Elsa.Management.Implementations definition.IsLatest = true; definition = Initialize(definition); - await _mediator.PublishAsync(new WorkflowDefinitionPublishing(definition), cancellationToken); - await _mediator.ExecuteAsync(new SaveWorkflowDefinition(definition), cancellationToken); - await _mediator.PublishAsync(new WorkflowDefinitionPublished(definition), cancellationToken); + await _eventPublisher.PublishAsync(new WorkflowDefinitionPublishing(definition), cancellationToken); + await _workflowDefinitionStore.SaveAsync(definition, cancellationToken); + await _eventPublisher.PublishAsync(new WorkflowDefinitionPublished(definition), cancellationToken); return definition; } public async Task RetractAsync(string definitionId, CancellationToken cancellationToken = default) { - var definition = await _mediator.RequestAsync(new FindWorkflowDefinitionByDefinitionId(definitionId, VersionOptions.Published), cancellationToken); + var definition = await _workflowDefinitionStore.FindByDefinitionIdAsync(definitionId, VersionOptions.Published, cancellationToken); if (definition == null) return null; @@ -103,15 +109,15 @@ namespace Elsa.Management.Implementations definition.IsPublished = false; definition = Initialize(definition); - await _mediator.PublishAsync(new WorkflowDefinitionRetracting(definition), cancellationToken); - await _mediator.ExecuteAsync(new SaveWorkflowDefinition(definition), cancellationToken); - await _mediator.PublishAsync(new WorkflowDefinitionRetracted(definition), cancellationToken); + await _eventPublisher.PublishAsync(new WorkflowDefinitionRetracting(definition), cancellationToken); + await _workflowDefinitionStore.SaveAsync(definition, cancellationToken); + await _eventPublisher.PublishAsync(new WorkflowDefinitionRetracted(definition), cancellationToken); return definition; } public async Task GetDraftAsync(string definitionId, CancellationToken cancellationToken = default) { - var definition = await _mediator.RequestAsync(new FindWorkflowDefinitionByDefinitionId(definitionId, VersionOptions.Latest), cancellationToken); + var definition = await _workflowDefinitionStore.FindByDefinitionIdAsync(definitionId, VersionOptions.Latest, cancellationToken); if (definition == null) return null; @@ -132,30 +138,22 @@ namespace Elsa.Management.Implementations { var draft = definition; var definitionId = definition.DefinitionId; - var latestVersion = await _mediator.RequestAsync(new FindWorkflowDefinitionByDefinitionId(definitionId, VersionOptions.Latest), cancellationToken); + var latestVersion = await _workflowDefinitionStore.FindByDefinitionIdAsync(definitionId, VersionOptions.Latest, cancellationToken); if (latestVersion is { IsPublished: true, IsLatest: true }) { latestVersion.IsLatest = false; - await _mediator.ExecuteAsync(new SaveWorkflowDefinition(latestVersion), cancellationToken); + await _workflowDefinitionStore.SaveAsync(latestVersion, cancellationToken); } draft.IsLatest = true; draft.IsPublished = false; draft = Initialize(draft); - await _mediator.ExecuteAsync(new SaveWorkflowDefinition(draft), cancellationToken); + await _workflowDefinitionStore.SaveAsync(draft, cancellationToken); return draft; } - public async Task DeleteAsync(string definitionId, CancellationToken cancellationToken = default) - { - await _mediator.ExecuteAsync(new DeleteWorkflowInstances(definitionId), cancellationToken); - await _mediator.ExecuteAsync(new DeleteWorkflowDefinition(definitionId), cancellationToken); - } - - public Task DeleteAsync(WorkflowDefinition definition, CancellationToken cancellationToken = default) => DeleteAsync(definition.DefinitionId, cancellationToken); - private WorkflowDefinition Initialize(WorkflowDefinition definition) { if (definition.Id == null!) diff --git a/src/core/Elsa.Management/Materializers/JsonWorkflowMaterializer.cs b/src/core/Elsa.Management/Materializers/JsonWorkflowMaterializer.cs index 980efdca4..06ee6061e 100644 --- a/src/core/Elsa.Management/Materializers/JsonWorkflowMaterializer.cs +++ b/src/core/Elsa.Management/Materializers/JsonWorkflowMaterializer.cs @@ -1,5 +1,4 @@ using System.Text.Json; -using System.Threading.Tasks; using Elsa.Management.Services; using Elsa.Models; using Elsa.Persistence.Entities; diff --git a/src/core/Elsa.Management/Notifications/WorkflowDefinitionPublished.cs b/src/core/Elsa.Management/Notifications/WorkflowDefinitionPublished.cs index 417fa54eb..74ef6b5db 100644 --- a/src/core/Elsa.Management/Notifications/WorkflowDefinitionPublished.cs +++ b/src/core/Elsa.Management/Notifications/WorkflowDefinitionPublished.cs @@ -1,5 +1,4 @@ using Elsa.Mediator.Services; -using Elsa.Models; using Elsa.Persistence.Entities; namespace Elsa.Management.Notifications; diff --git a/src/core/Elsa.Management/Notifications/WorkflowDefinitionPublishing.cs b/src/core/Elsa.Management/Notifications/WorkflowDefinitionPublishing.cs index 58ad665cf..6b878d9c0 100644 --- a/src/core/Elsa.Management/Notifications/WorkflowDefinitionPublishing.cs +++ b/src/core/Elsa.Management/Notifications/WorkflowDefinitionPublishing.cs @@ -1,5 +1,4 @@ using Elsa.Mediator.Services; -using Elsa.Models; using Elsa.Persistence.Entities; namespace Elsa.Management.Notifications; diff --git a/src/core/Elsa.Management/Notifications/WorkflowDefinitionRetracted.cs b/src/core/Elsa.Management/Notifications/WorkflowDefinitionRetracted.cs index 59d5b9a7c..3633cd7b4 100644 --- a/src/core/Elsa.Management/Notifications/WorkflowDefinitionRetracted.cs +++ b/src/core/Elsa.Management/Notifications/WorkflowDefinitionRetracted.cs @@ -1,5 +1,4 @@ using Elsa.Mediator.Services; -using Elsa.Models; using Elsa.Persistence.Entities; namespace Elsa.Management.Notifications; diff --git a/src/core/Elsa.Management/Notifications/WorkflowDefinitionRetracting.cs b/src/core/Elsa.Management/Notifications/WorkflowDefinitionRetracting.cs index 4cbdff2cb..797e4f4d5 100644 --- a/src/core/Elsa.Management/Notifications/WorkflowDefinitionRetracting.cs +++ b/src/core/Elsa.Management/Notifications/WorkflowDefinitionRetracting.cs @@ -1,5 +1,4 @@ using Elsa.Mediator.Services; -using Elsa.Models; using Elsa.Persistence.Entities; namespace Elsa.Management.Notifications; diff --git a/src/core/Elsa.Management/Services/IWorkflowInstancePublisher.cs b/src/core/Elsa.Management/Services/IWorkflowInstancePublisher.cs deleted file mode 100644 index 89f6428da..000000000 --- a/src/core/Elsa.Management/Services/IWorkflowInstancePublisher.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Elsa.Management.Services; - -public interface IWorkflowInstancePublisher -{ - Task DeleteAsync(string instanceId, CancellationToken cancellationToken = default); -} \ No newline at end of file diff --git a/src/core/Elsa.Management/Services/IWorkflowPublisher.cs b/src/core/Elsa.Management/Services/IWorkflowPublisher.cs index eb67efe85..d113e697f 100644 --- a/src/core/Elsa.Management/Services/IWorkflowPublisher.cs +++ b/src/core/Elsa.Management/Services/IWorkflowPublisher.cs @@ -1,4 +1,3 @@ -using Elsa.Models; using Elsa.Persistence.Entities; namespace Elsa.Management.Services @@ -12,7 +11,5 @@ namespace Elsa.Management.Services Task RetractAsync(WorkflowDefinition definition, CancellationToken cancellationToken = default); Task GetDraftAsync(string definitionId, CancellationToken cancellationToken = default); Task SaveDraftAsync(WorkflowDefinition definition, CancellationToken cancellationToken = default); - Task DeleteAsync(string definitionId, CancellationToken cancellationToken = default); - Task DeleteAsync(WorkflowDefinition definition, CancellationToken cancellationToken = default); } } \ No newline at end of file diff --git a/src/persistence/Elsa.Persistence.Abstractions/AssemblyInfo.cs b/src/core/Elsa.Persistence.Abstractions/AssemblyInfo.cs similarity index 100% rename from src/persistence/Elsa.Persistence.Abstractions/AssemblyInfo.cs rename to src/core/Elsa.Persistence.Abstractions/AssemblyInfo.cs diff --git a/src/persistence/Elsa.Persistence.Abstractions/Comparers/WorkflowTriggerHashEqualityComparer.cs b/src/core/Elsa.Persistence.Abstractions/Comparers/WorkflowTriggerHashEqualityComparer.cs similarity index 100% rename from src/persistence/Elsa.Persistence.Abstractions/Comparers/WorkflowTriggerHashEqualityComparer.cs rename to src/core/Elsa.Persistence.Abstractions/Comparers/WorkflowTriggerHashEqualityComparer.cs diff --git a/src/persistence/Elsa.Persistence.Abstractions/Elsa.Persistence.Abstractions.csproj b/src/core/Elsa.Persistence.Abstractions/Elsa.Persistence.Abstractions.csproj similarity index 100% rename from src/persistence/Elsa.Persistence.Abstractions/Elsa.Persistence.Abstractions.csproj rename to src/core/Elsa.Persistence.Abstractions/Elsa.Persistence.Abstractions.csproj diff --git a/src/persistence/Elsa.Persistence.Abstractions/Entities/Entity.cs b/src/core/Elsa.Persistence.Abstractions/Entities/Entity.cs similarity index 100% rename from src/persistence/Elsa.Persistence.Abstractions/Entities/Entity.cs rename to src/core/Elsa.Persistence.Abstractions/Entities/Entity.cs diff --git a/src/persistence/Elsa.Persistence.Abstractions/Entities/OrderBy.cs b/src/core/Elsa.Persistence.Abstractions/Entities/OrderBy.cs similarity index 100% rename from src/persistence/Elsa.Persistence.Abstractions/Entities/OrderBy.cs rename to src/core/Elsa.Persistence.Abstractions/Entities/OrderBy.cs diff --git a/src/persistence/Elsa.Persistence.Abstractions/Entities/OrderDirection.cs b/src/core/Elsa.Persistence.Abstractions/Entities/OrderDirection.cs similarity index 100% rename from src/persistence/Elsa.Persistence.Abstractions/Entities/OrderDirection.cs rename to src/core/Elsa.Persistence.Abstractions/Entities/OrderDirection.cs diff --git a/src/persistence/Elsa.Persistence.Abstractions/Entities/WorkflowBookmark.cs b/src/core/Elsa.Persistence.Abstractions/Entities/WorkflowBookmark.cs similarity index 100% rename from src/persistence/Elsa.Persistence.Abstractions/Entities/WorkflowBookmark.cs rename to src/core/Elsa.Persistence.Abstractions/Entities/WorkflowBookmark.cs diff --git a/src/persistence/Elsa.Persistence.Abstractions/Entities/WorkflowDefinition.cs b/src/core/Elsa.Persistence.Abstractions/Entities/WorkflowDefinition.cs similarity index 98% rename from src/persistence/Elsa.Persistence.Abstractions/Entities/WorkflowDefinition.cs rename to src/core/Elsa.Persistence.Abstractions/Entities/WorkflowDefinition.cs index 0933f1972..0e9a1f408 100644 --- a/src/persistence/Elsa.Persistence.Abstractions/Entities/WorkflowDefinition.cs +++ b/src/core/Elsa.Persistence.Abstractions/Entities/WorkflowDefinition.cs @@ -1,5 +1,4 @@ using Elsa.Models; -using Elsa.Services; namespace Elsa.Persistence.Entities; diff --git a/src/persistence/Elsa.Persistence.Abstractions/Entities/WorkflowExecutionLogRecord.cs b/src/core/Elsa.Persistence.Abstractions/Entities/WorkflowExecutionLogRecord.cs similarity index 88% rename from src/persistence/Elsa.Persistence.Abstractions/Entities/WorkflowExecutionLogRecord.cs rename to src/core/Elsa.Persistence.Abstractions/Entities/WorkflowExecutionLogRecord.cs index b9a8e614c..66c26f2de 100644 --- a/src/persistence/Elsa.Persistence.Abstractions/Entities/WorkflowExecutionLogRecord.cs +++ b/src/core/Elsa.Persistence.Abstractions/Entities/WorkflowExecutionLogRecord.cs @@ -2,6 +2,7 @@ namespace Elsa.Persistence.Entities { public class WorkflowExecutionLogRecord : Entity { + public string WorkflowDefinitionId { get; set; } = default!; public string WorkflowInstanceId { get; set; } = default!; public string ActivityId { get; set; } = default!; public string ActivityType { get; set; } = default!; diff --git a/src/persistence/Elsa.Persistence.Abstractions/Entities/WorkflowInstance.cs b/src/core/Elsa.Persistence.Abstractions/Entities/WorkflowInstance.cs similarity index 100% rename from src/persistence/Elsa.Persistence.Abstractions/Entities/WorkflowInstance.cs rename to src/core/Elsa.Persistence.Abstractions/Entities/WorkflowInstance.cs diff --git a/src/persistence/Elsa.Persistence.Abstractions/Entities/WorkflowTrigger.cs b/src/core/Elsa.Persistence.Abstractions/Entities/WorkflowTrigger.cs similarity index 100% rename from src/persistence/Elsa.Persistence.Abstractions/Entities/WorkflowTrigger.cs rename to src/core/Elsa.Persistence.Abstractions/Entities/WorkflowTrigger.cs diff --git a/src/persistence/Elsa.Persistence.Abstractions/Extensions/QueryableExtensions.cs b/src/core/Elsa.Persistence.Abstractions/Extensions/QueryableExtensions.cs similarity index 100% rename from src/persistence/Elsa.Persistence.Abstractions/Extensions/QueryableExtensions.cs rename to src/core/Elsa.Persistence.Abstractions/Extensions/QueryableExtensions.cs diff --git a/src/persistence/Elsa.Persistence.Abstractions/Extensions/ServiceCollectionExtensions.cs b/src/core/Elsa.Persistence.Abstractions/Extensions/ServiceCollectionExtensions.cs similarity index 100% rename from src/persistence/Elsa.Persistence.Abstractions/Extensions/ServiceCollectionExtensions.cs rename to src/core/Elsa.Persistence.Abstractions/Extensions/ServiceCollectionExtensions.cs diff --git a/src/persistence/Elsa.Persistence.Abstractions/Extensions/WorkflowBookmarkExtensions.cs b/src/core/Elsa.Persistence.Abstractions/Extensions/WorkflowBookmarkExtensions.cs similarity index 100% rename from src/persistence/Elsa.Persistence.Abstractions/Extensions/WorkflowBookmarkExtensions.cs rename to src/core/Elsa.Persistence.Abstractions/Extensions/WorkflowBookmarkExtensions.cs diff --git a/src/persistence/Elsa.Persistence.Abstractions/Extensions/WorkflowDefinitionExtensions.cs b/src/core/Elsa.Persistence.Abstractions/Extensions/WorkflowDefinitionExtensions.cs similarity index 100% rename from src/persistence/Elsa.Persistence.Abstractions/Extensions/WorkflowDefinitionExtensions.cs rename to src/core/Elsa.Persistence.Abstractions/Extensions/WorkflowDefinitionExtensions.cs diff --git a/src/persistence/Elsa.Persistence.Abstractions/Extensions/WorkflowExtensions.cs b/src/core/Elsa.Persistence.Abstractions/Extensions/WorkflowExtensions.cs similarity index 100% rename from src/persistence/Elsa.Persistence.Abstractions/Extensions/WorkflowExtensions.cs rename to src/core/Elsa.Persistence.Abstractions/Extensions/WorkflowExtensions.cs diff --git a/src/persistence/Elsa.Persistence.Abstractions/Extensions/WorkflowTriggerExtensions.cs b/src/core/Elsa.Persistence.Abstractions/Extensions/WorkflowTriggerExtensions.cs similarity index 100% rename from src/persistence/Elsa.Persistence.Abstractions/Extensions/WorkflowTriggerExtensions.cs rename to src/core/Elsa.Persistence.Abstractions/Extensions/WorkflowTriggerExtensions.cs diff --git a/src/persistence/Elsa.Persistence.Abstractions/Mappers/WorkflowDefinitionMapper.cs b/src/core/Elsa.Persistence.Abstractions/Mappers/WorkflowDefinitionMapper.cs similarity index 100% rename from src/persistence/Elsa.Persistence.Abstractions/Mappers/WorkflowDefinitionMapper.cs rename to src/core/Elsa.Persistence.Abstractions/Mappers/WorkflowDefinitionMapper.cs diff --git a/src/persistence/Elsa.Persistence.Abstractions/Models/Cursor.cs b/src/core/Elsa.Persistence.Abstractions/Models/Cursor.cs similarity index 100% rename from src/persistence/Elsa.Persistence.Abstractions/Models/Cursor.cs rename to src/core/Elsa.Persistence.Abstractions/Models/Cursor.cs diff --git a/src/persistence/Elsa.Persistence.Abstractions/Models/CursorDirection.cs b/src/core/Elsa.Persistence.Abstractions/Models/CursorDirection.cs similarity index 100% rename from src/persistence/Elsa.Persistence.Abstractions/Models/CursorDirection.cs rename to src/core/Elsa.Persistence.Abstractions/Models/CursorDirection.cs diff --git a/src/persistence/Elsa.Persistence.Abstractions/Models/PagedList.cs b/src/core/Elsa.Persistence.Abstractions/Models/PagedList.cs similarity index 100% rename from src/persistence/Elsa.Persistence.Abstractions/Models/PagedList.cs rename to src/core/Elsa.Persistence.Abstractions/Models/PagedList.cs diff --git a/src/persistence/Elsa.Persistence.Abstractions/Models/PagerParameters.cs b/src/core/Elsa.Persistence.Abstractions/Models/PagerParameters.cs similarity index 100% rename from src/persistence/Elsa.Persistence.Abstractions/Models/PagerParameters.cs rename to src/core/Elsa.Persistence.Abstractions/Models/PagerParameters.cs diff --git a/src/persistence/Elsa.Persistence.Abstractions/Models/SimpleException.cs b/src/core/Elsa.Persistence.Abstractions/Models/SimpleException.cs similarity index 100% rename from src/persistence/Elsa.Persistence.Abstractions/Models/SimpleException.cs rename to src/core/Elsa.Persistence.Abstractions/Models/SimpleException.cs diff --git a/src/persistence/Elsa.Persistence.Abstractions/Models/SimpleExceptionProperty.cs b/src/core/Elsa.Persistence.Abstractions/Models/SimpleExceptionProperty.cs similarity index 100% rename from src/persistence/Elsa.Persistence.Abstractions/Models/SimpleExceptionProperty.cs rename to src/core/Elsa.Persistence.Abstractions/Models/SimpleExceptionProperty.cs diff --git a/src/persistence/Elsa.Persistence.Abstractions/Models/VersionOptions.cs b/src/core/Elsa.Persistence.Abstractions/Models/VersionOptions.cs similarity index 100% rename from src/persistence/Elsa.Persistence.Abstractions/Models/VersionOptions.cs rename to src/core/Elsa.Persistence.Abstractions/Models/VersionOptions.cs diff --git a/src/persistence/Elsa.Persistence.Abstractions/Models/WorkflowDefinitionSummary.cs b/src/core/Elsa.Persistence.Abstractions/Models/WorkflowDefinitionSummary.cs similarity index 100% rename from src/persistence/Elsa.Persistence.Abstractions/Models/WorkflowDefinitionSummary.cs rename to src/core/Elsa.Persistence.Abstractions/Models/WorkflowDefinitionSummary.cs diff --git a/src/persistence/Elsa.Persistence.Abstractions/Models/WorkflowFault.cs b/src/core/Elsa.Persistence.Abstractions/Models/WorkflowFault.cs similarity index 100% rename from src/persistence/Elsa.Persistence.Abstractions/Models/WorkflowFault.cs rename to src/core/Elsa.Persistence.Abstractions/Models/WorkflowFault.cs diff --git a/src/persistence/Elsa.Persistence.Abstractions/Models/WorkflowInstanceSummary.cs b/src/core/Elsa.Persistence.Abstractions/Models/WorkflowInstanceSummary.cs similarity index 100% rename from src/persistence/Elsa.Persistence.Abstractions/Models/WorkflowInstanceSummary.cs rename to src/core/Elsa.Persistence.Abstractions/Models/WorkflowInstanceSummary.cs diff --git a/src/core/Elsa.Persistence.Abstractions/Services/IWorkflowBookmarkStore.cs b/src/core/Elsa.Persistence.Abstractions/Services/IWorkflowBookmarkStore.cs new file mode 100644 index 000000000..54064b0c2 --- /dev/null +++ b/src/core/Elsa.Persistence.Abstractions/Services/IWorkflowBookmarkStore.cs @@ -0,0 +1,14 @@ +using Elsa.Persistence.Entities; + +namespace Elsa.Persistence.Services; + +public interface IWorkflowBookmarkStore +{ + Task SaveAsync(WorkflowBookmark record, CancellationToken cancellationToken = default); + Task SaveManyAsync(IEnumerable records, CancellationToken cancellationToken = default); + Task FindByIdAsync(string id, CancellationToken cancellationToken = default); + Task> FindManyAsync(string name, string? hash = default, CancellationToken cancellationToken = default); + Task> FindManyByWorkflowInstanceIdAsync(string workflowInstanceId, CancellationToken cancellationToken = default); + Task DeleteAsync(string id, CancellationToken cancellationToken = default); + Task DeleteManyAsync(IEnumerable ids, CancellationToken cancellationToken = default); +} \ No newline at end of file diff --git a/src/core/Elsa.Persistence.Abstractions/Services/IWorkflowDefinitionStore.cs b/src/core/Elsa.Persistence.Abstractions/Services/IWorkflowDefinitionStore.cs new file mode 100644 index 000000000..f3c62084c --- /dev/null +++ b/src/core/Elsa.Persistence.Abstractions/Services/IWorkflowDefinitionStore.cs @@ -0,0 +1,17 @@ +using Elsa.Persistence.Entities; +using Elsa.Persistence.Models; + +namespace Elsa.Persistence.Services; + +public interface IWorkflowDefinitionStore +{ + Task FindByDefinitionIdAsync(string definitionId, VersionOptions versionOptions, CancellationToken cancellationToken = default); + Task FindByNameAsync(string name, VersionOptions versionOptions, CancellationToken cancellationToken = default); + Task> FindManySummariesAsync(IEnumerable definitionIds, VersionOptions? versionOptions = default, CancellationToken cancellationToken = default); + Task> FindLatestAndPublishedByDefinitionIdAsync(string definitionId, CancellationToken cancellationToken = default); + Task SaveAsync(WorkflowDefinition record, CancellationToken cancellationToken = default); + Task SaveManyAsync(IEnumerable records, CancellationToken cancellationToken = default); + Task DeleteByDefinitionIdAsync(string definitionId, CancellationToken cancellationToken = default); + Task DeleteManyByDefinitionIdsAsync(IEnumerable definitionIds, CancellationToken cancellationToken = default); + Task> ListSummariesAsync(VersionOptions? versionOptions = default, PageArgs? pageArgs = default, CancellationToken cancellationToken = default); +} \ No newline at end of file diff --git a/src/core/Elsa.Persistence.Abstractions/Services/IWorkflowExecutionLogStore.cs b/src/core/Elsa.Persistence.Abstractions/Services/IWorkflowExecutionLogStore.cs new file mode 100644 index 000000000..faec526f1 --- /dev/null +++ b/src/core/Elsa.Persistence.Abstractions/Services/IWorkflowExecutionLogStore.cs @@ -0,0 +1,9 @@ +using Elsa.Persistence.Entities; + +namespace Elsa.Persistence.Services; + +public interface IWorkflowExecutionLogStore +{ + Task SaveAsync(WorkflowExecutionLogRecord record, CancellationToken cancellationToken = default); + Task SaveManyAsync(IEnumerable records, CancellationToken cancellationToken = default); +} \ No newline at end of file diff --git a/src/core/Elsa.Persistence.Abstractions/Services/IWorkflowInstanceStore.cs b/src/core/Elsa.Persistence.Abstractions/Services/IWorkflowInstanceStore.cs new file mode 100644 index 000000000..d12658d78 --- /dev/null +++ b/src/core/Elsa.Persistence.Abstractions/Services/IWorkflowInstanceStore.cs @@ -0,0 +1,28 @@ +using Elsa.Models; +using Elsa.Persistence.Entities; +using Elsa.Persistence.Models; + +namespace Elsa.Persistence.Services; + +public interface IWorkflowInstanceStore +{ + Task FindByIdAsync(string id, CancellationToken cancellationToken = default); + Task SaveAsync(WorkflowInstance record, CancellationToken cancellationToken = default); + Task SaveManyAsync(IEnumerable records, CancellationToken cancellationToken = default); + Task DeleteAsync(string id, CancellationToken cancellationToken = default); + Task DeleteManyAsync(IEnumerable ids, CancellationToken cancellationToken = default); + Task DeleteManyByDefinitionIdAsync(string definitionId, CancellationToken cancellationToken = default); + Task> FindManyAsync(FindWorkflowInstancesArgs args, CancellationToken cancellationToken = default); +} + +public record FindWorkflowInstancesArgs( + string? SearchTerm = default, + string? DefinitionId = default, + int? Version = default, + string? CorrelationId = default, + WorkflowStatus? WorkflowStatus = default, + WorkflowSubStatus? WorkflowSubStatus = default, + PageArgs? PageArgs = default, + OrderBy OrderBy = OrderBy.Created, + OrderDirection OrderDirection = OrderDirection.Ascending +); \ No newline at end of file diff --git a/src/core/Elsa.Persistence.Abstractions/Services/IWorkflowTriggerStore.cs b/src/core/Elsa.Persistence.Abstractions/Services/IWorkflowTriggerStore.cs new file mode 100644 index 000000000..5584b3864 --- /dev/null +++ b/src/core/Elsa.Persistence.Abstractions/Services/IWorkflowTriggerStore.cs @@ -0,0 +1,13 @@ +using Elsa.Persistence.Entities; + +namespace Elsa.Persistence.Services; + +public interface IWorkflowTriggerStore +{ + Task SaveAsync(WorkflowTrigger record, CancellationToken cancellationToken = default); + Task SaveManyAsync(IEnumerable records, CancellationToken cancellationToken = default); + Task> FindManyByNameAsync(string name, string? hash, CancellationToken cancellationToken = default); + Task> FindManyByWorkflowDefinitionIdAsync(string workflowDefinitionId, CancellationToken cancellationToken = default); + Task ReplaceAsync(IEnumerable removed, IEnumerable added, CancellationToken cancellationToken = default); + Task DeleteManyAsync(IEnumerable ids, CancellationToken cancellationToken = default); +} \ No newline at end of file diff --git a/src/persistence/Elsa.Persistence.Abstractions/TypeConverters/VersionOptionsTypeConverter.cs b/src/core/Elsa.Persistence.Abstractions/TypeConverters/VersionOptionsTypeConverter.cs similarity index 100% rename from src/persistence/Elsa.Persistence.Abstractions/TypeConverters/VersionOptionsTypeConverter.cs rename to src/core/Elsa.Persistence.Abstractions/TypeConverters/VersionOptionsTypeConverter.cs diff --git a/src/core/Elsa.Runtime/Elsa.Runtime.csproj b/src/core/Elsa.Runtime/Elsa.Runtime.csproj index b72c91c51..915a4b674 100644 --- a/src/core/Elsa.Runtime/Elsa.Runtime.csproj +++ b/src/core/Elsa.Runtime/Elsa.Runtime.csproj @@ -10,14 +10,13 @@ - + - diff --git a/src/core/Elsa.Runtime/HostedServices/PopulateWorkflowDefinitionStore.cs b/src/core/Elsa.Runtime/HostedServices/PopulateWorkflowDefinitionStore.cs index b114c03af..66fe33489 100644 --- a/src/core/Elsa.Runtime/HostedServices/PopulateWorkflowDefinitionStore.cs +++ b/src/core/Elsa.Runtime/HostedServices/PopulateWorkflowDefinitionStore.cs @@ -1,9 +1,7 @@ -using Elsa.Mediator.Services; using Elsa.Models; -using Elsa.Persistence.Commands; using Elsa.Persistence.Entities; using Elsa.Persistence.Models; -using Elsa.Persistence.Requests; +using Elsa.Persistence.Services; using Elsa.Runtime.Services; using Microsoft.Extensions.Hosting; using Open.Linq.AsyncExtensions; @@ -17,15 +15,16 @@ public class PopulateWorkflowDefinitionStore : IHostedService { private readonly IEnumerable _workflowDefinitionProviders; private readonly ITriggerIndexer _triggerIndexer; - private readonly IRequestSender _requestSender; - private readonly ICommandSender _commandSender; + private readonly IWorkflowDefinitionStore _workflowDefinitionStore; - public PopulateWorkflowDefinitionStore(IEnumerable workflowDefinitionProviders, ITriggerIndexer triggerIndexer, IRequestSender requestSender, ICommandSender commandSender) + public PopulateWorkflowDefinitionStore( + IEnumerable workflowDefinitionProviders, + ITriggerIndexer triggerIndexer, + IWorkflowDefinitionStore workflowDefinitionStore) { _workflowDefinitionProviders = workflowDefinitionProviders; _triggerIndexer = triggerIndexer; - _requestSender = requestSender; - _commandSender = commandSender; + _workflowDefinitionStore = workflowDefinitionStore; } public async Task StartAsync(CancellationToken cancellationToken) @@ -45,10 +44,9 @@ public class PopulateWorkflowDefinitionStore : IHostedService private async Task AddOrUpdateAsync(WorkflowDefinition definition, CancellationToken cancellationToken = default) { // Check if there's already a workflow definition by the definition ID and version. - var existingDefinition = await _requestSender.RequestAsync( - new FindWorkflowDefinitionByDefinitionId( - definition.DefinitionId, - VersionOptions.SpecificVersion(definition.Version)), + var existingDefinition = await _workflowDefinitionStore.FindByDefinitionIdAsync( + definition.DefinitionId, + VersionOptions.SpecificVersion(definition.Version), cancellationToken); if (existingDefinition == null) @@ -68,7 +66,7 @@ public class PopulateWorkflowDefinitionStore : IHostedService existingDefinition.MaterializerName = definition.MaterializerName; } - await _commandSender.ExecuteAsync(new SaveWorkflowDefinition(existingDefinition), cancellationToken); + await _workflowDefinitionStore.SaveAsync(existingDefinition, cancellationToken); } private async Task IndexTriggersAsync(Workflow workflow, CancellationToken cancellationToken) => await _triggerIndexer.IndexTriggersAsync(workflow, cancellationToken); diff --git a/src/core/Elsa.Runtime/Implementations/BookmarkManager.cs b/src/core/Elsa.Runtime/Implementations/BookmarkManager.cs index 216d827e6..7a4b24822 100644 --- a/src/core/Elsa.Runtime/Implementations/BookmarkManager.cs +++ b/src/core/Elsa.Runtime/Implementations/BookmarkManager.cs @@ -1,6 +1,6 @@ using Elsa.Mediator.Services; -using Elsa.Persistence.Commands; using Elsa.Persistence.Entities; +using Elsa.Persistence.Services; using Elsa.Runtime.Notifications; using Elsa.Runtime.Services; @@ -8,12 +8,12 @@ namespace Elsa.Runtime.Implementations; public class BookmarkManager : IBookmarkManager { - private readonly ICommandSender _commandSender; + private readonly IWorkflowBookmarkStore _bookmarkStore; private readonly IEventPublisher _eventPublisher; - public BookmarkManager(ICommandSender commandSender, IEventPublisher eventPublisher) + public BookmarkManager(IWorkflowBookmarkStore bookmarkStore, IEventPublisher eventPublisher) { - _commandSender = commandSender; + _bookmarkStore = bookmarkStore; _eventPublisher = eventPublisher; } @@ -21,14 +21,14 @@ public class BookmarkManager : IBookmarkManager { var list = bookmarks.ToList(); var ids = list.Select(x => x.Id).ToList(); - await _commandSender.ExecuteAsync(new DeleteWorkflowBookmarks(ids), cancellationToken); + await _bookmarkStore.DeleteManyAsync(ids, cancellationToken); await _eventPublisher.PublishAsync(new WorkflowBookmarksDeleted(list), cancellationToken); } public async Task SaveBookmarksAsync(IEnumerable bookmarks, CancellationToken cancellationToken = default) { var list = bookmarks.ToList(); - await _commandSender.ExecuteAsync(new SaveWorkflowBookmarks(list), cancellationToken); + await _bookmarkStore.SaveManyAsync(list, cancellationToken); await _eventPublisher.PublishAsync(new WorkflowBookmarksSaved(list), cancellationToken); } } \ No newline at end of file diff --git a/src/core/Elsa.Runtime/Implementations/DefaultWorkflowInvoker.cs b/src/core/Elsa.Runtime/Implementations/DefaultWorkflowInvoker.cs index ff1c0d62f..410c44e7c 100644 --- a/src/core/Elsa.Runtime/Implementations/DefaultWorkflowInvoker.cs +++ b/src/core/Elsa.Runtime/Implementations/DefaultWorkflowInvoker.cs @@ -1,8 +1,7 @@ -using Elsa.Mediator.Services; using Elsa.Models; using Elsa.Persistence.Entities; using Elsa.Persistence.Models; -using Elsa.Persistence.Requests; +using Elsa.Persistence.Services; using Elsa.Runtime.Models; using Elsa.Runtime.Services; using Elsa.Services; @@ -15,15 +14,16 @@ namespace Elsa.Runtime.Implementations; /// public class DefaultWorkflowInvoker : IWorkflowInvoker { - private readonly IWorkflowInstanceFactory _workflowInstanceFactory; - private readonly IRequestSender _requestSender; + private readonly IWorkflowInstanceStore _workflowInstanceStore; private readonly IWorkflowRunner _workflowRunner; private readonly IWorkflowRegistry _workflowRegistry; - public DefaultWorkflowInvoker(IWorkflowInstanceFactory workflowInstanceFactory, IRequestSender requestSender, IWorkflowRunner workflowRunner, IWorkflowRegistry workflowRegistry) + public DefaultWorkflowInvoker( + IWorkflowInstanceStore workflowInstanceStore, + IWorkflowRunner workflowRunner, + IWorkflowRegistry workflowRegistry) { - _workflowInstanceFactory = workflowInstanceFactory; - _requestSender = requestSender; + _workflowInstanceStore = workflowInstanceStore; _workflowRunner = workflowRunner; _workflowRegistry = workflowRegistry; } @@ -37,7 +37,7 @@ public class DefaultWorkflowInvoker : IWorkflowInvoker public async Task InvokeAsync(InvokeWorkflowInstanceRequest request, CancellationToken cancellationToken = default) { - var workflowInstance = await _requestSender.RequestAsync(new FindWorkflowInstance(request.InstanceId), cancellationToken); + var workflowInstance = await _workflowInstanceStore.FindByIdAsync(request.InstanceId, cancellationToken); return await InvokeAsync(workflowInstance!, request.Bookmark, request.Input, cancellationToken); } diff --git a/src/core/Elsa.Runtime/Implementations/TriggerIndexer.cs b/src/core/Elsa.Runtime/Implementations/TriggerIndexer.cs index 45f772deb..dd233d61d 100644 --- a/src/core/Elsa.Runtime/Implementations/TriggerIndexer.cs +++ b/src/core/Elsa.Runtime/Implementations/TriggerIndexer.cs @@ -3,14 +3,14 @@ using System.Text.Json; using Elsa.Helpers; using Elsa.Mediator.Services; using Elsa.Models; -using Elsa.Persistence.Commands; using Elsa.Persistence.Comparers; using Elsa.Persistence.Entities; -using Elsa.Persistence.Requests; +using Elsa.Persistence.Services; using Elsa.Runtime.Models; using Elsa.Runtime.Services; using Elsa.Services; using Microsoft.Extensions.Logging; +using Open.Linq.AsyncExtensions; namespace Elsa.Runtime.Implementations; @@ -26,8 +26,7 @@ public class TriggerIndexer : ITriggerIndexer private readonly IWorkflowDefinitionService _workflowDefinitionService; private readonly IExpressionEvaluator _expressionEvaluator; private readonly IIdentityGenerator _identityGenerator; - private readonly IRequestSender _requestSender; - private readonly ICommandSender _commandSender; + private readonly IWorkflowTriggerStore _workflowTriggerStore; private readonly IEventPublisher _eventPublisher; private readonly IServiceProvider _serviceProvider; private readonly IHasher _hasher; @@ -38,8 +37,7 @@ public class TriggerIndexer : ITriggerIndexer IWorkflowDefinitionService workflowDefinitionService, IExpressionEvaluator expressionEvaluator, IIdentityGenerator identityGenerator, - IRequestSender requestSender, - ICommandSender commandSender, + IWorkflowTriggerStore workflowTriggerStore, IEventPublisher eventPublisher, IServiceProvider serviceProvider, IHasher hasher, @@ -48,8 +46,7 @@ public class TriggerIndexer : ITriggerIndexer _activityWalker = activityWalker; _expressionEvaluator = expressionEvaluator; _identityGenerator = identityGenerator; - _requestSender = requestSender; - _commandSender = commandSender; + _workflowTriggerStore = workflowTriggerStore; _eventPublisher = eventPublisher; _serviceProvider = serviceProvider; _hasher = hasher; @@ -66,7 +63,7 @@ public class TriggerIndexer : ITriggerIndexer public async Task IndexTriggersAsync(Workflow workflow, CancellationToken cancellationToken = default) { // Get current triggers - var currentTriggers = await GetCurrentTriggersAsync(workflow.Identity.DefinitionId, cancellationToken); + var currentTriggers = await GetCurrentTriggersAsync(workflow.Identity.DefinitionId, cancellationToken).ToList(); // Collect new triggers **if workflow is published**. var newTriggers = workflow.Publication.IsPublished @@ -77,7 +74,7 @@ public class TriggerIndexer : ITriggerIndexer var diff = Diff.For(currentTriggers, newTriggers, new WorkflowTriggerHashEqualityComparer()); // Replace triggers for the specified workflow. - await _commandSender.ExecuteAsync(new ReplaceWorkflowTriggers(workflow, diff.Removed, diff.Added), cancellationToken); + await _workflowTriggerStore.ReplaceAsync(diff.Removed, diff.Added, cancellationToken); var indexedWorkflow = new IndexedWorkflowTriggers(workflow, diff.Added, diff.Removed, diff.Unchanged); @@ -86,8 +83,8 @@ public class TriggerIndexer : ITriggerIndexer return indexedWorkflow; } - private async Task> GetCurrentTriggersAsync(string workflowDefinitionId, CancellationToken cancellationToken) => - await _requestSender.RequestAsync(new FindWorkflowTriggersByWorkflowDefinition(workflowDefinitionId), cancellationToken); + private async Task> GetCurrentTriggersAsync(string workflowDefinitionId, CancellationToken cancellationToken) => + await _workflowTriggerStore.FindManyByWorkflowDefinitionIdAsync(workflowDefinitionId, cancellationToken); private async IAsyncEnumerable GetTriggersAsync(Workflow workflow, [EnumeratorCancellation] CancellationToken cancellationToken = default) { diff --git a/src/core/Elsa.Runtime/Implementations/WorkflowRegistry.cs b/src/core/Elsa.Runtime/Implementations/WorkflowRegistry.cs index 964f49290..88b4d1166 100644 --- a/src/core/Elsa.Runtime/Implementations/WorkflowRegistry.cs +++ b/src/core/Elsa.Runtime/Implementations/WorkflowRegistry.cs @@ -1,32 +1,31 @@ -using Elsa.Mediator.Services; using Elsa.Models; using Elsa.Persistence.Entities; using Elsa.Persistence.Models; -using Elsa.Persistence.Requests; +using Elsa.Persistence.Services; using Elsa.Runtime.Services; namespace Elsa.Runtime.Implementations; public class WorkflowRegistry : IWorkflowRegistry { - private readonly IRequestSender _requestSender; + private readonly IWorkflowDefinitionStore _workflowDefinitionStore; private readonly IWorkflowDefinitionService _workflowDefinitionService; - public WorkflowRegistry(IRequestSender requestSender, IWorkflowDefinitionService workflowDefinitionService) + public WorkflowRegistry(IWorkflowDefinitionStore workflowDefinitionStore, IWorkflowDefinitionService workflowDefinitionService) { - _requestSender = requestSender; + _workflowDefinitionStore = workflowDefinitionStore; _workflowDefinitionService = workflowDefinitionService; } public async Task FindByDefinitionIdAsync(string definitionId, VersionOptions versionOptions, CancellationToken cancellationToken = default) { - var definition = await _requestSender.RequestAsync(new FindWorkflowDefinitionByDefinitionId(definitionId, versionOptions), cancellationToken); + var definition = await _workflowDefinitionStore.FindByDefinitionIdAsync(definitionId, versionOptions, cancellationToken); return await MaterializeAsync(definition, cancellationToken); } public async Task FindByNameAsync(string name, VersionOptions versionOptions, CancellationToken cancellationToken = default) { - var definition = await _requestSender.RequestAsync(new FindWorkflowDefinitionByName(name, versionOptions), cancellationToken); + var definition = await _workflowDefinitionStore.FindByNameAsync(name, versionOptions, cancellationToken); return await MaterializeAsync(definition, cancellationToken); } diff --git a/src/core/Elsa.Runtime/Interpreters/ResumeWorkflowInstructionInterpreter.cs b/src/core/Elsa.Runtime/Interpreters/ResumeWorkflowInstructionInterpreter.cs index 83ef3d9cd..ec1834f33 100644 --- a/src/core/Elsa.Runtime/Interpreters/ResumeWorkflowInstructionInterpreter.cs +++ b/src/core/Elsa.Runtime/Interpreters/ResumeWorkflowInstructionInterpreter.cs @@ -1,8 +1,7 @@ -using Elsa.Mediator.Services; using Elsa.Models; using Elsa.Persistence.Entities; using Elsa.Persistence.Models; -using Elsa.Persistence.Requests; +using Elsa.Persistence.Services; using Elsa.Runtime.Abstractions; using Elsa.Runtime.Models; using Elsa.Runtime.Services; @@ -17,14 +16,18 @@ public class ResumeWorkflowInstructionInterpreter : WorkflowInstructionInterpret { private readonly IWorkflowRunner _workflowRunner; private readonly IWorkflowRegistry _workflowRegistry; - private readonly IRequestSender _mediator; + private readonly IWorkflowInstanceStore _workflowInstanceStore; private readonly ILogger _logger; - public ResumeWorkflowInstructionInterpreter(IWorkflowRunner workflowRunner, IWorkflowRegistry workflowRegistry, IRequestSender mediator, ILogger logger) + public ResumeWorkflowInstructionInterpreter( + IWorkflowRunner workflowRunner, + IWorkflowRegistry workflowRegistry, + IWorkflowInstanceStore workflowInstanceStore, + ILogger logger) { _workflowRunner = workflowRunner; _workflowRegistry = workflowRegistry; - _mediator = mediator; + _workflowInstanceStore = workflowInstanceStore; _logger = logger; } @@ -33,7 +36,7 @@ public class ResumeWorkflowInstructionInterpreter : WorkflowInstructionInterpret var workflowBookmark = instruction.WorkflowBookmark; var workflowDefinitionId = workflowBookmark.WorkflowDefinitionId; var workflowInstanceId = workflowBookmark.WorkflowInstanceId; - var workflowInstance = await _mediator.RequestAsync(new FindWorkflowInstance(workflowInstanceId), cancellationToken); + var workflowInstance = await _workflowInstanceStore.FindByIdAsync(workflowInstanceId, cancellationToken); if (workflowInstance == null) { diff --git a/src/core/Elsa.Runtime/Middleware/PersistWorkflowExecutionLogMiddleware.cs b/src/core/Elsa.Runtime/Middleware/PersistWorkflowExecutionLogMiddleware.cs index b38f69747..82f611786 100644 --- a/src/core/Elsa.Runtime/Middleware/PersistWorkflowExecutionLogMiddleware.cs +++ b/src/core/Elsa.Runtime/Middleware/PersistWorkflowExecutionLogMiddleware.cs @@ -1,7 +1,6 @@ -using Elsa.Mediator.Services; using Elsa.Models; -using Elsa.Persistence.Commands; using Elsa.Persistence.Entities; +using Elsa.Persistence.Services; using Elsa.Pipelines.WorkflowExecution; using Elsa.Pipelines.WorkflowExecution.Components; using Elsa.Services; @@ -13,12 +12,12 @@ namespace Elsa.Runtime.Middleware; /// public class PersistWorkflowExecutionLogMiddleware : WorkflowExecutionMiddleware { - private readonly ICommandSender _commandSender; + private readonly IWorkflowExecutionLogStore _workflowExecutionLogStore; private readonly IIdentityGenerator _identityGenerator; - public PersistWorkflowExecutionLogMiddleware(WorkflowMiddlewareDelegate next, ICommandSender commandSender, IIdentityGenerator identityGenerator) : base(next) + public PersistWorkflowExecutionLogMiddleware(WorkflowMiddlewareDelegate next, IWorkflowExecutionLogStore workflowExecutionLogStore, IIdentityGenerator identityGenerator) : base(next) { - _commandSender = commandSender; + _workflowExecutionLogStore = workflowExecutionLogStore; _identityGenerator = identityGenerator; } @@ -35,12 +34,13 @@ public class PersistWorkflowExecutionLogMiddleware : WorkflowExecutionMiddleware ActivityType = x.ActivityType, Message = x.Message, EventName = x.EventName, + WorkflowDefinitionId = context.Workflow.Identity.DefinitionId, WorkflowInstanceId = context.Id, Source = x.Source, Payload = x.Payload, Timestamp = x.Timestamp }).ToList(); - await _commandSender.ExecuteAsync(new SaveWorkflowExecutionLog(entries), context.CancellationToken); + await _workflowExecutionLogStore.SaveManyAsync(entries, context.CancellationToken); } } \ No newline at end of file diff --git a/src/core/Elsa.Runtime/Middleware/PersistWorkflowInstanceMiddleware.cs b/src/core/Elsa.Runtime/Middleware/PersistWorkflowInstanceMiddleware.cs index e413375e1..ecbe72c77 100644 --- a/src/core/Elsa.Runtime/Middleware/PersistWorkflowInstanceMiddleware.cs +++ b/src/core/Elsa.Runtime/Middleware/PersistWorkflowInstanceMiddleware.cs @@ -1,9 +1,8 @@ using Elsa.Helpers; using Elsa.Mediator.Services; using Elsa.Models; -using Elsa.Persistence.Commands; using Elsa.Persistence.Entities; -using Elsa.Persistence.Requests; +using Elsa.Persistence.Services; using Elsa.Pipelines.WorkflowExecution; using Elsa.Pipelines.WorkflowExecution.Components; using Elsa.Runtime.Models; @@ -21,8 +20,9 @@ public class PersistWorkflowInstanceMiddleware : WorkflowExecutionMiddleware public static readonly object WorkflowInstanceKey = new(); public static readonly object WorkflowInstanceNameKey = new(); + private readonly IWorkflowInstanceStore _workflowInstanceStore; + private readonly IWorkflowBookmarkStore _bookmarkStore; private readonly IRequestSender _requestSender; - private readonly ICommandSender _commandSender; private readonly IEventPublisher _eventPublisher; private readonly IWorkflowStateSerializer _workflowStateSerializer; private readonly IBookmarkManager _bookmarkManager; @@ -31,16 +31,18 @@ public class PersistWorkflowInstanceMiddleware : WorkflowExecutionMiddleware public PersistWorkflowInstanceMiddleware( WorkflowMiddlewareDelegate next, + IWorkflowInstanceStore workflowInstanceStore, + IWorkflowBookmarkStore bookmarkStore, IRequestSender requestSender, - ICommandSender commandSender, IEventPublisher eventPublisher, IBookmarkManager bookmarkManager, IWorkflowStateSerializer workflowStateSerializer, IIdentityGenerator identityGenerator, ISystemClock clock) : base(next) { + _workflowInstanceStore = workflowInstanceStore; + _bookmarkStore = bookmarkStore; _requestSender = requestSender; - _commandSender = commandSender; _eventPublisher = eventPublisher; _bookmarkManager = bookmarkManager; _workflowStateSerializer = workflowStateSerializer; @@ -53,8 +55,9 @@ public class PersistWorkflowInstanceMiddleware : WorkflowExecutionMiddleware var cancellationToken = context.CancellationToken; var workflow = context.Workflow; var (definitionId, version, definitionVersionId) = workflow.Identity; - var existingWorkflowInstance = await _requestSender.RequestAsync(new FindWorkflowInstance(context.Id), cancellationToken); + var existingWorkflowInstance = await _workflowInstanceStore.FindByIdAsync(context.Id, cancellationToken); var workflowInstanceName = default(string?); + var now = _clock.UtcNow; // Get the workflow instance name, if any (could be provided by previously executed middleware). if (context.TransientProperties.TryGetValue(WorkflowInstanceNameKey, out var name)) @@ -67,7 +70,7 @@ public class PersistWorkflowInstanceMiddleware : WorkflowExecutionMiddleware DefinitionId = definitionId, Version = version, DefinitionVersionId = definitionVersionId, - CreatedAt = _clock.UtcNow, + CreatedAt = now, Status = WorkflowStatus.Running, SubStatus = WorkflowSubStatus.Executing, CorrelationId = _identityGenerator.GenerateId(), @@ -79,7 +82,7 @@ public class PersistWorkflowInstanceMiddleware : WorkflowExecutionMiddleware context.TransientProperties[WorkflowInstanceKey] = workflowInstance; // Get a copy of current bookmarks. - var existingBookmarks = await _requestSender.RequestAsync(new FindWorkflowBookmarks(workflowInstance.Id), cancellationToken); + var existingBookmarks = await _bookmarkStore.FindManyByWorkflowInstanceIdAsync(workflowInstance.Id, cancellationToken); var bookmarksSnapshot = existingBookmarks.Select(x => x.ToBookmark()).ToList(); var bookmarks = bookmarksSnapshot.ToList(); @@ -91,7 +94,7 @@ public class PersistWorkflowInstanceMiddleware : WorkflowExecutionMiddleware context.RegisterBookmarks(bookmarks); // Persist workflow instance. - await _commandSender.ExecuteAsync(new SaveWorkflowInstance(workflowInstance), cancellationToken); + await _workflowInstanceStore.SaveAsync(workflowInstance, cancellationToken); // Invoke next middleware. await Next(context); @@ -102,14 +105,31 @@ public class PersistWorkflowInstanceMiddleware : WorkflowExecutionMiddleware workflowInstance.Status = workflowState.Status; workflowInstance.SubStatus = workflowState.SubStatus; workflowInstance.CorrelationId = workflowState.CorrelationId; - workflowInstance.LastExecutedAt = _clock.UtcNow; + workflowInstance.LastExecutedAt = now; + + // Update timestamps. + if (workflowInstance.Status == WorkflowStatus.Finished) + { + switch (workflowInstance.SubStatus) + { + case WorkflowSubStatus.Cancelled: + workflowInstance.CancelledAt = now; + break; + case WorkflowSubStatus.Faulted: + workflowInstance.FaultedAt = now; + break; + case WorkflowSubStatus.Finished: + workflowInstance.FinishedAt = now; + break; + } + } // Get the workflow instance name, if any (could be provided by previously executed middleware). if (context.TransientProperties.TryGetValue(WorkflowInstanceNameKey, out name)) workflowInstance.Name = (string?)name; // Persist updated workflow instance. - await _commandSender.ExecuteAsync(new SaveWorkflowInstance(workflowInstance), cancellationToken); + await _workflowInstanceStore.SaveAsync(workflowInstance, cancellationToken); // Get a diff between bookmarks that were in the snapshot but no longer present in context. var diff = Diff.For(bookmarksSnapshot, context.Bookmarks.ToList()); diff --git a/src/core/Elsa.Runtime/Stimuli/Handlers/ResumeWorkflowsStimulusHandler.cs b/src/core/Elsa.Runtime/Stimuli/Handlers/ResumeWorkflowsStimulusHandler.cs index ffb7f010d..357d69c5f 100644 --- a/src/core/Elsa.Runtime/Stimuli/Handlers/ResumeWorkflowsStimulusHandler.cs +++ b/src/core/Elsa.Runtime/Stimuli/Handlers/ResumeWorkflowsStimulusHandler.cs @@ -1,19 +1,19 @@ -using Elsa.Mediator.Services; -using Elsa.Persistence.Requests; +using Elsa.Persistence.Services; using Elsa.Runtime.Abstractions; using Elsa.Runtime.Interpreters; using Elsa.Runtime.Services; +using Open.Linq.AsyncExtensions; namespace Elsa.Runtime.Stimuli.Handlers; public class ResumeWorkflowsStimulusHandler : StimulusHandler { - private readonly IRequestSender _mediator; - public ResumeWorkflowsStimulusHandler(IRequestSender mediator) => _mediator = mediator; + private readonly IWorkflowBookmarkStore _bookmarkStore; + public ResumeWorkflowsStimulusHandler(IWorkflowBookmarkStore bookmarkStore) => _bookmarkStore = bookmarkStore; protected override async ValueTask> GetInstructionsAsync(StandardStimulus stimulus, CancellationToken cancellationToken = default) { - var workflowBookmarks = (await _mediator.RequestAsync(new FindWorkflowBookmarks(stimulus.ActivityTypeName, stimulus.Hash), cancellationToken)).ToList(); + var workflowBookmarks = await _bookmarkStore.FindManyAsync(stimulus.ActivityTypeName, stimulus.Hash, cancellationToken).ToList(); return workflowBookmarks.Select(x => new ResumeWorkflowInstruction(x, stimulus.Input, stimulus.CorrelationId)); } } \ No newline at end of file diff --git a/src/core/Elsa.Runtime/Stimuli/Handlers/TriggerWorkflowsStimulusHandler.cs b/src/core/Elsa.Runtime/Stimuli/Handlers/TriggerWorkflowsStimulusHandler.cs index c4870ab1a..2ae5e79d3 100644 --- a/src/core/Elsa.Runtime/Stimuli/Handlers/TriggerWorkflowsStimulusHandler.cs +++ b/src/core/Elsa.Runtime/Stimuli/Handlers/TriggerWorkflowsStimulusHandler.cs @@ -1,5 +1,4 @@ -using Elsa.Mediator.Services; -using Elsa.Persistence.Requests; +using Elsa.Persistence.Services; using Elsa.Runtime.Abstractions; using Elsa.Runtime.Interpreters; using Elsa.Runtime.Services; @@ -8,12 +7,16 @@ namespace Elsa.Runtime.Stimuli.Handlers; public class TriggerWorkflowsStimulusHandler : StimulusHandler { - private readonly IRequestSender _mediator; - public TriggerWorkflowsStimulusHandler(IRequestSender mediator) => _mediator = mediator; + private readonly IWorkflowTriggerStore _workflowTriggerStore; + + public TriggerWorkflowsStimulusHandler(IWorkflowTriggerStore workflowTriggerStore) + { + _workflowTriggerStore = workflowTriggerStore; + } protected override async ValueTask> GetInstructionsAsync(StandardStimulus stimulus, CancellationToken cancellationToken = default) { - var workflowTriggers = (await _mediator.RequestAsync(new FindWorkflowTriggersByName(stimulus.ActivityTypeName, stimulus.Hash), cancellationToken)).ToList(); + var workflowTriggers = (await _workflowTriggerStore.FindManyByNameAsync(stimulus.ActivityTypeName, stimulus.Hash, cancellationToken)).ToList(); return workflowTriggers.Select(x => new TriggerWorkflowInstruction(x, stimulus.Input, stimulus.CorrelationId)); } } \ No newline at end of file diff --git a/src/core/Elsa/Elsa.csproj b/src/core/Elsa/Elsa.csproj index ffcb9792d..923de2596 100644 --- a/src/core/Elsa/Elsa.csproj +++ b/src/core/Elsa/Elsa.csproj @@ -15,7 +15,7 @@ - + diff --git a/src/modules/Elsa.Modules.AzureServiceBus/Elsa.Modules.AzureServiceBus.csproj b/src/modules/Elsa.Modules.AzureServiceBus/Elsa.Modules.AzureServiceBus.csproj index 2e9d7bf3f..d39414298 100644 --- a/src/modules/Elsa.Modules.AzureServiceBus/Elsa.Modules.AzureServiceBus.csproj +++ b/src/modules/Elsa.Modules.AzureServiceBus/Elsa.Modules.AzureServiceBus.csproj @@ -19,7 +19,7 @@ - + diff --git a/src/modules/Elsa.Modules.Scheduling/Activities/StartAt.cs b/src/modules/Elsa.Modules.Scheduling/Activities/StartAt.cs index 2f70e5f83..2c349947c 100644 --- a/src/modules/Elsa.Modules.Scheduling/Activities/StartAt.cs +++ b/src/modules/Elsa.Modules.Scheduling/Activities/StartAt.cs @@ -1,5 +1,4 @@ using System; -using System.Collections.Generic; using System.Threading.Tasks; using Elsa.Attributes; using Elsa.Models; diff --git a/src/modules/Elsa.Modules.Scheduling/Activities/Timer.cs b/src/modules/Elsa.Modules.Scheduling/Activities/Timer.cs index 162fc6363..461b2e845 100644 --- a/src/modules/Elsa.Modules.Scheduling/Activities/Timer.cs +++ b/src/modules/Elsa.Modules.Scheduling/Activities/Timer.cs @@ -1,5 +1,4 @@ using System; -using System.Collections.Generic; using System.Text.Json.Serialization; using Elsa.Attributes; using Elsa.Models; diff --git a/src/modules/Elsa.Modules.Scheduling/HostedServices/ScheduleWorkflows.cs b/src/modules/Elsa.Modules.Scheduling/HostedServices/ScheduleWorkflows.cs index 90b584569..64dac7dcf 100644 --- a/src/modules/Elsa.Modules.Scheduling/HostedServices/ScheduleWorkflows.cs +++ b/src/modules/Elsa.Modules.Scheduling/HostedServices/ScheduleWorkflows.cs @@ -2,10 +2,10 @@ using System.Collections.Immutable; using System.Linq; using System.Threading; using System.Threading.Tasks; -using Elsa.Mediator.Services; +using Elsa.Helpers; using Elsa.Modules.Scheduling.Activities; using Elsa.Modules.Scheduling.Services; -using Elsa.Persistence.Requests; +using Elsa.Persistence.Services; using Microsoft.Extensions.Hosting; namespace Elsa.Modules.Scheduling.HostedServices; @@ -15,12 +15,12 @@ namespace Elsa.Modules.Scheduling.HostedServices; /// public class ScheduleWorkflows : BackgroundService { - private readonly IRequestSender _requestSender; + private readonly IWorkflowBookmarkStore _bookmarkStore; private readonly IWorkflowBookmarkScheduler _workflowBookmarkScheduler; - public ScheduleWorkflows(IRequestSender requestSender, IWorkflowBookmarkScheduler workflowBookmarkScheduler) + public ScheduleWorkflows(IWorkflowBookmarkStore bookmarkStore, IWorkflowBookmarkScheduler workflowBookmarkScheduler) { - _requestSender = requestSender; + _bookmarkStore = bookmarkStore; _workflowBookmarkScheduler = workflowBookmarkScheduler; } @@ -31,7 +31,7 @@ public class ScheduleWorkflows : BackgroundService private async Task ScheduleBookmarksAsync(CancellationToken cancellationToken) { - var workflowBookmarks = (await _requestSender.RequestAsync(FindWorkflowBookmarks.ForActivity(), cancellationToken)).ToImmutableList(); + var workflowBookmarks = (await _bookmarkStore.FindManyAsync(ActivityTypeNameHelper.GenerateTypeName(), cancellationToken: cancellationToken)).ToImmutableList(); var groupedBookmarks = workflowBookmarks.GroupBy(x => x.WorkflowInstanceId); foreach (var bookmarksGroup in groupedBookmarks) diff --git a/src/modules/Elsa.Modules.SetName/Elsa.Modules.SetName.csproj b/src/modules/Elsa.Modules.SetName/Elsa.Modules.SetName.csproj deleted file mode 100644 index 0be27a646..000000000 --- a/src/modules/Elsa.Modules.SetName/Elsa.Modules.SetName.csproj +++ /dev/null @@ -1,19 +0,0 @@ - - - - net6.0 - enable - enable - - - - - - - - - - - - - diff --git a/src/persistence/Elsa.Persistence.Abstractions/Commands/DeleteWorkflowBookmarks.cs b/src/persistence/Elsa.Persistence.Abstractions/Commands/DeleteWorkflowBookmarks.cs deleted file mode 100644 index 5d8861bac..000000000 --- a/src/persistence/Elsa.Persistence.Abstractions/Commands/DeleteWorkflowBookmarks.cs +++ /dev/null @@ -1,12 +0,0 @@ -using Elsa.Mediator.Services; - -namespace Elsa.Persistence.Commands; - -/// -/// Represents a command to delete all of the specified . -/// -public record DeleteWorkflowBookmarks : ICommand -{ - public DeleteWorkflowBookmarks(IEnumerable bookmarkIds) => BookmarkIds = bookmarkIds.ToList(); - public ICollection BookmarkIds { get; set; } -} \ No newline at end of file diff --git a/src/persistence/Elsa.Persistence.Abstractions/Commands/DeleteWorkflowDefinition.cs b/src/persistence/Elsa.Persistence.Abstractions/Commands/DeleteWorkflowDefinition.cs deleted file mode 100644 index 6b0be9f4c..000000000 --- a/src/persistence/Elsa.Persistence.Abstractions/Commands/DeleteWorkflowDefinition.cs +++ /dev/null @@ -1,8 +0,0 @@ -using Elsa.Mediator.Services; - -namespace Elsa.Persistence.Commands; - -/// -/// Represents a command to delete all versions of the specified definition ID. -/// -public record DeleteWorkflowDefinition(string DefinitionId) : ICommand; \ No newline at end of file diff --git a/src/persistence/Elsa.Persistence.Abstractions/Commands/DeleteWorkflowInstance.cs b/src/persistence/Elsa.Persistence.Abstractions/Commands/DeleteWorkflowInstance.cs deleted file mode 100644 index c9b3c624d..000000000 --- a/src/persistence/Elsa.Persistence.Abstractions/Commands/DeleteWorkflowInstance.cs +++ /dev/null @@ -1,9 +0,0 @@ -using Elsa.Mediator.Services; - -namespace Elsa.Persistence.Commands; - -public record DeleteWorkflowInstance : ICommand -{ - public DeleteWorkflowInstance(string instanceId) => InstanceId = instanceId; - public string? InstanceId { get; set; } -} \ No newline at end of file diff --git a/src/persistence/Elsa.Persistence.Abstractions/Commands/DeleteWorkflowInstances.cs b/src/persistence/Elsa.Persistence.Abstractions/Commands/DeleteWorkflowInstances.cs deleted file mode 100644 index 725e9e171..000000000 --- a/src/persistence/Elsa.Persistence.Abstractions/Commands/DeleteWorkflowInstances.cs +++ /dev/null @@ -1,15 +0,0 @@ -using Elsa.Mediator.Services; - -namespace Elsa.Persistence.Commands; - -/// -/// Represents a command to delete all instances of the specified or having one of the specified . -/// -public record DeleteWorkflowInstances : ICommand -{ - public DeleteWorkflowInstances(string definitionId) => DefinitionId = definitionId; - public DeleteWorkflowInstances(IEnumerable instanceIds) => InstanceIds = instanceIds.ToList(); - - public string? DefinitionId { get; set; } - public ICollection? InstanceIds { get; set; } -} \ No newline at end of file diff --git a/src/persistence/Elsa.Persistence.Abstractions/Commands/ReplaceWorkflowTriggers.cs b/src/persistence/Elsa.Persistence.Abstractions/Commands/ReplaceWorkflowTriggers.cs deleted file mode 100644 index cabd342b4..000000000 --- a/src/persistence/Elsa.Persistence.Abstractions/Commands/ReplaceWorkflowTriggers.cs +++ /dev/null @@ -1,7 +0,0 @@ -using Elsa.Mediator.Services; -using Elsa.Models; -using Elsa.Persistence.Entities; - -namespace Elsa.Persistence.Commands; - -public record ReplaceWorkflowTriggers(Workflow Workflow, ICollection Removed, ICollection Added) : ICommand; \ No newline at end of file diff --git a/src/persistence/Elsa.Persistence.Abstractions/Commands/SaveWorkflowBookmarks.cs b/src/persistence/Elsa.Persistence.Abstractions/Commands/SaveWorkflowBookmarks.cs deleted file mode 100644 index be00fbb9e..000000000 --- a/src/persistence/Elsa.Persistence.Abstractions/Commands/SaveWorkflowBookmarks.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Elsa.Mediator.Services; -using Elsa.Persistence.Entities; - -namespace Elsa.Persistence.Commands; - -/// -/// Represents a command to persist the specified to storage. -/// -public record SaveWorkflowBookmarks : ICommand -{ - public SaveWorkflowBookmarks(IEnumerable workflowBookmarks) => WorkflowBookmarks = workflowBookmarks.ToList(); - public IReadOnlyCollection WorkflowBookmarks { get; } -} \ No newline at end of file diff --git a/src/persistence/Elsa.Persistence.Abstractions/Commands/SaveWorkflowDefinition.cs b/src/persistence/Elsa.Persistence.Abstractions/Commands/SaveWorkflowDefinition.cs deleted file mode 100644 index 448386f13..000000000 --- a/src/persistence/Elsa.Persistence.Abstractions/Commands/SaveWorkflowDefinition.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Elsa.Mediator.Services; -using Elsa.Models; -using Elsa.Persistence.Entities; - -namespace Elsa.Persistence.Commands; - -/// -/// Represents a command to persist the specified to storage. -/// -public record SaveWorkflowDefinition(WorkflowDefinition WorkflowDefinition) : ICommand; \ No newline at end of file diff --git a/src/persistence/Elsa.Persistence.Abstractions/Commands/SaveWorkflowExecutionLog.cs b/src/persistence/Elsa.Persistence.Abstractions/Commands/SaveWorkflowExecutionLog.cs deleted file mode 100644 index 8c058e9e5..000000000 --- a/src/persistence/Elsa.Persistence.Abstractions/Commands/SaveWorkflowExecutionLog.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Elsa.Mediator.Services; -using Elsa.Persistence.Entities; - -namespace Elsa.Persistence.Commands; - -public record SaveWorkflowExecutionLog : ICommand -{ - public SaveWorkflowExecutionLog(IEnumerable records) => Records = records.ToList(); - public IReadOnlyCollection Records { get; } -} \ No newline at end of file diff --git a/src/persistence/Elsa.Persistence.Abstractions/Commands/SaveWorkflowInstance.cs b/src/persistence/Elsa.Persistence.Abstractions/Commands/SaveWorkflowInstance.cs deleted file mode 100644 index 20f8918cd..000000000 --- a/src/persistence/Elsa.Persistence.Abstractions/Commands/SaveWorkflowInstance.cs +++ /dev/null @@ -1,9 +0,0 @@ -using Elsa.Mediator.Services; -using Elsa.Persistence.Entities; - -namespace Elsa.Persistence.Commands; - -/// -/// Represents a command to persist the specified to storage. -/// -public record SaveWorkflowInstance(WorkflowInstance WorkflowInstance) : ICommand; \ No newline at end of file diff --git a/src/persistence/Elsa.Persistence.Abstractions/Requests/FindLatestAndPublishedWorkflows.cs b/src/persistence/Elsa.Persistence.Abstractions/Requests/FindLatestAndPublishedWorkflows.cs deleted file mode 100644 index 60805c8ec..000000000 --- a/src/persistence/Elsa.Persistence.Abstractions/Requests/FindLatestAndPublishedWorkflows.cs +++ /dev/null @@ -1,7 +0,0 @@ -using Elsa.Mediator.Services; -using Elsa.Models; -using Elsa.Persistence.Entities; - -namespace Elsa.Persistence.Requests; - -public record FindLatestAndPublishedWorkflows(string DefinitionId) : IRequest>; \ No newline at end of file diff --git a/src/persistence/Elsa.Persistence.Abstractions/Requests/FindManyWorkflowDefinitions.cs b/src/persistence/Elsa.Persistence.Abstractions/Requests/FindManyWorkflowDefinitions.cs deleted file mode 100644 index f15d668be..000000000 --- a/src/persistence/Elsa.Persistence.Abstractions/Requests/FindManyWorkflowDefinitions.cs +++ /dev/null @@ -1,6 +0,0 @@ -using Elsa.Mediator.Services; -using Elsa.Persistence.Models; - -namespace Elsa.Persistence.Requests; - -public record FindManyWorkflowDefinitions(string[] DefinitionIds, VersionOptions? VersionOptions = default) : IRequest>; \ No newline at end of file diff --git a/src/persistence/Elsa.Persistence.Abstractions/Requests/FindWorkflowBookmark.cs b/src/persistence/Elsa.Persistence.Abstractions/Requests/FindWorkflowBookmark.cs deleted file mode 100644 index ba1c50f1f..000000000 --- a/src/persistence/Elsa.Persistence.Abstractions/Requests/FindWorkflowBookmark.cs +++ /dev/null @@ -1,6 +0,0 @@ -using Elsa.Mediator.Services; -using Elsa.Persistence.Entities; - -namespace Elsa.Persistence.Requests; - -public record FindWorkflowBookmark(string BookmarkId) : IRequest; \ No newline at end of file diff --git a/src/persistence/Elsa.Persistence.Abstractions/Requests/FindWorkflowBookmarks.cs b/src/persistence/Elsa.Persistence.Abstractions/Requests/FindWorkflowBookmarks.cs deleted file mode 100644 index 912ea5e62..000000000 --- a/src/persistence/Elsa.Persistence.Abstractions/Requests/FindWorkflowBookmarks.cs +++ /dev/null @@ -1,26 +0,0 @@ -using Elsa.Helpers; -using Elsa.Mediator.Services; -using Elsa.Persistence.Entities; -using Elsa.Services; - -namespace Elsa.Persistence.Requests; - -public record FindWorkflowBookmarks : IRequest> -{ - public FindWorkflowBookmarks(string workflowInstanceId) - { - WorkflowInstanceId = workflowInstanceId; - } - - public FindWorkflowBookmarks(string name, string? hash) - { - Name = name; - Hash = hash; - } - - public string? WorkflowInstanceId { get; } - public string? Name { get; } - public string? Hash { get; } - - public static FindWorkflowBookmarks ForActivity(string? hash = default) where T : IActivity => new(TypeNameHelper.GenerateTypeName(), hash); -} \ No newline at end of file diff --git a/src/persistence/Elsa.Persistence.Abstractions/Requests/FindWorkflowDefinitionByDefinitionId.cs b/src/persistence/Elsa.Persistence.Abstractions/Requests/FindWorkflowDefinitionByDefinitionId.cs deleted file mode 100644 index 53eff049c..000000000 --- a/src/persistence/Elsa.Persistence.Abstractions/Requests/FindWorkflowDefinitionByDefinitionId.cs +++ /dev/null @@ -1,8 +0,0 @@ -using Elsa.Mediator.Services; -using Elsa.Models; -using Elsa.Persistence.Entities; -using Elsa.Persistence.Models; - -namespace Elsa.Persistence.Requests; - -public record FindWorkflowDefinitionByDefinitionId(string DefinitionId, VersionOptions VersionOptions) : IRequest; \ No newline at end of file diff --git a/src/persistence/Elsa.Persistence.Abstractions/Requests/FindWorkflowDefinitionByName.cs b/src/persistence/Elsa.Persistence.Abstractions/Requests/FindWorkflowDefinitionByName.cs deleted file mode 100644 index c8a7115a2..000000000 --- a/src/persistence/Elsa.Persistence.Abstractions/Requests/FindWorkflowDefinitionByName.cs +++ /dev/null @@ -1,8 +0,0 @@ -using Elsa.Mediator.Services; -using Elsa.Models; -using Elsa.Persistence.Entities; -using Elsa.Persistence.Models; - -namespace Elsa.Persistence.Requests; - -public record FindWorkflowDefinitionByName(string Name, VersionOptions VersionOptions) : IRequest; \ No newline at end of file diff --git a/src/persistence/Elsa.Persistence.Abstractions/Requests/FindWorkflowInstance.cs b/src/persistence/Elsa.Persistence.Abstractions/Requests/FindWorkflowInstance.cs deleted file mode 100644 index c387d5be0..000000000 --- a/src/persistence/Elsa.Persistence.Abstractions/Requests/FindWorkflowInstance.cs +++ /dev/null @@ -1,6 +0,0 @@ -using Elsa.Mediator.Services; -using Elsa.Persistence.Entities; - -namespace Elsa.Persistence.Requests; - -public record FindWorkflowInstance(string InstanceId) : IRequest; \ No newline at end of file diff --git a/src/persistence/Elsa.Persistence.Abstractions/Requests/FindWorkflowTriggersByName.cs b/src/persistence/Elsa.Persistence.Abstractions/Requests/FindWorkflowTriggersByName.cs deleted file mode 100644 index 3906ebec3..000000000 --- a/src/persistence/Elsa.Persistence.Abstractions/Requests/FindWorkflowTriggersByName.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Elsa.Helpers; -using Elsa.Mediator.Services; -using Elsa.Persistence.Entities; -using Elsa.Services; - -namespace Elsa.Persistence.Requests; - -public record FindWorkflowTriggersByName(string Name, string? Hash = default) : IRequest> -{ - public static FindWorkflowTriggersByName ForTrigger(string? hash = default) where T : IEventGenerator => new(TypeNameHelper.GenerateTypeName(), hash); -} \ No newline at end of file diff --git a/src/persistence/Elsa.Persistence.Abstractions/Requests/FindWorkflowTriggersByWorkflowDefinition.cs b/src/persistence/Elsa.Persistence.Abstractions/Requests/FindWorkflowTriggersByWorkflowDefinition.cs deleted file mode 100644 index 31e157fef..000000000 --- a/src/persistence/Elsa.Persistence.Abstractions/Requests/FindWorkflowTriggersByWorkflowDefinition.cs +++ /dev/null @@ -1,6 +0,0 @@ -using Elsa.Mediator.Services; -using Elsa.Persistence.Entities; - -namespace Elsa.Persistence.Requests; - -public record FindWorkflowTriggersByWorkflowDefinition(string WorkflowDefinitionId) : IRequest>; \ No newline at end of file diff --git a/src/persistence/Elsa.Persistence.Abstractions/Requests/ListWorkflowDefinitionSummaries.cs b/src/persistence/Elsa.Persistence.Abstractions/Requests/ListWorkflowDefinitionSummaries.cs deleted file mode 100644 index 33bff1194..000000000 --- a/src/persistence/Elsa.Persistence.Abstractions/Requests/ListWorkflowDefinitionSummaries.cs +++ /dev/null @@ -1,6 +0,0 @@ -using Elsa.Mediator.Services; -using Elsa.Persistence.Models; - -namespace Elsa.Persistence.Requests; - -public record ListWorkflowDefinitionSummaries(VersionOptions? VersionOptions = default, PageArgs? PageArgs = default) : IRequest>; \ No newline at end of file diff --git a/src/persistence/Elsa.Persistence.Abstractions/Requests/ListWorkflowDefinitions.cs b/src/persistence/Elsa.Persistence.Abstractions/Requests/ListWorkflowDefinitions.cs deleted file mode 100644 index 8a5404732..000000000 --- a/src/persistence/Elsa.Persistence.Abstractions/Requests/ListWorkflowDefinitions.cs +++ /dev/null @@ -1,8 +0,0 @@ -using Elsa.Mediator.Services; -using Elsa.Models; -using Elsa.Persistence.Entities; -using Elsa.Persistence.Models; - -namespace Elsa.Persistence.Requests; - -public record ListWorkflowDefinitions(VersionOptions? VersionOptions = default, PageArgs? PageArgs = default) : IRequest>; \ No newline at end of file diff --git a/src/persistence/Elsa.Persistence.Abstractions/Requests/ListWorkflowInstanceSummaries.cs b/src/persistence/Elsa.Persistence.Abstractions/Requests/ListWorkflowInstanceSummaries.cs deleted file mode 100644 index 7f1a6a2cd..000000000 --- a/src/persistence/Elsa.Persistence.Abstractions/Requests/ListWorkflowInstanceSummaries.cs +++ /dev/null @@ -1,18 +0,0 @@ -using Elsa.Mediator.Services; -using Elsa.Models; -using Elsa.Persistence.Entities; -using Elsa.Persistence.Models; - -namespace Elsa.Persistence.Requests; - -public record ListWorkflowInstanceSummaries( - string? SearchTerm = default, - string? DefinitionId = default, - int? Version = default, - string? CorrelationId = default, - WorkflowStatus? WorkflowStatus = default, - WorkflowSubStatus? WorkflowSubStatus = default, - PageArgs? PageArgs = default, - OrderBy OrderBy = OrderBy.Created, - OrderDirection OrderDirection = OrderDirection.Ascending -) : IRequest>; \ No newline at end of file diff --git a/src/persistence/Elsa.Persistence.Abstractions/Services/IWorkflowBookmarkStore.cs b/src/persistence/Elsa.Persistence.Abstractions/Services/IWorkflowBookmarkStore.cs deleted file mode 100644 index 4fa3d273f..000000000 --- a/src/persistence/Elsa.Persistence.Abstractions/Services/IWorkflowBookmarkStore.cs +++ /dev/null @@ -1,16 +0,0 @@ -// using System.Collections.Generic; -// using System.Threading; -// using System.Threading.Tasks; -// using Elsa.Persistence.Entities; -// -// namespace Elsa.Persistence.Contracts; -// -// public interface IWorkflowBookmarkStore -// { -// Task SaveAsync(WorkflowBookmark record, CancellationToken cancellationToken = default); -// Task SaveManyAsync(IEnumerable records, CancellationToken cancellationToken = default); -// Task> FindManyAsync(string name, string? hash, CancellationToken cancellationToken = default); -// Task> FindManyByWorkflowInstanceAsync(string workflowInstanceId, CancellationToken cancellationToken = default); -// Task DeleteAsync(string id, CancellationToken cancellationToken = default); -// Task DeleteManyAsync(IEnumerable ids, CancellationToken cancellationToken = default); -// } \ No newline at end of file diff --git a/src/persistence/Elsa.Persistence.Abstractions/Services/IWorkflowInstanceStore.cs b/src/persistence/Elsa.Persistence.Abstractions/Services/IWorkflowInstanceStore.cs deleted file mode 100644 index 88d32f909..000000000 --- a/src/persistence/Elsa.Persistence.Abstractions/Services/IWorkflowInstanceStore.cs +++ /dev/null @@ -1,13 +0,0 @@ -// using System.Collections.Generic; -// using System.Threading; -// using System.Threading.Tasks; -// using Elsa.Persistence.Entities; -// -// namespace Elsa.Persistence.Contracts; -// -// public interface IWorkflowInstanceStore -// { -// Task FindByIdAsync(string id, CancellationToken cancellationToken = default); -// Task SaveAsync(WorkflowInstance record, CancellationToken cancellationToken = default); -// Task SaveManyAsync(IEnumerable records, CancellationToken cancellationToken = default); -// } \ No newline at end of file diff --git a/src/persistence/Elsa.Persistence.Abstractions/Services/IWorkflowTriggerStore.cs b/src/persistence/Elsa.Persistence.Abstractions/Services/IWorkflowTriggerStore.cs deleted file mode 100644 index b42e309e8..000000000 --- a/src/persistence/Elsa.Persistence.Abstractions/Services/IWorkflowTriggerStore.cs +++ /dev/null @@ -1,15 +0,0 @@ -// using System.Collections.Generic; -// using System.Threading; -// using System.Threading.Tasks; -// using Elsa.Persistence.Entities; -// -// namespace Elsa.Persistence.Contracts; -// -// public interface IWorkflowTriggerStore -// { -// Task SaveAsync(WorkflowTrigger record, CancellationToken cancellationToken = default); -// Task SaveManyAsync(IEnumerable records, CancellationToken cancellationToken = default); -// Task> FindManyAsync(string name, string? hash, CancellationToken cancellationToken = default); -// Task DeleteManyAsync(IEnumerable ids, CancellationToken cancellationToken = default); -// Task ReplaceTriggersAsync(string workflowDefinitionId, IEnumerable triggers, CancellationToken cancellationToken = default); -// } \ No newline at end of file diff --git a/src/persistence/Elsa.Persistence.EntityFrameworkCore/Handlers/Commands/DeleteWorkflowBookmarksHandler.cs b/src/persistence/Elsa.Persistence.EntityFrameworkCore/Handlers/Commands/DeleteWorkflowBookmarksHandler.cs deleted file mode 100644 index 8c35a7531..000000000 --- a/src/persistence/Elsa.Persistence.EntityFrameworkCore/Handlers/Commands/DeleteWorkflowBookmarksHandler.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Elsa.Mediator.Services; -using Elsa.Persistence.Commands; -using Elsa.Persistence.Entities; -using Elsa.Persistence.EntityFrameworkCore.Services; - -namespace Elsa.Persistence.EntityFrameworkCore.Handlers.Commands; - -public class DeleteWorkflowBookmarksHandler : ICommandHandler -{ - private readonly IStore _store; - public DeleteWorkflowBookmarksHandler(IStore store) => _store = store; - public async Task HandleAsync(DeleteWorkflowBookmarks command, CancellationToken cancellationToken) => await _store.DeleteWhereAsync(x => command.BookmarkIds.Contains(x.Id), cancellationToken); -} \ No newline at end of file diff --git a/src/persistence/Elsa.Persistence.EntityFrameworkCore/Handlers/Commands/DeleteWorkflowDefinitionHandler.cs b/src/persistence/Elsa.Persistence.EntityFrameworkCore/Handlers/Commands/DeleteWorkflowDefinitionHandler.cs deleted file mode 100644 index 9c778f995..000000000 --- a/src/persistence/Elsa.Persistence.EntityFrameworkCore/Handlers/Commands/DeleteWorkflowDefinitionHandler.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Elsa.Mediator.Services; -using Elsa.Persistence.Commands; -using Elsa.Persistence.Entities; -using Elsa.Persistence.EntityFrameworkCore.Services; - -namespace Elsa.Persistence.EntityFrameworkCore.Handlers.Commands; - -public class DeleteWorkflowDefinitionHandler : ICommandHandler -{ - private readonly IStore _store; - public DeleteWorkflowDefinitionHandler(IStore store) => _store = store; - public async Task HandleAsync(DeleteWorkflowDefinition command, CancellationToken cancellationToken) => await _store.DeleteWhereAsync(x => x.DefinitionId == command.DefinitionId, cancellationToken) > 0; -} \ No newline at end of file diff --git a/src/persistence/Elsa.Persistence.EntityFrameworkCore/Handlers/Commands/DeleteWorkflowInstancesHandler.cs b/src/persistence/Elsa.Persistence.EntityFrameworkCore/Handlers/Commands/DeleteWorkflowInstancesHandler.cs deleted file mode 100644 index 1e50af2a1..000000000 --- a/src/persistence/Elsa.Persistence.EntityFrameworkCore/Handlers/Commands/DeleteWorkflowInstancesHandler.cs +++ /dev/null @@ -1,31 +0,0 @@ -using Elsa.Mediator.Services; -using Elsa.Persistence.Commands; -using Elsa.Persistence.Entities; -using Elsa.Persistence.EntityFrameworkCore.Services; - -namespace Elsa.Persistence.EntityFrameworkCore.Handlers.Commands; - -public class DeleteWorkflowInstancesHandler : ICommandHandler, ICommandHandler -{ - private readonly IStore _store; - public DeleteWorkflowInstancesHandler(IStore store) => _store = store; - - public async Task HandleAsync(DeleteWorkflowInstances command, CancellationToken cancellationToken) - { - if (command.DefinitionId != null) - return await _store.DeleteWhereAsync(x => x.DefinitionId == command.DefinitionId, cancellationToken); - - if (command.InstanceIds != null) - return await _store.DeleteWhereAsync(x => command.InstanceIds.Contains(x.Id), cancellationToken); - - return 0; - } - - public async Task HandleAsync(DeleteWorkflowInstance command, CancellationToken cancellationToken) - { - if (command.InstanceId != null) - return await _store.DeleteWhereAsync(x => x.Id == command.InstanceId, cancellationToken); - - return 0; - } -} \ No newline at end of file diff --git a/src/persistence/Elsa.Persistence.EntityFrameworkCore/Handlers/Commands/ReplaceWorkflowTriggersHandler.cs b/src/persistence/Elsa.Persistence.EntityFrameworkCore/Handlers/Commands/ReplaceWorkflowTriggersHandler.cs deleted file mode 100644 index 759d91f10..000000000 --- a/src/persistence/Elsa.Persistence.EntityFrameworkCore/Handlers/Commands/ReplaceWorkflowTriggersHandler.cs +++ /dev/null @@ -1,21 +0,0 @@ -using Elsa.Mediator.Models; -using Elsa.Mediator.Services; -using Elsa.Persistence.Commands; -using Elsa.Persistence.Entities; -using Elsa.Persistence.EntityFrameworkCore.Services; - -namespace Elsa.Persistence.EntityFrameworkCore.Handlers.Commands; - -public class ReplaceWorkflowTriggersHandler : ICommandHandler -{ - private readonly IStore _store; - public ReplaceWorkflowTriggersHandler(IStore store) => _store = store; - - public async Task HandleAsync(ReplaceWorkflowTriggers command, CancellationToken cancellationToken) - { - await _store.DeleteManyAsync(command.Removed, cancellationToken); - await _store.SaveManyAsync(command.Added, cancellationToken); - - return Unit.Instance; - } -} \ No newline at end of file diff --git a/src/persistence/Elsa.Persistence.EntityFrameworkCore/Handlers/Commands/SaveWorkflowBookmarksHandler.cs b/src/persistence/Elsa.Persistence.EntityFrameworkCore/Handlers/Commands/SaveWorkflowBookmarksHandler.cs deleted file mode 100644 index 7a87443af..000000000 --- a/src/persistence/Elsa.Persistence.EntityFrameworkCore/Handlers/Commands/SaveWorkflowBookmarksHandler.cs +++ /dev/null @@ -1,20 +0,0 @@ -using Elsa.Mediator.Models; -using Elsa.Mediator.Services; -using Elsa.Persistence.Commands; -using Elsa.Persistence.Entities; -using Elsa.Persistence.EntityFrameworkCore.Services; - -namespace Elsa.Persistence.EntityFrameworkCore.Handlers.Commands; - -public class SaveWorkflowBookmarksHandler : ICommandHandler -{ - private readonly IStore _store; - public SaveWorkflowBookmarksHandler(IStore store) => _store = store; - - public async Task HandleAsync(SaveWorkflowBookmarks command, CancellationToken cancellationToken) - { - await _store.SaveManyAsync(command.WorkflowBookmarks, cancellationToken); - - return Unit.Instance; - } -} \ No newline at end of file diff --git a/src/persistence/Elsa.Persistence.EntityFrameworkCore/Handlers/Commands/SaveWorkflowDefinitionHandler.cs b/src/persistence/Elsa.Persistence.EntityFrameworkCore/Handlers/Commands/SaveWorkflowDefinitionHandler.cs deleted file mode 100644 index c29b0ebc3..000000000 --- a/src/persistence/Elsa.Persistence.EntityFrameworkCore/Handlers/Commands/SaveWorkflowDefinitionHandler.cs +++ /dev/null @@ -1,20 +0,0 @@ -using Elsa.Mediator.Models; -using Elsa.Mediator.Services; -using Elsa.Persistence.Commands; -using Elsa.Persistence.Entities; -using Elsa.Persistence.EntityFrameworkCore.Services; - -namespace Elsa.Persistence.EntityFrameworkCore.Handlers.Commands; - -public class SaveWorkflowDefinitionHandler : ICommandHandler -{ - private readonly IStore _store; - public SaveWorkflowDefinitionHandler(IStore store) => _store = store; - - public async Task HandleAsync(SaveWorkflowDefinition command, CancellationToken cancellationToken) - { - await _store.SaveAsync(command.WorkflowDefinition, cancellationToken); - - return Unit.Instance; - } -} \ No newline at end of file diff --git a/src/persistence/Elsa.Persistence.EntityFrameworkCore/Handlers/Commands/SaveWorkflowExecutionLogHandler.cs b/src/persistence/Elsa.Persistence.EntityFrameworkCore/Handlers/Commands/SaveWorkflowExecutionLogHandler.cs deleted file mode 100644 index 75f3e3853..000000000 --- a/src/persistence/Elsa.Persistence.EntityFrameworkCore/Handlers/Commands/SaveWorkflowExecutionLogHandler.cs +++ /dev/null @@ -1,20 +0,0 @@ -using Elsa.Mediator.Models; -using Elsa.Mediator.Services; -using Elsa.Persistence.Commands; -using Elsa.Persistence.Entities; -using Elsa.Persistence.EntityFrameworkCore.Services; - -namespace Elsa.Persistence.EntityFrameworkCore.Handlers.Commands; - -public class SaveWorkflowExecutionLogHandler : ICommandHandler -{ - private readonly IStore _store; - public SaveWorkflowExecutionLogHandler(IStore store) => _store = store; - - public async Task HandleAsync(SaveWorkflowExecutionLog command, CancellationToken cancellationToken) - { - await _store.SaveManyAsync(command.Records, cancellationToken); - - return Unit.Instance; - } -} \ No newline at end of file diff --git a/src/persistence/Elsa.Persistence.EntityFrameworkCore/Handlers/Commands/SaveWorkflowInstanceHandler.cs b/src/persistence/Elsa.Persistence.EntityFrameworkCore/Handlers/Commands/SaveWorkflowInstanceHandler.cs deleted file mode 100644 index 71b6db8a1..000000000 --- a/src/persistence/Elsa.Persistence.EntityFrameworkCore/Handlers/Commands/SaveWorkflowInstanceHandler.cs +++ /dev/null @@ -1,20 +0,0 @@ -using Elsa.Mediator.Models; -using Elsa.Mediator.Services; -using Elsa.Persistence.Commands; -using Elsa.Persistence.Entities; -using Elsa.Persistence.EntityFrameworkCore.Services; - -namespace Elsa.Persistence.EntityFrameworkCore.Handlers.Commands; - -public class SaveWorkflowInstanceHandler : ICommandHandler -{ - private readonly IStore _store; - public SaveWorkflowInstanceHandler(IStore store) => _store = store; - - public async Task HandleAsync(SaveWorkflowInstance command, CancellationToken cancellationToken) - { - await _store.SaveAsync(command.WorkflowInstance, cancellationToken); - - return Unit.Instance; - } -} \ No newline at end of file diff --git a/src/persistence/Elsa.Persistence.EntityFrameworkCore/Handlers/Requests/FindLatestAndPublishedWorkflowDefinitionsHandler.cs b/src/persistence/Elsa.Persistence.EntityFrameworkCore/Handlers/Requests/FindLatestAndPublishedWorkflowDefinitionsHandler.cs deleted file mode 100644 index a2a74e1ca..000000000 --- a/src/persistence/Elsa.Persistence.EntityFrameworkCore/Handlers/Requests/FindLatestAndPublishedWorkflowDefinitionsHandler.cs +++ /dev/null @@ -1,15 +0,0 @@ -using Elsa.Mediator.Services; -using Elsa.Persistence.Entities; -using Elsa.Persistence.EntityFrameworkCore.Services; -using Elsa.Persistence.Requests; - -namespace Elsa.Persistence.EntityFrameworkCore.Handlers.Requests; - -public class FindLatestAndPublishedWorkflowDefinitionsHandler : IRequestHandler> -{ - private readonly IStore _store; - public FindLatestAndPublishedWorkflowDefinitionsHandler(IStore store) => _store = store; - - public async Task> HandleAsync(FindLatestAndPublishedWorkflows request, CancellationToken cancellationToken) => - await _store.FindManyAsync(x => x.DefinitionId == request.DefinitionId && (x.IsLatest || x.IsPublished), cancellationToken); -} \ No newline at end of file diff --git a/src/persistence/Elsa.Persistence.EntityFrameworkCore/Handlers/Requests/FindManyWorkflowDefinitionsHandler.cs b/src/persistence/Elsa.Persistence.EntityFrameworkCore/Handlers/Requests/FindManyWorkflowDefinitionsHandler.cs deleted file mode 100644 index f8b41a819..000000000 --- a/src/persistence/Elsa.Persistence.EntityFrameworkCore/Handlers/Requests/FindManyWorkflowDefinitionsHandler.cs +++ /dev/null @@ -1,28 +0,0 @@ -using Elsa.Mediator.Services; -using Elsa.Persistence.Entities; -using Elsa.Persistence.EntityFrameworkCore.Services; -using Elsa.Persistence.Extensions; -using Elsa.Persistence.Models; -using Elsa.Persistence.Requests; - -namespace Elsa.Persistence.EntityFrameworkCore.Handlers.Requests; - -public class FindManyWorkflowDefinitionsHandler : IRequestHandler> -{ - private readonly IStore _store; - public FindManyWorkflowDefinitionsHandler(IStore store) => _store = store; - - public async Task> HandleAsync(FindManyWorkflowDefinitions request, CancellationToken cancellationToken) - { - await using var dbContext = await _store.CreateDbContextAsync(cancellationToken); - var set = dbContext.WorkflowDefinitions; - var query = set.AsQueryable(); - - if (request.VersionOptions != null) - query = query.WithVersion(request.VersionOptions.Value); - - query = query.Where(x => request.DefinitionIds.Contains(x.DefinitionId)); - - return query.OrderBy(x => x.Name).Select(x => WorkflowDefinitionSummary.FromDefinition(x)).ToList(); - } -} \ No newline at end of file diff --git a/src/persistence/Elsa.Persistence.EntityFrameworkCore/Handlers/Requests/FindWorkflowBookmarkHandler.cs b/src/persistence/Elsa.Persistence.EntityFrameworkCore/Handlers/Requests/FindWorkflowBookmarkHandler.cs deleted file mode 100644 index a33557897..000000000 --- a/src/persistence/Elsa.Persistence.EntityFrameworkCore/Handlers/Requests/FindWorkflowBookmarkHandler.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Elsa.Mediator.Services; -using Elsa.Persistence.Entities; -using Elsa.Persistence.EntityFrameworkCore.Services; -using Elsa.Persistence.Requests; - -namespace Elsa.Persistence.EntityFrameworkCore.Handlers.Requests; - -public class FindWorkflowBookmarkHandler : IRequestHandler -{ - private readonly IStore _store; - public FindWorkflowBookmarkHandler(IStore store) => _store = store; - public async Task HandleAsync(FindWorkflowBookmark request, CancellationToken cancellationToken) => await _store.FindAsync(x => x.Id == request.BookmarkId, cancellationToken); -} \ No newline at end of file diff --git a/src/persistence/Elsa.Persistence.EntityFrameworkCore/Handlers/Requests/FindWorkflowBookmarksHandler.cs b/src/persistence/Elsa.Persistence.EntityFrameworkCore/Handlers/Requests/FindWorkflowBookmarksHandler.cs deleted file mode 100644 index b965af8e2..000000000 --- a/src/persistence/Elsa.Persistence.EntityFrameworkCore/Handlers/Requests/FindWorkflowBookmarksHandler.cs +++ /dev/null @@ -1,35 +0,0 @@ -using Elsa.Mediator.Services; -using Elsa.Persistence.Entities; -using Elsa.Persistence.EntityFrameworkCore.Services; -using Elsa.Persistence.Requests; - -namespace Elsa.Persistence.EntityFrameworkCore.Handlers.Requests; - -public class FindWorkflowBookmarksHandler : IRequestHandler> -{ - private readonly IStore _store; - public FindWorkflowBookmarksHandler(IStore store) => _store = store; - - public async Task> HandleAsync(FindWorkflowBookmarks request, CancellationToken cancellationToken) => await FindAsync(request, cancellationToken); - - private async Task> FindAsync(FindWorkflowBookmarks request, CancellationToken cancellationToken) => request.WorkflowInstanceId != null - ? await FindByWorkflowInstanceIdAsync(request.WorkflowInstanceId, cancellationToken) - : request.Name != null - ? await FindByNameAsync(request.Name, request.Hash, cancellationToken) - : Enumerable.Empty(); - - private async Task> FindByWorkflowInstanceIdAsync(string instanceId, CancellationToken cancellationToken) => await _store.FindManyAsync(x => x.WorkflowInstanceId == instanceId, cancellationToken); - - private async Task> FindByNameAsync(string name, string? hash, CancellationToken cancellationToken) - { - return await _store.QueryAsync(query => - { - query = query.Where(x => x.Name == name); - - if (!string.IsNullOrWhiteSpace(hash)) - query = query.Where(x => x.Hash == hash); - - return query; - }, cancellationToken); - } -} \ No newline at end of file diff --git a/src/persistence/Elsa.Persistence.EntityFrameworkCore/Handlers/Requests/FindWorkflowHandler.cs b/src/persistence/Elsa.Persistence.EntityFrameworkCore/Handlers/Requests/FindWorkflowHandler.cs deleted file mode 100644 index 45cb71553..000000000 --- a/src/persistence/Elsa.Persistence.EntityFrameworkCore/Handlers/Requests/FindWorkflowHandler.cs +++ /dev/null @@ -1,32 +0,0 @@ -using System.Linq.Expressions; -using Elsa.Mediator.Services; -using Elsa.Persistence.Entities; -using Elsa.Persistence.EntityFrameworkCore.Services; -using Elsa.Persistence.Extensions; -using Elsa.Persistence.Requests; - -namespace Elsa.Persistence.EntityFrameworkCore.Handlers.Requests; - -public class FindWorkflowHandler : IRequestHandler, IRequestHandler -{ - private readonly IStore _store; - - public FindWorkflowHandler(IStore store) - { - _store = store; - } - - public async Task HandleAsync(FindWorkflowDefinitionByDefinitionId request, CancellationToken cancellationToken) - { - Expression> predicate = x => x.DefinitionId == request.DefinitionId; - predicate = predicate.WithVersion(request.VersionOptions); - return await _store.FindAsync(predicate, cancellationToken); - } - - public async Task HandleAsync(FindWorkflowDefinitionByName request, CancellationToken cancellationToken) - { - Expression> predicate = x => x.Name == request.Name; - predicate = predicate.WithVersion(request.VersionOptions); - return await _store.FindAsync(predicate, cancellationToken); - } -} \ No newline at end of file diff --git a/src/persistence/Elsa.Persistence.EntityFrameworkCore/Handlers/Requests/FindWorkflowInstanceHandler.cs b/src/persistence/Elsa.Persistence.EntityFrameworkCore/Handlers/Requests/FindWorkflowInstanceHandler.cs deleted file mode 100644 index cdc9bc794..000000000 --- a/src/persistence/Elsa.Persistence.EntityFrameworkCore/Handlers/Requests/FindWorkflowInstanceHandler.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Elsa.Mediator.Services; -using Elsa.Persistence.Entities; -using Elsa.Persistence.EntityFrameworkCore.Services; -using Elsa.Persistence.Requests; - -namespace Elsa.Persistence.EntityFrameworkCore.Handlers.Requests; - -public class FindWorkflowInstanceHandler : IRequestHandler -{ - private readonly IStore _store; - public FindWorkflowInstanceHandler(IStore store) => _store = store; - - public async Task HandleAsync(FindWorkflowInstance request, CancellationToken cancellationToken) => await _store.FindAsync(x => x.Id == request.InstanceId, cancellationToken); -} \ No newline at end of file diff --git a/src/persistence/Elsa.Persistence.EntityFrameworkCore/Handlers/Requests/FindWorkflowTriggersByNameHandler.cs b/src/persistence/Elsa.Persistence.EntityFrameworkCore/Handlers/Requests/FindWorkflowTriggersByNameHandler.cs deleted file mode 100644 index ae35979bf..000000000 --- a/src/persistence/Elsa.Persistence.EntityFrameworkCore/Handlers/Requests/FindWorkflowTriggersByNameHandler.cs +++ /dev/null @@ -1,27 +0,0 @@ -using Elsa.Mediator.Services; -using Elsa.Persistence.Entities; -using Elsa.Persistence.EntityFrameworkCore.Services; -using Elsa.Persistence.Requests; - -namespace Elsa.Persistence.EntityFrameworkCore.Handlers.Requests; - -public class FindWorkflowTriggersByNameHandler : IRequestHandler> -{ - private readonly IStore _store; - public FindWorkflowTriggersByNameHandler(IStore store) => _store = store; - - public async Task> HandleAsync(FindWorkflowTriggersByName request, CancellationToken cancellationToken) - { - var triggers = await _store.QueryAsync(query => - { - query = query.Where(x => x.Name == request.Name); - - if (request.Hash != null) - query = query.Where(x => x.Hash == request.Hash); - - return query; - }, cancellationToken); - - return triggers.ToList(); - } -} \ No newline at end of file diff --git a/src/persistence/Elsa.Persistence.EntityFrameworkCore/Handlers/Requests/FindWorkflowTriggersByWorkflowDefinitionHandler.cs b/src/persistence/Elsa.Persistence.EntityFrameworkCore/Handlers/Requests/FindWorkflowTriggersByWorkflowDefinitionHandler.cs deleted file mode 100644 index 7ebc5adb5..000000000 --- a/src/persistence/Elsa.Persistence.EntityFrameworkCore/Handlers/Requests/FindWorkflowTriggersByWorkflowDefinitionHandler.cs +++ /dev/null @@ -1,18 +0,0 @@ -using Elsa.Mediator.Services; -using Elsa.Persistence.Entities; -using Elsa.Persistence.EntityFrameworkCore.Services; -using Elsa.Persistence.Requests; - -namespace Elsa.Persistence.EntityFrameworkCore.Handlers.Requests; - -public class FindWorkflowTriggersByWorkflowDefinitionHandler : IRequestHandler> -{ - private readonly IStore _store; - public FindWorkflowTriggersByWorkflowDefinitionHandler(IStore store) => _store = store; - - public async Task> HandleAsync(FindWorkflowTriggersByWorkflowDefinition request, CancellationToken cancellationToken) - { - var triggers = await _store.QueryAsync(query => query.Where(x => x.WorkflowDefinitionId == request.WorkflowDefinitionId), cancellationToken); - return triggers.ToList(); - } -} \ No newline at end of file diff --git a/src/persistence/Elsa.Persistence.EntityFrameworkCore/Handlers/Requests/ListWorkflowInstanceSummariesHandler.cs b/src/persistence/Elsa.Persistence.EntityFrameworkCore/Handlers/Requests/ListWorkflowInstanceSummariesHandler.cs deleted file mode 100644 index 80d7c1acf..000000000 --- a/src/persistence/Elsa.Persistence.EntityFrameworkCore/Handlers/Requests/ListWorkflowInstanceSummariesHandler.cs +++ /dev/null @@ -1,57 +0,0 @@ -using Elsa.Mediator.Services; -using Elsa.Persistence.Entities; -using Elsa.Persistence.EntityFrameworkCore.Services; -using Elsa.Persistence.Extensions; -using Elsa.Persistence.Models; -using Elsa.Persistence.Requests; - -namespace Elsa.Persistence.EntityFrameworkCore.Handlers.Requests; - -public class ListWorkflowInstanceSummariesHandler : IRequestHandler> -{ - private readonly IStore _store; - public ListWorkflowInstanceSummariesHandler(IStore store) => _store = store; - - public async Task> HandleAsync(ListWorkflowInstanceSummaries request, CancellationToken cancellationToken) - { - var dbContext = await _store.CreateDbContextAsync(cancellationToken); - var query = dbContext.WorkflowInstances.AsQueryable(); - var (searchTerm, definitionId, version, correlationId, workflowStatus, workflowSubStatus, pageArgs, orderBy, orderDirection) = request; - - if (!string.IsNullOrWhiteSpace(definitionId)) - query = query.Where(x => x.DefinitionId == definitionId); - - if (version != null) - query = query.Where(x => x.Version == version); - - if (!string.IsNullOrWhiteSpace(correlationId)) - query = query.Where(x => x.CorrelationId == correlationId); - - if (workflowStatus != null) - query = query.Where(x => x.Status == workflowStatus); - - if (workflowSubStatus != null) - query = query.Where(x => x.SubStatus == workflowSubStatus); - - if (!string.IsNullOrWhiteSpace(searchTerm)) - { - query = - from instance in query - where instance.Name!.Contains(searchTerm) - || instance.Id.Contains(searchTerm) - || instance.DefinitionId.Contains(searchTerm) - || instance.CorrelationId.Contains(searchTerm) - select instance; - } - - query = orderBy switch - { - OrderBy.Finished => orderDirection == OrderDirection.Ascending ? query.OrderBy(x => x.FinishedAt) : query.OrderByDescending(x => x.FinishedAt), - OrderBy.LastExecuted => orderDirection == OrderDirection.Ascending ? query.OrderBy(x => x.LastExecutedAt) : query.OrderByDescending(x => x.LastExecutedAt), - OrderBy.Created => orderDirection == OrderDirection.Ascending ? query.OrderBy(x => x.CreatedAt) : query.OrderByDescending(x => x.CreatedAt), - _ => query - }; - - return await query.PaginateAsync(x => WorkflowInstanceSummary.FromInstance(x), pageArgs); - } -} \ No newline at end of file diff --git a/src/persistence/Elsa.Persistence.EntityFrameworkCore/Handlers/Requests/ListWorkflowSummariesHandler.cs b/src/persistence/Elsa.Persistence.EntityFrameworkCore/Handlers/Requests/ListWorkflowSummariesHandler.cs deleted file mode 100644 index f0369ed73..000000000 --- a/src/persistence/Elsa.Persistence.EntityFrameworkCore/Handlers/Requests/ListWorkflowSummariesHandler.cs +++ /dev/null @@ -1,29 +0,0 @@ -using Elsa.Mediator.Services; -using Elsa.Persistence.Entities; -using Elsa.Persistence.EntityFrameworkCore.Services; -using Elsa.Persistence.Extensions; -using Elsa.Persistence.Models; -using Elsa.Persistence.Requests; -using Microsoft.EntityFrameworkCore; - -namespace Elsa.Persistence.EntityFrameworkCore.Handlers.Requests; - -public class ListWorkflowSummariesHandler : IRequestHandler> -{ - private readonly IStore _store; - public ListWorkflowSummariesHandler(IStore store) => _store = store; - - public async Task> HandleAsync(ListWorkflowDefinitionSummaries request, CancellationToken cancellationToken) - { - await using var dbContext = await _store.CreateDbContextAsync(cancellationToken); - var set = dbContext.WorkflowDefinitions; - var query = set.AsQueryable(); - - if (request.VersionOptions != null) - query = query.WithVersion(request.VersionOptions.Value); - - query = query.OrderBy(x => x.Name); - - return await query.PaginateAsync(x => WorkflowDefinitionSummary.FromDefinition(x), request.PageArgs); - } -} \ No newline at end of file diff --git a/src/persistence/Elsa.Persistence.EntityFrameworkCore/Handlers/Requests/ListWorkflowsHandler.cs b/src/persistence/Elsa.Persistence.EntityFrameworkCore/Handlers/Requests/ListWorkflowsHandler.cs deleted file mode 100644 index 42d7b6f7f..000000000 --- a/src/persistence/Elsa.Persistence.EntityFrameworkCore/Handlers/Requests/ListWorkflowsHandler.cs +++ /dev/null @@ -1,31 +0,0 @@ -using Elsa.Mediator.Services; -using Elsa.Persistence.Entities; -using Elsa.Persistence.EntityFrameworkCore.Services; -using Elsa.Persistence.Extensions; -using Elsa.Persistence.Models; -using Elsa.Persistence.Requests; - -namespace Elsa.Persistence.EntityFrameworkCore.Handlers.Requests; - -public class ListWorkflowsHandler : IRequestHandler> -{ - private readonly IStore _store; - - public ListWorkflowsHandler(IStore store) - { - _store = store; - } - - public async Task> HandleAsync(ListWorkflowDefinitions request, CancellationToken cancellationToken) - { - await using var dbContext = await _store.CreateDbContextAsync(cancellationToken); - var set = dbContext.WorkflowDefinitions; - var query = set.AsQueryable(); - - if (request.VersionOptions != null) - query = query.WithVersion(request.VersionOptions.Value); - - query = query.OrderBy(x => x.Name); - return await query.PaginateAsync(request.PageArgs); - } -} \ No newline at end of file diff --git a/src/persistence/Elsa.Persistence.InMemory/Handlers/Commands/DeleteWorkflowBookmarksHandler.cs b/src/persistence/Elsa.Persistence.InMemory/Handlers/Commands/DeleteWorkflowBookmarksHandler.cs deleted file mode 100644 index 6ec7f0116..000000000 --- a/src/persistence/Elsa.Persistence.InMemory/Handlers/Commands/DeleteWorkflowBookmarksHandler.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System.Threading; -using System.Threading.Tasks; -using Elsa.Mediator.Services; -using Elsa.Persistence.Commands; -using Elsa.Persistence.Entities; -using Elsa.Persistence.InMemory.Implementations; - -namespace Elsa.Persistence.InMemory.Handlers.Commands; - -public class DeleteWorkflowBookmarksHandler : ICommandHandler -{ - private readonly InMemoryStore _store; - - public DeleteWorkflowBookmarksHandler(InMemoryStore store) - { - _store = store; - } - - public Task HandleAsync(DeleteWorkflowBookmarks command, CancellationToken cancellationToken) - { - var count = _store.DeleteMany(command.BookmarkIds); - - return Task.FromResult(count); - } -} \ No newline at end of file diff --git a/src/persistence/Elsa.Persistence.InMemory/Handlers/Commands/DeleteWorkflowDefinitionHandler.cs b/src/persistence/Elsa.Persistence.InMemory/Handlers/Commands/DeleteWorkflowDefinitionHandler.cs deleted file mode 100644 index abd44acd9..000000000 --- a/src/persistence/Elsa.Persistence.InMemory/Handlers/Commands/DeleteWorkflowDefinitionHandler.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System.Threading; -using System.Threading.Tasks; -using Elsa.Mediator.Models; -using Elsa.Mediator.Services; -using Elsa.Persistence.Commands; -using Elsa.Persistence.Entities; -using Elsa.Persistence.InMemory.Implementations; - -namespace Elsa.Persistence.InMemory.Handlers.Commands; - -public class DeleteWorkflowDefinitionHandler : ICommandHandler -{ - private readonly InMemoryStore _store; - - public DeleteWorkflowDefinitionHandler(InMemoryStore store) - { - _store = store; - } - - public Task HandleAsync(DeleteWorkflowDefinition command, CancellationToken cancellationToken) - { - _store.Delete(command.DefinitionId); - - return Task.FromResult(Unit.Instance); - } -} \ No newline at end of file diff --git a/src/persistence/Elsa.Persistence.InMemory/Handlers/Commands/DeleteWorkflowInstancesHandler.cs b/src/persistence/Elsa.Persistence.InMemory/Handlers/Commands/DeleteWorkflowInstancesHandler.cs deleted file mode 100644 index 5adac0ad8..000000000 --- a/src/persistence/Elsa.Persistence.InMemory/Handlers/Commands/DeleteWorkflowInstancesHandler.cs +++ /dev/null @@ -1,43 +0,0 @@ -using System.Threading; -using System.Threading.Tasks; -using Elsa.Mediator.Models; -using Elsa.Mediator.Services; -using Elsa.Persistence.Commands; -using Elsa.Persistence.Entities; -using Elsa.Persistence.InMemory.Implementations; - -namespace Elsa.Persistence.InMemory.Handlers.Commands; - -public class DeleteWorkflowInstancesHandler : ICommandHandler -{ - private readonly InMemoryStore _store; - - public DeleteWorkflowInstancesHandler(InMemoryStore store) - { - _store = store; - } - - public Task HandleAsync(DeleteWorkflowInstances command, CancellationToken cancellationToken) - { - if (command.DefinitionId != null) - { - _store.DeleteWhere(x => x.DefinitionId == command.DefinitionId); - } - else if (command.InstanceIds != null) - { - _store.DeleteMany(command.InstanceIds); - } - - return Task.FromResult(Unit.Instance); - } - - public Task HandleAsync(DeleteWorkflowInstance command, CancellationToken cancellationToken) - { - if (command.InstanceId != null) - { - _store.Delete(command.InstanceId); - } - - return Task.FromResult(Unit.Instance); - } -} \ No newline at end of file diff --git a/src/persistence/Elsa.Persistence.InMemory/Handlers/Commands/ReplaceWorkflowTriggersHandler.cs b/src/persistence/Elsa.Persistence.InMemory/Handlers/Commands/ReplaceWorkflowTriggersHandler.cs deleted file mode 100644 index f329700de..000000000 --- a/src/persistence/Elsa.Persistence.InMemory/Handlers/Commands/ReplaceWorkflowTriggersHandler.cs +++ /dev/null @@ -1,27 +0,0 @@ -using System.Threading; -using System.Threading.Tasks; -using Elsa.Mediator.Models; -using Elsa.Mediator.Services; -using Elsa.Persistence.Commands; -using Elsa.Persistence.Entities; -using Elsa.Persistence.InMemory.Implementations; - -namespace Elsa.Persistence.InMemory.Handlers.Commands; - -public class ReplaceWorkflowTriggersHandler : ICommandHandler -{ - private readonly InMemoryStore _store; - - public ReplaceWorkflowTriggersHandler(InMemoryStore store) - { - _store = store; - } - - public Task HandleAsync(ReplaceWorkflowTriggers command, CancellationToken cancellationToken) - { - _store.DeleteMany(command.Removed); - _store.SaveMany(command.Added); - - return Task.FromResult(Unit.Instance); - } -} \ No newline at end of file diff --git a/src/persistence/Elsa.Persistence.InMemory/Handlers/Commands/SaveWorkflowBookmarksHandler.cs b/src/persistence/Elsa.Persistence.InMemory/Handlers/Commands/SaveWorkflowBookmarksHandler.cs deleted file mode 100644 index 236b8af73..000000000 --- a/src/persistence/Elsa.Persistence.InMemory/Handlers/Commands/SaveWorkflowBookmarksHandler.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System.Threading; -using System.Threading.Tasks; -using Elsa.Mediator.Models; -using Elsa.Mediator.Services; -using Elsa.Persistence.Commands; -using Elsa.Persistence.Entities; -using Elsa.Persistence.InMemory.Implementations; - -namespace Elsa.Persistence.InMemory.Handlers.Commands; - -public class SaveWorkflowBookmarksHandler : ICommandHandler -{ - private readonly InMemoryStore _store; - - public SaveWorkflowBookmarksHandler(InMemoryStore store) - { - _store = store; - } - - public Task HandleAsync(SaveWorkflowBookmarks command, CancellationToken cancellationToken) - { - _store.SaveMany(command.WorkflowBookmarks); - - return Task.FromResult(Unit.Instance); - } -} \ No newline at end of file diff --git a/src/persistence/Elsa.Persistence.InMemory/Handlers/Commands/SaveWorkflowDefinitionHandler.cs b/src/persistence/Elsa.Persistence.InMemory/Handlers/Commands/SaveWorkflowDefinitionHandler.cs deleted file mode 100644 index 5dd449706..000000000 --- a/src/persistence/Elsa.Persistence.InMemory/Handlers/Commands/SaveWorkflowDefinitionHandler.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System.Threading; -using System.Threading.Tasks; -using Elsa.Mediator.Models; -using Elsa.Mediator.Services; -using Elsa.Persistence.Commands; -using Elsa.Persistence.Entities; -using Elsa.Persistence.InMemory.Implementations; - -namespace Elsa.Persistence.InMemory.Handlers.Commands; - -public class SaveWorkflowDefinitionHandler : ICommandHandler -{ - private readonly InMemoryStore _store; - public SaveWorkflowDefinitionHandler(InMemoryStore store) => _store = store; - - public Task HandleAsync(SaveWorkflowDefinition command, CancellationToken cancellationToken) - { - _store.Save(command.WorkflowDefinition); - - return Task.FromResult(Unit.Instance); - } -} \ No newline at end of file diff --git a/src/persistence/Elsa.Persistence.InMemory/Handlers/Commands/SaveWorkflowExecutionLogHandler.cs b/src/persistence/Elsa.Persistence.InMemory/Handlers/Commands/SaveWorkflowExecutionLogHandler.cs deleted file mode 100644 index d4284214d..000000000 --- a/src/persistence/Elsa.Persistence.InMemory/Handlers/Commands/SaveWorkflowExecutionLogHandler.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System.Threading; -using System.Threading.Tasks; -using Elsa.Mediator.Models; -using Elsa.Mediator.Services; -using Elsa.Persistence.Commands; -using Elsa.Persistence.Entities; -using Elsa.Persistence.InMemory.Implementations; - -namespace Elsa.Persistence.InMemory.Handlers.Commands; - -public class SaveWorkflowExecutionLogHandler : ICommandHandler -{ - private readonly InMemoryStore _store; - - public SaveWorkflowExecutionLogHandler(InMemoryStore store) => _store = store; - - public Task HandleAsync(SaveWorkflowExecutionLog command, CancellationToken cancellationToken) - { - _store.SaveMany(command.Records); - - return Task.FromResult(Unit.Instance); - } -} \ No newline at end of file diff --git a/src/persistence/Elsa.Persistence.InMemory/Handlers/Commands/SaveWorkflowInstanceHandler.cs b/src/persistence/Elsa.Persistence.InMemory/Handlers/Commands/SaveWorkflowInstanceHandler.cs deleted file mode 100644 index 3e4f510e7..000000000 --- a/src/persistence/Elsa.Persistence.InMemory/Handlers/Commands/SaveWorkflowInstanceHandler.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System.Threading; -using System.Threading.Tasks; -using Elsa.Mediator.Models; -using Elsa.Mediator.Services; -using Elsa.Persistence.Commands; -using Elsa.Persistence.Entities; -using Elsa.Persistence.InMemory.Implementations; - -namespace Elsa.Persistence.InMemory.Handlers.Commands; - -public class SaveWorkflowInstanceHandler : ICommandHandler -{ - private readonly InMemoryStore _store; - - public SaveWorkflowInstanceHandler(InMemoryStore store) - { - _store = store; - } - - public Task HandleAsync(SaveWorkflowInstance command, CancellationToken cancellationToken) - { - _store.Save(command.WorkflowInstance); - - return Task.FromResult(Unit.Instance); - } -} \ No newline at end of file diff --git a/src/persistence/Elsa.Persistence.InMemory/Handlers/Requests/FindLatestAndPublishedWorkflowDefinitionsHandler.cs b/src/persistence/Elsa.Persistence.InMemory/Handlers/Requests/FindLatestAndPublishedWorkflowDefinitionsHandler.cs deleted file mode 100644 index 168cc1f74..000000000 --- a/src/persistence/Elsa.Persistence.InMemory/Handlers/Requests/FindLatestAndPublishedWorkflowDefinitionsHandler.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; -using Elsa.Mediator.Services; -using Elsa.Persistence.Entities; -using Elsa.Persistence.InMemory.Implementations; -using Elsa.Persistence.Requests; - -namespace Elsa.Persistence.InMemory.Handlers.Requests; - -public class FindLatestAndPublishedWorkflowDefinitionsHandler : IRequestHandler> -{ - private readonly InMemoryStore _store; - - public FindLatestAndPublishedWorkflowDefinitionsHandler(InMemoryStore store) - { - _store = store; - } - - public Task> HandleAsync(FindLatestAndPublishedWorkflows request, CancellationToken cancellationToken) - { - var definitions = _store.FindMany(x => x.DefinitionId == request.DefinitionId && (x.IsLatest || x.IsPublished)); - return Task.FromResult(definitions); - } -} \ No newline at end of file diff --git a/src/persistence/Elsa.Persistence.InMemory/Handlers/Requests/FindManyWorkflowDefinitionsHandler.cs b/src/persistence/Elsa.Persistence.InMemory/Handlers/Requests/FindManyWorkflowDefinitionsHandler.cs deleted file mode 100644 index b48a99422..000000000 --- a/src/persistence/Elsa.Persistence.InMemory/Handlers/Requests/FindManyWorkflowDefinitionsHandler.cs +++ /dev/null @@ -1,34 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using Elsa.Mediator.Services; -using Elsa.Persistence.Entities; -using Elsa.Persistence.Extensions; -using Elsa.Persistence.InMemory.Implementations; -using Elsa.Persistence.Models; -using Elsa.Persistence.Requests; - -// ReSharper disable PossibleMultipleEnumeration - -namespace Elsa.Persistence.InMemory.Handlers.Requests; - -public class FindManyWorkflowDefinitionsHandler : IRequestHandler> -{ - private readonly InMemoryStore _store; - public FindManyWorkflowDefinitionsHandler(InMemoryStore store) => _store = store; - - public Task> HandleAsync(FindManyWorkflowDefinitions request, CancellationToken cancellationToken) - { - var query = _store.List(); - - if (request.VersionOptions != null) - query = query.WithVersion(request.VersionOptions.Value); - - if (request.DefinitionIds != null) - query = query.Where(x => request.DefinitionIds.Contains(x.Id)); - - var summaries = query.Select(WorkflowDefinitionSummary.FromDefinition).ToList().AsEnumerable(); - return Task.FromResult(summaries); - } -} \ No newline at end of file diff --git a/src/persistence/Elsa.Persistence.InMemory/Handlers/Requests/FindWorkflowBookmarkHandler.cs b/src/persistence/Elsa.Persistence.InMemory/Handlers/Requests/FindWorkflowBookmarkHandler.cs deleted file mode 100644 index 8b3d5cdad..000000000 --- a/src/persistence/Elsa.Persistence.InMemory/Handlers/Requests/FindWorkflowBookmarkHandler.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System.Threading; -using System.Threading.Tasks; -using Elsa.Mediator.Services; -using Elsa.Persistence.Entities; -using Elsa.Persistence.InMemory.Implementations; -using Elsa.Persistence.Requests; - -namespace Elsa.Persistence.InMemory.Handlers.Requests; - -public class FindWorkflowBookmarkHandler : IRequestHandler -{ - private readonly InMemoryStore _store; - public FindWorkflowBookmarkHandler(InMemoryStore store) => _store = store; - public Task HandleAsync(FindWorkflowBookmark request, CancellationToken cancellationToken) => Task.FromResult(FindById(request.BookmarkId)); - private WorkflowBookmark? FindById(string id) => _store.Find(x => x.Id == id); -} \ No newline at end of file diff --git a/src/persistence/Elsa.Persistence.InMemory/Handlers/Requests/FindWorkflowBookmarksHandler.cs b/src/persistence/Elsa.Persistence.InMemory/Handlers/Requests/FindWorkflowBookmarksHandler.cs deleted file mode 100644 index f22652080..000000000 --- a/src/persistence/Elsa.Persistence.InMemory/Handlers/Requests/FindWorkflowBookmarksHandler.cs +++ /dev/null @@ -1,47 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using Elsa.Mediator.Services; -using Elsa.Persistence.Entities; -using Elsa.Persistence.InMemory.Implementations; -using Elsa.Persistence.Requests; - -namespace Elsa.Persistence.InMemory.Handlers.Requests; - -public class FindWorkflowBookmarksHandler : IRequestHandler> -{ - private readonly InMemoryStore _store; - - public FindWorkflowBookmarksHandler(InMemoryStore store) - { - _store = store; - } - - public Task> HandleAsync(FindWorkflowBookmarks request, CancellationToken cancellationToken) - { - var bookmarks = Find(request); - return Task.FromResult(bookmarks); - } - - private IEnumerable Find(FindWorkflowBookmarks request) => request.WorkflowInstanceId != null - ? FindByWorkflowInstanceId(request.WorkflowInstanceId) - : request.Name != null - ? FindByName(request.Name, request.Hash) - : Enumerable.Empty(); - - private IEnumerable FindByWorkflowInstanceId(string instanceId) => _store.FindMany(x => x.WorkflowInstanceId == instanceId).ToList(); - - private IEnumerable FindByName(string name, string? hash) - { - return _store.Query(query => - { - query = query.Where(x => x.Name == name); - - if (!string.IsNullOrWhiteSpace(hash)) - query = query.Where(x => x.Hash == hash); - - return query; - }); - } -} \ No newline at end of file diff --git a/src/persistence/Elsa.Persistence.InMemory/Handlers/Requests/FindWorkflowHandler.cs b/src/persistence/Elsa.Persistence.InMemory/Handlers/Requests/FindWorkflowHandler.cs deleted file mode 100644 index fe178a75b..000000000 --- a/src/persistence/Elsa.Persistence.InMemory/Handlers/Requests/FindWorkflowHandler.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System.Threading; -using System.Threading.Tasks; -using Elsa.Mediator.Services; -using Elsa.Persistence.Entities; -using Elsa.Persistence.Extensions; -using Elsa.Persistence.InMemory.Implementations; -using Elsa.Persistence.Requests; - -namespace Elsa.Persistence.InMemory.Handlers.Requests; - -public class FindWorkflowHandler : IRequestHandler, IRequestHandler -{ - private readonly InMemoryStore _store; - - public FindWorkflowHandler(InMemoryStore store) - { - _store = store; - } - - public Task HandleAsync(FindWorkflowDefinitionByDefinitionId request, CancellationToken cancellationToken) - { - var definition = _store.Find(x => x.DefinitionId == request.DefinitionId && x.WithVersion(request.VersionOptions)); - return Task.FromResult(definition); - } - - public Task HandleAsync(FindWorkflowDefinitionByName request, CancellationToken cancellationToken) - { - var definition = _store.Find(x => x.Name == request.Name && x.WithVersion(request.VersionOptions)); - return Task.FromResult(definition); - } -} \ No newline at end of file diff --git a/src/persistence/Elsa.Persistence.InMemory/Handlers/Requests/FindWorkflowInstanceHandler.cs b/src/persistence/Elsa.Persistence.InMemory/Handlers/Requests/FindWorkflowInstanceHandler.cs deleted file mode 100644 index e171e90de..000000000 --- a/src/persistence/Elsa.Persistence.InMemory/Handlers/Requests/FindWorkflowInstanceHandler.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System.Threading; -using System.Threading.Tasks; -using Elsa.Mediator.Services; -using Elsa.Persistence.Entities; -using Elsa.Persistence.InMemory.Implementations; -using Elsa.Persistence.Requests; - -namespace Elsa.Persistence.InMemory.Handlers.Requests; - -public class FindWorkflowInstanceHandler : IRequestHandler -{ - private readonly InMemoryStore _store; - public FindWorkflowInstanceHandler(InMemoryStore store) => _store = store; - - public Task HandleAsync(FindWorkflowInstance request, CancellationToken cancellationToken) - { - var instance = _store.Find(x => x.Id == request.InstanceId); - - return Task.FromResult(instance); - } -} \ No newline at end of file diff --git a/src/persistence/Elsa.Persistence.InMemory/Handlers/Requests/FindWorkflowTriggersByNameHandler.cs b/src/persistence/Elsa.Persistence.InMemory/Handlers/Requests/FindWorkflowTriggersByNameHandler.cs deleted file mode 100644 index 9c1ff44eb..000000000 --- a/src/persistence/Elsa.Persistence.InMemory/Handlers/Requests/FindWorkflowTriggersByNameHandler.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using Elsa.Mediator.Services; -using Elsa.Persistence.Entities; -using Elsa.Persistence.InMemory.Implementations; -using Elsa.Persistence.Requests; - -namespace Elsa.Persistence.InMemory.Handlers.Requests; - -public class FindWorkflowTriggersByNameHandler : IRequestHandler> -{ - private readonly InMemoryStore _store; - public FindWorkflowTriggersByNameHandler(InMemoryStore store) => _store = store; - - public Task> HandleAsync(FindWorkflowTriggersByName request, CancellationToken cancellationToken) - { - var triggers = _store.Query(query => - { - query = query.Where(x => x.Name == request.Name); - - if (request.Hash != null) - query = query.Where(x => x.Hash == request.Hash); - - return query; - }); - - return Task.FromResult>(triggers.ToList()); - } -} \ No newline at end of file diff --git a/src/persistence/Elsa.Persistence.InMemory/Handlers/Requests/FindWorkflowTriggersByWorkflowDefinitionHandler.cs b/src/persistence/Elsa.Persistence.InMemory/Handlers/Requests/FindWorkflowTriggersByWorkflowDefinitionHandler.cs deleted file mode 100644 index 3ddf0c6a3..000000000 --- a/src/persistence/Elsa.Persistence.InMemory/Handlers/Requests/FindWorkflowTriggersByWorkflowDefinitionHandler.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using Elsa.Mediator.Services; -using Elsa.Persistence.Entities; -using Elsa.Persistence.InMemory.Implementations; -using Elsa.Persistence.Requests; - -namespace Elsa.Persistence.InMemory.Handlers.Requests; - -public class FindWorkflowTriggersByWorkflowDefinitionHandler : IRequestHandler> -{ - private readonly InMemoryStore _store; - public FindWorkflowTriggersByWorkflowDefinitionHandler(InMemoryStore store) => _store = store; - - public Task> HandleAsync(FindWorkflowTriggersByWorkflowDefinition request, CancellationToken cancellationToken) - { - var triggers = _store.Query(query => query.Where(x => x.WorkflowDefinitionId == request.WorkflowDefinitionId)); - - return Task.FromResult>(triggers.ToList()); - } -} \ No newline at end of file diff --git a/src/persistence/Elsa.Persistence.InMemory/Handlers/Requests/ListWorkflowSummariesHandler.cs b/src/persistence/Elsa.Persistence.InMemory/Handlers/Requests/ListWorkflowSummariesHandler.cs deleted file mode 100644 index 66cd06dcf..000000000 --- a/src/persistence/Elsa.Persistence.InMemory/Handlers/Requests/ListWorkflowSummariesHandler.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using Elsa.Mediator.Services; -using Elsa.Persistence.Entities; -using Elsa.Persistence.Extensions; -using Elsa.Persistence.InMemory.Implementations; -using Elsa.Persistence.Models; -using Elsa.Persistence.Requests; - -// ReSharper disable PossibleMultipleEnumeration - -namespace Elsa.Persistence.InMemory.Handlers.Requests; - -public class ListWorkflowSummariesHandler : IRequestHandler> -{ - private readonly InMemoryStore _store; - public ListWorkflowSummariesHandler(InMemoryStore store) => _store = store; - - public Task> HandleAsync(ListWorkflowDefinitionSummaries request, CancellationToken cancellationToken) - { - var query = _store.List().AsQueryable(); - - if (request.VersionOptions != null) - query = query.WithVersion(request.VersionOptions.Value); - - var pageArgs = request.PageArgs; - - return query.PaginateAsync(x => WorkflowDefinitionSummary.FromDefinition(x), pageArgs); - } -} \ No newline at end of file diff --git a/src/persistence/Elsa.Persistence.InMemory/Handlers/Requests/ListWorkflowsHandler.cs b/src/persistence/Elsa.Persistence.InMemory/Handlers/Requests/ListWorkflowsHandler.cs deleted file mode 100644 index 9826f14ee..000000000 --- a/src/persistence/Elsa.Persistence.InMemory/Handlers/Requests/ListWorkflowsHandler.cs +++ /dev/null @@ -1,41 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using Elsa.Mediator.Services; -using Elsa.Models; -using Elsa.Persistence.Entities; -using Elsa.Persistence.Extensions; -using Elsa.Persistence.InMemory.Implementations; -using Elsa.Persistence.Models; -using Elsa.Persistence.Requests; - -namespace Elsa.Persistence.InMemory.Handlers.Requests; - -public class ListWorkflowsHandler : IRequestHandler> -{ - private readonly InMemoryStore _store; - - public ListWorkflowsHandler(InMemoryStore store) - { - _store = store; - } - - public Task> HandleAsync(ListWorkflowDefinitions request, CancellationToken cancellationToken) - { - var query = _store.List().AsQueryable(); - - if (request.VersionOptions != null) - query = query.WithVersion(request.VersionOptions.Value); - - var totalCount = query.Count(); - var pageArgs = request.PageArgs; - - if (pageArgs?.Offset != null) query = query.Skip(pageArgs.Offset.Value); - if (pageArgs?.Limit != null) query = query.Take(pageArgs.Limit.Value); - - var entities = query.ToList(); - var page = Page.Of(entities, totalCount); - return Task.FromResult(page); - } -} \ No newline at end of file diff --git a/src/persistence/Elsa.Persistence.EntityFrameworkCore.Sqlite/DbContextOptionsBuilderExtensions.cs b/src/persistence/efcore/Elsa.Persistence.EntityFrameworkCore.Sqlite/DbContextOptionsBuilderExtensions.cs similarity index 100% rename from src/persistence/Elsa.Persistence.EntityFrameworkCore.Sqlite/DbContextOptionsBuilderExtensions.cs rename to src/persistence/efcore/Elsa.Persistence.EntityFrameworkCore.Sqlite/DbContextOptionsBuilderExtensions.cs diff --git a/src/persistence/Elsa.Persistence.EntityFrameworkCore.Sqlite/Elsa.Persistence.EntityFrameworkCore.Sqlite.csproj b/src/persistence/efcore/Elsa.Persistence.EntityFrameworkCore.Sqlite/Elsa.Persistence.EntityFrameworkCore.Sqlite.csproj similarity index 85% rename from src/persistence/Elsa.Persistence.EntityFrameworkCore.Sqlite/Elsa.Persistence.EntityFrameworkCore.Sqlite.csproj rename to src/persistence/efcore/Elsa.Persistence.EntityFrameworkCore.Sqlite/Elsa.Persistence.EntityFrameworkCore.Sqlite.csproj index f4fcffa01..6b66e2e65 100644 --- a/src/persistence/Elsa.Persistence.EntityFrameworkCore.Sqlite/Elsa.Persistence.EntityFrameworkCore.Sqlite.csproj +++ b/src/persistence/efcore/Elsa.Persistence.EntityFrameworkCore.Sqlite/Elsa.Persistence.EntityFrameworkCore.Sqlite.csproj @@ -6,10 +6,6 @@ enable - - - - all @@ -19,4 +15,8 @@ + + + + diff --git a/src/persistence/Elsa.Persistence.EntityFrameworkCore.Sqlite/Migrations/20220430085059_Initial.Designer.cs b/src/persistence/efcore/Elsa.Persistence.EntityFrameworkCore.Sqlite/Migrations/20220430125711_Initial.Designer.cs similarity index 97% rename from src/persistence/Elsa.Persistence.EntityFrameworkCore.Sqlite/Migrations/20220430085059_Initial.Designer.cs rename to src/persistence/efcore/Elsa.Persistence.EntityFrameworkCore.Sqlite/Migrations/20220430125711_Initial.Designer.cs index 235e1e406..7eb33f926 100644 --- a/src/persistence/Elsa.Persistence.EntityFrameworkCore.Sqlite/Migrations/20220430085059_Initial.Designer.cs +++ b/src/persistence/efcore/Elsa.Persistence.EntityFrameworkCore.Sqlite/Migrations/20220430125711_Initial.Designer.cs @@ -11,7 +11,7 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion; namespace Elsa.Persistence.EntityFrameworkCore.Sqlite.Migrations { [DbContext(typeof(ElsaDbContext))] - [Migration("20220430085059_Initial")] + [Migration("20220430125711_Initial")] partial class Initial { protected override void BuildTargetModel(ModelBuilder modelBuilder) @@ -173,6 +173,10 @@ namespace Elsa.Persistence.EntityFrameworkCore.Sqlite.Migrations .IsRequired() .HasColumnType("TEXT"); + b.Property("WorkflowDefinitionId") + .IsRequired() + .HasColumnType("TEXT"); + b.Property("WorkflowInstanceId") .IsRequired() .HasColumnType("TEXT"); @@ -191,6 +195,9 @@ namespace Elsa.Persistence.EntityFrameworkCore.Sqlite.Migrations b.HasIndex("Timestamp") .HasDatabaseName("IX_WorkflowExecutionLogRecord_Timestamp"); + b.HasIndex("WorkflowDefinitionId") + .HasDatabaseName("IX_WorkflowExecutionLogRecord_WorkflowDefinitionId"); + b.HasIndex("WorkflowInstanceId") .HasDatabaseName("IX_WorkflowExecutionLogRecord_WorkflowInstanceId"); diff --git a/src/persistence/Elsa.Persistence.EntityFrameworkCore.Sqlite/Migrations/20220430085059_Initial.cs b/src/persistence/efcore/Elsa.Persistence.EntityFrameworkCore.Sqlite/Migrations/20220430125711_Initial.cs similarity index 97% rename from src/persistence/Elsa.Persistence.EntityFrameworkCore.Sqlite/Migrations/20220430085059_Initial.cs rename to src/persistence/efcore/Elsa.Persistence.EntityFrameworkCore.Sqlite/Migrations/20220430125711_Initial.cs index caf61063a..202c58f1c 100644 --- a/src/persistence/Elsa.Persistence.EntityFrameworkCore.Sqlite/Migrations/20220430085059_Initial.cs +++ b/src/persistence/efcore/Elsa.Persistence.EntityFrameworkCore.Sqlite/Migrations/20220430125711_Initial.cs @@ -57,6 +57,7 @@ namespace Elsa.Persistence.EntityFrameworkCore.Sqlite.Migrations columns: table => new { Id = table.Column(type: "TEXT", nullable: false), + WorkflowDefinitionId = table.Column(type: "TEXT", nullable: false), WorkflowInstanceId = table.Column(type: "TEXT", nullable: false), ActivityId = table.Column(type: "TEXT", nullable: false), ActivityType = table.Column(type: "TEXT", nullable: false), @@ -186,6 +187,11 @@ namespace Elsa.Persistence.EntityFrameworkCore.Sqlite.Migrations table: "WorkflowExecutionLogRecords", column: "Timestamp"); + migrationBuilder.CreateIndex( + name: "IX_WorkflowExecutionLogRecord_WorkflowDefinitionId", + table: "WorkflowExecutionLogRecords", + column: "WorkflowDefinitionId"); + migrationBuilder.CreateIndex( name: "IX_WorkflowExecutionLogRecord_WorkflowInstanceId", table: "WorkflowExecutionLogRecords", diff --git a/src/persistence/Elsa.Persistence.EntityFrameworkCore.Sqlite/Migrations/ElsaDbContextModelSnapshot.cs b/src/persistence/efcore/Elsa.Persistence.EntityFrameworkCore.Sqlite/Migrations/ElsaDbContextModelSnapshot.cs similarity index 97% rename from src/persistence/Elsa.Persistence.EntityFrameworkCore.Sqlite/Migrations/ElsaDbContextModelSnapshot.cs rename to src/persistence/efcore/Elsa.Persistence.EntityFrameworkCore.Sqlite/Migrations/ElsaDbContextModelSnapshot.cs index 6e2053385..2fd9567b3 100644 --- a/src/persistence/Elsa.Persistence.EntityFrameworkCore.Sqlite/Migrations/ElsaDbContextModelSnapshot.cs +++ b/src/persistence/efcore/Elsa.Persistence.EntityFrameworkCore.Sqlite/Migrations/ElsaDbContextModelSnapshot.cs @@ -171,6 +171,10 @@ namespace Elsa.Persistence.EntityFrameworkCore.Sqlite.Migrations .IsRequired() .HasColumnType("TEXT"); + b.Property("WorkflowDefinitionId") + .IsRequired() + .HasColumnType("TEXT"); + b.Property("WorkflowInstanceId") .IsRequired() .HasColumnType("TEXT"); @@ -189,6 +193,9 @@ namespace Elsa.Persistence.EntityFrameworkCore.Sqlite.Migrations b.HasIndex("Timestamp") .HasDatabaseName("IX_WorkflowExecutionLogRecord_Timestamp"); + b.HasIndex("WorkflowDefinitionId") + .HasDatabaseName("IX_WorkflowExecutionLogRecord_WorkflowDefinitionId"); + b.HasIndex("WorkflowInstanceId") .HasDatabaseName("IX_WorkflowExecutionLogRecord_WorkflowInstanceId"); diff --git a/src/persistence/Elsa.Persistence.EntityFrameworkCore.Sqlite/Readme.md b/src/persistence/efcore/Elsa.Persistence.EntityFrameworkCore.Sqlite/Readme.md similarity index 100% rename from src/persistence/Elsa.Persistence.EntityFrameworkCore.Sqlite/Readme.md rename to src/persistence/efcore/Elsa.Persistence.EntityFrameworkCore.Sqlite/Readme.md diff --git a/src/persistence/Elsa.Persistence.EntityFrameworkCore.Sqlite/SqliteElsaContextFactory.cs b/src/persistence/efcore/Elsa.Persistence.EntityFrameworkCore.Sqlite/SqliteElsaContextFactory.cs similarity index 100% rename from src/persistence/Elsa.Persistence.EntityFrameworkCore.Sqlite/SqliteElsaContextFactory.cs rename to src/persistence/efcore/Elsa.Persistence.EntityFrameworkCore.Sqlite/SqliteElsaContextFactory.cs diff --git a/src/persistence/Elsa.Persistence.EntityFrameworkCore/Configuration/WorkflowBookmarkConfiguration.cs b/src/persistence/efcore/Elsa.Persistence.EntityFrameworkCore/Configuration/WorkflowBookmarkConfiguration.cs similarity index 100% rename from src/persistence/Elsa.Persistence.EntityFrameworkCore/Configuration/WorkflowBookmarkConfiguration.cs rename to src/persistence/efcore/Elsa.Persistence.EntityFrameworkCore/Configuration/WorkflowBookmarkConfiguration.cs diff --git a/src/persistence/Elsa.Persistence.EntityFrameworkCore/Configuration/WorkflowDefinitionConfiguration.cs b/src/persistence/efcore/Elsa.Persistence.EntityFrameworkCore/Configuration/WorkflowDefinitionConfiguration.cs similarity index 100% rename from src/persistence/Elsa.Persistence.EntityFrameworkCore/Configuration/WorkflowDefinitionConfiguration.cs rename to src/persistence/efcore/Elsa.Persistence.EntityFrameworkCore/Configuration/WorkflowDefinitionConfiguration.cs diff --git a/src/persistence/Elsa.Persistence.EntityFrameworkCore/Configuration/WorkflowExecutionLogRecordConfiguration.cs b/src/persistence/efcore/Elsa.Persistence.EntityFrameworkCore/Configuration/WorkflowExecutionLogRecordConfiguration.cs similarity index 88% rename from src/persistence/Elsa.Persistence.EntityFrameworkCore/Configuration/WorkflowExecutionLogRecordConfiguration.cs rename to src/persistence/efcore/Elsa.Persistence.EntityFrameworkCore/Configuration/WorkflowExecutionLogRecordConfiguration.cs index abd283338..1f4bf5c49 100644 --- a/src/persistence/Elsa.Persistence.EntityFrameworkCore/Configuration/WorkflowExecutionLogRecordConfiguration.cs +++ b/src/persistence/efcore/Elsa.Persistence.EntityFrameworkCore/Configuration/WorkflowExecutionLogRecordConfiguration.cs @@ -15,6 +15,7 @@ namespace Elsa.Persistence.EntityFrameworkCore.Configuration builder.HasIndex(x => x.ActivityId).HasDatabaseName($"IX_{nameof(WorkflowExecutionLogRecord)}_{nameof(WorkflowExecutionLogRecord.ActivityId)}"); builder.HasIndex(x => x.ActivityType).HasDatabaseName($"IX_{nameof(WorkflowExecutionLogRecord)}_{nameof(WorkflowExecutionLogRecord.ActivityType)}"); builder.HasIndex(x => x.EventName).HasDatabaseName($"IX_{nameof(WorkflowExecutionLogRecord)}_{nameof(WorkflowExecutionLogRecord.EventName)}"); + builder.HasIndex(x => x.WorkflowDefinitionId).HasDatabaseName($"IX_{nameof(WorkflowExecutionLogRecord)}_{nameof(WorkflowExecutionLogRecord.WorkflowDefinitionId)}"); builder.HasIndex(x => x.WorkflowInstanceId).HasDatabaseName($"IX_{nameof(WorkflowExecutionLogRecord)}_{nameof(WorkflowExecutionLogRecord.WorkflowInstanceId)}"); } } diff --git a/src/persistence/Elsa.Persistence.EntityFrameworkCore/Configuration/WorkflowInstanceConfiguration.cs b/src/persistence/efcore/Elsa.Persistence.EntityFrameworkCore/Configuration/WorkflowInstanceConfiguration.cs similarity index 100% rename from src/persistence/Elsa.Persistence.EntityFrameworkCore/Configuration/WorkflowInstanceConfiguration.cs rename to src/persistence/efcore/Elsa.Persistence.EntityFrameworkCore/Configuration/WorkflowInstanceConfiguration.cs diff --git a/src/persistence/Elsa.Persistence.EntityFrameworkCore/Configuration/WorkflowTriggerConfiguration.cs b/src/persistence/efcore/Elsa.Persistence.EntityFrameworkCore/Configuration/WorkflowTriggerConfiguration.cs similarity index 100% rename from src/persistence/Elsa.Persistence.EntityFrameworkCore/Configuration/WorkflowTriggerConfiguration.cs rename to src/persistence/efcore/Elsa.Persistence.EntityFrameworkCore/Configuration/WorkflowTriggerConfiguration.cs diff --git a/src/persistence/Elsa.Persistence.EntityFrameworkCore/Elsa.Persistence.EntityFrameworkCore.csproj b/src/persistence/efcore/Elsa.Persistence.EntityFrameworkCore/Elsa.Persistence.EntityFrameworkCore.csproj similarity index 75% rename from src/persistence/Elsa.Persistence.EntityFrameworkCore/Elsa.Persistence.EntityFrameworkCore.csproj rename to src/persistence/efcore/Elsa.Persistence.EntityFrameworkCore/Elsa.Persistence.EntityFrameworkCore.csproj index 580cfafc8..57e599822 100644 --- a/src/persistence/Elsa.Persistence.EntityFrameworkCore/Elsa.Persistence.EntityFrameworkCore.csproj +++ b/src/persistence/efcore/Elsa.Persistence.EntityFrameworkCore/Elsa.Persistence.EntityFrameworkCore.csproj @@ -14,8 +14,8 @@ - - + + diff --git a/src/persistence/Elsa.Persistence.EntityFrameworkCore/ElsaDbContext.cs b/src/persistence/efcore/Elsa.Persistence.EntityFrameworkCore/ElsaDbContext.cs similarity index 100% rename from src/persistence/Elsa.Persistence.EntityFrameworkCore/ElsaDbContext.cs rename to src/persistence/efcore/Elsa.Persistence.EntityFrameworkCore/ElsaDbContext.cs diff --git a/src/persistence/Elsa.Persistence.EntityFrameworkCore/Extensions/DatabaseFacadeExtensions.cs b/src/persistence/efcore/Elsa.Persistence.EntityFrameworkCore/Extensions/DatabaseFacadeExtensions.cs similarity index 100% rename from src/persistence/Elsa.Persistence.EntityFrameworkCore/Extensions/DatabaseFacadeExtensions.cs rename to src/persistence/efcore/Elsa.Persistence.EntityFrameworkCore/Extensions/DatabaseFacadeExtensions.cs diff --git a/src/persistence/Elsa.Persistence.EntityFrameworkCore/Extensions/QueryableBulkExtensions.cs b/src/persistence/efcore/Elsa.Persistence.EntityFrameworkCore/Extensions/QueryableBulkExtensions.cs similarity index 100% rename from src/persistence/Elsa.Persistence.EntityFrameworkCore/Extensions/QueryableBulkExtensions.cs rename to src/persistence/efcore/Elsa.Persistence.EntityFrameworkCore/Extensions/QueryableBulkExtensions.cs diff --git a/src/persistence/Elsa.Persistence.EntityFrameworkCore/Extensions/ServiceCollectionExtensions.cs b/src/persistence/efcore/Elsa.Persistence.EntityFrameworkCore/Extensions/ServiceCollectionExtensions.cs similarity index 81% rename from src/persistence/Elsa.Persistence.EntityFrameworkCore/Extensions/ServiceCollectionExtensions.cs rename to src/persistence/efcore/Elsa.Persistence.EntityFrameworkCore/Extensions/ServiceCollectionExtensions.cs index eb1c9a4ed..c94eb39ce 100644 --- a/src/persistence/Elsa.Persistence.EntityFrameworkCore/Extensions/ServiceCollectionExtensions.cs +++ b/src/persistence/efcore/Elsa.Persistence.EntityFrameworkCore/Extensions/ServiceCollectionExtensions.cs @@ -1,10 +1,9 @@ -using Elsa.Mediator.Extensions; using Elsa.Persistence.Entities; -using Elsa.Persistence.EntityFrameworkCore.Handlers.Commands; -using Elsa.Persistence.EntityFrameworkCore.Handlers.Serialization; +using Elsa.Persistence.EntityFrameworkCore.Handlers; using Elsa.Persistence.EntityFrameworkCore.HostedServices; using Elsa.Persistence.EntityFrameworkCore.Implementations; using Elsa.Persistence.EntityFrameworkCore.Services; +using Elsa.Persistence.Services; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; @@ -21,12 +20,16 @@ public static class ServiceCollectionExtensions services.AddElsaDbContextFactory(configure, useContextPooling); services - .AddEFCoreHandlers() .AddSingleton, EFCoreStore>() .AddSingleton, EFCoreStore>() .AddSingleton, EFCoreStore>() .AddSingleton, EFCoreStore>() .AddSingleton, EFCoreStore>() + .AddSingleton() + .AddSingleton() + .AddSingleton() + .AddSingleton() + .AddSingleton() .AddSingleton, WorkflowDefinitionSerializer>() .AddSingleton, WorkflowInstanceSerializer>() .AddSingleton, WorkflowExecutionLogRecordSerializer>() @@ -38,8 +41,6 @@ public static class ServiceCollectionExtensions return services; } - private static IServiceCollection AddEFCoreHandlers(this IServiceCollection services) => services.AddHandlersFrom(); - private static IServiceCollection AddElsaDbContextFactory(this IServiceCollection services, Action configure, bool useContextPooling, diff --git a/src/persistence/Elsa.Persistence.EntityFrameworkCore/Handlers/Serialization/WorkflowDefinitionSerializer.cs b/src/persistence/efcore/Elsa.Persistence.EntityFrameworkCore/Handlers/WorkflowDefinitionSerializer.cs similarity index 96% rename from src/persistence/Elsa.Persistence.EntityFrameworkCore/Handlers/Serialization/WorkflowDefinitionSerializer.cs rename to src/persistence/efcore/Elsa.Persistence.EntityFrameworkCore/Handlers/WorkflowDefinitionSerializer.cs index 02f031a7d..c4f53157f 100644 --- a/src/persistence/Elsa.Persistence.EntityFrameworkCore/Handlers/Serialization/WorkflowDefinitionSerializer.cs +++ b/src/persistence/efcore/Elsa.Persistence.EntityFrameworkCore/Handlers/WorkflowDefinitionSerializer.cs @@ -3,9 +3,8 @@ using Elsa.Models; using Elsa.Persistence.Entities; using Elsa.Persistence.EntityFrameworkCore.Services; using Elsa.Serialization; -using Elsa.Services; -namespace Elsa.Persistence.EntityFrameworkCore.Handlers.Serialization; +namespace Elsa.Persistence.EntityFrameworkCore.Handlers; public class WorkflowDefinitionSerializer : IEntitySerializer { diff --git a/src/persistence/Elsa.Persistence.EntityFrameworkCore/Handlers/Serialization/WorkflowExecutionLogRecordSerializer.cs b/src/persistence/efcore/Elsa.Persistence.EntityFrameworkCore/Handlers/WorkflowExecutionLogRecordSerializer.cs similarity index 93% rename from src/persistence/Elsa.Persistence.EntityFrameworkCore/Handlers/Serialization/WorkflowExecutionLogRecordSerializer.cs rename to src/persistence/efcore/Elsa.Persistence.EntityFrameworkCore/Handlers/WorkflowExecutionLogRecordSerializer.cs index e106c0d4d..bb49d7d0e 100644 --- a/src/persistence/Elsa.Persistence.EntityFrameworkCore/Handlers/Serialization/WorkflowExecutionLogRecordSerializer.cs +++ b/src/persistence/efcore/Elsa.Persistence.EntityFrameworkCore/Handlers/WorkflowExecutionLogRecordSerializer.cs @@ -3,7 +3,7 @@ using System.Text.Json.Serialization; using Elsa.Persistence.Entities; using Elsa.Persistence.EntityFrameworkCore.Services; -namespace Elsa.Persistence.EntityFrameworkCore.Handlers.Serialization; +namespace Elsa.Persistence.EntityFrameworkCore.Handlers; public class WorkflowExecutionLogRecordSerializer : IEntitySerializer { diff --git a/src/persistence/Elsa.Persistence.EntityFrameworkCore/Handlers/Serialization/WorkflowInstanceSerializer.cs b/src/persistence/efcore/Elsa.Persistence.EntityFrameworkCore/Handlers/WorkflowInstanceSerializer.cs similarity index 96% rename from src/persistence/Elsa.Persistence.EntityFrameworkCore/Handlers/Serialization/WorkflowInstanceSerializer.cs rename to src/persistence/efcore/Elsa.Persistence.EntityFrameworkCore/Handlers/WorkflowInstanceSerializer.cs index ca855dcc4..3dbd1dc54 100644 --- a/src/persistence/Elsa.Persistence.EntityFrameworkCore/Handlers/Serialization/WorkflowInstanceSerializer.cs +++ b/src/persistence/efcore/Elsa.Persistence.EntityFrameworkCore/Handlers/WorkflowInstanceSerializer.cs @@ -5,7 +5,7 @@ using Elsa.Persistence.Models; using Elsa.Serialization; using Elsa.State; -namespace Elsa.Persistence.EntityFrameworkCore.Handlers.Serialization; +namespace Elsa.Persistence.EntityFrameworkCore.Handlers; public class WorkflowInstanceSerializer : IEntitySerializer { diff --git a/src/persistence/Elsa.Persistence.EntityFrameworkCore/HostedServices/RunMigrations.cs b/src/persistence/efcore/Elsa.Persistence.EntityFrameworkCore/HostedServices/RunMigrations.cs similarity index 100% rename from src/persistence/Elsa.Persistence.EntityFrameworkCore/HostedServices/RunMigrations.cs rename to src/persistence/efcore/Elsa.Persistence.EntityFrameworkCore/HostedServices/RunMigrations.cs diff --git a/src/persistence/Elsa.Persistence.EntityFrameworkCore/Implementations/EFCoreStore.cs b/src/persistence/efcore/Elsa.Persistence.EntityFrameworkCore/Implementations/EFCoreStore.cs similarity index 100% rename from src/persistence/Elsa.Persistence.EntityFrameworkCore/Implementations/EFCoreStore.cs rename to src/persistence/efcore/Elsa.Persistence.EntityFrameworkCore/Implementations/EFCoreStore.cs diff --git a/src/persistence/efcore/Elsa.Persistence.EntityFrameworkCore/Implementations/EFCoreWorkflowBookmarkStore.cs b/src/persistence/efcore/Elsa.Persistence.EntityFrameworkCore/Implementations/EFCoreWorkflowBookmarkStore.cs new file mode 100644 index 000000000..3f8e355e0 --- /dev/null +++ b/src/persistence/efcore/Elsa.Persistence.EntityFrameworkCore/Implementations/EFCoreWorkflowBookmarkStore.cs @@ -0,0 +1,42 @@ +using Elsa.Persistence.Entities; +using Elsa.Persistence.EntityFrameworkCore.Services; +using Elsa.Persistence.Services; + +namespace Elsa.Persistence.EntityFrameworkCore.Implementations; + +public class EFCoreWorkflowBookmarkStore : IWorkflowBookmarkStore +{ + private readonly IStore _store; + + public EFCoreWorkflowBookmarkStore(IStore store) + { + _store = store; + } + + public async Task SaveAsync(WorkflowBookmark record, CancellationToken cancellationToken = default) => await _store.SaveAsync(record, cancellationToken); + public async Task SaveManyAsync(IEnumerable records, CancellationToken cancellationToken = default) => await _store.SaveManyAsync(records, cancellationToken); + public async Task FindByIdAsync(string id, CancellationToken cancellationToken = default) => await _store.FindAsync(x => x.Id == id, cancellationToken); + + public async Task> FindManyAsync(string name, string? hash, CancellationToken cancellationToken = default) => + await _store.QueryAsync(query => + { + query = query.Where(x => x.Name == name); + + if (!string.IsNullOrWhiteSpace(hash)) + query = query.Where(x => x.Hash == hash); + + return query; + }, cancellationToken); + + public async Task> FindManyByWorkflowInstanceIdAsync(string workflowInstanceId, CancellationToken cancellationToken = default) => + await _store.FindManyAsync(x => x.WorkflowInstanceId == workflowInstanceId, cancellationToken); + + public async Task DeleteAsync(string id, CancellationToken cancellationToken = default) => + await _store.DeleteWhereAsync(x => x.Id == id, cancellationToken) > 0; + + public async Task DeleteManyAsync(IEnumerable ids, CancellationToken cancellationToken = default) + { + var idList = ids.ToList(); + return await _store.DeleteWhereAsync(x => idList.Contains(x.Id), cancellationToken); + } +} \ No newline at end of file diff --git a/src/persistence/efcore/Elsa.Persistence.EntityFrameworkCore/Implementations/EFCoreWorkflowDefinitionStore.cs b/src/persistence/efcore/Elsa.Persistence.EntityFrameworkCore/Implementations/EFCoreWorkflowDefinitionStore.cs new file mode 100644 index 000000000..912a7ec07 --- /dev/null +++ b/src/persistence/efcore/Elsa.Persistence.EntityFrameworkCore/Implementations/EFCoreWorkflowDefinitionStore.cs @@ -0,0 +1,98 @@ +using System.Linq.Expressions; +using Elsa.Persistence.Entities; +using Elsa.Persistence.EntityFrameworkCore.Services; +using Elsa.Persistence.Extensions; +using Elsa.Persistence.Models; +using Elsa.Persistence.Services; + +namespace Elsa.Persistence.EntityFrameworkCore.Implementations; + +public class EFCoreWorkflowDefinitionStore : IWorkflowDefinitionStore +{ + private readonly IStore _store; + private readonly IStore _instanceStore; + private readonly IStore _triggerStore; + private readonly IStore _bookmarkStore; + private readonly IStore _executionLogRecordStore; + + public EFCoreWorkflowDefinitionStore( + IStore store, + IStore instanceStore, + IStore triggerStore, + IStore bookmarkStore, + IStore executionLogRecordStore) + { + _store = store; + _instanceStore = instanceStore; + _triggerStore = triggerStore; + _bookmarkStore = bookmarkStore; + _executionLogRecordStore = executionLogRecordStore; + } + + public async Task FindByDefinitionIdAsync(string definitionId, VersionOptions versionOptions, CancellationToken cancellationToken = default) + { + Expression> predicate = x => x.DefinitionId == definitionId; + predicate = predicate.WithVersion(versionOptions); + return await _store.FindAsync(predicate, cancellationToken); + } + + public async Task FindByNameAsync(string name, VersionOptions versionOptions, CancellationToken cancellationToken = default) + { + Expression> predicate = x => x.Name == name; + predicate = predicate.WithVersion(versionOptions); + return await _store.FindAsync(predicate, cancellationToken); + } + + public async Task> FindManySummariesAsync(IEnumerable definitionIds, VersionOptions? versionOptions = default, CancellationToken cancellationToken = default) + { + await using var dbContext = await _store.CreateDbContextAsync(cancellationToken); + var set = dbContext.WorkflowDefinitions; + var query = set.AsQueryable(); + + if (versionOptions != null) + query = query.WithVersion(versionOptions.Value); + + query = query.Where(x => definitionIds.Contains(x.DefinitionId)); + + return query.OrderBy(x => x.Name).Select(x => WorkflowDefinitionSummary.FromDefinition(x)).ToList(); + } + + public async Task> FindLatestAndPublishedByDefinitionIdAsync(string definitionId, CancellationToken cancellationToken = default) => + await _store.FindManyAsync(x => x.DefinitionId == definitionId && (x.IsLatest || x.IsPublished), cancellationToken); + + public async Task SaveAsync(WorkflowDefinition record, CancellationToken cancellationToken = default) => await _store.SaveAsync(record, cancellationToken); + public async Task SaveManyAsync(IEnumerable records, CancellationToken cancellationToken = default) => await _store.SaveManyAsync(records, cancellationToken); + + public async Task DeleteByDefinitionIdAsync(string definitionId, CancellationToken cancellationToken = default) + { + await _triggerStore.DeleteWhereAsync(x => x.WorkflowDefinitionId == definitionId, cancellationToken); + await _executionLogRecordStore.DeleteWhereAsync(x => x.WorkflowDefinitionId == definitionId, cancellationToken); + await _instanceStore.DeleteWhereAsync(x => x.DefinitionId == definitionId, cancellationToken); + await _bookmarkStore.DeleteWhereAsync(x => x.WorkflowDefinitionId == definitionId, cancellationToken); + return await _store.DeleteWhereAsync(x => x.DefinitionId == definitionId, cancellationToken); + } + + public async Task DeleteManyByDefinitionIdsAsync(IEnumerable definitionIds, CancellationToken cancellationToken = default) + { + var definitionIdList = definitionIds.ToList(); + await _triggerStore.DeleteWhereAsync(x => definitionIdList.Contains(x.WorkflowDefinitionId), cancellationToken); + await _executionLogRecordStore.DeleteWhereAsync(x => definitionIdList.Contains(x.WorkflowDefinitionId), cancellationToken); + await _instanceStore.DeleteWhereAsync(x => definitionIdList.Contains(x.DefinitionId), cancellationToken); + await _bookmarkStore.DeleteWhereAsync(x => definitionIdList.Contains(x.WorkflowDefinitionId), cancellationToken); + return await _store.DeleteWhereAsync(x => definitionIdList.Contains(x.DefinitionId), cancellationToken); + } + + public async Task> ListSummariesAsync(VersionOptions? versionOptions = default, PageArgs? pageArgs = default, CancellationToken cancellationToken = default) + { + await using var dbContext = await _store.CreateDbContextAsync(cancellationToken); + var set = dbContext.WorkflowDefinitions; + var query = set.AsQueryable(); + + if (versionOptions != null) + query = query.WithVersion(versionOptions.Value); + + query = query.OrderBy(x => x.Name); + + return await query.PaginateAsync(x => WorkflowDefinitionSummary.FromDefinition(x), pageArgs); + } +} \ No newline at end of file diff --git a/src/persistence/efcore/Elsa.Persistence.EntityFrameworkCore/Implementations/EFCoreWorkflowExecutionLogStore.cs b/src/persistence/efcore/Elsa.Persistence.EntityFrameworkCore/Implementations/EFCoreWorkflowExecutionLogStore.cs new file mode 100644 index 000000000..d65a89e09 --- /dev/null +++ b/src/persistence/efcore/Elsa.Persistence.EntityFrameworkCore/Implementations/EFCoreWorkflowExecutionLogStore.cs @@ -0,0 +1,13 @@ +using Elsa.Persistence.Entities; +using Elsa.Persistence.EntityFrameworkCore.Services; +using Elsa.Persistence.Services; + +namespace Elsa.Persistence.EntityFrameworkCore.Implementations; + +public class EFCoreWorkflowExecutionLogStore : IWorkflowExecutionLogStore +{ + private readonly IStore _store; + public EFCoreWorkflowExecutionLogStore(IStore store) => _store = store; + public async Task SaveAsync(WorkflowExecutionLogRecord record, CancellationToken cancellationToken = default) => await _store.SaveAsync(record, cancellationToken); + public async Task SaveManyAsync(IEnumerable records, CancellationToken cancellationToken = default) => await _store.SaveManyAsync(records, cancellationToken); +} \ No newline at end of file diff --git a/src/persistence/efcore/Elsa.Persistence.EntityFrameworkCore/Implementations/EFCoreWorkflowInstanceStore.cs b/src/persistence/efcore/Elsa.Persistence.EntityFrameworkCore/Implementations/EFCoreWorkflowInstanceStore.cs new file mode 100644 index 000000000..79d0d2d67 --- /dev/null +++ b/src/persistence/efcore/Elsa.Persistence.EntityFrameworkCore/Implementations/EFCoreWorkflowInstanceStore.cs @@ -0,0 +1,94 @@ +using Elsa.Persistence.Entities; +using Elsa.Persistence.EntityFrameworkCore.Services; +using Elsa.Persistence.Extensions; +using Elsa.Persistence.Models; +using Elsa.Persistence.Services; + +namespace Elsa.Persistence.EntityFrameworkCore.Implementations; + +public class EFCoreWorkflowInstanceStore : IWorkflowInstanceStore +{ + private readonly IStore _store; + private readonly IStore _bookmarkStore; + private readonly IStore _executionLogRecordStore; + + public EFCoreWorkflowInstanceStore( + IStore store, + IStore bookmarkStore, + IStore executionLogRecordStore) + { + _store = store; + _bookmarkStore = bookmarkStore; + _executionLogRecordStore = executionLogRecordStore; + } + + public async Task FindByIdAsync(string id, CancellationToken cancellationToken = default) => + await _store.FindAsync(x => x.Id == id, cancellationToken); + + public async Task SaveAsync(WorkflowInstance record, CancellationToken cancellationToken = default) => + await _store.SaveAsync(record, cancellationToken); + + public async Task SaveManyAsync(IEnumerable records, CancellationToken cancellationToken = default) => + await _store.SaveManyAsync(records, cancellationToken); + + public async Task DeleteAsync(string id, CancellationToken cancellationToken = default) => + await _store.DeleteWhereAsync(x => x.Id == id, cancellationToken) > 0; + + public async Task DeleteManyAsync(IEnumerable ids, CancellationToken cancellationToken = default) + { + var idList = ids.ToList(); + await _bookmarkStore.DeleteWhereAsync(x => idList.Contains(x.WorkflowDefinitionId), cancellationToken); + await _executionLogRecordStore.DeleteWhereAsync(x => idList.Contains(x.WorkflowDefinitionId), cancellationToken); + return await _store.DeleteWhereAsync(x => idList.Contains(x.Id), cancellationToken); + } + + public async Task DeleteManyByDefinitionIdAsync(string definitionId, CancellationToken cancellationToken = default) + { + await _bookmarkStore.DeleteWhereAsync(x => x.WorkflowDefinitionId == definitionId, cancellationToken); + await _executionLogRecordStore.DeleteWhereAsync(x => x.WorkflowDefinitionId == definitionId, cancellationToken); + await _store.DeleteWhereAsync(x => x.DefinitionId == definitionId, cancellationToken); + } + + public async Task> FindManyAsync(FindWorkflowInstancesArgs args, CancellationToken cancellationToken = default) + { + var dbContext = await _store.CreateDbContextAsync(cancellationToken); + var query = dbContext.WorkflowInstances.AsQueryable(); + var (searchTerm, definitionId, version, correlationId, workflowStatus, workflowSubStatus, pageArgs, orderBy, orderDirection) = args; + + if (!string.IsNullOrWhiteSpace(definitionId)) + query = query.Where(x => x.DefinitionId == definitionId); + + if (version != null) + query = query.Where(x => x.Version == version); + + if (!string.IsNullOrWhiteSpace(correlationId)) + query = query.Where(x => x.CorrelationId == correlationId); + + if (workflowStatus != null) + query = query.Where(x => x.Status == workflowStatus); + + if (workflowSubStatus != null) + query = query.Where(x => x.SubStatus == workflowSubStatus); + + if (!string.IsNullOrWhiteSpace(searchTerm)) + { + query = + from instance in query + where instance.Name!.Contains(searchTerm) + || instance.Id.Contains(searchTerm) + || instance.DefinitionId.Contains(searchTerm) + || instance.CorrelationId.Contains(searchTerm) + select instance; + } + + query = orderBy switch + { + OrderBy.Finished => orderDirection == OrderDirection.Ascending ? query.OrderBy(x => x.FinishedAt) : query.OrderByDescending(x => x.FinishedAt), + OrderBy.LastExecuted => orderDirection == OrderDirection.Ascending ? query.OrderBy(x => x.LastExecutedAt) : query.OrderByDescending(x => x.LastExecutedAt), + OrderBy.Created => orderDirection == OrderDirection.Ascending ? query.OrderBy(x => x.CreatedAt) : query.OrderByDescending(x => x.CreatedAt), + _ => query + }; + + return await query.PaginateAsync(x => WorkflowInstanceSummary.FromInstance(x), pageArgs); + } +} \ No newline at end of file diff --git a/src/persistence/efcore/Elsa.Persistence.EntityFrameworkCore/Implementations/EFCoreWorkflowTriggerStore.cs b/src/persistence/efcore/Elsa.Persistence.EntityFrameworkCore/Implementations/EFCoreWorkflowTriggerStore.cs new file mode 100644 index 000000000..3bf58614d --- /dev/null +++ b/src/persistence/efcore/Elsa.Persistence.EntityFrameworkCore/Implementations/EFCoreWorkflowTriggerStore.cs @@ -0,0 +1,44 @@ +using Elsa.Persistence.Entities; +using Elsa.Persistence.EntityFrameworkCore.Services; +using Elsa.Persistence.Services; + +namespace Elsa.Persistence.EntityFrameworkCore.Implementations; + +public class EFCoreWorkflowTriggerStore : IWorkflowTriggerStore +{ + private readonly IStore _store; + + public EFCoreWorkflowTriggerStore(IStore store) + { + _store = store; + } + + public async Task SaveAsync(WorkflowTrigger record, CancellationToken cancellationToken = default) => await _store.SaveAsync(record, cancellationToken); + public async Task SaveManyAsync(IEnumerable records, CancellationToken cancellationToken = default) => await _store.SaveManyAsync(records, cancellationToken); + + public async Task> FindManyByNameAsync(string name, string? hash, CancellationToken cancellationToken = default) => + await _store.QueryAsync(query => + { + query = query.Where(x => x.Name == name); + + if (hash != null) + query = query.Where(x => x.Hash == hash); + + return query; + }, cancellationToken); + + public async Task> FindManyByWorkflowDefinitionIdAsync(string workflowDefinitionId, CancellationToken cancellationToken = default) => + await _store.QueryAsync(query => query.Where(x => x.WorkflowDefinitionId == workflowDefinitionId), cancellationToken); + + public async Task ReplaceAsync(IEnumerable removed, IEnumerable added, CancellationToken cancellationToken = default) + { + await _store.DeleteManyAsync(removed, cancellationToken); + await _store.SaveManyAsync(added, cancellationToken); + } + + public async Task DeleteManyAsync(IEnumerable ids, CancellationToken cancellationToken = default) + { + var idList = ids.ToList(); + await _store.DeleteWhereAsync(x => idList.Contains(x.Id), cancellationToken); + } +} \ No newline at end of file diff --git a/src/persistence/Elsa.Persistence.EntityFrameworkCore/Services/IEntitySerializer.cs b/src/persistence/efcore/Elsa.Persistence.EntityFrameworkCore/Services/IEntitySerializer.cs similarity index 100% rename from src/persistence/Elsa.Persistence.EntityFrameworkCore/Services/IEntitySerializer.cs rename to src/persistence/efcore/Elsa.Persistence.EntityFrameworkCore/Services/IEntitySerializer.cs diff --git a/src/persistence/Elsa.Persistence.EntityFrameworkCore/Services/IStore.cs b/src/persistence/efcore/Elsa.Persistence.EntityFrameworkCore/Services/IStore.cs similarity index 100% rename from src/persistence/Elsa.Persistence.EntityFrameworkCore/Services/IStore.cs rename to src/persistence/efcore/Elsa.Persistence.EntityFrameworkCore/Services/IStore.cs diff --git a/src/persistence/Elsa.Persistence.InMemory/AssemblyInfo.cs b/src/persistence/memory/Elsa.Persistence.InMemory/AssemblyInfo.cs similarity index 100% rename from src/persistence/Elsa.Persistence.InMemory/AssemblyInfo.cs rename to src/persistence/memory/Elsa.Persistence.InMemory/AssemblyInfo.cs diff --git a/src/persistence/Elsa.Persistence.InMemory/Elsa.Persistence.InMemory.csproj b/src/persistence/memory/Elsa.Persistence.InMemory/Elsa.Persistence.InMemory.csproj similarity index 63% rename from src/persistence/Elsa.Persistence.InMemory/Elsa.Persistence.InMemory.csproj rename to src/persistence/memory/Elsa.Persistence.InMemory/Elsa.Persistence.InMemory.csproj index 3f47b170c..76e7d0541 100644 --- a/src/persistence/Elsa.Persistence.InMemory/Elsa.Persistence.InMemory.csproj +++ b/src/persistence/memory/Elsa.Persistence.InMemory/Elsa.Persistence.InMemory.csproj @@ -6,7 +6,7 @@ - + diff --git a/src/persistence/Elsa.Persistence.InMemory/Extensions/ServiceCollectionExtensions.cs b/src/persistence/memory/Elsa.Persistence.InMemory/Extensions/ServiceCollectionExtensions.cs similarity index 60% rename from src/persistence/Elsa.Persistence.InMemory/Extensions/ServiceCollectionExtensions.cs rename to src/persistence/memory/Elsa.Persistence.InMemory/Extensions/ServiceCollectionExtensions.cs index 745cf8a1f..176d41620 100644 --- a/src/persistence/Elsa.Persistence.InMemory/Extensions/ServiceCollectionExtensions.cs +++ b/src/persistence/memory/Elsa.Persistence.InMemory/Extensions/ServiceCollectionExtensions.cs @@ -1,7 +1,6 @@ -using Elsa.Mediator.Extensions; using Elsa.Persistence.Entities; -using Elsa.Persistence.InMemory.Handlers.Commands; using Elsa.Persistence.InMemory.Implementations; +using Elsa.Persistence.Services; using Microsoft.Extensions.DependencyInjection; #pragma warning disable CS8631 @@ -13,14 +12,16 @@ public static class ServiceCollectionExtensions public static IServiceCollection AddInMemoryPersistence(this IServiceCollection services) { return services - .AddInMemoryHandlers() .AddSingleton>() .AddSingleton>() .AddSingleton>() .AddSingleton>() .AddSingleton>() + .AddSingleton() + .AddSingleton() + .AddSingleton() + .AddSingleton() + .AddSingleton() ; } - - public static IServiceCollection AddInMemoryHandlers(this IServiceCollection services) => services.AddHandlersFrom(); } \ No newline at end of file diff --git a/src/persistence/Elsa.Persistence.InMemory/Implementations/InMemoryStore.cs b/src/persistence/memory/Elsa.Persistence.InMemory/Implementations/InMemoryStore.cs similarity index 96% rename from src/persistence/Elsa.Persistence.InMemory/Implementations/InMemoryStore.cs rename to src/persistence/memory/Elsa.Persistence.InMemory/Implementations/InMemoryStore.cs index 7abfa1e2a..692da3f61 100644 --- a/src/persistence/Elsa.Persistence.InMemory/Implementations/InMemoryStore.cs +++ b/src/persistence/memory/Elsa.Persistence.InMemory/Implementations/InMemoryStore.cs @@ -20,7 +20,7 @@ public class InMemoryStore where TEntity : Entity public IEnumerable FindMany(Func predicate) => Entities.Values.Where(predicate); public IEnumerable List() => Entities.Values; - public void Delete(string id) => Entities.Remove(id); + public bool Delete(string id) => Entities.Remove(id); public int DeleteWhere(Func predicate) { diff --git a/src/persistence/memory/Elsa.Persistence.InMemory/Implementations/InMemoryWorkflowBookmarkStore.cs b/src/persistence/memory/Elsa.Persistence.InMemory/Implementations/InMemoryWorkflowBookmarkStore.cs new file mode 100644 index 000000000..c4142bd99 --- /dev/null +++ b/src/persistence/memory/Elsa.Persistence.InMemory/Implementations/InMemoryWorkflowBookmarkStore.cs @@ -0,0 +1,69 @@ +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Elsa.Persistence.Entities; +using Elsa.Persistence.Services; + +namespace Elsa.Persistence.InMemory.Implementations; + +public class InMemoryWorkflowBookmarkStore : IWorkflowBookmarkStore +{ + private readonly InMemoryStore _store; + + public InMemoryWorkflowBookmarkStore(InMemoryStore store) + { + _store = store; + } + + public Task SaveAsync(WorkflowBookmark record, CancellationToken cancellationToken = default) + { + _store.Save(record); + return Task.CompletedTask; + } + + public Task SaveManyAsync(IEnumerable records, CancellationToken cancellationToken = default) + { + _store.SaveMany(records); + return Task.CompletedTask; + } + + public Task FindByIdAsync(string id, CancellationToken cancellationToken = default) + { + var bookmark = _store.Find(x => x.Id == id); + return Task.FromResult(bookmark); + } + + public Task> FindManyAsync(string name, string? hash, CancellationToken cancellationToken = default) + { + var bookmarks = _store.Query(query => + { + query = query.Where(x => x.Name == name); + + if (!string.IsNullOrWhiteSpace(hash)) + query = query.Where(x => x.Hash == hash); + + return query; + }); + + return Task.FromResult(bookmarks); + } + + public Task> FindManyByWorkflowInstanceIdAsync(string workflowInstanceId, CancellationToken cancellationToken = default) + { + var bookmarks = _store.FindMany(x => x.WorkflowInstanceId == workflowInstanceId); + return Task.FromResult(bookmarks); + } + + public Task DeleteAsync(string id, CancellationToken cancellationToken = default) + { + var result = _store.Delete(id); + return Task.FromResult(result); + } + + public Task DeleteManyAsync(IEnumerable ids, CancellationToken cancellationToken = default) + { + var result = _store.DeleteMany(ids); + return Task.FromResult(result); + } +} \ No newline at end of file diff --git a/src/persistence/memory/Elsa.Persistence.InMemory/Implementations/InMemoryWorkflowDefinitionStore.cs b/src/persistence/memory/Elsa.Persistence.InMemory/Implementations/InMemoryWorkflowDefinitionStore.cs new file mode 100644 index 000000000..5d7242c61 --- /dev/null +++ b/src/persistence/memory/Elsa.Persistence.InMemory/Implementations/InMemoryWorkflowDefinitionStore.cs @@ -0,0 +1,103 @@ +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Elsa.Persistence.Entities; +using Elsa.Persistence.Extensions; +using Elsa.Persistence.Models; +using Elsa.Persistence.Services; + +namespace Elsa.Persistence.InMemory.Implementations; + +public class InMemoryWorkflowDefinitionStore : IWorkflowDefinitionStore +{ + private readonly InMemoryStore _store; + private readonly InMemoryStore _instanceStore; + private readonly InMemoryStore _triggerStore; + private readonly InMemoryStore _bookmarkStore; + + public InMemoryWorkflowDefinitionStore( + InMemoryStore store, + InMemoryStore instanceStore, + InMemoryStore triggerStore, + InMemoryStore bookmarkStore) + { + _store = store; + _instanceStore = instanceStore; + _triggerStore = triggerStore; + _bookmarkStore = bookmarkStore; + } + + public Task FindByDefinitionIdAsync(string definitionId, VersionOptions versionOptions, CancellationToken cancellationToken = default) + { + var definition = _store.Find(x => x.DefinitionId == definitionId && x.WithVersion(versionOptions)); + return Task.FromResult(definition); + } + + public Task FindByNameAsync(string name, VersionOptions versionOptions, CancellationToken cancellationToken = default) + { + var definition = _store.Find(x => x.Name == name && x.WithVersion(versionOptions)); + return Task.FromResult(definition); + } + + public Task> FindManySummariesAsync(IEnumerable definitionIds, VersionOptions? versionOptions = default, CancellationToken cancellationToken = default) + { + var query = _store.List(); + + if (versionOptions != null) + query = query.WithVersion(versionOptions.Value); + + var definitionIdList = definitionIds.ToList(); + query = query.Where(x => definitionIdList.Contains(x.Id)); + + var summaries = query.Select(WorkflowDefinitionSummary.FromDefinition).ToList().AsEnumerable(); + return Task.FromResult(summaries); + } + + public Task> FindLatestAndPublishedByDefinitionIdAsync(string definitionId, CancellationToken cancellationToken = default) + { + var definitions = _store.FindMany(x => x.DefinitionId == definitionId && (x.IsLatest || x.IsPublished)); + return Task.FromResult(definitions); + } + + public Task SaveAsync(WorkflowDefinition record, CancellationToken cancellationToken = default) + { + _store.Save(record); + return Task.CompletedTask; + } + + public Task SaveManyAsync(IEnumerable records, CancellationToken cancellationToken = default) + { + _store.SaveMany(records); + return Task.CompletedTask; + } + + public Task DeleteByDefinitionIdAsync(string definitionId, CancellationToken cancellationToken = default) + { + _triggerStore.DeleteWhere(x => x.WorkflowDefinitionId == definitionId); + _instanceStore.DeleteWhere(x => x.DefinitionId == definitionId); + _bookmarkStore.DeleteWhere(x => x.WorkflowDefinitionId == definitionId); + var result = _store.DeleteWhere(x => x.DefinitionId == definitionId); + return Task.FromResult(result); + } + + public Task DeleteManyByDefinitionIdsAsync(IEnumerable definitionIds, CancellationToken cancellationToken = default) + { + var definitionIdList = definitionIds.ToList(); + _triggerStore.DeleteWhere(x => definitionIdList.Contains(x.WorkflowDefinitionId)); + _instanceStore.DeleteWhere(x => definitionIdList.Contains(x.DefinitionId)); + _bookmarkStore.DeleteWhere(x => definitionIdList.Contains(x.WorkflowDefinitionId)); + var result = _store.DeleteWhere(x => definitionIdList.Contains(x.DefinitionId)); + return Task.FromResult(result); + } + + public Task> ListSummariesAsync(VersionOptions? versionOptions = default, PageArgs? pageArgs = default, CancellationToken cancellationToken = default) + { + var query = _store.List().AsQueryable(); + + if (versionOptions != null) + query = query.WithVersion(versionOptions.Value); + + return query.PaginateAsync(x => WorkflowDefinitionSummary.FromDefinition(x), pageArgs); + } +} \ No newline at end of file diff --git a/src/persistence/memory/Elsa.Persistence.InMemory/Implementations/InMemoryWorkflowExecutionLogStore.cs b/src/persistence/memory/Elsa.Persistence.InMemory/Implementations/InMemoryWorkflowExecutionLogStore.cs new file mode 100644 index 000000000..dd5d7e3f5 --- /dev/null +++ b/src/persistence/memory/Elsa.Persistence.InMemory/Implementations/InMemoryWorkflowExecutionLogStore.cs @@ -0,0 +1,29 @@ +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using Elsa.Persistence.Entities; +using Elsa.Persistence.Services; + +namespace Elsa.Persistence.InMemory.Implementations; + +public class InMemoryWorkflowExecutionLogStore : IWorkflowExecutionLogStore +{ + private readonly InMemoryStore _store; + + public InMemoryWorkflowExecutionLogStore(InMemoryStore store) + { + _store = store; + } + + public Task SaveAsync(WorkflowExecutionLogRecord record, CancellationToken cancellationToken = default) + { + _store.Save(record); + return Task.CompletedTask; + } + + public Task SaveManyAsync(IEnumerable records, CancellationToken cancellationToken = default) + { + _store.SaveMany(records); + return Task.CompletedTask; + } +} \ No newline at end of file diff --git a/src/persistence/Elsa.Persistence.InMemory/Handlers/Requests/ListWorkflowInstanceSummariesHandler.cs b/src/persistence/memory/Elsa.Persistence.InMemory/Implementations/InMemoryWorkflowInstanceStore.cs similarity index 54% rename from src/persistence/Elsa.Persistence.InMemory/Handlers/Requests/ListWorkflowInstanceSummariesHandler.cs rename to src/persistence/memory/Elsa.Persistence.InMemory/Implementations/InMemoryWorkflowInstanceStore.cs index 0df57a677..a880cf4b3 100644 --- a/src/persistence/Elsa.Persistence.InMemory/Handlers/Requests/ListWorkflowInstanceSummariesHandler.cs +++ b/src/persistence/memory/Elsa.Persistence.InMemory/Implementations/InMemoryWorkflowInstanceStore.cs @@ -1,26 +1,63 @@ using System; +using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; -using Elsa.Mediator.Services; using Elsa.Persistence.Entities; -using Elsa.Persistence.InMemory.Implementations; using Elsa.Persistence.Models; -using Elsa.Persistence.Requests; +using Elsa.Persistence.Services; -// ReSharper disable PossibleMultipleEnumeration +namespace Elsa.Persistence.InMemory.Implementations; -namespace Elsa.Persistence.InMemory.Handlers.Requests; - -public class ListWorkflowInstanceSummariesHandler : IRequestHandler> +public class InMemoryWorkflowInstanceStore : IWorkflowInstanceStore { private readonly InMemoryStore _store; - public ListWorkflowInstanceSummariesHandler(InMemoryStore store) => _store = store; - public Task> HandleAsync(ListWorkflowInstanceSummaries request, CancellationToken cancellationToken) + public InMemoryWorkflowInstanceStore(InMemoryStore store) { - var query = _store.List(); - var (searchTerm, definitionId, version, correlationId, workflowStatus, workflowSubStatus, pageArgs, orderBy, orderDirection) = request; + _store = store; + } + + public Task FindByIdAsync(string id, CancellationToken cancellationToken = default) + { + var instance = _store.Find(x => x.Id == id); + return Task.FromResult(instance); + } + + public Task SaveAsync(WorkflowInstance record, CancellationToken cancellationToken = default) + { + _store.Save(record); + return Task.CompletedTask; + } + + public Task SaveManyAsync(IEnumerable records, CancellationToken cancellationToken = default) + { + _store.SaveMany(records); + return Task.CompletedTask; + } + + public Task DeleteAsync(string id, CancellationToken cancellationToken = default) + { + var success = _store.Delete(id); + return Task.FromResult(success); + } + + public Task DeleteManyAsync(IEnumerable ids, CancellationToken cancellationToken = default) + { + var count = _store.DeleteMany(ids); + return Task.FromResult(count); + } + + public Task DeleteManyByDefinitionIdAsync(string definitionId, CancellationToken cancellationToken = default) + { + _store.DeleteWhere(x => x.DefinitionId == definitionId); + return Task.CompletedTask; + } + + public Task> FindManyAsync(FindWorkflowInstancesArgs args, CancellationToken cancellationToken = default) + { + var query = _store.List().AsQueryable(); + var (searchTerm, definitionId, version, correlationId, workflowStatus, workflowSubStatus, pageArgs, orderBy, orderDirection) = args; if (!string.IsNullOrWhiteSpace(definitionId)) query = query.Where(x => x.DefinitionId == definitionId); @@ -43,10 +80,10 @@ public class ListWorkflowInstanceSummariesHandler : IRequestHandler _store; + + public InMemoryWorkflowTriggerStore(InMemoryStore store) + { + _store = store; + } + + public Task SaveAsync(WorkflowTrigger record, CancellationToken cancellationToken = default) + { + throw new NotImplementedException(); + } + + public Task SaveManyAsync(IEnumerable records, CancellationToken cancellationToken = default) + { + throw new NotImplementedException(); + } + + public Task> FindManyByNameAsync(string name, string? hash, CancellationToken cancellationToken = default) + { + var triggers = _store.Query(query => + { + query = query.Where(x => x.Name == name); + + if (hash != null) + query = query.Where(x => x.Hash == hash); + + return query; + }); + + return Task.FromResult>(triggers.ToList()); + } + + public Task> FindManyByWorkflowDefinitionIdAsync(string workflowDefinitionId, CancellationToken cancellationToken = default) + { + var triggers = _store.Query(query => query.Where(x => x.WorkflowDefinitionId == workflowDefinitionId)); + return Task.FromResult>(triggers.ToList()); + } + + public Task ReplaceAsync(IEnumerable removed, IEnumerable added, CancellationToken cancellationToken = default) + { + _store.DeleteMany(removed); + _store.SaveMany(added); + + return Task.CompletedTask; + } + + public Task DeleteManyAsync(IEnumerable ids, CancellationToken cancellationToken = default) + { + _store.DeleteMany(ids); + return Task.CompletedTask; + } +} \ No newline at end of file diff --git a/src/runtime/Elsa.Runtime.ProtoActor/Grains/WorkflowInstanceGrain.cs b/src/runtime/Elsa.Runtime.ProtoActor/Grains/WorkflowInstanceGrain.cs index 05065d8ab..b894bbf77 100644 --- a/src/runtime/Elsa.Runtime.ProtoActor/Grains/WorkflowInstanceGrain.cs +++ b/src/runtime/Elsa.Runtime.ProtoActor/Grains/WorkflowInstanceGrain.cs @@ -4,12 +4,10 @@ using System.Linq; using System.Text.Json; using System.Threading; using System.Threading.Tasks; -using Elsa.Mediator.Services; using Elsa.Models; using Elsa.Persistence.Models; -using Elsa.Persistence.Requests; +using Elsa.Persistence.Services; using Elsa.Runtime.ProtoActor.Extensions; -using Elsa.Runtime.ProtoActor.Implementations; using Elsa.Runtime.Protos; using Elsa.Runtime.Services; using Elsa.Serialization; @@ -25,25 +23,22 @@ namespace Elsa.Runtime.ProtoActor.Grains; /// public class WorkflowInstanceGrain : WorkflowInstanceGrainBase { - private readonly IRequestSender _requestSender; + private readonly IWorkflowInstanceStore _workflowInstanceStore; private readonly IWorkflowRegistry _workflowRegistry; - private readonly GrainClientFactory _grainClientFactory; private readonly IWorkflowRunner _workflowRunner; private readonly IWorkflowInstanceFactory _workflowInstanceFactory; private readonly WorkflowSerializerOptionsProvider _workflowSerializerOptionsProvider; public WorkflowInstanceGrain( - IRequestSender requestSender, + IWorkflowInstanceStore workflowInstanceStore, IWorkflowRegistry workflowRegistry, - GrainClientFactory grainClientFactory, IWorkflowRunner workflowRunner, IWorkflowInstanceFactory workflowInstanceFactory, WorkflowSerializerOptionsProvider workflowSerializerOptionsProvider, IContext context) : base(context) { - _requestSender = requestSender; + _workflowInstanceStore = workflowInstanceStore; _workflowRegistry = workflowRegistry; - _grainClientFactory = grainClientFactory; _workflowRunner = workflowRunner; _workflowInstanceFactory = workflowInstanceFactory; _workflowSerializerOptionsProvider = workflowSerializerOptionsProvider; @@ -53,7 +48,7 @@ public class WorkflowInstanceGrain : WorkflowInstanceGrainBase { var workflowInstanceId = request.InstanceId; var cancellationToken = Context.CancellationToken; - var workflowInstance = await _requestSender.RequestAsync(new FindWorkflowInstance(workflowInstanceId), cancellationToken); + var workflowInstance = await _workflowInstanceStore.FindByIdAsync(workflowInstanceId, cancellationToken); if (workflowInstance == null) throw new Exception($"No workflow instance found with ID {workflowInstanceId}"); diff --git a/src/samples/aspnet/Elsa.Samples.Web1/Activities/WriteLines.cs b/src/samples/aspnet/Elsa.Samples.Web1/Activities/WriteLines.cs index 5bce9dfa2..3794a5076 100644 --- a/src/samples/aspnet/Elsa.Samples.Web1/Activities/WriteLines.cs +++ b/src/samples/aspnet/Elsa.Samples.Web1/Activities/WriteLines.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using System.ComponentModel; using System.Reflection; using Elsa.Attributes; using Elsa.Management.ActivityInputOptions; diff --git a/src/samples/aspnet/Elsa.Samples.Web1/Elsa.Samples.Web1.csproj b/src/samples/aspnet/Elsa.Samples.Web1/Elsa.Samples.Web1.csproj index 0d3354af3..2007aeca6 100644 --- a/src/samples/aspnet/Elsa.Samples.Web1/Elsa.Samples.Web1.csproj +++ b/src/samples/aspnet/Elsa.Samples.Web1/Elsa.Samples.Web1.csproj @@ -18,7 +18,7 @@ - + diff --git a/src/samples/aspnet/Elsa.Samples.Web1/Program.cs b/src/samples/aspnet/Elsa.Samples.Web1/Program.cs index 559517fd2..71a235dad 100644 --- a/src/samples/aspnet/Elsa.Samples.Web1/Program.cs +++ b/src/samples/aspnet/Elsa.Samples.Web1/Program.cs @@ -18,7 +18,6 @@ using Elsa.Persistence.EntityFrameworkCore.Extensions; using Elsa.Persistence.EntityFrameworkCore.Sqlite; using Elsa.Pipelines.WorkflowExecution.Components; using Elsa.Runtime.Extensions; -using Elsa.Runtime.ProtoActor.Extensions; using Elsa.Samples.Web1.Activities; using Elsa.Samples.Web1.Serialization; using Elsa.Samples.Web1.Workflows; diff --git a/src/samples/aspnet/Elsa.Samples.Web2/Elsa.Samples.Web2.csproj b/src/samples/aspnet/Elsa.Samples.Web2/Elsa.Samples.Web2.csproj index 4fd5bb070..14ab92342 100644 --- a/src/samples/aspnet/Elsa.Samples.Web2/Elsa.Samples.Web2.csproj +++ b/src/samples/aspnet/Elsa.Samples.Web2/Elsa.Samples.Web2.csproj @@ -13,7 +13,7 @@ - + diff --git a/src/samples/aspnet/Elsa.Samples.Web3/Elsa.Samples.Web3.csproj b/src/samples/aspnet/Elsa.Samples.Web3/Elsa.Samples.Web3.csproj index dfffe5a56..72b004b2c 100644 --- a/src/samples/aspnet/Elsa.Samples.Web3/Elsa.Samples.Web3.csproj +++ b/src/samples/aspnet/Elsa.Samples.Web3/Elsa.Samples.Web3.csproj @@ -9,7 +9,6 @@ - diff --git a/src/samples/aspnet/Elsa.Samples.Web3/Pages/Index.cshtml.cs b/src/samples/aspnet/Elsa.Samples.Web3/Pages/Index.cshtml.cs index fcdd40047..bd9d92964 100644 --- a/src/samples/aspnet/Elsa.Samples.Web3/Pages/Index.cshtml.cs +++ b/src/samples/aspnet/Elsa.Samples.Web3/Pages/Index.cshtml.cs @@ -1,5 +1,4 @@ -using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.Mvc.RazorPages; +using Microsoft.AspNetCore.Mvc.RazorPages; namespace Elsa.Samples.Web3.Pages; diff --git a/src/samples/aspnet/Elsa.Samples.Web3/Pages/Privacy.cshtml.cs b/src/samples/aspnet/Elsa.Samples.Web3/Pages/Privacy.cshtml.cs index 8a2559ab9..627566e78 100644 --- a/src/samples/aspnet/Elsa.Samples.Web3/Pages/Privacy.cshtml.cs +++ b/src/samples/aspnet/Elsa.Samples.Web3/Pages/Privacy.cshtml.cs @@ -1,5 +1,4 @@ -using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.Mvc.RazorPages; +using Microsoft.AspNetCore.Mvc.RazorPages; namespace Elsa.Samples.Web3.Pages; diff --git a/src/scripting/Elsa.Scripting.JavaScript/Handlers/ConfigureJavaScriptEngineWithActivityOutput.cs b/src/scripting/Elsa.Scripting.JavaScript/Handlers/ConfigureJavaScriptEngineWithActivityOutput.cs index 14f25d66c..abb854349 100644 --- a/src/scripting/Elsa.Scripting.JavaScript/Handlers/ConfigureJavaScriptEngineWithActivityOutput.cs +++ b/src/scripting/Elsa.Scripting.JavaScript/Handlers/ConfigureJavaScriptEngineWithActivityOutput.cs @@ -1,5 +1,4 @@ using Elsa.Mediator.Services; -using Elsa.Models; using Elsa.Scripting.JavaScript.Notifications; using Elsa.Services; diff --git a/test/Elsa.IntegrationTests/WorkflowInvoker/Tests.cs b/test/Elsa.IntegrationTests/WorkflowInvoker/Tests.cs index 5aae0a310..cde6f7320 100644 --- a/test/Elsa.IntegrationTests/WorkflowInvoker/Tests.cs +++ b/test/Elsa.IntegrationTests/WorkflowInvoker/Tests.cs @@ -6,9 +6,7 @@ using Elsa.Persistence.Entities; using Elsa.Persistence.InMemory.Implementations; using Elsa.Pipelines.WorkflowExecution.Components; using Elsa.Runtime.Extensions; -using Elsa.Runtime.Models; using Elsa.Runtime.Services; -using Elsa.Services; using Elsa.Testing.Shared; using Microsoft.Extensions.DependencyInjection; using Xunit;