From 7ed2bc1c1fd97de0a6830b7eab6e70ae16bbaeec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20DEVILLARD?= Date: Tue, 7 Jan 2025 10:05:25 +0100 Subject: [PATCH 01/10] Add Elsa Connection Module (wip on persistence and naming) --- Elsa.sln | 1977 +++++++++-------- .../Elsa.Connections.Api.csproj | 12 + .../List/Endpoint.cs | 33 + .../ActivityConnectionDescriptor/List/Get.cs | 26 + .../List/Request.cs | 6 + .../Endpoints/Add/Endpoint.cs | 40 + .../Endpoints/Delete/Endpoint.cs | 23 + .../Endpoints/List/Endpoint.cs | 24 + .../Extensions/ModuleExtensions.cs | 19 + .../Features/ConnectionsApiFeature.cs | 37 + .../Elsa.Connections.Api/FodyWeavers.xml | 3 + .../Services/InMemoryConnectionRepository.cs | 45 + .../Attributes/ConnectionActivityAttribute.cs | 15 + .../Attributes/ConnectionPropertyAttribute.cs | 15 + .../Attributes/ConnectionTypeAttribute.cs | 13 + .../Attributes/NoLogAttribute.cs | 5 + .../IConnectionDescriptorRegistry.cs | 39 + .../IConnectionDescriptorRepository.cs | 9 + .../Contracts/IConnectionProperty.cs | 16 + .../Contracts/IConnectionRepository.cs | 15 + .../Elsa.Connections.Core.csproj | 15 + .../Extensions/ModuleExtensions.cs | 19 + .../Features/ConnectionsFeatures.cs | 80 + .../Filters/PropertyAttributeFilter.cs | 27 + .../Elsa.Connections.Core/FodyWeavers.xml | 3 + .../Middleware/ConnectionMiddleware.cs | 101 + .../ConnectionConfigurationMetadataModel.cs | 17 + .../Models/ConnectionDescriptor.cs | 3 + .../Models/ConnectionProperties.cs | 20 + .../ConnectionOptionsProvider.cs | 46 + .../Services/ConnectionRegistry.cs | 86 + .../UIHints/ConnexionDropDownUIHintHandler.cs | 18 + .../Elsa.Connections.Models.csproj | 13 + .../Elsa.Connections.Persistence.csproj | 13 + .../Features/ConnectionPersistenceFeature.cs | 58 + .../FodyWeavers.xml | 3 + 36 files changed, 1921 insertions(+), 973 deletions(-) create mode 100644 src/modules/Elsa.Connections.Api/Elsa.Connections.Api.csproj create mode 100644 src/modules/Elsa.Connections.Api/Endpoints/ActivityConnectionDescriptor/List/Endpoint.cs create mode 100644 src/modules/Elsa.Connections.Api/Endpoints/ActivityConnectionDescriptor/List/Get.cs create mode 100644 src/modules/Elsa.Connections.Api/Endpoints/ActivityConnectionDescriptor/List/Request.cs create mode 100644 src/modules/Elsa.Connections.Api/Endpoints/Add/Endpoint.cs create mode 100644 src/modules/Elsa.Connections.Api/Endpoints/Delete/Endpoint.cs create mode 100644 src/modules/Elsa.Connections.Api/Endpoints/List/Endpoint.cs create mode 100644 src/modules/Elsa.Connections.Api/Extensions/ModuleExtensions.cs create mode 100644 src/modules/Elsa.Connections.Api/Features/ConnectionsApiFeature.cs create mode 100644 src/modules/Elsa.Connections.Api/FodyWeavers.xml create mode 100644 src/modules/Elsa.Connections.Api/Services/InMemoryConnectionRepository.cs create mode 100644 src/modules/Elsa.Connections.Core/Attributes/ConnectionActivityAttribute.cs create mode 100644 src/modules/Elsa.Connections.Core/Attributes/ConnectionPropertyAttribute.cs create mode 100644 src/modules/Elsa.Connections.Core/Attributes/ConnectionTypeAttribute.cs create mode 100644 src/modules/Elsa.Connections.Core/Attributes/NoLogAttribute.cs create mode 100644 src/modules/Elsa.Connections.Core/Contracts/IConnectionDescriptorRegistry.cs create mode 100644 src/modules/Elsa.Connections.Core/Contracts/IConnectionDescriptorRepository.cs create mode 100644 src/modules/Elsa.Connections.Core/Contracts/IConnectionProperty.cs create mode 100644 src/modules/Elsa.Connections.Core/Contracts/IConnectionRepository.cs create mode 100644 src/modules/Elsa.Connections.Core/Elsa.Connections.Core.csproj create mode 100644 src/modules/Elsa.Connections.Core/Extensions/ModuleExtensions.cs create mode 100644 src/modules/Elsa.Connections.Core/Features/ConnectionsFeatures.cs create mode 100644 src/modules/Elsa.Connections.Core/Filters/PropertyAttributeFilter.cs create mode 100644 src/modules/Elsa.Connections.Core/FodyWeavers.xml create mode 100644 src/modules/Elsa.Connections.Core/Middleware/ConnectionMiddleware.cs create mode 100644 src/modules/Elsa.Connections.Core/Models/ConnectionConfigurationMetadataModel.cs create mode 100644 src/modules/Elsa.Connections.Core/Models/ConnectionDescriptor.cs create mode 100644 src/modules/Elsa.Connections.Core/Models/ConnectionProperties.cs create mode 100644 src/modules/Elsa.Connections.Core/ServiceProvider/ConnectionOptionsProvider.cs create mode 100644 src/modules/Elsa.Connections.Core/Services/ConnectionRegistry.cs create mode 100644 src/modules/Elsa.Connections.Core/UIHints/ConnexionDropDownUIHintHandler.cs create mode 100644 src/modules/Elsa.Connections.Models/Elsa.Connections.Models.csproj create mode 100644 src/modules/Elsa.Connections.Persistence/Elsa.Connections.Persistence.csproj create mode 100644 src/modules/Elsa.Connections.Persistence/Features/ConnectionPersistenceFeature.cs create mode 100644 src/modules/Elsa.Connections.Persistence/FodyWeavers.xml diff --git a/Elsa.sln b/Elsa.sln index 619e260be..faf54b9c7 100644 --- a/Elsa.sln +++ b/Elsa.sln @@ -1,975 +1,1006 @@ -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.7.34003.232 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{61017E64-6D00-49CB-9E81-5002DC8F7D5F}" - ProjectSection(SolutionItems) = preProject - src\Directory.Build.props = src\Directory.Build.props - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "common", "common", "{C6658DE0-2B2F-47F0-BB61-2CA66D435C09}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "solution", "solution", "{7D21EB5E-D6B4-48A5-A9BC-A26387A65F0B}" - ProjectSection(SolutionItems) = preProject - .editorconfig = .editorconfig - .gitignore = .gitignore - Directory.Build.props = Directory.Build.props - Directory.Packages.props = Directory.Packages.props - icon.png = icon.png - NuGet.Config = NuGet.Config - README.md = README.md - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "docs", "docs", "{0354F050-3992-4DD4-B0EE-5FBA04AC72B6}" - ProjectSection(SolutionItems) = preProject - docs\bounty-footer.md = docs\bounty-footer.md - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "modules", "modules", "{5BA4A8FA-F7F4-45B3-AEC8-8886D35AAC79}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Quartz", "src\modules\Elsa.Quartz\Elsa.Quartz.csproj", "{7D5A49B4-9A9B-496E-803B-DEB85B2C3132}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Http", "src\modules\Elsa.Http\Elsa.Http.csproj", "{82E26BF9-5F3A-4365-899A-AB1FFD54AA45}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Scheduling", "src\modules\Elsa.Scheduling\Elsa.Scheduling.csproj", "{ACD65CE5-3CC2-47B1-BFAC-72443D764F6E}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.AzureServiceBus", "src\modules\Elsa.AzureServiceBus\Elsa.AzureServiceBus.csproj", "{24C7095B-5CDD-4369-9F34-5565A019B195}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.JavaScript", "src\modules\Elsa.JavaScript\Elsa.JavaScript.csproj", "{D31581AB-A6C1-4B73-AB63-45667F6C82AE}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Hangfire", "src\modules\Elsa.Hangfire\Elsa.Hangfire.csproj", "{0601A2A6-2C62-418B-9104-8CDE497E5283}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.WorkflowContexts", "src\modules\Elsa.WorkflowContexts\Elsa.WorkflowContexts.csproj", "{302BFC43-ED2F-43AE-8AD4-FCD481B0AC67}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.MassTransit", "src\modules\Elsa.MassTransit\Elsa.MassTransit.csproj", "{BB983D0B-A939-4008-B9E3-C7C172BCF83A}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{90031D64-CA0F-46D0-9AF4-8DC023A5FFCD}" - ProjectSection(SolutionItems) = preProject - test\Directory.Build.props = test\Directory.Build.props - EndProjectSection -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Labels", "src\modules\Elsa.Labels\Elsa.Labels.csproj", "{80FF5821-E831-450D-AA0C-C76D07D878F4}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Liquid", "src\modules\Elsa.Liquid\Elsa.Liquid.csproj", "{8E5BD3D9-3529-48BC-B741-CFB7A69DB233}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Workflows.Runtime.ProtoActor", "src\modules\Elsa.Workflows.Runtime.ProtoActor\Elsa.Workflows.Runtime.ProtoActor.csproj", "{B2049499-D384-46DF-8837-F1180107DD54}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Dsl", "src\modules\Elsa.Dsl\Elsa.Dsl.csproj", "{78DAB791-8595-4612-8E9E-2248AF5B1862}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Workflows.Api", "src\modules\Elsa.Workflows.Api\Elsa.Workflows.Api.csproj", "{C9539BD8-D2AE-4A8D-8281-71A05B3FBF31}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Workflows.Core", "src\modules\Elsa.Workflows.Core\Elsa.Workflows.Core.csproj", "{169E2C9B-6687-427F-A278-30BF849BFEDC}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Workflows.Management", "src\modules\Elsa.Workflows.Management\Elsa.Workflows.Management.csproj", "{2DD5D66B-85E9-4AF9-911C-C9F963234159}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Workflows.Runtime", "src\modules\Elsa.Workflows.Runtime\Elsa.Workflows.Runtime.csproj", "{8A050229-DB79-4E0B-9AFF-7565E87F2954}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Features", "src\common\Elsa.Features\Elsa.Features.csproj", "{C237BA1A-3A7D-4AB2-BE09-2696F3C082A4}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Expressions", "src\modules\Elsa.Expressions\Elsa.Expressions.csproj", "{80529478-A383-4FEA-B744-C71264969E9A}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Api.Common", "src\common\Elsa.Api.Common\Elsa.Api.Common.csproj", "{39CD855E-83B1-4A96-93F7-01608211EBE3}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Identity", "src\modules\Elsa.Identity\Elsa.Identity.csproj", "{30B49E42-AE61-4F7C-981F-923F07BB3986}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Common", "src\modules\Elsa.Common\Elsa.Common.csproj", "{D229105F-6879-4452-9189-75DE060C0F4C}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.EntityFrameworkCore", "src\modules\Elsa.EntityFrameworkCore\Elsa.EntityFrameworkCore.csproj", "{7CC95512-7F44-45C3-A669-95B7048D4730}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Telnyx", "src\modules\Elsa.Telnyx\Elsa.Telnyx.csproj", "{F09B30F7-AF33-44D7-B835-099D1F72A37E}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Email", "src\modules\Elsa.Email\Elsa.Email.csproj", "{1E5BD8D9-55BE-41E2-B389-6AB9F26C22AF}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "docker", "docker", "{986E5482-0482-448C-B9E4-EC67A9474B85}" - ProjectSection(SolutionItems) = preProject - docker\.dockerignore = docker\.dockerignore - docker\docker-compose-datadog.yml = docker\docker-compose-datadog.yml - docker\docker-compose.yml = docker\docker-compose.yml - docker\ElsaServer-Datadog.Dockerfile = docker\ElsaServer-Datadog.Dockerfile - docker\ElsaServer.Dockerfile = docker\ElsaServer.Dockerfile - docker\ElsaServerAndStudio.Dockerfile = docker\ElsaServerAndStudio.Dockerfile - docker\ElsaStudio.Dockerfile = docker\ElsaStudio.Dockerfile - docker\init-db.sh = docker\init-db.sh - docker\otel-collector-config.yaml = docker\otel-collector-config.yaml +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.7.34003.232 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{61017E64-6D00-49CB-9E81-5002DC8F7D5F}" + ProjectSection(SolutionItems) = preProject + src\Directory.Build.props = src\Directory.Build.props + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "common", "common", "{C6658DE0-2B2F-47F0-BB61-2CA66D435C09}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "solution", "solution", "{7D21EB5E-D6B4-48A5-A9BC-A26387A65F0B}" + ProjectSection(SolutionItems) = preProject + .editorconfig = .editorconfig + .gitignore = .gitignore + Directory.Build.props = Directory.Build.props + Directory.Packages.props = Directory.Packages.props + icon.png = icon.png + NuGet.Config = NuGet.Config + README.md = README.md + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "docs", "docs", "{0354F050-3992-4DD4-B0EE-5FBA04AC72B6}" + ProjectSection(SolutionItems) = preProject + docs\bounty-footer.md = docs\bounty-footer.md + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "modules", "modules", "{5BA4A8FA-F7F4-45B3-AEC8-8886D35AAC79}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Quartz", "src\modules\Elsa.Quartz\Elsa.Quartz.csproj", "{7D5A49B4-9A9B-496E-803B-DEB85B2C3132}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Http", "src\modules\Elsa.Http\Elsa.Http.csproj", "{82E26BF9-5F3A-4365-899A-AB1FFD54AA45}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Scheduling", "src\modules\Elsa.Scheduling\Elsa.Scheduling.csproj", "{ACD65CE5-3CC2-47B1-BFAC-72443D764F6E}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.AzureServiceBus", "src\modules\Elsa.AzureServiceBus\Elsa.AzureServiceBus.csproj", "{24C7095B-5CDD-4369-9F34-5565A019B195}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.JavaScript", "src\modules\Elsa.JavaScript\Elsa.JavaScript.csproj", "{D31581AB-A6C1-4B73-AB63-45667F6C82AE}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Hangfire", "src\modules\Elsa.Hangfire\Elsa.Hangfire.csproj", "{0601A2A6-2C62-418B-9104-8CDE497E5283}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.WorkflowContexts", "src\modules\Elsa.WorkflowContexts\Elsa.WorkflowContexts.csproj", "{302BFC43-ED2F-43AE-8AD4-FCD481B0AC67}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.MassTransit", "src\modules\Elsa.MassTransit\Elsa.MassTransit.csproj", "{BB983D0B-A939-4008-B9E3-C7C172BCF83A}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{90031D64-CA0F-46D0-9AF4-8DC023A5FFCD}" + ProjectSection(SolutionItems) = preProject + test\Directory.Build.props = test\Directory.Build.props + EndProjectSection +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Labels", "src\modules\Elsa.Labels\Elsa.Labels.csproj", "{80FF5821-E831-450D-AA0C-C76D07D878F4}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Liquid", "src\modules\Elsa.Liquid\Elsa.Liquid.csproj", "{8E5BD3D9-3529-48BC-B741-CFB7A69DB233}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Workflows.Runtime.ProtoActor", "src\modules\Elsa.Workflows.Runtime.ProtoActor\Elsa.Workflows.Runtime.ProtoActor.csproj", "{B2049499-D384-46DF-8837-F1180107DD54}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Dsl", "src\modules\Elsa.Dsl\Elsa.Dsl.csproj", "{78DAB791-8595-4612-8E9E-2248AF5B1862}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Workflows.Api", "src\modules\Elsa.Workflows.Api\Elsa.Workflows.Api.csproj", "{C9539BD8-D2AE-4A8D-8281-71A05B3FBF31}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Workflows.Core", "src\modules\Elsa.Workflows.Core\Elsa.Workflows.Core.csproj", "{169E2C9B-6687-427F-A278-30BF849BFEDC}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Workflows.Management", "src\modules\Elsa.Workflows.Management\Elsa.Workflows.Management.csproj", "{2DD5D66B-85E9-4AF9-911C-C9F963234159}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Workflows.Runtime", "src\modules\Elsa.Workflows.Runtime\Elsa.Workflows.Runtime.csproj", "{8A050229-DB79-4E0B-9AFF-7565E87F2954}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Features", "src\common\Elsa.Features\Elsa.Features.csproj", "{C237BA1A-3A7D-4AB2-BE09-2696F3C082A4}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Expressions", "src\modules\Elsa.Expressions\Elsa.Expressions.csproj", "{80529478-A383-4FEA-B744-C71264969E9A}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Api.Common", "src\common\Elsa.Api.Common\Elsa.Api.Common.csproj", "{39CD855E-83B1-4A96-93F7-01608211EBE3}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Identity", "src\modules\Elsa.Identity\Elsa.Identity.csproj", "{30B49E42-AE61-4F7C-981F-923F07BB3986}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Common", "src\modules\Elsa.Common\Elsa.Common.csproj", "{D229105F-6879-4452-9189-75DE060C0F4C}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.EntityFrameworkCore", "src\modules\Elsa.EntityFrameworkCore\Elsa.EntityFrameworkCore.csproj", "{7CC95512-7F44-45C3-A669-95B7048D4730}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Telnyx", "src\modules\Elsa.Telnyx\Elsa.Telnyx.csproj", "{F09B30F7-AF33-44D7-B835-099D1F72A37E}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Email", "src\modules\Elsa.Email\Elsa.Email.csproj", "{1E5BD8D9-55BE-41E2-B389-6AB9F26C22AF}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "docker", "docker", "{986E5482-0482-448C-B9E4-EC67A9474B85}" + ProjectSection(SolutionItems) = preProject + docker\.dockerignore = docker\.dockerignore + docker\docker-compose-datadog.yml = docker\docker-compose-datadog.yml + docker\docker-compose.yml = docker\docker-compose.yml + docker\ElsaServer-Datadog.Dockerfile = docker\ElsaServer-Datadog.Dockerfile + docker\ElsaServer.Dockerfile = docker\ElsaServer.Dockerfile + docker\ElsaServerAndStudio.Dockerfile = docker\ElsaServerAndStudio.Dockerfile + docker\ElsaStudio.Dockerfile = docker\ElsaStudio.Dockerfile + docker\init-db.sh = docker\init-db.sh + docker\otel-collector-config.yaml = docker\otel-collector-config.yaml docker\docker-compose-kafka.yml = docker\docker-compose-kafka.yml - EndProjectSection -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Elasticsearch", "src\modules\Elsa.Elasticsearch\Elsa.Elasticsearch.csproj", "{3246883E-2FA7-4B4A-BDC5-99039A2869BC}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Webhooks", "src\modules\Elsa.Webhooks\Elsa.Webhooks.csproj", "{2BBFDE36-28A7-4875-8EBE-CC25C76B97FF}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "unit", "unit", "{18453B51-25EB-4317-A4B3-B10518252E92}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "integration", "integration", "{1B8D5897-902E-4632-8698-E89CAF3DDF54}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "component", "component", "{08B41FFA-CEE3-46A7-B5C0-3EB65D37A16C}" - ProjectSection(SolutionItems) = preProject - test\component\Directory.Build.props = test\component\Directory.Build.props - EndProjectSection -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Workflows.IntegrationTests", "test\integration\Elsa.Workflows.IntegrationTests\Elsa.Workflows.IntegrationTests.csproj", "{E9652738-2B3D-4357-B84B-54F0EA161382}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "clients", "clients", "{89608AA5-5ADE-4832-AC7B-871C4AE64210}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Api.Client", "src\clients\Elsa.Api.Client\Elsa.Api.Client.csproj", "{1FCB2200-28B8-4703-8E89-73241AAED047}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Environments", "src\modules\Elsa.Environments\Elsa.Environments.csproj", "{B5CDF747-8066-40D5-9BAE-CBE397BC9B51}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "persistence", "persistence", "{9B4F139F-7D26-435C-A561-89E65A67A8E5}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "scripting", "scripting", "{6EF07978-A6D2-40EB-891D-7D70C5F37E76}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "servicebus", "servicebus", "{DD089B8B-DA73-492A-9010-F772D1C178DA}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "security", "security", "{5948B0A5-7873-4DBB-BA03-EB283D6EA91B}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "workflows", "workflows", "{B08B4E00-C2AB-48F3-8389-449F42AEF179}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "timers", "timers", "{AB797AF0-C12C-46DE-A157-7E25625C6200}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "runtimes", "runtimes", "{58C59255-281C-4595-8732-808158F1DC6E}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Dapper", "src\modules\Elsa.Dapper\Elsa.Dapper.csproj", "{4D8F3BB2-709D-481A-8FD3-0DA9762B366D}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Dapper.Migrations", "src\modules\Elsa.Dapper.Migrations\Elsa.Dapper.Migrations.csproj", "{A86DF0F0-24E9-470E-984B-9E7332544972}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.WorkflowProviders.BlobStorage", "src\modules\Elsa.WorkflowProviders.BlobStorage\Elsa.WorkflowProviders.BlobStorage.csproj", "{A702DD84-B55C-4807-9C28-D8F5AC3CCA78}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.MongoDb", "src\modules\Elsa.MongoDb\Elsa.MongoDb.csproj", "{3A377A6A-F735-4010-9E00-72E8BEB8F1F2}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Mediator", "src\common\Elsa.Mediator\Elsa.Mediator.csproj", "{28818676-F6AF-4203-8B65-BD33A50CB9A2}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Workflows.Core.UnitTests", "test\unit\Elsa.Workflows.Core.UnitTests\Elsa.Workflows.Core.UnitTests.csproj", "{DC9CCAD0-7363-4691-B964-FF5B3AEA3F95}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.DropIns.Core", "src\common\Elsa.DropIns.Core\Elsa.DropIns.Core.csproj", "{1B794B9C-9B8A-4D5A-9848-B51274BD1FC5}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.DropIns", "src\common\Elsa.DropIns\Elsa.DropIns.csproj", "{4E7F15D1-729E-4DA7-992A-C3A2C6054B37}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.SasTokens", "src\modules\Elsa.SasTokens\Elsa.SasTokens.csproj", "{3095C95A-F1F9-487A-A983-1B100A33E4C7}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "alterations", "alterations", "{CF3DA5F1-F98D-49C9-A980-27E570B38B8D}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Alterations.Core", "src\modules\Elsa.Alterations.Core\Elsa.Alterations.Core.csproj", "{8DBEC8F3-908D-46B3-95CA-47EA138AB1A4}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Alterations", "src\modules\Elsa.Alterations\Elsa.Alterations.csproj", "{CC7DE119-736D-4FC5-85DC-70A6770749F6}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.EntityFrameworkCore.Sqlite", "src\modules\Elsa.EntityFrameworkCore.Sqlite\Elsa.EntityFrameworkCore.Sqlite.csproj", "{EFE4A814-F58D-4C19-8F7F-B95F4EE343F0}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.EntityFrameworkCore.SqlServer", "src\modules\Elsa.EntityFrameworkCore.SqlServer\Elsa.EntityFrameworkCore.SqlServer.csproj", "{1C84408D-A0A7-4513-AD9A-1BA137ABE62C}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.EntityFrameworkCore.MySql", "src\modules\Elsa.EntityFrameworkCore.MySql\Elsa.EntityFrameworkCore.MySql.csproj", "{E4300D97-1D53-4029-9435-483FB7EC9621}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.EntityFrameworkCore.PostgreSql", "src\modules\Elsa.EntityFrameworkCore.PostgreSql\Elsa.EntityFrameworkCore.PostgreSql.csproj", "{84AB9951-3DBF-43A4-8F5D-AEED1102CE88}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Alterations.MassTransit", "src\modules\Elsa.Alterations.MassTransit\Elsa.Alterations.MassTransit.csproj", "{1F621382-08FB-45EA-B94C-96A7FECB9489}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.EntityFrameworkCore.Common", "src\modules\Elsa.EntityFrameworkCore.Common\Elsa.EntityFrameworkCore.Common.csproj", "{FBA14F8A-9F14-4364-ABDB-B8AE81A0D755}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Quartz.EntityFrameworkCore.Sqlite", "src\modules\Elsa.Quartz.EntityFrameworkCore.Sqlite\Elsa.Quartz.EntityFrameworkCore.Sqlite.csproj", "{A71557F2-D5FB-4772-9391-F7D18A3B6C44}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Quartz.EntityFrameworkCore.SqlServer", "src\modules\Elsa.Quartz.EntityFrameworkCore.SqlServer\Elsa.Quartz.EntityFrameworkCore.SqlServer.csproj", "{05F3B23E-CF28-467B-AD3C-595EA4ED6B96}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Quartz.EntityFrameworkCore.MySql", "src\modules\Elsa.Quartz.EntityFrameworkCore.MySql\Elsa.Quartz.EntityFrameworkCore.MySql.csproj", "{74ACD9D0-8B4C-42FA-A582-E93BF0075023}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Quartz.EntityFrameworkCore.PostgreSql", "src\modules\Elsa.Quartz.EntityFrameworkCore.PostgreSql\Elsa.Quartz.EntityFrameworkCore.PostgreSql.csproj", "{CCCCEF8C-7D96-4BEA-B9D0-E91EDF08E65D}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.EntityFrameworkCore.Oracle", "src\modules\Elsa.EntityFrameworkCore.Oracle\Elsa.EntityFrameworkCore.Oracle.csproj", "{49D8D2CF-AF68-40FA-951F-018247C97443}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.FileStorage", "src\modules\Elsa.FileStorage\Elsa.FileStorage.csproj", "{732BF088-6AD7-4C4D-9A48-8074253596D4}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "storage", "storage", "{B818988E-639C-4E6E-85C1-B231BCAD9DAB}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Tenants", "src\modules\Elsa.Tenants\Elsa.Tenants.csproj", "{29638A67-E79F-44FE-AC05-DA499EBA929E}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.CSharp", "src\modules\Elsa.CSharp\Elsa.CSharp.csproj", "{24331E82-D7AF-45B1-ACF0-CA6C3B0B77DC}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Python", "src\modules\Elsa.Python\Elsa.Python.csproj", "{790E94F2-5393-47DF-AC52-D9247F5B243A}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.MassTransit.RabbitMq", "src\modules\Elsa.MassTransit.RabbitMq\Elsa.MassTransit.RabbitMq.csproj", "{169BEA3D-2A81-47EE-A6C1-3F8719EEC1F6}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "pipelines", "pipelines", "{B789B743-0FBE-4BBC-9F45-84C20C8D4814}" - ProjectSection(SolutionItems) = preProject - .github\workflows\bounty.yml = .github\workflows\bounty.yml - .github\workflows\elsa-server-and-studio.yml = .github\workflows\elsa-server-and-studio.yml - .github\workflows\elsa-server.yml = .github\workflows\elsa-server.yml - .github\workflows\elsa-studio.yml = .github\workflows\elsa-studio.yml - .github\workflows\packages.yml = .github\workflows\packages.yml - .github\workflows\pr.yml = .github\workflows\pr.yml - .github\workflows\stale.yml = .github\workflows\stale.yml - EndProjectSection -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "_build", "build\_build.csproj", "{99F2B1DA-2F69-4D70-A2A3-AC985AD91EC4}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.MassTransit.AzureServiceBus", "src\modules\Elsa.MassTransit.AzureServiceBus\Elsa.MassTransit.AzureServiceBus.csproj", "{AFEB799E-82C3-4D02-9D5C-766BB8DEF004}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "scripts", "scripts", "{C80C8231-D35C-4ACC-9ED6-9F3DB221535E}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Alterations.IntegrationTests", "test\integration\Elsa.Alterations.IntegrationTests\Elsa.Alterations.IntegrationTests.csproj", "{F50336DA-42D1-4DD1-A107-67AFEB8A33EE}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "hosting", "hosting", "{A516931E-EDBB-4FC3-BB94-1BB824D5BC61}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Hosting.Management", "src\modules\Elsa.Hosting.Management\Elsa.Hosting.Management.csproj", "{BBCE36D1-6767-4ED1-B3E8-84D2567A962A}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.KeyValues", "src\modules\Elsa.KeyValues\Elsa.KeyValues.csproj", "{73BBB1E3-AEEC-44E8-83D7-6DD9CD687FE3}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Workflows.Runtime.UnitTests", "test\unit\Elsa.Workflows.Runtime.UnitTests\Elsa.Workflows.Runtime.UnitTests.csproj", "{B0946844-DE0E-4C59-9391-C0EB649DBF4E}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Caching", "src\modules\Elsa.Caching\Elsa.Caching.csproj", "{A1FE2CA0-8EF3-4EDB-9055-DD282E374E16}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "caching", "caching", "{EB3A7401-0DE3-476F-9E6F-057F1F4590FB}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Caching.Distributed.MassTransit", "src\modules\Elsa.Caching.Distributed.MassTransit\Elsa.Caching.Distributed.MassTransit.csproj", "{BF4CDE28-F0CC-482D-8392-C1C9BB4C368F}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Caching.Distributed", "src\modules\Elsa.Caching.Distributed\Elsa.Caching.Distributed.csproj", "{7EB0CFB8-B668-4F3F-898D-80411095BC2F}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Workflows.ComponentTests", "test\component\Elsa.Workflows.ComponentTests\Elsa.Workflows.ComponentTests.csproj", "{34BC9836-681D-43A5-BC39-E4FEE17FC528}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "performance", "performance", "{CBB515F3-A0EF-43B5-A907-FD4E652DD66E}" - ProjectSection(SolutionItems) = preProject - test\performance\Directory.Build.props = test\performance\Directory.Build.props - EndProjectSection -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Workflows.PerformanceTests", "test\performance\Elsa.Workflows.PerformanceTests\Elsa.Workflows.PerformanceTests.csproj", "{90CD37A9-C866-4D90-A3B1-8C87F53B845E}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "retention", "retention", "{3F20899B-C5E1-485F-808B-ADB1877EB3FD}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Retention", "src\modules\Elsa.Retention\Elsa.Retention.csproj", "{3D42FCA2-5BD0-4624-9FCA-F4BF935B27AE}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.MongoDb.UnitTests", "test\unit\Elsa.MongoDb.UnitTests\Elsa.MongoDb.UnitTests.csproj", "{56CAA9F2-1882-4EFA-BAC0-9C3D804553F1}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Workflows.Runtime.Distributed", "src\modules\Elsa.Workflows.Runtime.Distributed\Elsa.Workflows.Runtime.Distributed.csproj", "{0D4A88A1-8AEE-49ED-BC2E-ED68C96F60AD}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Testing.Shared", "src\common\Elsa.Testing.Shared\Elsa.Testing.Shared.csproj", "{5CBCBEA4-6038-48CA-B45D-C1D0F6B4ACA4}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Testing.Shared.Integration", "src\common\Elsa.Testing.Shared.Integration\Elsa.Testing.Shared.Integration.csproj", "{94A61AD7-2A2B-40DB-81F3-C59D596958A8}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Testing.Shared.Component", "src\common\Elsa.Testing.Shared.Component\Elsa.Testing.Shared.Component.csproj", "{4B598AF7-BD7D-4544-A274-2CDDD98F4167}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Activities.IntegrationTests", "test\integration\Elsa.Activities.IntegrationTests\Elsa.Activities.IntegrationTests.csproj", "{99B171E6-0248-4402-836D-98947CD63772}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.JavaScript.IntegrationTests", "test\integration\Elsa.JavaScript.IntegrationTests\Elsa.JavaScript.IntegrationTests.csproj", "{4332A6BC-434A-4AF5-A075-F1BBCDD28F5D}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.AzureServiceBus.ComponentTests", "test\component\Elsa.AzureServiceBus.ComponentTests\Elsa.AzureServiceBus.ComponentTests.csproj", "{7F5A304F-7DD9-4A64-8FCD-9B1FF06735B9}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "apps", "apps", "{D92BEAB2-60D6-4BB4-885A-6BA681C6CCF1}" - ProjectSection(SolutionItems) = preProject - src\apps\Directory.Build.props = src\apps\Directory.Build.props - EndProjectSection -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Server.Web", "src\apps\Elsa.Server.Web\Elsa.Server.Web.csproj", "{5ADDDFB1-E59B-4097-97B7-8C24E2D60463}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa", "src\modules\Elsa\Elsa.csproj", "{97C7E531-9D5F-43FD-AA19-BF24DA13B612}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Server.LoadBalancer", "src\apps\Elsa.Server.LoadBalancer\Elsa.Server.LoadBalancer.csproj", "{65F2AD97-3ECF-4BA6-8AAA-1E5882FDCE68}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ElsaStudioWebAssembly", "src\apps\ElsaStudioWebAssembly\ElsaStudioWebAssembly.csproj", "{690B0274-291F-4D9E-BA76-54EFF7D3E4BC}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.ServerAndStudio.Web", "src\apps\Elsa.ServerAndStudio.Web\Elsa.ServerAndStudio.Web.csproj", "{060FD0BA-BD78-48E1-A8A7-4906A5AD5E39}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Studio.Web", "src\apps\Elsa.Studio.Web\Elsa.Studio.Web.csproj", "{169A82A5-2DB3-40EA-801E-14C08D743DF7}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.OpenTelemetry", "src\modules\Elsa.OpenTelemetry\Elsa.OpenTelemetry.csproj", "{2CDF3E1C-267D-4198-B1C7-7E1F548FC120}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.ProtoActor.Core", "src\modules\Elsa.ProtoActor.Core\Elsa.ProtoActor.Core.csproj", "{01B96BB9-35E8-4364-ACB8-6D12A14D8DBA}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Caching.Distributed.ProtoActor", "src\modules\Elsa.Caching.Distributed.ProtoActor\Elsa.Caching.Distributed.ProtoActor.csproj", "{47FBCB04-0C2D-453C-BE2F-7052CAC22524}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "k8s", "k8s", "{B32DB9B2-AD6C-48A5-8682-4373CB045185}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "elsa-server", "elsa-server", "{454652D5-E1BB-4D4B-9B21-9CEFC900C4FB}" - ProjectSection(SolutionItems) = preProject - scripts\k8s\elsa-server\deployment.yaml = scripts\k8s\elsa-server\deployment.yaml - scripts\k8s\elsa-server\role-binding.yaml = scripts\k8s\elsa-server\role-binding.yaml - scripts\k8s\elsa-server\role.yaml = scripts\k8s\elsa-server\role.yaml - scripts\k8s\elsa-server\service-account.yml = scripts\k8s\elsa-server\service-account.yml - scripts\k8s\elsa-server\service.yaml = scripts\k8s\elsa-server\service.yaml - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "postgres", "postgres", "{31089E79-694B-4F45-97AF-86D34A7B231E}" - ProjectSection(SolutionItems) = preProject - scripts\k8s\postgres\config-map.yaml = scripts\k8s\postgres\config-map.yaml - scripts\k8s\postgres\deployment.yaml = scripts\k8s\postgres\deployment.yaml - scripts\k8s\postgres\service.yml = scripts\k8s\postgres\service.yml - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "plant-uml", "plant-uml", "{6DDB9ECF-D454-4894-A262-A6BB3026E61E}" - ProjectSection(SolutionItems) = preProject - scripts\k8s\plant-uml\deployment.yaml = scripts\k8s\plant-uml\deployment.yaml - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "trace-lens", "trace-lens", "{16B570BC-E293-4A19-B20E-5C97BAF8476B}" - ProjectSection(SolutionItems) = preProject - scripts\k8s\trace-lens\deployment.yaml = scripts\k8s\trace-lens\deployment.yaml - scripts\k8s\trace-lens\service.yaml = scripts\k8s\trace-lens\service.yaml - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "integrations", "integrations", "{EBD0CF78-C5D7-4B4B-94C9-C5D8C20B6F59}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.OrchardCore", "src\modules\Elsa.OrchardCore\Elsa.OrchardCore.csproj", "{B0460856-7E6D-4B1E-B243-8E20662FC32E}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "agents", "agents", "{50470834-4CD8-479A-8B58-0A1869BA5D37}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Agents.Core", "src\modules\Elsa.Agents.Core\Elsa.Agents.Core.csproj", "{5BD671F0-9603-4C2F-8364-54B02986EAA2}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Agents.Api", "src\modules\Elsa.Agents.Api\Elsa.Agents.Api.csproj", "{154525CD-3726-45B7-9A9C-553BBC60EB10}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Agents.Activities", "src\modules\Elsa.Agents.Activities\Elsa.Agents.Activities.csproj", "{F620D7DC-B58D-4BD0-81A2-E88A2C1E4833}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Agents.Persistence.EntityFrameworkCore", "src\modules\Elsa.Agents.Persistence.EntityFrameworkCore\Elsa.Agents.Persistence.EntityFrameworkCore.csproj", "{6FE60BB4-DE6A-485C-A38A-1317C56AF2DA}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "nuke", "nuke", "{57326431-9C6C-4BAB-AA51-15131C21ADCC}" - ProjectSection(SolutionItems) = preProject - scripts\nuke\build.cmd = scripts\nuke\build.cmd - scripts\nuke\build.ps1 = scripts\nuke\build.ps1 - scripts\nuke\build.sh = scripts\nuke\build.sh - EndProjectSection -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Secrets.Core", "src\modules\Elsa.Secrets.Core\Elsa.Secrets.Core.csproj", "{34FAB60D-7259-47B9-B50E-B533C7C3CFEC}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "secrets", "secrets", "{8CEEC194-820A-4C8D-AB9E-E51E6D3E9CC1}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Secrets.Management", "src\modules\Elsa.Secrets.Management\Elsa.Secrets.Management.csproj", "{19329441-2A59-4BAC-A1BE-BBAB70C93CA0}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Secrets.Api", "src\modules\Elsa.Secrets.Api\Elsa.Secrets.Api.csproj", "{37D16EAF-ACD8-4105-8BD3-B2745819CFF8}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Agents.Persistence", "src\modules\Elsa.Agents.Persistence\Elsa.Agents.Persistence.csproj", "{CFEC357F-0863-4458-A6C4-5D7AA0E44759}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Agents.Persistence.EntityFrameworkCore.Sqlite", "src\modules\Elsa.Agents.Persistence.EntityFrameworkCore.Sqlite\Elsa.Agents.Persistence.EntityFrameworkCore.Sqlite.csproj", "{E75762D2-FD12-4165-810B-628C28CB2562}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "migrations", "migrations", "{3666CF13-1353-4620-9472-506670214A6A}" - ProjectSection(SolutionItems) = preProject - scripts\migrations\efcore-3.0.sh = scripts\migrations\efcore-3.0.sh - scripts\migrations\efcore-3.1-sql.sh = scripts\migrations\efcore-3.1-sql.sh - scripts\migrations\efcore-3.1.sh = scripts\migrations\efcore-3.1.sh - scripts\migrations\efcore-3.2.sh = scripts\migrations\efcore-3.2.sh - scripts\migrations\efcore-3.3.sh = scripts\migrations\efcore-3.3.sh - scripts\migrations\README.md = scripts\migrations\README.md - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "docker", "docker", "{AA5ACF15-8647-4AC9-B9F5-73FCB92BE7E3}" - ProjectSection(SolutionItems) = preProject - scripts\docker\build-and-run-all-in-one-web-docker.sh = scripts\docker\build-and-run-all-in-one-web-docker.sh - scripts\docker\docker-compose.yml = scripts\docker\docker-compose.yml - scripts\docker\docker-run-all-in-one-web.ps1 = scripts\docker\docker-run-all-in-one-web.ps1 - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "elsa-studio", "elsa-studio", "{DFFE6199-B5A7-4BA8-A5E1-77D0426C6468}" - ProjectSection(SolutionItems) = preProject - scripts\k8s\elsa-studio\deployment.yaml = scripts\k8s\elsa-studio\deployment.yaml - scripts\k8s\elsa-studio\service.yaml = scripts\k8s\elsa-studio\service.yaml - EndProjectSection -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Agents.Models", "src\modules\Elsa.Agents.Models\Elsa.Agents.Models.csproj", "{052C4F97-5909-4D88-AA49-4B0D9058A0A9}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Secrets.Persistence.EntityFrameworkCore", "src\modules\Elsa.Secrets.Persistence.EntityFrameworkCore\Elsa.Secrets.Persistence.EntityFrameworkCore.csproj", "{9A6D67DE-51B1-456D-B25D-19E0356C8F60}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Secrets.Persistence.EntityFrameworkCore.Sqlite", "src\modules\Elsa.Secrets.Persistence.EntityFrameworkCore.Sqlite\Elsa.Secrets.Persistence.EntityFrameworkCore.Sqlite.csproj", "{44A03CF6-4EB6-434C-90D1-FF8142FE394E}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Agents.Persistence.EntityFrameworkCore.SqlServer", "src\modules\Elsa.Agents.Persistence.EntityFrameworkCore.SqlServer\Elsa.Agents.Persistence.EntityFrameworkCore.SqlServer.csproj", "{A9140976-DFF9-432A-B1DC-E188A07C49E5}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Agents.Persistence.EntityFrameworkCore.MySql", "src\modules\Elsa.Agents.Persistence.EntityFrameworkCore.MySql\Elsa.Agents.Persistence.EntityFrameworkCore.MySql.csproj", "{B3046301-6F00-4885-8B01-080BD489055C}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Secrets.Models", "src\modules\Elsa.Secrets.Models\Elsa.Secrets.Models.csproj", "{29D12ADC-55E9-40D0-9E4C-F0EBB6E098EC}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Secrets.Scripting", "src\modules\Elsa.Secrets.Scripting\Elsa.Secrets.Scripting.csproj", "{6C606FEB-9A1F-4816-ABE4-22AFA8CEE771}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.JavaScript.Libraries", "src\modules\Elsa.JavaScript.Libraries\Elsa.JavaScript.Libraries.csproj", "{5F80663C-B072-49DE-9A67-FD804BAD787E}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Secrets.Persistence.EntityFrameworkCore.PostgreSql", "src\modules\Elsa.Secrets.Persistence.EntityFrameworkCore.PostgreSql\Elsa.Secrets.Persistence.EntityFrameworkCore.PostgreSql.csproj", "{630E2D93-7F7D-4A8A-BB52-D8095A1F24D9}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Secrets.Persistence.EntityFrameworkCore.SqlServer", "src\modules\Elsa.Secrets.Persistence.EntityFrameworkCore.SqlServer\Elsa.Secrets.Persistence.EntityFrameworkCore.SqlServer.csproj", "{59E7614A-3630-4C39-9C7F-9E12BC95D37E}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "multitenancy", "multitenancy", "{2F3E1026-5054-4E1F-899B-F1A7F70F9912}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Tenants.AspNetCore", "src\modules\Elsa.Tenants.AspNetCore\Elsa.Tenants.AspNetCore.csproj", "{D5720DBC-8C2B-42D5-9D9F-2FF6EAD4001C}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Agents.Persistence.EntityFrameworkCore.PostgreSql", "src\modules\Elsa.Agents.Persistence.EntityFrameworkCore.PostgreSql\Elsa.Agents.Persistence.EntityFrameworkCore.PostgreSql.csproj", "{2B939AC9-03A4-479E-AA0D-CB58F4A7F480}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Kafka", "src\modules\Elsa.Kafka\Elsa.Kafka.csproj", "{BF934627-F531-44FB-BEC2-ECA801FF31E7}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {7D5A49B4-9A9B-496E-803B-DEB85B2C3132}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7D5A49B4-9A9B-496E-803B-DEB85B2C3132}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7D5A49B4-9A9B-496E-803B-DEB85B2C3132}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7D5A49B4-9A9B-496E-803B-DEB85B2C3132}.Release|Any CPU.Build.0 = Release|Any CPU - {82E26BF9-5F3A-4365-899A-AB1FFD54AA45}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {82E26BF9-5F3A-4365-899A-AB1FFD54AA45}.Debug|Any CPU.Build.0 = Debug|Any CPU - {82E26BF9-5F3A-4365-899A-AB1FFD54AA45}.Release|Any CPU.ActiveCfg = Release|Any CPU - {82E26BF9-5F3A-4365-899A-AB1FFD54AA45}.Release|Any CPU.Build.0 = Release|Any CPU - {ACD65CE5-3CC2-47B1-BFAC-72443D764F6E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {ACD65CE5-3CC2-47B1-BFAC-72443D764F6E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {ACD65CE5-3CC2-47B1-BFAC-72443D764F6E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {ACD65CE5-3CC2-47B1-BFAC-72443D764F6E}.Release|Any CPU.Build.0 = Release|Any CPU - {24C7095B-5CDD-4369-9F34-5565A019B195}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {24C7095B-5CDD-4369-9F34-5565A019B195}.Debug|Any CPU.Build.0 = Debug|Any CPU - {24C7095B-5CDD-4369-9F34-5565A019B195}.Release|Any CPU.ActiveCfg = Release|Any CPU - {24C7095B-5CDD-4369-9F34-5565A019B195}.Release|Any CPU.Build.0 = Release|Any CPU - {D31581AB-A6C1-4B73-AB63-45667F6C82AE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D31581AB-A6C1-4B73-AB63-45667F6C82AE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D31581AB-A6C1-4B73-AB63-45667F6C82AE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D31581AB-A6C1-4B73-AB63-45667F6C82AE}.Release|Any CPU.Build.0 = Release|Any CPU - {0601A2A6-2C62-418B-9104-8CDE497E5283}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0601A2A6-2C62-418B-9104-8CDE497E5283}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0601A2A6-2C62-418B-9104-8CDE497E5283}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0601A2A6-2C62-418B-9104-8CDE497E5283}.Release|Any CPU.Build.0 = Release|Any CPU - {302BFC43-ED2F-43AE-8AD4-FCD481B0AC67}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {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 - {BB983D0B-A939-4008-B9E3-C7C172BCF83A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BB983D0B-A939-4008-B9E3-C7C172BCF83A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BB983D0B-A939-4008-B9E3-C7C172BCF83A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BB983D0B-A939-4008-B9E3-C7C172BCF83A}.Release|Any CPU.Build.0 = Release|Any CPU - {80FF5821-E831-450D-AA0C-C76D07D878F4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {80FF5821-E831-450D-AA0C-C76D07D878F4}.Debug|Any CPU.Build.0 = Debug|Any CPU - {80FF5821-E831-450D-AA0C-C76D07D878F4}.Release|Any CPU.ActiveCfg = Release|Any CPU - {80FF5821-E831-450D-AA0C-C76D07D878F4}.Release|Any CPU.Build.0 = Release|Any CPU - {8E5BD3D9-3529-48BC-B741-CFB7A69DB233}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {8E5BD3D9-3529-48BC-B741-CFB7A69DB233}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8E5BD3D9-3529-48BC-B741-CFB7A69DB233}.Release|Any CPU.ActiveCfg = Release|Any CPU - {8E5BD3D9-3529-48BC-B741-CFB7A69DB233}.Release|Any CPU.Build.0 = Release|Any CPU - {B2049499-D384-46DF-8837-F1180107DD54}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B2049499-D384-46DF-8837-F1180107DD54}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B2049499-D384-46DF-8837-F1180107DD54}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B2049499-D384-46DF-8837-F1180107DD54}.Release|Any CPU.Build.0 = Release|Any CPU - {78DAB791-8595-4612-8E9E-2248AF5B1862}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {78DAB791-8595-4612-8E9E-2248AF5B1862}.Debug|Any CPU.Build.0 = Debug|Any CPU - {78DAB791-8595-4612-8E9E-2248AF5B1862}.Release|Any CPU.ActiveCfg = Release|Any CPU - {78DAB791-8595-4612-8E9E-2248AF5B1862}.Release|Any CPU.Build.0 = Release|Any CPU - {C9539BD8-D2AE-4A8D-8281-71A05B3FBF31}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C9539BD8-D2AE-4A8D-8281-71A05B3FBF31}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C9539BD8-D2AE-4A8D-8281-71A05B3FBF31}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C9539BD8-D2AE-4A8D-8281-71A05B3FBF31}.Release|Any CPU.Build.0 = Release|Any CPU - {169E2C9B-6687-427F-A278-30BF849BFEDC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {169E2C9B-6687-427F-A278-30BF849BFEDC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {169E2C9B-6687-427F-A278-30BF849BFEDC}.Release|Any CPU.ActiveCfg = Release|Any CPU - {169E2C9B-6687-427F-A278-30BF849BFEDC}.Release|Any CPU.Build.0 = Release|Any CPU - {2DD5D66B-85E9-4AF9-911C-C9F963234159}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2DD5D66B-85E9-4AF9-911C-C9F963234159}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2DD5D66B-85E9-4AF9-911C-C9F963234159}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2DD5D66B-85E9-4AF9-911C-C9F963234159}.Release|Any CPU.Build.0 = Release|Any CPU - {8A050229-DB79-4E0B-9AFF-7565E87F2954}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {8A050229-DB79-4E0B-9AFF-7565E87F2954}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8A050229-DB79-4E0B-9AFF-7565E87F2954}.Release|Any CPU.ActiveCfg = Release|Any CPU - {8A050229-DB79-4E0B-9AFF-7565E87F2954}.Release|Any CPU.Build.0 = Release|Any CPU - {C237BA1A-3A7D-4AB2-BE09-2696F3C082A4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C237BA1A-3A7D-4AB2-BE09-2696F3C082A4}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C237BA1A-3A7D-4AB2-BE09-2696F3C082A4}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C237BA1A-3A7D-4AB2-BE09-2696F3C082A4}.Release|Any CPU.Build.0 = Release|Any CPU - {80529478-A383-4FEA-B744-C71264969E9A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {80529478-A383-4FEA-B744-C71264969E9A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {80529478-A383-4FEA-B744-C71264969E9A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {80529478-A383-4FEA-B744-C71264969E9A}.Release|Any CPU.Build.0 = Release|Any CPU - {39CD855E-83B1-4A96-93F7-01608211EBE3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {39CD855E-83B1-4A96-93F7-01608211EBE3}.Debug|Any CPU.Build.0 = Debug|Any CPU - {39CD855E-83B1-4A96-93F7-01608211EBE3}.Release|Any CPU.ActiveCfg = Release|Any CPU - {39CD855E-83B1-4A96-93F7-01608211EBE3}.Release|Any CPU.Build.0 = Release|Any CPU - {30B49E42-AE61-4F7C-981F-923F07BB3986}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {30B49E42-AE61-4F7C-981F-923F07BB3986}.Debug|Any CPU.Build.0 = Debug|Any CPU - {30B49E42-AE61-4F7C-981F-923F07BB3986}.Release|Any CPU.ActiveCfg = Release|Any CPU - {30B49E42-AE61-4F7C-981F-923F07BB3986}.Release|Any CPU.Build.0 = Release|Any CPU - {D229105F-6879-4452-9189-75DE060C0F4C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D229105F-6879-4452-9189-75DE060C0F4C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D229105F-6879-4452-9189-75DE060C0F4C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D229105F-6879-4452-9189-75DE060C0F4C}.Release|Any CPU.Build.0 = Release|Any CPU - {7CC95512-7F44-45C3-A669-95B7048D4730}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7CC95512-7F44-45C3-A669-95B7048D4730}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7CC95512-7F44-45C3-A669-95B7048D4730}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7CC95512-7F44-45C3-A669-95B7048D4730}.Release|Any CPU.Build.0 = Release|Any CPU - {F09B30F7-AF33-44D7-B835-099D1F72A37E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F09B30F7-AF33-44D7-B835-099D1F72A37E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F09B30F7-AF33-44D7-B835-099D1F72A37E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F09B30F7-AF33-44D7-B835-099D1F72A37E}.Release|Any CPU.Build.0 = Release|Any CPU - {1E5BD8D9-55BE-41E2-B389-6AB9F26C22AF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1E5BD8D9-55BE-41E2-B389-6AB9F26C22AF}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1E5BD8D9-55BE-41E2-B389-6AB9F26C22AF}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1E5BD8D9-55BE-41E2-B389-6AB9F26C22AF}.Release|Any CPU.Build.0 = Release|Any CPU - {3246883E-2FA7-4B4A-BDC5-99039A2869BC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3246883E-2FA7-4B4A-BDC5-99039A2869BC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3246883E-2FA7-4B4A-BDC5-99039A2869BC}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3246883E-2FA7-4B4A-BDC5-99039A2869BC}.Release|Any CPU.Build.0 = Release|Any CPU - {2BBFDE36-28A7-4875-8EBE-CC25C76B97FF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2BBFDE36-28A7-4875-8EBE-CC25C76B97FF}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2BBFDE36-28A7-4875-8EBE-CC25C76B97FF}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2BBFDE36-28A7-4875-8EBE-CC25C76B97FF}.Release|Any CPU.Build.0 = Release|Any CPU - {E9652738-2B3D-4357-B84B-54F0EA161382}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E9652738-2B3D-4357-B84B-54F0EA161382}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E9652738-2B3D-4357-B84B-54F0EA161382}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E9652738-2B3D-4357-B84B-54F0EA161382}.Release|Any CPU.Build.0 = Release|Any CPU - {1FCB2200-28B8-4703-8E89-73241AAED047}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1FCB2200-28B8-4703-8E89-73241AAED047}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1FCB2200-28B8-4703-8E89-73241AAED047}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1FCB2200-28B8-4703-8E89-73241AAED047}.Release|Any CPU.Build.0 = Release|Any CPU - {B5CDF747-8066-40D5-9BAE-CBE397BC9B51}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B5CDF747-8066-40D5-9BAE-CBE397BC9B51}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B5CDF747-8066-40D5-9BAE-CBE397BC9B51}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B5CDF747-8066-40D5-9BAE-CBE397BC9B51}.Release|Any CPU.Build.0 = Release|Any CPU - {4D8F3BB2-709D-481A-8FD3-0DA9762B366D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4D8F3BB2-709D-481A-8FD3-0DA9762B366D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4D8F3BB2-709D-481A-8FD3-0DA9762B366D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4D8F3BB2-709D-481A-8FD3-0DA9762B366D}.Release|Any CPU.Build.0 = Release|Any CPU - {A86DF0F0-24E9-470E-984B-9E7332544972}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A86DF0F0-24E9-470E-984B-9E7332544972}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A86DF0F0-24E9-470E-984B-9E7332544972}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A86DF0F0-24E9-470E-984B-9E7332544972}.Release|Any CPU.Build.0 = Release|Any CPU - {A702DD84-B55C-4807-9C28-D8F5AC3CCA78}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A702DD84-B55C-4807-9C28-D8F5AC3CCA78}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A702DD84-B55C-4807-9C28-D8F5AC3CCA78}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A702DD84-B55C-4807-9C28-D8F5AC3CCA78}.Release|Any CPU.Build.0 = Release|Any CPU - {3A377A6A-F735-4010-9E00-72E8BEB8F1F2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3A377A6A-F735-4010-9E00-72E8BEB8F1F2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3A377A6A-F735-4010-9E00-72E8BEB8F1F2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3A377A6A-F735-4010-9E00-72E8BEB8F1F2}.Release|Any CPU.Build.0 = Release|Any CPU - {28818676-F6AF-4203-8B65-BD33A50CB9A2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {28818676-F6AF-4203-8B65-BD33A50CB9A2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {28818676-F6AF-4203-8B65-BD33A50CB9A2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {28818676-F6AF-4203-8B65-BD33A50CB9A2}.Release|Any CPU.Build.0 = Release|Any CPU - {DC9CCAD0-7363-4691-B964-FF5B3AEA3F95}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DC9CCAD0-7363-4691-B964-FF5B3AEA3F95}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DC9CCAD0-7363-4691-B964-FF5B3AEA3F95}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DC9CCAD0-7363-4691-B964-FF5B3AEA3F95}.Release|Any CPU.Build.0 = Release|Any CPU - {1B794B9C-9B8A-4D5A-9848-B51274BD1FC5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1B794B9C-9B8A-4D5A-9848-B51274BD1FC5}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1B794B9C-9B8A-4D5A-9848-B51274BD1FC5}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1B794B9C-9B8A-4D5A-9848-B51274BD1FC5}.Release|Any CPU.Build.0 = Release|Any CPU - {4E7F15D1-729E-4DA7-992A-C3A2C6054B37}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4E7F15D1-729E-4DA7-992A-C3A2C6054B37}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4E7F15D1-729E-4DA7-992A-C3A2C6054B37}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4E7F15D1-729E-4DA7-992A-C3A2C6054B37}.Release|Any CPU.Build.0 = Release|Any CPU - {3095C95A-F1F9-487A-A983-1B100A33E4C7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3095C95A-F1F9-487A-A983-1B100A33E4C7}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3095C95A-F1F9-487A-A983-1B100A33E4C7}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3095C95A-F1F9-487A-A983-1B100A33E4C7}.Release|Any CPU.Build.0 = Release|Any CPU - {8DBEC8F3-908D-46B3-95CA-47EA138AB1A4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {8DBEC8F3-908D-46B3-95CA-47EA138AB1A4}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8DBEC8F3-908D-46B3-95CA-47EA138AB1A4}.Release|Any CPU.ActiveCfg = Release|Any CPU - {8DBEC8F3-908D-46B3-95CA-47EA138AB1A4}.Release|Any CPU.Build.0 = Release|Any CPU - {CC7DE119-736D-4FC5-85DC-70A6770749F6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {CC7DE119-736D-4FC5-85DC-70A6770749F6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {CC7DE119-736D-4FC5-85DC-70A6770749F6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {CC7DE119-736D-4FC5-85DC-70A6770749F6}.Release|Any CPU.Build.0 = Release|Any CPU - {EFE4A814-F58D-4C19-8F7F-B95F4EE343F0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {EFE4A814-F58D-4C19-8F7F-B95F4EE343F0}.Debug|Any CPU.Build.0 = Debug|Any CPU - {EFE4A814-F58D-4C19-8F7F-B95F4EE343F0}.Release|Any CPU.ActiveCfg = Release|Any CPU - {EFE4A814-F58D-4C19-8F7F-B95F4EE343F0}.Release|Any CPU.Build.0 = Release|Any CPU - {1C84408D-A0A7-4513-AD9A-1BA137ABE62C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1C84408D-A0A7-4513-AD9A-1BA137ABE62C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1C84408D-A0A7-4513-AD9A-1BA137ABE62C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1C84408D-A0A7-4513-AD9A-1BA137ABE62C}.Release|Any CPU.Build.0 = Release|Any CPU - {E4300D97-1D53-4029-9435-483FB7EC9621}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E4300D97-1D53-4029-9435-483FB7EC9621}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E4300D97-1D53-4029-9435-483FB7EC9621}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E4300D97-1D53-4029-9435-483FB7EC9621}.Release|Any CPU.Build.0 = Release|Any CPU - {84AB9951-3DBF-43A4-8F5D-AEED1102CE88}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {84AB9951-3DBF-43A4-8F5D-AEED1102CE88}.Debug|Any CPU.Build.0 = Debug|Any CPU - {84AB9951-3DBF-43A4-8F5D-AEED1102CE88}.Release|Any CPU.ActiveCfg = Release|Any CPU - {84AB9951-3DBF-43A4-8F5D-AEED1102CE88}.Release|Any CPU.Build.0 = Release|Any CPU - {1F621382-08FB-45EA-B94C-96A7FECB9489}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1F621382-08FB-45EA-B94C-96A7FECB9489}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1F621382-08FB-45EA-B94C-96A7FECB9489}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1F621382-08FB-45EA-B94C-96A7FECB9489}.Release|Any CPU.Build.0 = Release|Any CPU - {FBA14F8A-9F14-4364-ABDB-B8AE81A0D755}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FBA14F8A-9F14-4364-ABDB-B8AE81A0D755}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FBA14F8A-9F14-4364-ABDB-B8AE81A0D755}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FBA14F8A-9F14-4364-ABDB-B8AE81A0D755}.Release|Any CPU.Build.0 = Release|Any CPU - {A71557F2-D5FB-4772-9391-F7D18A3B6C44}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A71557F2-D5FB-4772-9391-F7D18A3B6C44}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A71557F2-D5FB-4772-9391-F7D18A3B6C44}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A71557F2-D5FB-4772-9391-F7D18A3B6C44}.Release|Any CPU.Build.0 = Release|Any CPU - {05F3B23E-CF28-467B-AD3C-595EA4ED6B96}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {05F3B23E-CF28-467B-AD3C-595EA4ED6B96}.Debug|Any CPU.Build.0 = Debug|Any CPU - {05F3B23E-CF28-467B-AD3C-595EA4ED6B96}.Release|Any CPU.ActiveCfg = Release|Any CPU - {05F3B23E-CF28-467B-AD3C-595EA4ED6B96}.Release|Any CPU.Build.0 = Release|Any CPU - {74ACD9D0-8B4C-42FA-A582-E93BF0075023}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {74ACD9D0-8B4C-42FA-A582-E93BF0075023}.Debug|Any CPU.Build.0 = Debug|Any CPU - {74ACD9D0-8B4C-42FA-A582-E93BF0075023}.Release|Any CPU.ActiveCfg = Release|Any CPU - {74ACD9D0-8B4C-42FA-A582-E93BF0075023}.Release|Any CPU.Build.0 = Release|Any CPU - {CCCCEF8C-7D96-4BEA-B9D0-E91EDF08E65D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {CCCCEF8C-7D96-4BEA-B9D0-E91EDF08E65D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {CCCCEF8C-7D96-4BEA-B9D0-E91EDF08E65D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {CCCCEF8C-7D96-4BEA-B9D0-E91EDF08E65D}.Release|Any CPU.Build.0 = Release|Any CPU - {49D8D2CF-AF68-40FA-951F-018247C97443}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {49D8D2CF-AF68-40FA-951F-018247C97443}.Debug|Any CPU.Build.0 = Debug|Any CPU - {49D8D2CF-AF68-40FA-951F-018247C97443}.Release|Any CPU.ActiveCfg = Release|Any CPU - {49D8D2CF-AF68-40FA-951F-018247C97443}.Release|Any CPU.Build.0 = Release|Any CPU - {732BF088-6AD7-4C4D-9A48-8074253596D4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {732BF088-6AD7-4C4D-9A48-8074253596D4}.Debug|Any CPU.Build.0 = Debug|Any CPU - {732BF088-6AD7-4C4D-9A48-8074253596D4}.Release|Any CPU.ActiveCfg = Release|Any CPU - {732BF088-6AD7-4C4D-9A48-8074253596D4}.Release|Any CPU.Build.0 = Release|Any CPU - {29638A67-E79F-44FE-AC05-DA499EBA929E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {29638A67-E79F-44FE-AC05-DA499EBA929E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {29638A67-E79F-44FE-AC05-DA499EBA929E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {29638A67-E79F-44FE-AC05-DA499EBA929E}.Release|Any CPU.Build.0 = Release|Any CPU - {24331E82-D7AF-45B1-ACF0-CA6C3B0B77DC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {24331E82-D7AF-45B1-ACF0-CA6C3B0B77DC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {24331E82-D7AF-45B1-ACF0-CA6C3B0B77DC}.Release|Any CPU.ActiveCfg = Release|Any CPU - {24331E82-D7AF-45B1-ACF0-CA6C3B0B77DC}.Release|Any CPU.Build.0 = Release|Any CPU - {790E94F2-5393-47DF-AC52-D9247F5B243A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {790E94F2-5393-47DF-AC52-D9247F5B243A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {790E94F2-5393-47DF-AC52-D9247F5B243A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {790E94F2-5393-47DF-AC52-D9247F5B243A}.Release|Any CPU.Build.0 = Release|Any CPU - {169BEA3D-2A81-47EE-A6C1-3F8719EEC1F6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {169BEA3D-2A81-47EE-A6C1-3F8719EEC1F6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {169BEA3D-2A81-47EE-A6C1-3F8719EEC1F6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {169BEA3D-2A81-47EE-A6C1-3F8719EEC1F6}.Release|Any CPU.Build.0 = Release|Any CPU - {99F2B1DA-2F69-4D70-A2A3-AC985AD91EC4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {99F2B1DA-2F69-4D70-A2A3-AC985AD91EC4}.Release|Any CPU.ActiveCfg = Release|Any CPU - {AFEB799E-82C3-4D02-9D5C-766BB8DEF004}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {AFEB799E-82C3-4D02-9D5C-766BB8DEF004}.Debug|Any CPU.Build.0 = Debug|Any CPU - {AFEB799E-82C3-4D02-9D5C-766BB8DEF004}.Release|Any CPU.ActiveCfg = Release|Any CPU - {AFEB799E-82C3-4D02-9D5C-766BB8DEF004}.Release|Any CPU.Build.0 = Release|Any CPU - {F50336DA-42D1-4DD1-A107-67AFEB8A33EE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F50336DA-42D1-4DD1-A107-67AFEB8A33EE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F50336DA-42D1-4DD1-A107-67AFEB8A33EE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F50336DA-42D1-4DD1-A107-67AFEB8A33EE}.Release|Any CPU.Build.0 = Release|Any CPU - {BBCE36D1-6767-4ED1-B3E8-84D2567A962A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BBCE36D1-6767-4ED1-B3E8-84D2567A962A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BBCE36D1-6767-4ED1-B3E8-84D2567A962A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BBCE36D1-6767-4ED1-B3E8-84D2567A962A}.Release|Any CPU.Build.0 = Release|Any CPU - {73BBB1E3-AEEC-44E8-83D7-6DD9CD687FE3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {73BBB1E3-AEEC-44E8-83D7-6DD9CD687FE3}.Debug|Any CPU.Build.0 = Debug|Any CPU - {73BBB1E3-AEEC-44E8-83D7-6DD9CD687FE3}.Release|Any CPU.ActiveCfg = Release|Any CPU - {73BBB1E3-AEEC-44E8-83D7-6DD9CD687FE3}.Release|Any CPU.Build.0 = Release|Any CPU - {B0946844-DE0E-4C59-9391-C0EB649DBF4E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B0946844-DE0E-4C59-9391-C0EB649DBF4E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B0946844-DE0E-4C59-9391-C0EB649DBF4E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B0946844-DE0E-4C59-9391-C0EB649DBF4E}.Release|Any CPU.Build.0 = Release|Any CPU - {A1FE2CA0-8EF3-4EDB-9055-DD282E374E16}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A1FE2CA0-8EF3-4EDB-9055-DD282E374E16}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A1FE2CA0-8EF3-4EDB-9055-DD282E374E16}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A1FE2CA0-8EF3-4EDB-9055-DD282E374E16}.Release|Any CPU.Build.0 = Release|Any CPU - {BF4CDE28-F0CC-482D-8392-C1C9BB4C368F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BF4CDE28-F0CC-482D-8392-C1C9BB4C368F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BF4CDE28-F0CC-482D-8392-C1C9BB4C368F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BF4CDE28-F0CC-482D-8392-C1C9BB4C368F}.Release|Any CPU.Build.0 = Release|Any CPU - {7EB0CFB8-B668-4F3F-898D-80411095BC2F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7EB0CFB8-B668-4F3F-898D-80411095BC2F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7EB0CFB8-B668-4F3F-898D-80411095BC2F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7EB0CFB8-B668-4F3F-898D-80411095BC2F}.Release|Any CPU.Build.0 = Release|Any CPU - {34BC9836-681D-43A5-BC39-E4FEE17FC528}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {34BC9836-681D-43A5-BC39-E4FEE17FC528}.Debug|Any CPU.Build.0 = Debug|Any CPU - {34BC9836-681D-43A5-BC39-E4FEE17FC528}.Release|Any CPU.ActiveCfg = Release|Any CPU - {34BC9836-681D-43A5-BC39-E4FEE17FC528}.Release|Any CPU.Build.0 = Release|Any CPU - {90CD37A9-C866-4D90-A3B1-8C87F53B845E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {90CD37A9-C866-4D90-A3B1-8C87F53B845E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {90CD37A9-C866-4D90-A3B1-8C87F53B845E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {90CD37A9-C866-4D90-A3B1-8C87F53B845E}.Release|Any CPU.Build.0 = Release|Any CPU - {3D42FCA2-5BD0-4624-9FCA-F4BF935B27AE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3D42FCA2-5BD0-4624-9FCA-F4BF935B27AE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3D42FCA2-5BD0-4624-9FCA-F4BF935B27AE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3D42FCA2-5BD0-4624-9FCA-F4BF935B27AE}.Release|Any CPU.Build.0 = Release|Any CPU - {56CAA9F2-1882-4EFA-BAC0-9C3D804553F1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {56CAA9F2-1882-4EFA-BAC0-9C3D804553F1}.Debug|Any CPU.Build.0 = Debug|Any CPU - {56CAA9F2-1882-4EFA-BAC0-9C3D804553F1}.Release|Any CPU.ActiveCfg = Release|Any CPU - {56CAA9F2-1882-4EFA-BAC0-9C3D804553F1}.Release|Any CPU.Build.0 = Release|Any CPU - {0D4A88A1-8AEE-49ED-BC2E-ED68C96F60AD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0D4A88A1-8AEE-49ED-BC2E-ED68C96F60AD}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0D4A88A1-8AEE-49ED-BC2E-ED68C96F60AD}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0D4A88A1-8AEE-49ED-BC2E-ED68C96F60AD}.Release|Any CPU.Build.0 = Release|Any CPU - {5CBCBEA4-6038-48CA-B45D-C1D0F6B4ACA4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5CBCBEA4-6038-48CA-B45D-C1D0F6B4ACA4}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5CBCBEA4-6038-48CA-B45D-C1D0F6B4ACA4}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5CBCBEA4-6038-48CA-B45D-C1D0F6B4ACA4}.Release|Any CPU.Build.0 = Release|Any CPU - {94A61AD7-2A2B-40DB-81F3-C59D596958A8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {94A61AD7-2A2B-40DB-81F3-C59D596958A8}.Debug|Any CPU.Build.0 = Debug|Any CPU - {94A61AD7-2A2B-40DB-81F3-C59D596958A8}.Release|Any CPU.ActiveCfg = Release|Any CPU - {94A61AD7-2A2B-40DB-81F3-C59D596958A8}.Release|Any CPU.Build.0 = Release|Any CPU - {4B598AF7-BD7D-4544-A274-2CDDD98F4167}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4B598AF7-BD7D-4544-A274-2CDDD98F4167}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4B598AF7-BD7D-4544-A274-2CDDD98F4167}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4B598AF7-BD7D-4544-A274-2CDDD98F4167}.Release|Any CPU.Build.0 = Release|Any CPU - {99B171E6-0248-4402-836D-98947CD63772}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {99B171E6-0248-4402-836D-98947CD63772}.Debug|Any CPU.Build.0 = Debug|Any CPU - {99B171E6-0248-4402-836D-98947CD63772}.Release|Any CPU.ActiveCfg = Release|Any CPU - {99B171E6-0248-4402-836D-98947CD63772}.Release|Any CPU.Build.0 = Release|Any CPU - {4332A6BC-434A-4AF5-A075-F1BBCDD28F5D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4332A6BC-434A-4AF5-A075-F1BBCDD28F5D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4332A6BC-434A-4AF5-A075-F1BBCDD28F5D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4332A6BC-434A-4AF5-A075-F1BBCDD28F5D}.Release|Any CPU.Build.0 = Release|Any CPU - {7F5A304F-7DD9-4A64-8FCD-9B1FF06735B9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7F5A304F-7DD9-4A64-8FCD-9B1FF06735B9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7F5A304F-7DD9-4A64-8FCD-9B1FF06735B9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7F5A304F-7DD9-4A64-8FCD-9B1FF06735B9}.Release|Any CPU.Build.0 = Release|Any CPU - {5ADDDFB1-E59B-4097-97B7-8C24E2D60463}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5ADDDFB1-E59B-4097-97B7-8C24E2D60463}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5ADDDFB1-E59B-4097-97B7-8C24E2D60463}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5ADDDFB1-E59B-4097-97B7-8C24E2D60463}.Release|Any CPU.Build.0 = Release|Any CPU - {97C7E531-9D5F-43FD-AA19-BF24DA13B612}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {97C7E531-9D5F-43FD-AA19-BF24DA13B612}.Debug|Any CPU.Build.0 = Debug|Any CPU - {97C7E531-9D5F-43FD-AA19-BF24DA13B612}.Release|Any CPU.ActiveCfg = Release|Any CPU - {97C7E531-9D5F-43FD-AA19-BF24DA13B612}.Release|Any CPU.Build.0 = Release|Any CPU - {65F2AD97-3ECF-4BA6-8AAA-1E5882FDCE68}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {65F2AD97-3ECF-4BA6-8AAA-1E5882FDCE68}.Debug|Any CPU.Build.0 = Debug|Any CPU - {65F2AD97-3ECF-4BA6-8AAA-1E5882FDCE68}.Release|Any CPU.ActiveCfg = Release|Any CPU - {65F2AD97-3ECF-4BA6-8AAA-1E5882FDCE68}.Release|Any CPU.Build.0 = Release|Any CPU - {690B0274-291F-4D9E-BA76-54EFF7D3E4BC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {690B0274-291F-4D9E-BA76-54EFF7D3E4BC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {690B0274-291F-4D9E-BA76-54EFF7D3E4BC}.Release|Any CPU.ActiveCfg = Release|Any CPU - {690B0274-291F-4D9E-BA76-54EFF7D3E4BC}.Release|Any CPU.Build.0 = Release|Any CPU - {060FD0BA-BD78-48E1-A8A7-4906A5AD5E39}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {060FD0BA-BD78-48E1-A8A7-4906A5AD5E39}.Debug|Any CPU.Build.0 = Debug|Any CPU - {060FD0BA-BD78-48E1-A8A7-4906A5AD5E39}.Release|Any CPU.ActiveCfg = Release|Any CPU - {060FD0BA-BD78-48E1-A8A7-4906A5AD5E39}.Release|Any CPU.Build.0 = Release|Any CPU - {169A82A5-2DB3-40EA-801E-14C08D743DF7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {169A82A5-2DB3-40EA-801E-14C08D743DF7}.Debug|Any CPU.Build.0 = Debug|Any CPU - {169A82A5-2DB3-40EA-801E-14C08D743DF7}.Release|Any CPU.ActiveCfg = Release|Any CPU - {169A82A5-2DB3-40EA-801E-14C08D743DF7}.Release|Any CPU.Build.0 = Release|Any CPU - {2CDF3E1C-267D-4198-B1C7-7E1F548FC120}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2CDF3E1C-267D-4198-B1C7-7E1F548FC120}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2CDF3E1C-267D-4198-B1C7-7E1F548FC120}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2CDF3E1C-267D-4198-B1C7-7E1F548FC120}.Release|Any CPU.Build.0 = Release|Any CPU - {01B96BB9-35E8-4364-ACB8-6D12A14D8DBA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {01B96BB9-35E8-4364-ACB8-6D12A14D8DBA}.Debug|Any CPU.Build.0 = Debug|Any CPU - {01B96BB9-35E8-4364-ACB8-6D12A14D8DBA}.Release|Any CPU.ActiveCfg = Release|Any CPU - {01B96BB9-35E8-4364-ACB8-6D12A14D8DBA}.Release|Any CPU.Build.0 = Release|Any CPU - {47FBCB04-0C2D-453C-BE2F-7052CAC22524}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {47FBCB04-0C2D-453C-BE2F-7052CAC22524}.Debug|Any CPU.Build.0 = Debug|Any CPU - {47FBCB04-0C2D-453C-BE2F-7052CAC22524}.Release|Any CPU.ActiveCfg = Release|Any CPU - {47FBCB04-0C2D-453C-BE2F-7052CAC22524}.Release|Any CPU.Build.0 = Release|Any CPU - {B0460856-7E6D-4B1E-B243-8E20662FC32E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B0460856-7E6D-4B1E-B243-8E20662FC32E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B0460856-7E6D-4B1E-B243-8E20662FC32E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B0460856-7E6D-4B1E-B243-8E20662FC32E}.Release|Any CPU.Build.0 = Release|Any CPU - {5BD671F0-9603-4C2F-8364-54B02986EAA2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5BD671F0-9603-4C2F-8364-54B02986EAA2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5BD671F0-9603-4C2F-8364-54B02986EAA2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5BD671F0-9603-4C2F-8364-54B02986EAA2}.Release|Any CPU.Build.0 = Release|Any CPU - {154525CD-3726-45B7-9A9C-553BBC60EB10}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {154525CD-3726-45B7-9A9C-553BBC60EB10}.Debug|Any CPU.Build.0 = Debug|Any CPU - {154525CD-3726-45B7-9A9C-553BBC60EB10}.Release|Any CPU.ActiveCfg = Release|Any CPU - {154525CD-3726-45B7-9A9C-553BBC60EB10}.Release|Any CPU.Build.0 = Release|Any CPU - {F620D7DC-B58D-4BD0-81A2-E88A2C1E4833}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F620D7DC-B58D-4BD0-81A2-E88A2C1E4833}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F620D7DC-B58D-4BD0-81A2-E88A2C1E4833}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F620D7DC-B58D-4BD0-81A2-E88A2C1E4833}.Release|Any CPU.Build.0 = Release|Any CPU - {6FE60BB4-DE6A-485C-A38A-1317C56AF2DA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6FE60BB4-DE6A-485C-A38A-1317C56AF2DA}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6FE60BB4-DE6A-485C-A38A-1317C56AF2DA}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6FE60BB4-DE6A-485C-A38A-1317C56AF2DA}.Release|Any CPU.Build.0 = Release|Any CPU - {34FAB60D-7259-47B9-B50E-B533C7C3CFEC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {34FAB60D-7259-47B9-B50E-B533C7C3CFEC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {34FAB60D-7259-47B9-B50E-B533C7C3CFEC}.Release|Any CPU.ActiveCfg = Release|Any CPU - {34FAB60D-7259-47B9-B50E-B533C7C3CFEC}.Release|Any CPU.Build.0 = Release|Any CPU - {19329441-2A59-4BAC-A1BE-BBAB70C93CA0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {19329441-2A59-4BAC-A1BE-BBAB70C93CA0}.Debug|Any CPU.Build.0 = Debug|Any CPU - {19329441-2A59-4BAC-A1BE-BBAB70C93CA0}.Release|Any CPU.ActiveCfg = Release|Any CPU - {19329441-2A59-4BAC-A1BE-BBAB70C93CA0}.Release|Any CPU.Build.0 = Release|Any CPU - {37D16EAF-ACD8-4105-8BD3-B2745819CFF8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {37D16EAF-ACD8-4105-8BD3-B2745819CFF8}.Debug|Any CPU.Build.0 = Debug|Any CPU - {37D16EAF-ACD8-4105-8BD3-B2745819CFF8}.Release|Any CPU.ActiveCfg = Release|Any CPU - {37D16EAF-ACD8-4105-8BD3-B2745819CFF8}.Release|Any CPU.Build.0 = Release|Any CPU - {CFEC357F-0863-4458-A6C4-5D7AA0E44759}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {CFEC357F-0863-4458-A6C4-5D7AA0E44759}.Debug|Any CPU.Build.0 = Debug|Any CPU - {CFEC357F-0863-4458-A6C4-5D7AA0E44759}.Release|Any CPU.ActiveCfg = Release|Any CPU - {CFEC357F-0863-4458-A6C4-5D7AA0E44759}.Release|Any CPU.Build.0 = Release|Any CPU - {E75762D2-FD12-4165-810B-628C28CB2562}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E75762D2-FD12-4165-810B-628C28CB2562}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E75762D2-FD12-4165-810B-628C28CB2562}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E75762D2-FD12-4165-810B-628C28CB2562}.Release|Any CPU.Build.0 = Release|Any CPU - {052C4F97-5909-4D88-AA49-4B0D9058A0A9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {052C4F97-5909-4D88-AA49-4B0D9058A0A9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {052C4F97-5909-4D88-AA49-4B0D9058A0A9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {052C4F97-5909-4D88-AA49-4B0D9058A0A9}.Release|Any CPU.Build.0 = Release|Any CPU - {9A6D67DE-51B1-456D-B25D-19E0356C8F60}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9A6D67DE-51B1-456D-B25D-19E0356C8F60}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9A6D67DE-51B1-456D-B25D-19E0356C8F60}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9A6D67DE-51B1-456D-B25D-19E0356C8F60}.Release|Any CPU.Build.0 = Release|Any CPU - {44A03CF6-4EB6-434C-90D1-FF8142FE394E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {44A03CF6-4EB6-434C-90D1-FF8142FE394E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {44A03CF6-4EB6-434C-90D1-FF8142FE394E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {44A03CF6-4EB6-434C-90D1-FF8142FE394E}.Release|Any CPU.Build.0 = Release|Any CPU - {A9140976-DFF9-432A-B1DC-E188A07C49E5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A9140976-DFF9-432A-B1DC-E188A07C49E5}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A9140976-DFF9-432A-B1DC-E188A07C49E5}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A9140976-DFF9-432A-B1DC-E188A07C49E5}.Release|Any CPU.Build.0 = Release|Any CPU - {B3046301-6F00-4885-8B01-080BD489055C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B3046301-6F00-4885-8B01-080BD489055C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B3046301-6F00-4885-8B01-080BD489055C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B3046301-6F00-4885-8B01-080BD489055C}.Release|Any CPU.Build.0 = Release|Any CPU - {29D12ADC-55E9-40D0-9E4C-F0EBB6E098EC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {29D12ADC-55E9-40D0-9E4C-F0EBB6E098EC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {29D12ADC-55E9-40D0-9E4C-F0EBB6E098EC}.Release|Any CPU.ActiveCfg = Release|Any CPU - {29D12ADC-55E9-40D0-9E4C-F0EBB6E098EC}.Release|Any CPU.Build.0 = Release|Any CPU - {6C606FEB-9A1F-4816-ABE4-22AFA8CEE771}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6C606FEB-9A1F-4816-ABE4-22AFA8CEE771}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6C606FEB-9A1F-4816-ABE4-22AFA8CEE771}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6C606FEB-9A1F-4816-ABE4-22AFA8CEE771}.Release|Any CPU.Build.0 = Release|Any CPU - {5F80663C-B072-49DE-9A67-FD804BAD787E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5F80663C-B072-49DE-9A67-FD804BAD787E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5F80663C-B072-49DE-9A67-FD804BAD787E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5F80663C-B072-49DE-9A67-FD804BAD787E}.Release|Any CPU.Build.0 = Release|Any CPU - {630E2D93-7F7D-4A8A-BB52-D8095A1F24D9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {630E2D93-7F7D-4A8A-BB52-D8095A1F24D9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {630E2D93-7F7D-4A8A-BB52-D8095A1F24D9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {630E2D93-7F7D-4A8A-BB52-D8095A1F24D9}.Release|Any CPU.Build.0 = Release|Any CPU - {59E7614A-3630-4C39-9C7F-9E12BC95D37E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {59E7614A-3630-4C39-9C7F-9E12BC95D37E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {59E7614A-3630-4C39-9C7F-9E12BC95D37E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {59E7614A-3630-4C39-9C7F-9E12BC95D37E}.Release|Any CPU.Build.0 = Release|Any CPU - {D5720DBC-8C2B-42D5-9D9F-2FF6EAD4001C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D5720DBC-8C2B-42D5-9D9F-2FF6EAD4001C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D5720DBC-8C2B-42D5-9D9F-2FF6EAD4001C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D5720DBC-8C2B-42D5-9D9F-2FF6EAD4001C}.Release|Any CPU.Build.0 = Release|Any CPU - {2B939AC9-03A4-479E-AA0D-CB58F4A7F480}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2B939AC9-03A4-479E-AA0D-CB58F4A7F480}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2B939AC9-03A4-479E-AA0D-CB58F4A7F480}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2B939AC9-03A4-479E-AA0D-CB58F4A7F480}.Release|Any CPU.Build.0 = Release|Any CPU - {BF934627-F531-44FB-BEC2-ECA801FF31E7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BF934627-F531-44FB-BEC2-ECA801FF31E7}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BF934627-F531-44FB-BEC2-ECA801FF31E7}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BF934627-F531-44FB-BEC2-ECA801FF31E7}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(NestedProjects) = preSolution - {C6658DE0-2B2F-47F0-BB61-2CA66D435C09} = {61017E64-6D00-49CB-9E81-5002DC8F7D5F} - {5BA4A8FA-F7F4-45B3-AEC8-8886D35AAC79} = {61017E64-6D00-49CB-9E81-5002DC8F7D5F} - {7D5A49B4-9A9B-496E-803B-DEB85B2C3132} = {AB797AF0-C12C-46DE-A157-7E25625C6200} - {82E26BF9-5F3A-4365-899A-AB1FFD54AA45} = {EBD0CF78-C5D7-4B4B-94C9-C5D8C20B6F59} - {ACD65CE5-3CC2-47B1-BFAC-72443D764F6E} = {AB797AF0-C12C-46DE-A157-7E25625C6200} - {24C7095B-5CDD-4369-9F34-5565A019B195} = {DD089B8B-DA73-492A-9010-F772D1C178DA} - {D31581AB-A6C1-4B73-AB63-45667F6C82AE} = {6EF07978-A6D2-40EB-891D-7D70C5F37E76} - {0601A2A6-2C62-418B-9104-8CDE497E5283} = {AB797AF0-C12C-46DE-A157-7E25625C6200} - {302BFC43-ED2F-43AE-8AD4-FCD481B0AC67} = {B08B4E00-C2AB-48F3-8389-449F42AEF179} - {BB983D0B-A939-4008-B9E3-C7C172BCF83A} = {DD089B8B-DA73-492A-9010-F772D1C178DA} - {80FF5821-E831-450D-AA0C-C76D07D878F4} = {5BA4A8FA-F7F4-45B3-AEC8-8886D35AAC79} - {8E5BD3D9-3529-48BC-B741-CFB7A69DB233} = {6EF07978-A6D2-40EB-891D-7D70C5F37E76} - {B2049499-D384-46DF-8837-F1180107DD54} = {58C59255-281C-4595-8732-808158F1DC6E} - {78DAB791-8595-4612-8E9E-2248AF5B1862} = {6EF07978-A6D2-40EB-891D-7D70C5F37E76} - {C9539BD8-D2AE-4A8D-8281-71A05B3FBF31} = {B08B4E00-C2AB-48F3-8389-449F42AEF179} - {169E2C9B-6687-427F-A278-30BF849BFEDC} = {B08B4E00-C2AB-48F3-8389-449F42AEF179} - {2DD5D66B-85E9-4AF9-911C-C9F963234159} = {B08B4E00-C2AB-48F3-8389-449F42AEF179} - {8A050229-DB79-4E0B-9AFF-7565E87F2954} = {58C59255-281C-4595-8732-808158F1DC6E} - {C237BA1A-3A7D-4AB2-BE09-2696F3C082A4} = {C6658DE0-2B2F-47F0-BB61-2CA66D435C09} - {80529478-A383-4FEA-B744-C71264969E9A} = {6EF07978-A6D2-40EB-891D-7D70C5F37E76} - {39CD855E-83B1-4A96-93F7-01608211EBE3} = {C6658DE0-2B2F-47F0-BB61-2CA66D435C09} - {30B49E42-AE61-4F7C-981F-923F07BB3986} = {5948B0A5-7873-4DBB-BA03-EB283D6EA91B} - {D229105F-6879-4452-9189-75DE060C0F4C} = {5BA4A8FA-F7F4-45B3-AEC8-8886D35AAC79} - {7CC95512-7F44-45C3-A669-95B7048D4730} = {9B4F139F-7D26-435C-A561-89E65A67A8E5} - {F09B30F7-AF33-44D7-B835-099D1F72A37E} = {EBD0CF78-C5D7-4B4B-94C9-C5D8C20B6F59} - {1E5BD8D9-55BE-41E2-B389-6AB9F26C22AF} = {EBD0CF78-C5D7-4B4B-94C9-C5D8C20B6F59} - {3246883E-2FA7-4B4A-BDC5-99039A2869BC} = {9B4F139F-7D26-435C-A561-89E65A67A8E5} - {2BBFDE36-28A7-4875-8EBE-CC25C76B97FF} = {EBD0CF78-C5D7-4B4B-94C9-C5D8C20B6F59} - {18453B51-25EB-4317-A4B3-B10518252E92} = {90031D64-CA0F-46D0-9AF4-8DC023A5FFCD} - {1B8D5897-902E-4632-8698-E89CAF3DDF54} = {90031D64-CA0F-46D0-9AF4-8DC023A5FFCD} - {08B41FFA-CEE3-46A7-B5C0-3EB65D37A16C} = {90031D64-CA0F-46D0-9AF4-8DC023A5FFCD} - {E9652738-2B3D-4357-B84B-54F0EA161382} = {1B8D5897-902E-4632-8698-E89CAF3DDF54} - {89608AA5-5ADE-4832-AC7B-871C4AE64210} = {61017E64-6D00-49CB-9E81-5002DC8F7D5F} - {1FCB2200-28B8-4703-8E89-73241AAED047} = {89608AA5-5ADE-4832-AC7B-871C4AE64210} - {B5CDF747-8066-40D5-9BAE-CBE397BC9B51} = {5BA4A8FA-F7F4-45B3-AEC8-8886D35AAC79} - {9B4F139F-7D26-435C-A561-89E65A67A8E5} = {5BA4A8FA-F7F4-45B3-AEC8-8886D35AAC79} - {6EF07978-A6D2-40EB-891D-7D70C5F37E76} = {5BA4A8FA-F7F4-45B3-AEC8-8886D35AAC79} - {DD089B8B-DA73-492A-9010-F772D1C178DA} = {5BA4A8FA-F7F4-45B3-AEC8-8886D35AAC79} - {5948B0A5-7873-4DBB-BA03-EB283D6EA91B} = {5BA4A8FA-F7F4-45B3-AEC8-8886D35AAC79} - {B08B4E00-C2AB-48F3-8389-449F42AEF179} = {5BA4A8FA-F7F4-45B3-AEC8-8886D35AAC79} - {AB797AF0-C12C-46DE-A157-7E25625C6200} = {5BA4A8FA-F7F4-45B3-AEC8-8886D35AAC79} - {58C59255-281C-4595-8732-808158F1DC6E} = {5BA4A8FA-F7F4-45B3-AEC8-8886D35AAC79} - {4D8F3BB2-709D-481A-8FD3-0DA9762B366D} = {9B4F139F-7D26-435C-A561-89E65A67A8E5} - {A86DF0F0-24E9-470E-984B-9E7332544972} = {9B4F139F-7D26-435C-A561-89E65A67A8E5} - {A702DD84-B55C-4807-9C28-D8F5AC3CCA78} = {B08B4E00-C2AB-48F3-8389-449F42AEF179} - {3A377A6A-F735-4010-9E00-72E8BEB8F1F2} = {9B4F139F-7D26-435C-A561-89E65A67A8E5} - {28818676-F6AF-4203-8B65-BD33A50CB9A2} = {C6658DE0-2B2F-47F0-BB61-2CA66D435C09} - {DC9CCAD0-7363-4691-B964-FF5B3AEA3F95} = {18453B51-25EB-4317-A4B3-B10518252E92} - {1B794B9C-9B8A-4D5A-9848-B51274BD1FC5} = {C6658DE0-2B2F-47F0-BB61-2CA66D435C09} - {4E7F15D1-729E-4DA7-992A-C3A2C6054B37} = {C6658DE0-2B2F-47F0-BB61-2CA66D435C09} - {3095C95A-F1F9-487A-A983-1B100A33E4C7} = {5948B0A5-7873-4DBB-BA03-EB283D6EA91B} - {CF3DA5F1-F98D-49C9-A980-27E570B38B8D} = {5BA4A8FA-F7F4-45B3-AEC8-8886D35AAC79} - {8DBEC8F3-908D-46B3-95CA-47EA138AB1A4} = {CF3DA5F1-F98D-49C9-A980-27E570B38B8D} - {CC7DE119-736D-4FC5-85DC-70A6770749F6} = {CF3DA5F1-F98D-49C9-A980-27E570B38B8D} - {EFE4A814-F58D-4C19-8F7F-B95F4EE343F0} = {9B4F139F-7D26-435C-A561-89E65A67A8E5} - {1C84408D-A0A7-4513-AD9A-1BA137ABE62C} = {9B4F139F-7D26-435C-A561-89E65A67A8E5} - {E4300D97-1D53-4029-9435-483FB7EC9621} = {9B4F139F-7D26-435C-A561-89E65A67A8E5} - {84AB9951-3DBF-43A4-8F5D-AEED1102CE88} = {9B4F139F-7D26-435C-A561-89E65A67A8E5} - {1F621382-08FB-45EA-B94C-96A7FECB9489} = {CF3DA5F1-F98D-49C9-A980-27E570B38B8D} - {FBA14F8A-9F14-4364-ABDB-B8AE81A0D755} = {9B4F139F-7D26-435C-A561-89E65A67A8E5} - {A71557F2-D5FB-4772-9391-F7D18A3B6C44} = {AB797AF0-C12C-46DE-A157-7E25625C6200} - {05F3B23E-CF28-467B-AD3C-595EA4ED6B96} = {AB797AF0-C12C-46DE-A157-7E25625C6200} - {74ACD9D0-8B4C-42FA-A582-E93BF0075023} = {AB797AF0-C12C-46DE-A157-7E25625C6200} - {CCCCEF8C-7D96-4BEA-B9D0-E91EDF08E65D} = {AB797AF0-C12C-46DE-A157-7E25625C6200} - {49D8D2CF-AF68-40FA-951F-018247C97443} = {9B4F139F-7D26-435C-A561-89E65A67A8E5} - {732BF088-6AD7-4C4D-9A48-8074253596D4} = {B818988E-639C-4E6E-85C1-B231BCAD9DAB} - {B818988E-639C-4E6E-85C1-B231BCAD9DAB} = {5BA4A8FA-F7F4-45B3-AEC8-8886D35AAC79} - {29638A67-E79F-44FE-AC05-DA499EBA929E} = {2F3E1026-5054-4E1F-899B-F1A7F70F9912} - {24331E82-D7AF-45B1-ACF0-CA6C3B0B77DC} = {6EF07978-A6D2-40EB-891D-7D70C5F37E76} - {790E94F2-5393-47DF-AC52-D9247F5B243A} = {6EF07978-A6D2-40EB-891D-7D70C5F37E76} - {169BEA3D-2A81-47EE-A6C1-3F8719EEC1F6} = {DD089B8B-DA73-492A-9010-F772D1C178DA} - {AFEB799E-82C3-4D02-9D5C-766BB8DEF004} = {DD089B8B-DA73-492A-9010-F772D1C178DA} - {F50336DA-42D1-4DD1-A107-67AFEB8A33EE} = {1B8D5897-902E-4632-8698-E89CAF3DDF54} - {A516931E-EDBB-4FC3-BB94-1BB824D5BC61} = {5BA4A8FA-F7F4-45B3-AEC8-8886D35AAC79} - {BBCE36D1-6767-4ED1-B3E8-84D2567A962A} = {A516931E-EDBB-4FC3-BB94-1BB824D5BC61} - {73BBB1E3-AEEC-44E8-83D7-6DD9CD687FE3} = {5BA4A8FA-F7F4-45B3-AEC8-8886D35AAC79} - {B0946844-DE0E-4C59-9391-C0EB649DBF4E} = {18453B51-25EB-4317-A4B3-B10518252E92} - {A1FE2CA0-8EF3-4EDB-9055-DD282E374E16} = {EB3A7401-0DE3-476F-9E6F-057F1F4590FB} - {EB3A7401-0DE3-476F-9E6F-057F1F4590FB} = {5BA4A8FA-F7F4-45B3-AEC8-8886D35AAC79} - {BF4CDE28-F0CC-482D-8392-C1C9BB4C368F} = {EB3A7401-0DE3-476F-9E6F-057F1F4590FB} - {7EB0CFB8-B668-4F3F-898D-80411095BC2F} = {EB3A7401-0DE3-476F-9E6F-057F1F4590FB} - {34BC9836-681D-43A5-BC39-E4FEE17FC528} = {08B41FFA-CEE3-46A7-B5C0-3EB65D37A16C} - {CBB515F3-A0EF-43B5-A907-FD4E652DD66E} = {90031D64-CA0F-46D0-9AF4-8DC023A5FFCD} - {90CD37A9-C866-4D90-A3B1-8C87F53B845E} = {CBB515F3-A0EF-43B5-A907-FD4E652DD66E} - {3F20899B-C5E1-485F-808B-ADB1877EB3FD} = {5BA4A8FA-F7F4-45B3-AEC8-8886D35AAC79} - {3D42FCA2-5BD0-4624-9FCA-F4BF935B27AE} = {3F20899B-C5E1-485F-808B-ADB1877EB3FD} - {56CAA9F2-1882-4EFA-BAC0-9C3D804553F1} = {18453B51-25EB-4317-A4B3-B10518252E92} - {0D4A88A1-8AEE-49ED-BC2E-ED68C96F60AD} = {58C59255-281C-4595-8732-808158F1DC6E} - {5CBCBEA4-6038-48CA-B45D-C1D0F6B4ACA4} = {C6658DE0-2B2F-47F0-BB61-2CA66D435C09} - {94A61AD7-2A2B-40DB-81F3-C59D596958A8} = {C6658DE0-2B2F-47F0-BB61-2CA66D435C09} - {4B598AF7-BD7D-4544-A274-2CDDD98F4167} = {C6658DE0-2B2F-47F0-BB61-2CA66D435C09} - {99B171E6-0248-4402-836D-98947CD63772} = {1B8D5897-902E-4632-8698-E89CAF3DDF54} - {4332A6BC-434A-4AF5-A075-F1BBCDD28F5D} = {1B8D5897-902E-4632-8698-E89CAF3DDF54} - {7F5A304F-7DD9-4A64-8FCD-9B1FF06735B9} = {08B41FFA-CEE3-46A7-B5C0-3EB65D37A16C} - {D92BEAB2-60D6-4BB4-885A-6BA681C6CCF1} = {61017E64-6D00-49CB-9E81-5002DC8F7D5F} - {5ADDDFB1-E59B-4097-97B7-8C24E2D60463} = {D92BEAB2-60D6-4BB4-885A-6BA681C6CCF1} - {97C7E531-9D5F-43FD-AA19-BF24DA13B612} = {5BA4A8FA-F7F4-45B3-AEC8-8886D35AAC79} - {65F2AD97-3ECF-4BA6-8AAA-1E5882FDCE68} = {D92BEAB2-60D6-4BB4-885A-6BA681C6CCF1} - {690B0274-291F-4D9E-BA76-54EFF7D3E4BC} = {D92BEAB2-60D6-4BB4-885A-6BA681C6CCF1} - {060FD0BA-BD78-48E1-A8A7-4906A5AD5E39} = {D92BEAB2-60D6-4BB4-885A-6BA681C6CCF1} - {169A82A5-2DB3-40EA-801E-14C08D743DF7} = {D92BEAB2-60D6-4BB4-885A-6BA681C6CCF1} - {01B96BB9-35E8-4364-ACB8-6D12A14D8DBA} = {5BA4A8FA-F7F4-45B3-AEC8-8886D35AAC79} - {47FBCB04-0C2D-453C-BE2F-7052CAC22524} = {EB3A7401-0DE3-476F-9E6F-057F1F4590FB} - {B32DB9B2-AD6C-48A5-8682-4373CB045185} = {C80C8231-D35C-4ACC-9ED6-9F3DB221535E} - {454652D5-E1BB-4D4B-9B21-9CEFC900C4FB} = {B32DB9B2-AD6C-48A5-8682-4373CB045185} - {31089E79-694B-4F45-97AF-86D34A7B231E} = {B32DB9B2-AD6C-48A5-8682-4373CB045185} - {6DDB9ECF-D454-4894-A262-A6BB3026E61E} = {B32DB9B2-AD6C-48A5-8682-4373CB045185} - {16B570BC-E293-4A19-B20E-5C97BAF8476B} = {B32DB9B2-AD6C-48A5-8682-4373CB045185} - {EBD0CF78-C5D7-4B4B-94C9-C5D8C20B6F59} = {5BA4A8FA-F7F4-45B3-AEC8-8886D35AAC79} - {B0460856-7E6D-4B1E-B243-8E20662FC32E} = {EBD0CF78-C5D7-4B4B-94C9-C5D8C20B6F59} - {50470834-4CD8-479A-8B58-0A1869BA5D37} = {5BA4A8FA-F7F4-45B3-AEC8-8886D35AAC79} - {5BD671F0-9603-4C2F-8364-54B02986EAA2} = {50470834-4CD8-479A-8B58-0A1869BA5D37} - {154525CD-3726-45B7-9A9C-553BBC60EB10} = {50470834-4CD8-479A-8B58-0A1869BA5D37} - {F620D7DC-B58D-4BD0-81A2-E88A2C1E4833} = {50470834-4CD8-479A-8B58-0A1869BA5D37} - {6FE60BB4-DE6A-485C-A38A-1317C56AF2DA} = {50470834-4CD8-479A-8B58-0A1869BA5D37} - {57326431-9C6C-4BAB-AA51-15131C21ADCC} = {C80C8231-D35C-4ACC-9ED6-9F3DB221535E} - {34FAB60D-7259-47B9-B50E-B533C7C3CFEC} = {8CEEC194-820A-4C8D-AB9E-E51E6D3E9CC1} - {8CEEC194-820A-4C8D-AB9E-E51E6D3E9CC1} = {5BA4A8FA-F7F4-45B3-AEC8-8886D35AAC79} - {19329441-2A59-4BAC-A1BE-BBAB70C93CA0} = {8CEEC194-820A-4C8D-AB9E-E51E6D3E9CC1} - {37D16EAF-ACD8-4105-8BD3-B2745819CFF8} = {8CEEC194-820A-4C8D-AB9E-E51E6D3E9CC1} - {CFEC357F-0863-4458-A6C4-5D7AA0E44759} = {50470834-4CD8-479A-8B58-0A1869BA5D37} - {E75762D2-FD12-4165-810B-628C28CB2562} = {50470834-4CD8-479A-8B58-0A1869BA5D37} - {3666CF13-1353-4620-9472-506670214A6A} = {C80C8231-D35C-4ACC-9ED6-9F3DB221535E} - {AA5ACF15-8647-4AC9-B9F5-73FCB92BE7E3} = {C80C8231-D35C-4ACC-9ED6-9F3DB221535E} - {DFFE6199-B5A7-4BA8-A5E1-77D0426C6468} = {B32DB9B2-AD6C-48A5-8682-4373CB045185} - {052C4F97-5909-4D88-AA49-4B0D9058A0A9} = {50470834-4CD8-479A-8B58-0A1869BA5D37} - {9A6D67DE-51B1-456D-B25D-19E0356C8F60} = {8CEEC194-820A-4C8D-AB9E-E51E6D3E9CC1} - {44A03CF6-4EB6-434C-90D1-FF8142FE394E} = {8CEEC194-820A-4C8D-AB9E-E51E6D3E9CC1} - {A9140976-DFF9-432A-B1DC-E188A07C49E5} = {50470834-4CD8-479A-8B58-0A1869BA5D37} - {B3046301-6F00-4885-8B01-080BD489055C} = {50470834-4CD8-479A-8B58-0A1869BA5D37} - {29D12ADC-55E9-40D0-9E4C-F0EBB6E098EC} = {8CEEC194-820A-4C8D-AB9E-E51E6D3E9CC1} - {6C606FEB-9A1F-4816-ABE4-22AFA8CEE771} = {8CEEC194-820A-4C8D-AB9E-E51E6D3E9CC1} - {5F80663C-B072-49DE-9A67-FD804BAD787E} = {6EF07978-A6D2-40EB-891D-7D70C5F37E76} - {630E2D93-7F7D-4A8A-BB52-D8095A1F24D9} = {8CEEC194-820A-4C8D-AB9E-E51E6D3E9CC1} - {59E7614A-3630-4C39-9C7F-9E12BC95D37E} = {8CEEC194-820A-4C8D-AB9E-E51E6D3E9CC1} - {2F3E1026-5054-4E1F-899B-F1A7F70F9912} = {5BA4A8FA-F7F4-45B3-AEC8-8886D35AAC79} - {D5720DBC-8C2B-42D5-9D9F-2FF6EAD4001C} = {2F3E1026-5054-4E1F-899B-F1A7F70F9912} - {2B939AC9-03A4-479E-AA0D-CB58F4A7F480} = {50470834-4CD8-479A-8B58-0A1869BA5D37} + EndProjectSection +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Elasticsearch", "src\modules\Elsa.Elasticsearch\Elsa.Elasticsearch.csproj", "{3246883E-2FA7-4B4A-BDC5-99039A2869BC}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Webhooks", "src\modules\Elsa.Webhooks\Elsa.Webhooks.csproj", "{2BBFDE36-28A7-4875-8EBE-CC25C76B97FF}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "unit", "unit", "{18453B51-25EB-4317-A4B3-B10518252E92}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "integration", "integration", "{1B8D5897-902E-4632-8698-E89CAF3DDF54}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "component", "component", "{08B41FFA-CEE3-46A7-B5C0-3EB65D37A16C}" + ProjectSection(SolutionItems) = preProject + test\component\Directory.Build.props = test\component\Directory.Build.props + EndProjectSection +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Workflows.IntegrationTests", "test\integration\Elsa.Workflows.IntegrationTests\Elsa.Workflows.IntegrationTests.csproj", "{E9652738-2B3D-4357-B84B-54F0EA161382}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "clients", "clients", "{89608AA5-5ADE-4832-AC7B-871C4AE64210}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Api.Client", "src\clients\Elsa.Api.Client\Elsa.Api.Client.csproj", "{1FCB2200-28B8-4703-8E89-73241AAED047}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Environments", "src\modules\Elsa.Environments\Elsa.Environments.csproj", "{B5CDF747-8066-40D5-9BAE-CBE397BC9B51}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "persistence", "persistence", "{9B4F139F-7D26-435C-A561-89E65A67A8E5}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "scripting", "scripting", "{6EF07978-A6D2-40EB-891D-7D70C5F37E76}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "servicebus", "servicebus", "{DD089B8B-DA73-492A-9010-F772D1C178DA}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "security", "security", "{5948B0A5-7873-4DBB-BA03-EB283D6EA91B}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "workflows", "workflows", "{B08B4E00-C2AB-48F3-8389-449F42AEF179}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "timers", "timers", "{AB797AF0-C12C-46DE-A157-7E25625C6200}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "runtimes", "runtimes", "{58C59255-281C-4595-8732-808158F1DC6E}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Dapper", "src\modules\Elsa.Dapper\Elsa.Dapper.csproj", "{4D8F3BB2-709D-481A-8FD3-0DA9762B366D}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Dapper.Migrations", "src\modules\Elsa.Dapper.Migrations\Elsa.Dapper.Migrations.csproj", "{A86DF0F0-24E9-470E-984B-9E7332544972}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.WorkflowProviders.BlobStorage", "src\modules\Elsa.WorkflowProviders.BlobStorage\Elsa.WorkflowProviders.BlobStorage.csproj", "{A702DD84-B55C-4807-9C28-D8F5AC3CCA78}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.MongoDb", "src\modules\Elsa.MongoDb\Elsa.MongoDb.csproj", "{3A377A6A-F735-4010-9E00-72E8BEB8F1F2}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Mediator", "src\common\Elsa.Mediator\Elsa.Mediator.csproj", "{28818676-F6AF-4203-8B65-BD33A50CB9A2}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Workflows.Core.UnitTests", "test\unit\Elsa.Workflows.Core.UnitTests\Elsa.Workflows.Core.UnitTests.csproj", "{DC9CCAD0-7363-4691-B964-FF5B3AEA3F95}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.DropIns.Core", "src\common\Elsa.DropIns.Core\Elsa.DropIns.Core.csproj", "{1B794B9C-9B8A-4D5A-9848-B51274BD1FC5}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.DropIns", "src\common\Elsa.DropIns\Elsa.DropIns.csproj", "{4E7F15D1-729E-4DA7-992A-C3A2C6054B37}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.SasTokens", "src\modules\Elsa.SasTokens\Elsa.SasTokens.csproj", "{3095C95A-F1F9-487A-A983-1B100A33E4C7}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "alterations", "alterations", "{CF3DA5F1-F98D-49C9-A980-27E570B38B8D}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Alterations.Core", "src\modules\Elsa.Alterations.Core\Elsa.Alterations.Core.csproj", "{8DBEC8F3-908D-46B3-95CA-47EA138AB1A4}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Alterations", "src\modules\Elsa.Alterations\Elsa.Alterations.csproj", "{CC7DE119-736D-4FC5-85DC-70A6770749F6}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.EntityFrameworkCore.Sqlite", "src\modules\Elsa.EntityFrameworkCore.Sqlite\Elsa.EntityFrameworkCore.Sqlite.csproj", "{EFE4A814-F58D-4C19-8F7F-B95F4EE343F0}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.EntityFrameworkCore.SqlServer", "src\modules\Elsa.EntityFrameworkCore.SqlServer\Elsa.EntityFrameworkCore.SqlServer.csproj", "{1C84408D-A0A7-4513-AD9A-1BA137ABE62C}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.EntityFrameworkCore.MySql", "src\modules\Elsa.EntityFrameworkCore.MySql\Elsa.EntityFrameworkCore.MySql.csproj", "{E4300D97-1D53-4029-9435-483FB7EC9621}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.EntityFrameworkCore.PostgreSql", "src\modules\Elsa.EntityFrameworkCore.PostgreSql\Elsa.EntityFrameworkCore.PostgreSql.csproj", "{84AB9951-3DBF-43A4-8F5D-AEED1102CE88}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Alterations.MassTransit", "src\modules\Elsa.Alterations.MassTransit\Elsa.Alterations.MassTransit.csproj", "{1F621382-08FB-45EA-B94C-96A7FECB9489}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.EntityFrameworkCore.Common", "src\modules\Elsa.EntityFrameworkCore.Common\Elsa.EntityFrameworkCore.Common.csproj", "{FBA14F8A-9F14-4364-ABDB-B8AE81A0D755}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Quartz.EntityFrameworkCore.Sqlite", "src\modules\Elsa.Quartz.EntityFrameworkCore.Sqlite\Elsa.Quartz.EntityFrameworkCore.Sqlite.csproj", "{A71557F2-D5FB-4772-9391-F7D18A3B6C44}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Quartz.EntityFrameworkCore.SqlServer", "src\modules\Elsa.Quartz.EntityFrameworkCore.SqlServer\Elsa.Quartz.EntityFrameworkCore.SqlServer.csproj", "{05F3B23E-CF28-467B-AD3C-595EA4ED6B96}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Quartz.EntityFrameworkCore.MySql", "src\modules\Elsa.Quartz.EntityFrameworkCore.MySql\Elsa.Quartz.EntityFrameworkCore.MySql.csproj", "{74ACD9D0-8B4C-42FA-A582-E93BF0075023}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Quartz.EntityFrameworkCore.PostgreSql", "src\modules\Elsa.Quartz.EntityFrameworkCore.PostgreSql\Elsa.Quartz.EntityFrameworkCore.PostgreSql.csproj", "{CCCCEF8C-7D96-4BEA-B9D0-E91EDF08E65D}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.EntityFrameworkCore.Oracle", "src\modules\Elsa.EntityFrameworkCore.Oracle\Elsa.EntityFrameworkCore.Oracle.csproj", "{49D8D2CF-AF68-40FA-951F-018247C97443}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.FileStorage", "src\modules\Elsa.FileStorage\Elsa.FileStorage.csproj", "{732BF088-6AD7-4C4D-9A48-8074253596D4}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "storage", "storage", "{B818988E-639C-4E6E-85C1-B231BCAD9DAB}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Tenants", "src\modules\Elsa.Tenants\Elsa.Tenants.csproj", "{29638A67-E79F-44FE-AC05-DA499EBA929E}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.CSharp", "src\modules\Elsa.CSharp\Elsa.CSharp.csproj", "{24331E82-D7AF-45B1-ACF0-CA6C3B0B77DC}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Python", "src\modules\Elsa.Python\Elsa.Python.csproj", "{790E94F2-5393-47DF-AC52-D9247F5B243A}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.MassTransit.RabbitMq", "src\modules\Elsa.MassTransit.RabbitMq\Elsa.MassTransit.RabbitMq.csproj", "{169BEA3D-2A81-47EE-A6C1-3F8719EEC1F6}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "pipelines", "pipelines", "{B789B743-0FBE-4BBC-9F45-84C20C8D4814}" + ProjectSection(SolutionItems) = preProject + .github\workflows\bounty.yml = .github\workflows\bounty.yml + .github\workflows\elsa-server-and-studio.yml = .github\workflows\elsa-server-and-studio.yml + .github\workflows\elsa-server.yml = .github\workflows\elsa-server.yml + .github\workflows\elsa-studio.yml = .github\workflows\elsa-studio.yml + .github\workflows\packages.yml = .github\workflows\packages.yml + .github\workflows\pr.yml = .github\workflows\pr.yml + .github\workflows\stale.yml = .github\workflows\stale.yml + EndProjectSection +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "_build", "build\_build.csproj", "{99F2B1DA-2F69-4D70-A2A3-AC985AD91EC4}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.MassTransit.AzureServiceBus", "src\modules\Elsa.MassTransit.AzureServiceBus\Elsa.MassTransit.AzureServiceBus.csproj", "{AFEB799E-82C3-4D02-9D5C-766BB8DEF004}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "scripts", "scripts", "{C80C8231-D35C-4ACC-9ED6-9F3DB221535E}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Alterations.IntegrationTests", "test\integration\Elsa.Alterations.IntegrationTests\Elsa.Alterations.IntegrationTests.csproj", "{F50336DA-42D1-4DD1-A107-67AFEB8A33EE}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "hosting", "hosting", "{A516931E-EDBB-4FC3-BB94-1BB824D5BC61}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Hosting.Management", "src\modules\Elsa.Hosting.Management\Elsa.Hosting.Management.csproj", "{BBCE36D1-6767-4ED1-B3E8-84D2567A962A}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.KeyValues", "src\modules\Elsa.KeyValues\Elsa.KeyValues.csproj", "{73BBB1E3-AEEC-44E8-83D7-6DD9CD687FE3}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Workflows.Runtime.UnitTests", "test\unit\Elsa.Workflows.Runtime.UnitTests\Elsa.Workflows.Runtime.UnitTests.csproj", "{B0946844-DE0E-4C59-9391-C0EB649DBF4E}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Caching", "src\modules\Elsa.Caching\Elsa.Caching.csproj", "{A1FE2CA0-8EF3-4EDB-9055-DD282E374E16}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "caching", "caching", "{EB3A7401-0DE3-476F-9E6F-057F1F4590FB}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Caching.Distributed.MassTransit", "src\modules\Elsa.Caching.Distributed.MassTransit\Elsa.Caching.Distributed.MassTransit.csproj", "{BF4CDE28-F0CC-482D-8392-C1C9BB4C368F}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Caching.Distributed", "src\modules\Elsa.Caching.Distributed\Elsa.Caching.Distributed.csproj", "{7EB0CFB8-B668-4F3F-898D-80411095BC2F}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Workflows.ComponentTests", "test\component\Elsa.Workflows.ComponentTests\Elsa.Workflows.ComponentTests.csproj", "{34BC9836-681D-43A5-BC39-E4FEE17FC528}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "performance", "performance", "{CBB515F3-A0EF-43B5-A907-FD4E652DD66E}" + ProjectSection(SolutionItems) = preProject + test\performance\Directory.Build.props = test\performance\Directory.Build.props + EndProjectSection +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Workflows.PerformanceTests", "test\performance\Elsa.Workflows.PerformanceTests\Elsa.Workflows.PerformanceTests.csproj", "{90CD37A9-C866-4D90-A3B1-8C87F53B845E}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "retention", "retention", "{3F20899B-C5E1-485F-808B-ADB1877EB3FD}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Retention", "src\modules\Elsa.Retention\Elsa.Retention.csproj", "{3D42FCA2-5BD0-4624-9FCA-F4BF935B27AE}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.MongoDb.UnitTests", "test\unit\Elsa.MongoDb.UnitTests\Elsa.MongoDb.UnitTests.csproj", "{56CAA9F2-1882-4EFA-BAC0-9C3D804553F1}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Workflows.Runtime.Distributed", "src\modules\Elsa.Workflows.Runtime.Distributed\Elsa.Workflows.Runtime.Distributed.csproj", "{0D4A88A1-8AEE-49ED-BC2E-ED68C96F60AD}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Testing.Shared", "src\common\Elsa.Testing.Shared\Elsa.Testing.Shared.csproj", "{5CBCBEA4-6038-48CA-B45D-C1D0F6B4ACA4}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Testing.Shared.Integration", "src\common\Elsa.Testing.Shared.Integration\Elsa.Testing.Shared.Integration.csproj", "{94A61AD7-2A2B-40DB-81F3-C59D596958A8}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Testing.Shared.Component", "src\common\Elsa.Testing.Shared.Component\Elsa.Testing.Shared.Component.csproj", "{4B598AF7-BD7D-4544-A274-2CDDD98F4167}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Activities.IntegrationTests", "test\integration\Elsa.Activities.IntegrationTests\Elsa.Activities.IntegrationTests.csproj", "{99B171E6-0248-4402-836D-98947CD63772}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.JavaScript.IntegrationTests", "test\integration\Elsa.JavaScript.IntegrationTests\Elsa.JavaScript.IntegrationTests.csproj", "{4332A6BC-434A-4AF5-A075-F1BBCDD28F5D}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.AzureServiceBus.ComponentTests", "test\component\Elsa.AzureServiceBus.ComponentTests\Elsa.AzureServiceBus.ComponentTests.csproj", "{7F5A304F-7DD9-4A64-8FCD-9B1FF06735B9}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "apps", "apps", "{D92BEAB2-60D6-4BB4-885A-6BA681C6CCF1}" + ProjectSection(SolutionItems) = preProject + src\apps\Directory.Build.props = src\apps\Directory.Build.props + EndProjectSection +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Server.Web", "src\apps\Elsa.Server.Web\Elsa.Server.Web.csproj", "{5ADDDFB1-E59B-4097-97B7-8C24E2D60463}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa", "src\modules\Elsa\Elsa.csproj", "{97C7E531-9D5F-43FD-AA19-BF24DA13B612}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Server.LoadBalancer", "src\apps\Elsa.Server.LoadBalancer\Elsa.Server.LoadBalancer.csproj", "{65F2AD97-3ECF-4BA6-8AAA-1E5882FDCE68}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ElsaStudioWebAssembly", "src\apps\ElsaStudioWebAssembly\ElsaStudioWebAssembly.csproj", "{690B0274-291F-4D9E-BA76-54EFF7D3E4BC}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.ServerAndStudio.Web", "src\apps\Elsa.ServerAndStudio.Web\Elsa.ServerAndStudio.Web.csproj", "{060FD0BA-BD78-48E1-A8A7-4906A5AD5E39}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Studio.Web", "src\apps\Elsa.Studio.Web\Elsa.Studio.Web.csproj", "{169A82A5-2DB3-40EA-801E-14C08D743DF7}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.OpenTelemetry", "src\modules\Elsa.OpenTelemetry\Elsa.OpenTelemetry.csproj", "{2CDF3E1C-267D-4198-B1C7-7E1F548FC120}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.ProtoActor.Core", "src\modules\Elsa.ProtoActor.Core\Elsa.ProtoActor.Core.csproj", "{01B96BB9-35E8-4364-ACB8-6D12A14D8DBA}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Caching.Distributed.ProtoActor", "src\modules\Elsa.Caching.Distributed.ProtoActor\Elsa.Caching.Distributed.ProtoActor.csproj", "{47FBCB04-0C2D-453C-BE2F-7052CAC22524}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "k8s", "k8s", "{B32DB9B2-AD6C-48A5-8682-4373CB045185}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "elsa-server", "elsa-server", "{454652D5-E1BB-4D4B-9B21-9CEFC900C4FB}" + ProjectSection(SolutionItems) = preProject + scripts\k8s\elsa-server\deployment.yaml = scripts\k8s\elsa-server\deployment.yaml + scripts\k8s\elsa-server\role-binding.yaml = scripts\k8s\elsa-server\role-binding.yaml + scripts\k8s\elsa-server\role.yaml = scripts\k8s\elsa-server\role.yaml + scripts\k8s\elsa-server\service-account.yml = scripts\k8s\elsa-server\service-account.yml + scripts\k8s\elsa-server\service.yaml = scripts\k8s\elsa-server\service.yaml + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "postgres", "postgres", "{31089E79-694B-4F45-97AF-86D34A7B231E}" + ProjectSection(SolutionItems) = preProject + scripts\k8s\postgres\config-map.yaml = scripts\k8s\postgres\config-map.yaml + scripts\k8s\postgres\deployment.yaml = scripts\k8s\postgres\deployment.yaml + scripts\k8s\postgres\service.yml = scripts\k8s\postgres\service.yml + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "plant-uml", "plant-uml", "{6DDB9ECF-D454-4894-A262-A6BB3026E61E}" + ProjectSection(SolutionItems) = preProject + scripts\k8s\plant-uml\deployment.yaml = scripts\k8s\plant-uml\deployment.yaml + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "trace-lens", "trace-lens", "{16B570BC-E293-4A19-B20E-5C97BAF8476B}" + ProjectSection(SolutionItems) = preProject + scripts\k8s\trace-lens\deployment.yaml = scripts\k8s\trace-lens\deployment.yaml + scripts\k8s\trace-lens\service.yaml = scripts\k8s\trace-lens\service.yaml + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "integrations", "integrations", "{EBD0CF78-C5D7-4B4B-94C9-C5D8C20B6F59}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.OrchardCore", "src\modules\Elsa.OrchardCore\Elsa.OrchardCore.csproj", "{B0460856-7E6D-4B1E-B243-8E20662FC32E}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "agents", "agents", "{50470834-4CD8-479A-8B58-0A1869BA5D37}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Agents.Core", "src\modules\Elsa.Agents.Core\Elsa.Agents.Core.csproj", "{5BD671F0-9603-4C2F-8364-54B02986EAA2}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Agents.Api", "src\modules\Elsa.Agents.Api\Elsa.Agents.Api.csproj", "{154525CD-3726-45B7-9A9C-553BBC60EB10}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Agents.Activities", "src\modules\Elsa.Agents.Activities\Elsa.Agents.Activities.csproj", "{F620D7DC-B58D-4BD0-81A2-E88A2C1E4833}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Agents.Persistence.EntityFrameworkCore", "src\modules\Elsa.Agents.Persistence.EntityFrameworkCore\Elsa.Agents.Persistence.EntityFrameworkCore.csproj", "{6FE60BB4-DE6A-485C-A38A-1317C56AF2DA}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "nuke", "nuke", "{57326431-9C6C-4BAB-AA51-15131C21ADCC}" + ProjectSection(SolutionItems) = preProject + scripts\nuke\build.cmd = scripts\nuke\build.cmd + scripts\nuke\build.ps1 = scripts\nuke\build.ps1 + scripts\nuke\build.sh = scripts\nuke\build.sh + EndProjectSection +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Secrets.Core", "src\modules\Elsa.Secrets.Core\Elsa.Secrets.Core.csproj", "{34FAB60D-7259-47B9-B50E-B533C7C3CFEC}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "secrets", "secrets", "{8CEEC194-820A-4C8D-AB9E-E51E6D3E9CC1}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Secrets.Management", "src\modules\Elsa.Secrets.Management\Elsa.Secrets.Management.csproj", "{19329441-2A59-4BAC-A1BE-BBAB70C93CA0}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Secrets.Api", "src\modules\Elsa.Secrets.Api\Elsa.Secrets.Api.csproj", "{37D16EAF-ACD8-4105-8BD3-B2745819CFF8}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Agents.Persistence", "src\modules\Elsa.Agents.Persistence\Elsa.Agents.Persistence.csproj", "{CFEC357F-0863-4458-A6C4-5D7AA0E44759}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Agents.Persistence.EntityFrameworkCore.Sqlite", "src\modules\Elsa.Agents.Persistence.EntityFrameworkCore.Sqlite\Elsa.Agents.Persistence.EntityFrameworkCore.Sqlite.csproj", "{E75762D2-FD12-4165-810B-628C28CB2562}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "migrations", "migrations", "{3666CF13-1353-4620-9472-506670214A6A}" + ProjectSection(SolutionItems) = preProject + scripts\migrations\efcore-3.0.sh = scripts\migrations\efcore-3.0.sh + scripts\migrations\efcore-3.1-sql.sh = scripts\migrations\efcore-3.1-sql.sh + scripts\migrations\efcore-3.1.sh = scripts\migrations\efcore-3.1.sh + scripts\migrations\efcore-3.2.sh = scripts\migrations\efcore-3.2.sh + scripts\migrations\efcore-3.3.sh = scripts\migrations\efcore-3.3.sh + scripts\migrations\README.md = scripts\migrations\README.md + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "docker", "docker", "{AA5ACF15-8647-4AC9-B9F5-73FCB92BE7E3}" + ProjectSection(SolutionItems) = preProject + scripts\docker\build-and-run-all-in-one-web-docker.sh = scripts\docker\build-and-run-all-in-one-web-docker.sh + scripts\docker\docker-compose.yml = scripts\docker\docker-compose.yml + scripts\docker\docker-run-all-in-one-web.ps1 = scripts\docker\docker-run-all-in-one-web.ps1 + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "elsa-studio", "elsa-studio", "{DFFE6199-B5A7-4BA8-A5E1-77D0426C6468}" + ProjectSection(SolutionItems) = preProject + scripts\k8s\elsa-studio\deployment.yaml = scripts\k8s\elsa-studio\deployment.yaml + scripts\k8s\elsa-studio\service.yaml = scripts\k8s\elsa-studio\service.yaml + EndProjectSection +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Agents.Models", "src\modules\Elsa.Agents.Models\Elsa.Agents.Models.csproj", "{052C4F97-5909-4D88-AA49-4B0D9058A0A9}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Secrets.Persistence.EntityFrameworkCore", "src\modules\Elsa.Secrets.Persistence.EntityFrameworkCore\Elsa.Secrets.Persistence.EntityFrameworkCore.csproj", "{9A6D67DE-51B1-456D-B25D-19E0356C8F60}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Secrets.Persistence.EntityFrameworkCore.Sqlite", "src\modules\Elsa.Secrets.Persistence.EntityFrameworkCore.Sqlite\Elsa.Secrets.Persistence.EntityFrameworkCore.Sqlite.csproj", "{44A03CF6-4EB6-434C-90D1-FF8142FE394E}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Agents.Persistence.EntityFrameworkCore.SqlServer", "src\modules\Elsa.Agents.Persistence.EntityFrameworkCore.SqlServer\Elsa.Agents.Persistence.EntityFrameworkCore.SqlServer.csproj", "{A9140976-DFF9-432A-B1DC-E188A07C49E5}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Agents.Persistence.EntityFrameworkCore.MySql", "src\modules\Elsa.Agents.Persistence.EntityFrameworkCore.MySql\Elsa.Agents.Persistence.EntityFrameworkCore.MySql.csproj", "{B3046301-6F00-4885-8B01-080BD489055C}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Secrets.Models", "src\modules\Elsa.Secrets.Models\Elsa.Secrets.Models.csproj", "{29D12ADC-55E9-40D0-9E4C-F0EBB6E098EC}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Secrets.Scripting", "src\modules\Elsa.Secrets.Scripting\Elsa.Secrets.Scripting.csproj", "{6C606FEB-9A1F-4816-ABE4-22AFA8CEE771}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.JavaScript.Libraries", "src\modules\Elsa.JavaScript.Libraries\Elsa.JavaScript.Libraries.csproj", "{5F80663C-B072-49DE-9A67-FD804BAD787E}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Secrets.Persistence.EntityFrameworkCore.PostgreSql", "src\modules\Elsa.Secrets.Persistence.EntityFrameworkCore.PostgreSql\Elsa.Secrets.Persistence.EntityFrameworkCore.PostgreSql.csproj", "{630E2D93-7F7D-4A8A-BB52-D8095A1F24D9}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Secrets.Persistence.EntityFrameworkCore.SqlServer", "src\modules\Elsa.Secrets.Persistence.EntityFrameworkCore.SqlServer\Elsa.Secrets.Persistence.EntityFrameworkCore.SqlServer.csproj", "{59E7614A-3630-4C39-9C7F-9E12BC95D37E}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "multitenancy", "multitenancy", "{2F3E1026-5054-4E1F-899B-F1A7F70F9912}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Tenants.AspNetCore", "src\modules\Elsa.Tenants.AspNetCore\Elsa.Tenants.AspNetCore.csproj", "{D5720DBC-8C2B-42D5-9D9F-2FF6EAD4001C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Agents.Persistence.EntityFrameworkCore.PostgreSql", "src\modules\Elsa.Agents.Persistence.EntityFrameworkCore.PostgreSql\Elsa.Agents.Persistence.EntityFrameworkCore.PostgreSql.csproj", "{2B939AC9-03A4-479E-AA0D-CB58F4A7F480}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Kafka", "src\modules\Elsa.Kafka\Elsa.Kafka.csproj", "{BF934627-F531-44FB-BEC2-ECA801FF31E7}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "connection", "connection", "{FFC2EE94-ABD1-4D22-A325-A53F80CC097E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Connections.Core", "src\modules\Elsa.Connections.Core\Elsa.Connections.Core.csproj", "{7F620A88-E1CE-4D73-A21A-DE5A5B538BA8}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Connections.Api", "src\modules\Elsa.Connections.Api\Elsa.Connections.Api.csproj", "{FD22E2B0-E164-4881-9DD4-4E429D178FB9}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Connections.Persistence", "src\modules\Elsa.Connections.Persistence\Elsa.Connections.Persistence.csproj", "{9C2764B2-8BA4-4184-9B75-C426A593C815}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Connections.Models", "src\modules\Elsa.Connections.Models\Elsa.Connections.Models.csproj", "{FB1A962B-1299-4B35-9F53-3683BBD3426C}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {7D5A49B4-9A9B-496E-803B-DEB85B2C3132}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7D5A49B4-9A9B-496E-803B-DEB85B2C3132}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7D5A49B4-9A9B-496E-803B-DEB85B2C3132}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7D5A49B4-9A9B-496E-803B-DEB85B2C3132}.Release|Any CPU.Build.0 = Release|Any CPU + {82E26BF9-5F3A-4365-899A-AB1FFD54AA45}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {82E26BF9-5F3A-4365-899A-AB1FFD54AA45}.Debug|Any CPU.Build.0 = Debug|Any CPU + {82E26BF9-5F3A-4365-899A-AB1FFD54AA45}.Release|Any CPU.ActiveCfg = Release|Any CPU + {82E26BF9-5F3A-4365-899A-AB1FFD54AA45}.Release|Any CPU.Build.0 = Release|Any CPU + {ACD65CE5-3CC2-47B1-BFAC-72443D764F6E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {ACD65CE5-3CC2-47B1-BFAC-72443D764F6E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {ACD65CE5-3CC2-47B1-BFAC-72443D764F6E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {ACD65CE5-3CC2-47B1-BFAC-72443D764F6E}.Release|Any CPU.Build.0 = Release|Any CPU + {24C7095B-5CDD-4369-9F34-5565A019B195}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {24C7095B-5CDD-4369-9F34-5565A019B195}.Debug|Any CPU.Build.0 = Debug|Any CPU + {24C7095B-5CDD-4369-9F34-5565A019B195}.Release|Any CPU.ActiveCfg = Release|Any CPU + {24C7095B-5CDD-4369-9F34-5565A019B195}.Release|Any CPU.Build.0 = Release|Any CPU + {D31581AB-A6C1-4B73-AB63-45667F6C82AE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D31581AB-A6C1-4B73-AB63-45667F6C82AE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D31581AB-A6C1-4B73-AB63-45667F6C82AE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D31581AB-A6C1-4B73-AB63-45667F6C82AE}.Release|Any CPU.Build.0 = Release|Any CPU + {0601A2A6-2C62-418B-9104-8CDE497E5283}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0601A2A6-2C62-418B-9104-8CDE497E5283}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0601A2A6-2C62-418B-9104-8CDE497E5283}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0601A2A6-2C62-418B-9104-8CDE497E5283}.Release|Any CPU.Build.0 = Release|Any CPU + {302BFC43-ED2F-43AE-8AD4-FCD481B0AC67}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {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 + {BB983D0B-A939-4008-B9E3-C7C172BCF83A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BB983D0B-A939-4008-B9E3-C7C172BCF83A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BB983D0B-A939-4008-B9E3-C7C172BCF83A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BB983D0B-A939-4008-B9E3-C7C172BCF83A}.Release|Any CPU.Build.0 = Release|Any CPU + {80FF5821-E831-450D-AA0C-C76D07D878F4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {80FF5821-E831-450D-AA0C-C76D07D878F4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {80FF5821-E831-450D-AA0C-C76D07D878F4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {80FF5821-E831-450D-AA0C-C76D07D878F4}.Release|Any CPU.Build.0 = Release|Any CPU + {8E5BD3D9-3529-48BC-B741-CFB7A69DB233}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8E5BD3D9-3529-48BC-B741-CFB7A69DB233}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8E5BD3D9-3529-48BC-B741-CFB7A69DB233}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8E5BD3D9-3529-48BC-B741-CFB7A69DB233}.Release|Any CPU.Build.0 = Release|Any CPU + {B2049499-D384-46DF-8837-F1180107DD54}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B2049499-D384-46DF-8837-F1180107DD54}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B2049499-D384-46DF-8837-F1180107DD54}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B2049499-D384-46DF-8837-F1180107DD54}.Release|Any CPU.Build.0 = Release|Any CPU + {78DAB791-8595-4612-8E9E-2248AF5B1862}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {78DAB791-8595-4612-8E9E-2248AF5B1862}.Debug|Any CPU.Build.0 = Debug|Any CPU + {78DAB791-8595-4612-8E9E-2248AF5B1862}.Release|Any CPU.ActiveCfg = Release|Any CPU + {78DAB791-8595-4612-8E9E-2248AF5B1862}.Release|Any CPU.Build.0 = Release|Any CPU + {C9539BD8-D2AE-4A8D-8281-71A05B3FBF31}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C9539BD8-D2AE-4A8D-8281-71A05B3FBF31}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C9539BD8-D2AE-4A8D-8281-71A05B3FBF31}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C9539BD8-D2AE-4A8D-8281-71A05B3FBF31}.Release|Any CPU.Build.0 = Release|Any CPU + {169E2C9B-6687-427F-A278-30BF849BFEDC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {169E2C9B-6687-427F-A278-30BF849BFEDC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {169E2C9B-6687-427F-A278-30BF849BFEDC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {169E2C9B-6687-427F-A278-30BF849BFEDC}.Release|Any CPU.Build.0 = Release|Any CPU + {2DD5D66B-85E9-4AF9-911C-C9F963234159}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2DD5D66B-85E9-4AF9-911C-C9F963234159}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2DD5D66B-85E9-4AF9-911C-C9F963234159}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2DD5D66B-85E9-4AF9-911C-C9F963234159}.Release|Any CPU.Build.0 = Release|Any CPU + {8A050229-DB79-4E0B-9AFF-7565E87F2954}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8A050229-DB79-4E0B-9AFF-7565E87F2954}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8A050229-DB79-4E0B-9AFF-7565E87F2954}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8A050229-DB79-4E0B-9AFF-7565E87F2954}.Release|Any CPU.Build.0 = Release|Any CPU + {C237BA1A-3A7D-4AB2-BE09-2696F3C082A4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C237BA1A-3A7D-4AB2-BE09-2696F3C082A4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C237BA1A-3A7D-4AB2-BE09-2696F3C082A4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C237BA1A-3A7D-4AB2-BE09-2696F3C082A4}.Release|Any CPU.Build.0 = Release|Any CPU + {80529478-A383-4FEA-B744-C71264969E9A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {80529478-A383-4FEA-B744-C71264969E9A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {80529478-A383-4FEA-B744-C71264969E9A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {80529478-A383-4FEA-B744-C71264969E9A}.Release|Any CPU.Build.0 = Release|Any CPU + {39CD855E-83B1-4A96-93F7-01608211EBE3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {39CD855E-83B1-4A96-93F7-01608211EBE3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {39CD855E-83B1-4A96-93F7-01608211EBE3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {39CD855E-83B1-4A96-93F7-01608211EBE3}.Release|Any CPU.Build.0 = Release|Any CPU + {30B49E42-AE61-4F7C-981F-923F07BB3986}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {30B49E42-AE61-4F7C-981F-923F07BB3986}.Debug|Any CPU.Build.0 = Debug|Any CPU + {30B49E42-AE61-4F7C-981F-923F07BB3986}.Release|Any CPU.ActiveCfg = Release|Any CPU + {30B49E42-AE61-4F7C-981F-923F07BB3986}.Release|Any CPU.Build.0 = Release|Any CPU + {D229105F-6879-4452-9189-75DE060C0F4C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D229105F-6879-4452-9189-75DE060C0F4C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D229105F-6879-4452-9189-75DE060C0F4C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D229105F-6879-4452-9189-75DE060C0F4C}.Release|Any CPU.Build.0 = Release|Any CPU + {7CC95512-7F44-45C3-A669-95B7048D4730}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7CC95512-7F44-45C3-A669-95B7048D4730}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7CC95512-7F44-45C3-A669-95B7048D4730}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7CC95512-7F44-45C3-A669-95B7048D4730}.Release|Any CPU.Build.0 = Release|Any CPU + {F09B30F7-AF33-44D7-B835-099D1F72A37E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F09B30F7-AF33-44D7-B835-099D1F72A37E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F09B30F7-AF33-44D7-B835-099D1F72A37E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F09B30F7-AF33-44D7-B835-099D1F72A37E}.Release|Any CPU.Build.0 = Release|Any CPU + {1E5BD8D9-55BE-41E2-B389-6AB9F26C22AF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1E5BD8D9-55BE-41E2-B389-6AB9F26C22AF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1E5BD8D9-55BE-41E2-B389-6AB9F26C22AF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1E5BD8D9-55BE-41E2-B389-6AB9F26C22AF}.Release|Any CPU.Build.0 = Release|Any CPU + {3246883E-2FA7-4B4A-BDC5-99039A2869BC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3246883E-2FA7-4B4A-BDC5-99039A2869BC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3246883E-2FA7-4B4A-BDC5-99039A2869BC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3246883E-2FA7-4B4A-BDC5-99039A2869BC}.Release|Any CPU.Build.0 = Release|Any CPU + {2BBFDE36-28A7-4875-8EBE-CC25C76B97FF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2BBFDE36-28A7-4875-8EBE-CC25C76B97FF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2BBFDE36-28A7-4875-8EBE-CC25C76B97FF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2BBFDE36-28A7-4875-8EBE-CC25C76B97FF}.Release|Any CPU.Build.0 = Release|Any CPU + {E9652738-2B3D-4357-B84B-54F0EA161382}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E9652738-2B3D-4357-B84B-54F0EA161382}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E9652738-2B3D-4357-B84B-54F0EA161382}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E9652738-2B3D-4357-B84B-54F0EA161382}.Release|Any CPU.Build.0 = Release|Any CPU + {1FCB2200-28B8-4703-8E89-73241AAED047}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1FCB2200-28B8-4703-8E89-73241AAED047}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1FCB2200-28B8-4703-8E89-73241AAED047}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1FCB2200-28B8-4703-8E89-73241AAED047}.Release|Any CPU.Build.0 = Release|Any CPU + {B5CDF747-8066-40D5-9BAE-CBE397BC9B51}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B5CDF747-8066-40D5-9BAE-CBE397BC9B51}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B5CDF747-8066-40D5-9BAE-CBE397BC9B51}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B5CDF747-8066-40D5-9BAE-CBE397BC9B51}.Release|Any CPU.Build.0 = Release|Any CPU + {4D8F3BB2-709D-481A-8FD3-0DA9762B366D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4D8F3BB2-709D-481A-8FD3-0DA9762B366D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4D8F3BB2-709D-481A-8FD3-0DA9762B366D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4D8F3BB2-709D-481A-8FD3-0DA9762B366D}.Release|Any CPU.Build.0 = Release|Any CPU + {A86DF0F0-24E9-470E-984B-9E7332544972}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A86DF0F0-24E9-470E-984B-9E7332544972}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A86DF0F0-24E9-470E-984B-9E7332544972}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A86DF0F0-24E9-470E-984B-9E7332544972}.Release|Any CPU.Build.0 = Release|Any CPU + {A702DD84-B55C-4807-9C28-D8F5AC3CCA78}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A702DD84-B55C-4807-9C28-D8F5AC3CCA78}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A702DD84-B55C-4807-9C28-D8F5AC3CCA78}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A702DD84-B55C-4807-9C28-D8F5AC3CCA78}.Release|Any CPU.Build.0 = Release|Any CPU + {3A377A6A-F735-4010-9E00-72E8BEB8F1F2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3A377A6A-F735-4010-9E00-72E8BEB8F1F2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3A377A6A-F735-4010-9E00-72E8BEB8F1F2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3A377A6A-F735-4010-9E00-72E8BEB8F1F2}.Release|Any CPU.Build.0 = Release|Any CPU + {28818676-F6AF-4203-8B65-BD33A50CB9A2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {28818676-F6AF-4203-8B65-BD33A50CB9A2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {28818676-F6AF-4203-8B65-BD33A50CB9A2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {28818676-F6AF-4203-8B65-BD33A50CB9A2}.Release|Any CPU.Build.0 = Release|Any CPU + {DC9CCAD0-7363-4691-B964-FF5B3AEA3F95}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DC9CCAD0-7363-4691-B964-FF5B3AEA3F95}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DC9CCAD0-7363-4691-B964-FF5B3AEA3F95}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DC9CCAD0-7363-4691-B964-FF5B3AEA3F95}.Release|Any CPU.Build.0 = Release|Any CPU + {1B794B9C-9B8A-4D5A-9848-B51274BD1FC5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1B794B9C-9B8A-4D5A-9848-B51274BD1FC5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1B794B9C-9B8A-4D5A-9848-B51274BD1FC5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1B794B9C-9B8A-4D5A-9848-B51274BD1FC5}.Release|Any CPU.Build.0 = Release|Any CPU + {4E7F15D1-729E-4DA7-992A-C3A2C6054B37}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4E7F15D1-729E-4DA7-992A-C3A2C6054B37}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4E7F15D1-729E-4DA7-992A-C3A2C6054B37}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4E7F15D1-729E-4DA7-992A-C3A2C6054B37}.Release|Any CPU.Build.0 = Release|Any CPU + {3095C95A-F1F9-487A-A983-1B100A33E4C7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3095C95A-F1F9-487A-A983-1B100A33E4C7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3095C95A-F1F9-487A-A983-1B100A33E4C7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3095C95A-F1F9-487A-A983-1B100A33E4C7}.Release|Any CPU.Build.0 = Release|Any CPU + {8DBEC8F3-908D-46B3-95CA-47EA138AB1A4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8DBEC8F3-908D-46B3-95CA-47EA138AB1A4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8DBEC8F3-908D-46B3-95CA-47EA138AB1A4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8DBEC8F3-908D-46B3-95CA-47EA138AB1A4}.Release|Any CPU.Build.0 = Release|Any CPU + {CC7DE119-736D-4FC5-85DC-70A6770749F6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CC7DE119-736D-4FC5-85DC-70A6770749F6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CC7DE119-736D-4FC5-85DC-70A6770749F6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CC7DE119-736D-4FC5-85DC-70A6770749F6}.Release|Any CPU.Build.0 = Release|Any CPU + {EFE4A814-F58D-4C19-8F7F-B95F4EE343F0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EFE4A814-F58D-4C19-8F7F-B95F4EE343F0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EFE4A814-F58D-4C19-8F7F-B95F4EE343F0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EFE4A814-F58D-4C19-8F7F-B95F4EE343F0}.Release|Any CPU.Build.0 = Release|Any CPU + {1C84408D-A0A7-4513-AD9A-1BA137ABE62C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1C84408D-A0A7-4513-AD9A-1BA137ABE62C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1C84408D-A0A7-4513-AD9A-1BA137ABE62C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1C84408D-A0A7-4513-AD9A-1BA137ABE62C}.Release|Any CPU.Build.0 = Release|Any CPU + {E4300D97-1D53-4029-9435-483FB7EC9621}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E4300D97-1D53-4029-9435-483FB7EC9621}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E4300D97-1D53-4029-9435-483FB7EC9621}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E4300D97-1D53-4029-9435-483FB7EC9621}.Release|Any CPU.Build.0 = Release|Any CPU + {84AB9951-3DBF-43A4-8F5D-AEED1102CE88}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {84AB9951-3DBF-43A4-8F5D-AEED1102CE88}.Debug|Any CPU.Build.0 = Debug|Any CPU + {84AB9951-3DBF-43A4-8F5D-AEED1102CE88}.Release|Any CPU.ActiveCfg = Release|Any CPU + {84AB9951-3DBF-43A4-8F5D-AEED1102CE88}.Release|Any CPU.Build.0 = Release|Any CPU + {1F621382-08FB-45EA-B94C-96A7FECB9489}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1F621382-08FB-45EA-B94C-96A7FECB9489}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1F621382-08FB-45EA-B94C-96A7FECB9489}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1F621382-08FB-45EA-B94C-96A7FECB9489}.Release|Any CPU.Build.0 = Release|Any CPU + {FBA14F8A-9F14-4364-ABDB-B8AE81A0D755}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FBA14F8A-9F14-4364-ABDB-B8AE81A0D755}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FBA14F8A-9F14-4364-ABDB-B8AE81A0D755}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FBA14F8A-9F14-4364-ABDB-B8AE81A0D755}.Release|Any CPU.Build.0 = Release|Any CPU + {A71557F2-D5FB-4772-9391-F7D18A3B6C44}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A71557F2-D5FB-4772-9391-F7D18A3B6C44}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A71557F2-D5FB-4772-9391-F7D18A3B6C44}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A71557F2-D5FB-4772-9391-F7D18A3B6C44}.Release|Any CPU.Build.0 = Release|Any CPU + {05F3B23E-CF28-467B-AD3C-595EA4ED6B96}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {05F3B23E-CF28-467B-AD3C-595EA4ED6B96}.Debug|Any CPU.Build.0 = Debug|Any CPU + {05F3B23E-CF28-467B-AD3C-595EA4ED6B96}.Release|Any CPU.ActiveCfg = Release|Any CPU + {05F3B23E-CF28-467B-AD3C-595EA4ED6B96}.Release|Any CPU.Build.0 = Release|Any CPU + {74ACD9D0-8B4C-42FA-A582-E93BF0075023}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {74ACD9D0-8B4C-42FA-A582-E93BF0075023}.Debug|Any CPU.Build.0 = Debug|Any CPU + {74ACD9D0-8B4C-42FA-A582-E93BF0075023}.Release|Any CPU.ActiveCfg = Release|Any CPU + {74ACD9D0-8B4C-42FA-A582-E93BF0075023}.Release|Any CPU.Build.0 = Release|Any CPU + {CCCCEF8C-7D96-4BEA-B9D0-E91EDF08E65D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CCCCEF8C-7D96-4BEA-B9D0-E91EDF08E65D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CCCCEF8C-7D96-4BEA-B9D0-E91EDF08E65D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CCCCEF8C-7D96-4BEA-B9D0-E91EDF08E65D}.Release|Any CPU.Build.0 = Release|Any CPU + {49D8D2CF-AF68-40FA-951F-018247C97443}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {49D8D2CF-AF68-40FA-951F-018247C97443}.Debug|Any CPU.Build.0 = Debug|Any CPU + {49D8D2CF-AF68-40FA-951F-018247C97443}.Release|Any CPU.ActiveCfg = Release|Any CPU + {49D8D2CF-AF68-40FA-951F-018247C97443}.Release|Any CPU.Build.0 = Release|Any CPU + {732BF088-6AD7-4C4D-9A48-8074253596D4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {732BF088-6AD7-4C4D-9A48-8074253596D4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {732BF088-6AD7-4C4D-9A48-8074253596D4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {732BF088-6AD7-4C4D-9A48-8074253596D4}.Release|Any CPU.Build.0 = Release|Any CPU + {29638A67-E79F-44FE-AC05-DA499EBA929E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {29638A67-E79F-44FE-AC05-DA499EBA929E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {29638A67-E79F-44FE-AC05-DA499EBA929E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {29638A67-E79F-44FE-AC05-DA499EBA929E}.Release|Any CPU.Build.0 = Release|Any CPU + {24331E82-D7AF-45B1-ACF0-CA6C3B0B77DC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {24331E82-D7AF-45B1-ACF0-CA6C3B0B77DC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {24331E82-D7AF-45B1-ACF0-CA6C3B0B77DC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {24331E82-D7AF-45B1-ACF0-CA6C3B0B77DC}.Release|Any CPU.Build.0 = Release|Any CPU + {790E94F2-5393-47DF-AC52-D9247F5B243A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {790E94F2-5393-47DF-AC52-D9247F5B243A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {790E94F2-5393-47DF-AC52-D9247F5B243A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {790E94F2-5393-47DF-AC52-D9247F5B243A}.Release|Any CPU.Build.0 = Release|Any CPU + {169BEA3D-2A81-47EE-A6C1-3F8719EEC1F6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {169BEA3D-2A81-47EE-A6C1-3F8719EEC1F6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {169BEA3D-2A81-47EE-A6C1-3F8719EEC1F6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {169BEA3D-2A81-47EE-A6C1-3F8719EEC1F6}.Release|Any CPU.Build.0 = Release|Any CPU + {99F2B1DA-2F69-4D70-A2A3-AC985AD91EC4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {99F2B1DA-2F69-4D70-A2A3-AC985AD91EC4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AFEB799E-82C3-4D02-9D5C-766BB8DEF004}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AFEB799E-82C3-4D02-9D5C-766BB8DEF004}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AFEB799E-82C3-4D02-9D5C-766BB8DEF004}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AFEB799E-82C3-4D02-9D5C-766BB8DEF004}.Release|Any CPU.Build.0 = Release|Any CPU + {F50336DA-42D1-4DD1-A107-67AFEB8A33EE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F50336DA-42D1-4DD1-A107-67AFEB8A33EE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F50336DA-42D1-4DD1-A107-67AFEB8A33EE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F50336DA-42D1-4DD1-A107-67AFEB8A33EE}.Release|Any CPU.Build.0 = Release|Any CPU + {BBCE36D1-6767-4ED1-B3E8-84D2567A962A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BBCE36D1-6767-4ED1-B3E8-84D2567A962A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BBCE36D1-6767-4ED1-B3E8-84D2567A962A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BBCE36D1-6767-4ED1-B3E8-84D2567A962A}.Release|Any CPU.Build.0 = Release|Any CPU + {73BBB1E3-AEEC-44E8-83D7-6DD9CD687FE3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {73BBB1E3-AEEC-44E8-83D7-6DD9CD687FE3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {73BBB1E3-AEEC-44E8-83D7-6DD9CD687FE3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {73BBB1E3-AEEC-44E8-83D7-6DD9CD687FE3}.Release|Any CPU.Build.0 = Release|Any CPU + {B0946844-DE0E-4C59-9391-C0EB649DBF4E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B0946844-DE0E-4C59-9391-C0EB649DBF4E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B0946844-DE0E-4C59-9391-C0EB649DBF4E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B0946844-DE0E-4C59-9391-C0EB649DBF4E}.Release|Any CPU.Build.0 = Release|Any CPU + {A1FE2CA0-8EF3-4EDB-9055-DD282E374E16}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A1FE2CA0-8EF3-4EDB-9055-DD282E374E16}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A1FE2CA0-8EF3-4EDB-9055-DD282E374E16}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A1FE2CA0-8EF3-4EDB-9055-DD282E374E16}.Release|Any CPU.Build.0 = Release|Any CPU + {BF4CDE28-F0CC-482D-8392-C1C9BB4C368F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BF4CDE28-F0CC-482D-8392-C1C9BB4C368F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BF4CDE28-F0CC-482D-8392-C1C9BB4C368F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BF4CDE28-F0CC-482D-8392-C1C9BB4C368F}.Release|Any CPU.Build.0 = Release|Any CPU + {7EB0CFB8-B668-4F3F-898D-80411095BC2F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7EB0CFB8-B668-4F3F-898D-80411095BC2F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7EB0CFB8-B668-4F3F-898D-80411095BC2F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7EB0CFB8-B668-4F3F-898D-80411095BC2F}.Release|Any CPU.Build.0 = Release|Any CPU + {34BC9836-681D-43A5-BC39-E4FEE17FC528}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {34BC9836-681D-43A5-BC39-E4FEE17FC528}.Debug|Any CPU.Build.0 = Debug|Any CPU + {34BC9836-681D-43A5-BC39-E4FEE17FC528}.Release|Any CPU.ActiveCfg = Release|Any CPU + {34BC9836-681D-43A5-BC39-E4FEE17FC528}.Release|Any CPU.Build.0 = Release|Any CPU + {90CD37A9-C866-4D90-A3B1-8C87F53B845E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {90CD37A9-C866-4D90-A3B1-8C87F53B845E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {90CD37A9-C866-4D90-A3B1-8C87F53B845E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {90CD37A9-C866-4D90-A3B1-8C87F53B845E}.Release|Any CPU.Build.0 = Release|Any CPU + {3D42FCA2-5BD0-4624-9FCA-F4BF935B27AE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3D42FCA2-5BD0-4624-9FCA-F4BF935B27AE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3D42FCA2-5BD0-4624-9FCA-F4BF935B27AE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3D42FCA2-5BD0-4624-9FCA-F4BF935B27AE}.Release|Any CPU.Build.0 = Release|Any CPU + {56CAA9F2-1882-4EFA-BAC0-9C3D804553F1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {56CAA9F2-1882-4EFA-BAC0-9C3D804553F1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {56CAA9F2-1882-4EFA-BAC0-9C3D804553F1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {56CAA9F2-1882-4EFA-BAC0-9C3D804553F1}.Release|Any CPU.Build.0 = Release|Any CPU + {0D4A88A1-8AEE-49ED-BC2E-ED68C96F60AD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0D4A88A1-8AEE-49ED-BC2E-ED68C96F60AD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0D4A88A1-8AEE-49ED-BC2E-ED68C96F60AD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0D4A88A1-8AEE-49ED-BC2E-ED68C96F60AD}.Release|Any CPU.Build.0 = Release|Any CPU + {5CBCBEA4-6038-48CA-B45D-C1D0F6B4ACA4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5CBCBEA4-6038-48CA-B45D-C1D0F6B4ACA4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5CBCBEA4-6038-48CA-B45D-C1D0F6B4ACA4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5CBCBEA4-6038-48CA-B45D-C1D0F6B4ACA4}.Release|Any CPU.Build.0 = Release|Any CPU + {94A61AD7-2A2B-40DB-81F3-C59D596958A8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {94A61AD7-2A2B-40DB-81F3-C59D596958A8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {94A61AD7-2A2B-40DB-81F3-C59D596958A8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {94A61AD7-2A2B-40DB-81F3-C59D596958A8}.Release|Any CPU.Build.0 = Release|Any CPU + {4B598AF7-BD7D-4544-A274-2CDDD98F4167}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4B598AF7-BD7D-4544-A274-2CDDD98F4167}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4B598AF7-BD7D-4544-A274-2CDDD98F4167}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4B598AF7-BD7D-4544-A274-2CDDD98F4167}.Release|Any CPU.Build.0 = Release|Any CPU + {99B171E6-0248-4402-836D-98947CD63772}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {99B171E6-0248-4402-836D-98947CD63772}.Debug|Any CPU.Build.0 = Debug|Any CPU + {99B171E6-0248-4402-836D-98947CD63772}.Release|Any CPU.ActiveCfg = Release|Any CPU + {99B171E6-0248-4402-836D-98947CD63772}.Release|Any CPU.Build.0 = Release|Any CPU + {4332A6BC-434A-4AF5-A075-F1BBCDD28F5D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4332A6BC-434A-4AF5-A075-F1BBCDD28F5D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4332A6BC-434A-4AF5-A075-F1BBCDD28F5D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4332A6BC-434A-4AF5-A075-F1BBCDD28F5D}.Release|Any CPU.Build.0 = Release|Any CPU + {7F5A304F-7DD9-4A64-8FCD-9B1FF06735B9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7F5A304F-7DD9-4A64-8FCD-9B1FF06735B9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7F5A304F-7DD9-4A64-8FCD-9B1FF06735B9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7F5A304F-7DD9-4A64-8FCD-9B1FF06735B9}.Release|Any CPU.Build.0 = Release|Any CPU + {5ADDDFB1-E59B-4097-97B7-8C24E2D60463}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5ADDDFB1-E59B-4097-97B7-8C24E2D60463}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5ADDDFB1-E59B-4097-97B7-8C24E2D60463}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5ADDDFB1-E59B-4097-97B7-8C24E2D60463}.Release|Any CPU.Build.0 = Release|Any CPU + {97C7E531-9D5F-43FD-AA19-BF24DA13B612}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {97C7E531-9D5F-43FD-AA19-BF24DA13B612}.Debug|Any CPU.Build.0 = Debug|Any CPU + {97C7E531-9D5F-43FD-AA19-BF24DA13B612}.Release|Any CPU.ActiveCfg = Release|Any CPU + {97C7E531-9D5F-43FD-AA19-BF24DA13B612}.Release|Any CPU.Build.0 = Release|Any CPU + {65F2AD97-3ECF-4BA6-8AAA-1E5882FDCE68}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {65F2AD97-3ECF-4BA6-8AAA-1E5882FDCE68}.Debug|Any CPU.Build.0 = Debug|Any CPU + {65F2AD97-3ECF-4BA6-8AAA-1E5882FDCE68}.Release|Any CPU.ActiveCfg = Release|Any CPU + {65F2AD97-3ECF-4BA6-8AAA-1E5882FDCE68}.Release|Any CPU.Build.0 = Release|Any CPU + {690B0274-291F-4D9E-BA76-54EFF7D3E4BC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {690B0274-291F-4D9E-BA76-54EFF7D3E4BC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {690B0274-291F-4D9E-BA76-54EFF7D3E4BC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {690B0274-291F-4D9E-BA76-54EFF7D3E4BC}.Release|Any CPU.Build.0 = Release|Any CPU + {060FD0BA-BD78-48E1-A8A7-4906A5AD5E39}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {060FD0BA-BD78-48E1-A8A7-4906A5AD5E39}.Debug|Any CPU.Build.0 = Debug|Any CPU + {060FD0BA-BD78-48E1-A8A7-4906A5AD5E39}.Release|Any CPU.ActiveCfg = Release|Any CPU + {060FD0BA-BD78-48E1-A8A7-4906A5AD5E39}.Release|Any CPU.Build.0 = Release|Any CPU + {169A82A5-2DB3-40EA-801E-14C08D743DF7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {169A82A5-2DB3-40EA-801E-14C08D743DF7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {169A82A5-2DB3-40EA-801E-14C08D743DF7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {169A82A5-2DB3-40EA-801E-14C08D743DF7}.Release|Any CPU.Build.0 = Release|Any CPU + {2CDF3E1C-267D-4198-B1C7-7E1F548FC120}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2CDF3E1C-267D-4198-B1C7-7E1F548FC120}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2CDF3E1C-267D-4198-B1C7-7E1F548FC120}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2CDF3E1C-267D-4198-B1C7-7E1F548FC120}.Release|Any CPU.Build.0 = Release|Any CPU + {01B96BB9-35E8-4364-ACB8-6D12A14D8DBA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {01B96BB9-35E8-4364-ACB8-6D12A14D8DBA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {01B96BB9-35E8-4364-ACB8-6D12A14D8DBA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {01B96BB9-35E8-4364-ACB8-6D12A14D8DBA}.Release|Any CPU.Build.0 = Release|Any CPU + {47FBCB04-0C2D-453C-BE2F-7052CAC22524}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {47FBCB04-0C2D-453C-BE2F-7052CAC22524}.Debug|Any CPU.Build.0 = Debug|Any CPU + {47FBCB04-0C2D-453C-BE2F-7052CAC22524}.Release|Any CPU.ActiveCfg = Release|Any CPU + {47FBCB04-0C2D-453C-BE2F-7052CAC22524}.Release|Any CPU.Build.0 = Release|Any CPU + {B0460856-7E6D-4B1E-B243-8E20662FC32E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B0460856-7E6D-4B1E-B243-8E20662FC32E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B0460856-7E6D-4B1E-B243-8E20662FC32E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B0460856-7E6D-4B1E-B243-8E20662FC32E}.Release|Any CPU.Build.0 = Release|Any CPU + {5BD671F0-9603-4C2F-8364-54B02986EAA2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5BD671F0-9603-4C2F-8364-54B02986EAA2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5BD671F0-9603-4C2F-8364-54B02986EAA2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5BD671F0-9603-4C2F-8364-54B02986EAA2}.Release|Any CPU.Build.0 = Release|Any CPU + {154525CD-3726-45B7-9A9C-553BBC60EB10}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {154525CD-3726-45B7-9A9C-553BBC60EB10}.Debug|Any CPU.Build.0 = Debug|Any CPU + {154525CD-3726-45B7-9A9C-553BBC60EB10}.Release|Any CPU.ActiveCfg = Release|Any CPU + {154525CD-3726-45B7-9A9C-553BBC60EB10}.Release|Any CPU.Build.0 = Release|Any CPU + {F620D7DC-B58D-4BD0-81A2-E88A2C1E4833}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F620D7DC-B58D-4BD0-81A2-E88A2C1E4833}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F620D7DC-B58D-4BD0-81A2-E88A2C1E4833}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F620D7DC-B58D-4BD0-81A2-E88A2C1E4833}.Release|Any CPU.Build.0 = Release|Any CPU + {6FE60BB4-DE6A-485C-A38A-1317C56AF2DA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6FE60BB4-DE6A-485C-A38A-1317C56AF2DA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6FE60BB4-DE6A-485C-A38A-1317C56AF2DA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6FE60BB4-DE6A-485C-A38A-1317C56AF2DA}.Release|Any CPU.Build.0 = Release|Any CPU + {34FAB60D-7259-47B9-B50E-B533C7C3CFEC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {34FAB60D-7259-47B9-B50E-B533C7C3CFEC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {34FAB60D-7259-47B9-B50E-B533C7C3CFEC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {34FAB60D-7259-47B9-B50E-B533C7C3CFEC}.Release|Any CPU.Build.0 = Release|Any CPU + {19329441-2A59-4BAC-A1BE-BBAB70C93CA0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {19329441-2A59-4BAC-A1BE-BBAB70C93CA0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {19329441-2A59-4BAC-A1BE-BBAB70C93CA0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {19329441-2A59-4BAC-A1BE-BBAB70C93CA0}.Release|Any CPU.Build.0 = Release|Any CPU + {37D16EAF-ACD8-4105-8BD3-B2745819CFF8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {37D16EAF-ACD8-4105-8BD3-B2745819CFF8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {37D16EAF-ACD8-4105-8BD3-B2745819CFF8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {37D16EAF-ACD8-4105-8BD3-B2745819CFF8}.Release|Any CPU.Build.0 = Release|Any CPU + {CFEC357F-0863-4458-A6C4-5D7AA0E44759}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CFEC357F-0863-4458-A6C4-5D7AA0E44759}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CFEC357F-0863-4458-A6C4-5D7AA0E44759}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CFEC357F-0863-4458-A6C4-5D7AA0E44759}.Release|Any CPU.Build.0 = Release|Any CPU + {E75762D2-FD12-4165-810B-628C28CB2562}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E75762D2-FD12-4165-810B-628C28CB2562}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E75762D2-FD12-4165-810B-628C28CB2562}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E75762D2-FD12-4165-810B-628C28CB2562}.Release|Any CPU.Build.0 = Release|Any CPU + {052C4F97-5909-4D88-AA49-4B0D9058A0A9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {052C4F97-5909-4D88-AA49-4B0D9058A0A9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {052C4F97-5909-4D88-AA49-4B0D9058A0A9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {052C4F97-5909-4D88-AA49-4B0D9058A0A9}.Release|Any CPU.Build.0 = Release|Any CPU + {9A6D67DE-51B1-456D-B25D-19E0356C8F60}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9A6D67DE-51B1-456D-B25D-19E0356C8F60}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9A6D67DE-51B1-456D-B25D-19E0356C8F60}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9A6D67DE-51B1-456D-B25D-19E0356C8F60}.Release|Any CPU.Build.0 = Release|Any CPU + {44A03CF6-4EB6-434C-90D1-FF8142FE394E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {44A03CF6-4EB6-434C-90D1-FF8142FE394E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {44A03CF6-4EB6-434C-90D1-FF8142FE394E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {44A03CF6-4EB6-434C-90D1-FF8142FE394E}.Release|Any CPU.Build.0 = Release|Any CPU + {A9140976-DFF9-432A-B1DC-E188A07C49E5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A9140976-DFF9-432A-B1DC-E188A07C49E5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A9140976-DFF9-432A-B1DC-E188A07C49E5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A9140976-DFF9-432A-B1DC-E188A07C49E5}.Release|Any CPU.Build.0 = Release|Any CPU + {B3046301-6F00-4885-8B01-080BD489055C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B3046301-6F00-4885-8B01-080BD489055C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B3046301-6F00-4885-8B01-080BD489055C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B3046301-6F00-4885-8B01-080BD489055C}.Release|Any CPU.Build.0 = Release|Any CPU + {29D12ADC-55E9-40D0-9E4C-F0EBB6E098EC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {29D12ADC-55E9-40D0-9E4C-F0EBB6E098EC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {29D12ADC-55E9-40D0-9E4C-F0EBB6E098EC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {29D12ADC-55E9-40D0-9E4C-F0EBB6E098EC}.Release|Any CPU.Build.0 = Release|Any CPU + {6C606FEB-9A1F-4816-ABE4-22AFA8CEE771}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6C606FEB-9A1F-4816-ABE4-22AFA8CEE771}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6C606FEB-9A1F-4816-ABE4-22AFA8CEE771}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6C606FEB-9A1F-4816-ABE4-22AFA8CEE771}.Release|Any CPU.Build.0 = Release|Any CPU + {5F80663C-B072-49DE-9A67-FD804BAD787E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5F80663C-B072-49DE-9A67-FD804BAD787E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5F80663C-B072-49DE-9A67-FD804BAD787E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5F80663C-B072-49DE-9A67-FD804BAD787E}.Release|Any CPU.Build.0 = Release|Any CPU + {630E2D93-7F7D-4A8A-BB52-D8095A1F24D9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {630E2D93-7F7D-4A8A-BB52-D8095A1F24D9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {630E2D93-7F7D-4A8A-BB52-D8095A1F24D9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {630E2D93-7F7D-4A8A-BB52-D8095A1F24D9}.Release|Any CPU.Build.0 = Release|Any CPU + {59E7614A-3630-4C39-9C7F-9E12BC95D37E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {59E7614A-3630-4C39-9C7F-9E12BC95D37E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {59E7614A-3630-4C39-9C7F-9E12BC95D37E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {59E7614A-3630-4C39-9C7F-9E12BC95D37E}.Release|Any CPU.Build.0 = Release|Any CPU + {D5720DBC-8C2B-42D5-9D9F-2FF6EAD4001C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D5720DBC-8C2B-42D5-9D9F-2FF6EAD4001C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D5720DBC-8C2B-42D5-9D9F-2FF6EAD4001C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D5720DBC-8C2B-42D5-9D9F-2FF6EAD4001C}.Release|Any CPU.Build.0 = Release|Any CPU + {2B939AC9-03A4-479E-AA0D-CB58F4A7F480}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2B939AC9-03A4-479E-AA0D-CB58F4A7F480}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2B939AC9-03A4-479E-AA0D-CB58F4A7F480}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2B939AC9-03A4-479E-AA0D-CB58F4A7F480}.Release|Any CPU.Build.0 = Release|Any CPU + {BF934627-F531-44FB-BEC2-ECA801FF31E7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BF934627-F531-44FB-BEC2-ECA801FF31E7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BF934627-F531-44FB-BEC2-ECA801FF31E7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BF934627-F531-44FB-BEC2-ECA801FF31E7}.Release|Any CPU.Build.0 = Release|Any CPU + {7F620A88-E1CE-4D73-A21A-DE5A5B538BA8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7F620A88-E1CE-4D73-A21A-DE5A5B538BA8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7F620A88-E1CE-4D73-A21A-DE5A5B538BA8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7F620A88-E1CE-4D73-A21A-DE5A5B538BA8}.Release|Any CPU.Build.0 = Release|Any CPU + {FD22E2B0-E164-4881-9DD4-4E429D178FB9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FD22E2B0-E164-4881-9DD4-4E429D178FB9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FD22E2B0-E164-4881-9DD4-4E429D178FB9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FD22E2B0-E164-4881-9DD4-4E429D178FB9}.Release|Any CPU.Build.0 = Release|Any CPU + {9C2764B2-8BA4-4184-9B75-C426A593C815}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9C2764B2-8BA4-4184-9B75-C426A593C815}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9C2764B2-8BA4-4184-9B75-C426A593C815}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9C2764B2-8BA4-4184-9B75-C426A593C815}.Release|Any CPU.Build.0 = Release|Any CPU + {FB1A962B-1299-4B35-9F53-3683BBD3426C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FB1A962B-1299-4B35-9F53-3683BBD3426C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FB1A962B-1299-4B35-9F53-3683BBD3426C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FB1A962B-1299-4B35-9F53-3683BBD3426C}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {C6658DE0-2B2F-47F0-BB61-2CA66D435C09} = {61017E64-6D00-49CB-9E81-5002DC8F7D5F} + {5BA4A8FA-F7F4-45B3-AEC8-8886D35AAC79} = {61017E64-6D00-49CB-9E81-5002DC8F7D5F} + {7D5A49B4-9A9B-496E-803B-DEB85B2C3132} = {AB797AF0-C12C-46DE-A157-7E25625C6200} + {82E26BF9-5F3A-4365-899A-AB1FFD54AA45} = {EBD0CF78-C5D7-4B4B-94C9-C5D8C20B6F59} + {ACD65CE5-3CC2-47B1-BFAC-72443D764F6E} = {AB797AF0-C12C-46DE-A157-7E25625C6200} + {24C7095B-5CDD-4369-9F34-5565A019B195} = {DD089B8B-DA73-492A-9010-F772D1C178DA} + {D31581AB-A6C1-4B73-AB63-45667F6C82AE} = {6EF07978-A6D2-40EB-891D-7D70C5F37E76} + {0601A2A6-2C62-418B-9104-8CDE497E5283} = {AB797AF0-C12C-46DE-A157-7E25625C6200} + {302BFC43-ED2F-43AE-8AD4-FCD481B0AC67} = {B08B4E00-C2AB-48F3-8389-449F42AEF179} + {BB983D0B-A939-4008-B9E3-C7C172BCF83A} = {DD089B8B-DA73-492A-9010-F772D1C178DA} + {80FF5821-E831-450D-AA0C-C76D07D878F4} = {5BA4A8FA-F7F4-45B3-AEC8-8886D35AAC79} + {8E5BD3D9-3529-48BC-B741-CFB7A69DB233} = {6EF07978-A6D2-40EB-891D-7D70C5F37E76} + {B2049499-D384-46DF-8837-F1180107DD54} = {58C59255-281C-4595-8732-808158F1DC6E} + {78DAB791-8595-4612-8E9E-2248AF5B1862} = {6EF07978-A6D2-40EB-891D-7D70C5F37E76} + {C9539BD8-D2AE-4A8D-8281-71A05B3FBF31} = {B08B4E00-C2AB-48F3-8389-449F42AEF179} + {169E2C9B-6687-427F-A278-30BF849BFEDC} = {B08B4E00-C2AB-48F3-8389-449F42AEF179} + {2DD5D66B-85E9-4AF9-911C-C9F963234159} = {B08B4E00-C2AB-48F3-8389-449F42AEF179} + {8A050229-DB79-4E0B-9AFF-7565E87F2954} = {58C59255-281C-4595-8732-808158F1DC6E} + {C237BA1A-3A7D-4AB2-BE09-2696F3C082A4} = {C6658DE0-2B2F-47F0-BB61-2CA66D435C09} + {80529478-A383-4FEA-B744-C71264969E9A} = {6EF07978-A6D2-40EB-891D-7D70C5F37E76} + {39CD855E-83B1-4A96-93F7-01608211EBE3} = {C6658DE0-2B2F-47F0-BB61-2CA66D435C09} + {30B49E42-AE61-4F7C-981F-923F07BB3986} = {5948B0A5-7873-4DBB-BA03-EB283D6EA91B} + {D229105F-6879-4452-9189-75DE060C0F4C} = {5BA4A8FA-F7F4-45B3-AEC8-8886D35AAC79} + {7CC95512-7F44-45C3-A669-95B7048D4730} = {9B4F139F-7D26-435C-A561-89E65A67A8E5} + {F09B30F7-AF33-44D7-B835-099D1F72A37E} = {EBD0CF78-C5D7-4B4B-94C9-C5D8C20B6F59} + {1E5BD8D9-55BE-41E2-B389-6AB9F26C22AF} = {EBD0CF78-C5D7-4B4B-94C9-C5D8C20B6F59} + {3246883E-2FA7-4B4A-BDC5-99039A2869BC} = {9B4F139F-7D26-435C-A561-89E65A67A8E5} + {2BBFDE36-28A7-4875-8EBE-CC25C76B97FF} = {EBD0CF78-C5D7-4B4B-94C9-C5D8C20B6F59} + {18453B51-25EB-4317-A4B3-B10518252E92} = {90031D64-CA0F-46D0-9AF4-8DC023A5FFCD} + {1B8D5897-902E-4632-8698-E89CAF3DDF54} = {90031D64-CA0F-46D0-9AF4-8DC023A5FFCD} + {08B41FFA-CEE3-46A7-B5C0-3EB65D37A16C} = {90031D64-CA0F-46D0-9AF4-8DC023A5FFCD} + {E9652738-2B3D-4357-B84B-54F0EA161382} = {1B8D5897-902E-4632-8698-E89CAF3DDF54} + {89608AA5-5ADE-4832-AC7B-871C4AE64210} = {61017E64-6D00-49CB-9E81-5002DC8F7D5F} + {1FCB2200-28B8-4703-8E89-73241AAED047} = {89608AA5-5ADE-4832-AC7B-871C4AE64210} + {B5CDF747-8066-40D5-9BAE-CBE397BC9B51} = {5BA4A8FA-F7F4-45B3-AEC8-8886D35AAC79} + {9B4F139F-7D26-435C-A561-89E65A67A8E5} = {5BA4A8FA-F7F4-45B3-AEC8-8886D35AAC79} + {6EF07978-A6D2-40EB-891D-7D70C5F37E76} = {5BA4A8FA-F7F4-45B3-AEC8-8886D35AAC79} + {DD089B8B-DA73-492A-9010-F772D1C178DA} = {5BA4A8FA-F7F4-45B3-AEC8-8886D35AAC79} + {5948B0A5-7873-4DBB-BA03-EB283D6EA91B} = {5BA4A8FA-F7F4-45B3-AEC8-8886D35AAC79} + {B08B4E00-C2AB-48F3-8389-449F42AEF179} = {5BA4A8FA-F7F4-45B3-AEC8-8886D35AAC79} + {AB797AF0-C12C-46DE-A157-7E25625C6200} = {5BA4A8FA-F7F4-45B3-AEC8-8886D35AAC79} + {58C59255-281C-4595-8732-808158F1DC6E} = {5BA4A8FA-F7F4-45B3-AEC8-8886D35AAC79} + {4D8F3BB2-709D-481A-8FD3-0DA9762B366D} = {9B4F139F-7D26-435C-A561-89E65A67A8E5} + {A86DF0F0-24E9-470E-984B-9E7332544972} = {9B4F139F-7D26-435C-A561-89E65A67A8E5} + {A702DD84-B55C-4807-9C28-D8F5AC3CCA78} = {B08B4E00-C2AB-48F3-8389-449F42AEF179} + {3A377A6A-F735-4010-9E00-72E8BEB8F1F2} = {9B4F139F-7D26-435C-A561-89E65A67A8E5} + {28818676-F6AF-4203-8B65-BD33A50CB9A2} = {C6658DE0-2B2F-47F0-BB61-2CA66D435C09} + {DC9CCAD0-7363-4691-B964-FF5B3AEA3F95} = {18453B51-25EB-4317-A4B3-B10518252E92} + {1B794B9C-9B8A-4D5A-9848-B51274BD1FC5} = {C6658DE0-2B2F-47F0-BB61-2CA66D435C09} + {4E7F15D1-729E-4DA7-992A-C3A2C6054B37} = {C6658DE0-2B2F-47F0-BB61-2CA66D435C09} + {3095C95A-F1F9-487A-A983-1B100A33E4C7} = {5948B0A5-7873-4DBB-BA03-EB283D6EA91B} + {CF3DA5F1-F98D-49C9-A980-27E570B38B8D} = {5BA4A8FA-F7F4-45B3-AEC8-8886D35AAC79} + {8DBEC8F3-908D-46B3-95CA-47EA138AB1A4} = {CF3DA5F1-F98D-49C9-A980-27E570B38B8D} + {CC7DE119-736D-4FC5-85DC-70A6770749F6} = {CF3DA5F1-F98D-49C9-A980-27E570B38B8D} + {EFE4A814-F58D-4C19-8F7F-B95F4EE343F0} = {9B4F139F-7D26-435C-A561-89E65A67A8E5} + {1C84408D-A0A7-4513-AD9A-1BA137ABE62C} = {9B4F139F-7D26-435C-A561-89E65A67A8E5} + {E4300D97-1D53-4029-9435-483FB7EC9621} = {9B4F139F-7D26-435C-A561-89E65A67A8E5} + {84AB9951-3DBF-43A4-8F5D-AEED1102CE88} = {9B4F139F-7D26-435C-A561-89E65A67A8E5} + {1F621382-08FB-45EA-B94C-96A7FECB9489} = {CF3DA5F1-F98D-49C9-A980-27E570B38B8D} + {FBA14F8A-9F14-4364-ABDB-B8AE81A0D755} = {9B4F139F-7D26-435C-A561-89E65A67A8E5} + {A71557F2-D5FB-4772-9391-F7D18A3B6C44} = {AB797AF0-C12C-46DE-A157-7E25625C6200} + {05F3B23E-CF28-467B-AD3C-595EA4ED6B96} = {AB797AF0-C12C-46DE-A157-7E25625C6200} + {74ACD9D0-8B4C-42FA-A582-E93BF0075023} = {AB797AF0-C12C-46DE-A157-7E25625C6200} + {CCCCEF8C-7D96-4BEA-B9D0-E91EDF08E65D} = {AB797AF0-C12C-46DE-A157-7E25625C6200} + {49D8D2CF-AF68-40FA-951F-018247C97443} = {9B4F139F-7D26-435C-A561-89E65A67A8E5} + {732BF088-6AD7-4C4D-9A48-8074253596D4} = {B818988E-639C-4E6E-85C1-B231BCAD9DAB} + {B818988E-639C-4E6E-85C1-B231BCAD9DAB} = {5BA4A8FA-F7F4-45B3-AEC8-8886D35AAC79} + {29638A67-E79F-44FE-AC05-DA499EBA929E} = {2F3E1026-5054-4E1F-899B-F1A7F70F9912} + {24331E82-D7AF-45B1-ACF0-CA6C3B0B77DC} = {6EF07978-A6D2-40EB-891D-7D70C5F37E76} + {790E94F2-5393-47DF-AC52-D9247F5B243A} = {6EF07978-A6D2-40EB-891D-7D70C5F37E76} + {169BEA3D-2A81-47EE-A6C1-3F8719EEC1F6} = {DD089B8B-DA73-492A-9010-F772D1C178DA} + {AFEB799E-82C3-4D02-9D5C-766BB8DEF004} = {DD089B8B-DA73-492A-9010-F772D1C178DA} + {F50336DA-42D1-4DD1-A107-67AFEB8A33EE} = {1B8D5897-902E-4632-8698-E89CAF3DDF54} + {A516931E-EDBB-4FC3-BB94-1BB824D5BC61} = {5BA4A8FA-F7F4-45B3-AEC8-8886D35AAC79} + {BBCE36D1-6767-4ED1-B3E8-84D2567A962A} = {A516931E-EDBB-4FC3-BB94-1BB824D5BC61} + {73BBB1E3-AEEC-44E8-83D7-6DD9CD687FE3} = {5BA4A8FA-F7F4-45B3-AEC8-8886D35AAC79} + {B0946844-DE0E-4C59-9391-C0EB649DBF4E} = {18453B51-25EB-4317-A4B3-B10518252E92} + {A1FE2CA0-8EF3-4EDB-9055-DD282E374E16} = {EB3A7401-0DE3-476F-9E6F-057F1F4590FB} + {EB3A7401-0DE3-476F-9E6F-057F1F4590FB} = {5BA4A8FA-F7F4-45B3-AEC8-8886D35AAC79} + {BF4CDE28-F0CC-482D-8392-C1C9BB4C368F} = {EB3A7401-0DE3-476F-9E6F-057F1F4590FB} + {7EB0CFB8-B668-4F3F-898D-80411095BC2F} = {EB3A7401-0DE3-476F-9E6F-057F1F4590FB} + {34BC9836-681D-43A5-BC39-E4FEE17FC528} = {08B41FFA-CEE3-46A7-B5C0-3EB65D37A16C} + {CBB515F3-A0EF-43B5-A907-FD4E652DD66E} = {90031D64-CA0F-46D0-9AF4-8DC023A5FFCD} + {90CD37A9-C866-4D90-A3B1-8C87F53B845E} = {CBB515F3-A0EF-43B5-A907-FD4E652DD66E} + {3F20899B-C5E1-485F-808B-ADB1877EB3FD} = {5BA4A8FA-F7F4-45B3-AEC8-8886D35AAC79} + {3D42FCA2-5BD0-4624-9FCA-F4BF935B27AE} = {3F20899B-C5E1-485F-808B-ADB1877EB3FD} + {56CAA9F2-1882-4EFA-BAC0-9C3D804553F1} = {18453B51-25EB-4317-A4B3-B10518252E92} + {0D4A88A1-8AEE-49ED-BC2E-ED68C96F60AD} = {58C59255-281C-4595-8732-808158F1DC6E} + {5CBCBEA4-6038-48CA-B45D-C1D0F6B4ACA4} = {C6658DE0-2B2F-47F0-BB61-2CA66D435C09} + {94A61AD7-2A2B-40DB-81F3-C59D596958A8} = {C6658DE0-2B2F-47F0-BB61-2CA66D435C09} + {4B598AF7-BD7D-4544-A274-2CDDD98F4167} = {C6658DE0-2B2F-47F0-BB61-2CA66D435C09} + {99B171E6-0248-4402-836D-98947CD63772} = {1B8D5897-902E-4632-8698-E89CAF3DDF54} + {4332A6BC-434A-4AF5-A075-F1BBCDD28F5D} = {1B8D5897-902E-4632-8698-E89CAF3DDF54} + {7F5A304F-7DD9-4A64-8FCD-9B1FF06735B9} = {08B41FFA-CEE3-46A7-B5C0-3EB65D37A16C} + {D92BEAB2-60D6-4BB4-885A-6BA681C6CCF1} = {61017E64-6D00-49CB-9E81-5002DC8F7D5F} + {5ADDDFB1-E59B-4097-97B7-8C24E2D60463} = {D92BEAB2-60D6-4BB4-885A-6BA681C6CCF1} + {97C7E531-9D5F-43FD-AA19-BF24DA13B612} = {5BA4A8FA-F7F4-45B3-AEC8-8886D35AAC79} + {65F2AD97-3ECF-4BA6-8AAA-1E5882FDCE68} = {D92BEAB2-60D6-4BB4-885A-6BA681C6CCF1} + {690B0274-291F-4D9E-BA76-54EFF7D3E4BC} = {D92BEAB2-60D6-4BB4-885A-6BA681C6CCF1} + {060FD0BA-BD78-48E1-A8A7-4906A5AD5E39} = {D92BEAB2-60D6-4BB4-885A-6BA681C6CCF1} + {169A82A5-2DB3-40EA-801E-14C08D743DF7} = {D92BEAB2-60D6-4BB4-885A-6BA681C6CCF1} + {01B96BB9-35E8-4364-ACB8-6D12A14D8DBA} = {5BA4A8FA-F7F4-45B3-AEC8-8886D35AAC79} + {47FBCB04-0C2D-453C-BE2F-7052CAC22524} = {EB3A7401-0DE3-476F-9E6F-057F1F4590FB} + {B32DB9B2-AD6C-48A5-8682-4373CB045185} = {C80C8231-D35C-4ACC-9ED6-9F3DB221535E} + {454652D5-E1BB-4D4B-9B21-9CEFC900C4FB} = {B32DB9B2-AD6C-48A5-8682-4373CB045185} + {31089E79-694B-4F45-97AF-86D34A7B231E} = {B32DB9B2-AD6C-48A5-8682-4373CB045185} + {6DDB9ECF-D454-4894-A262-A6BB3026E61E} = {B32DB9B2-AD6C-48A5-8682-4373CB045185} + {16B570BC-E293-4A19-B20E-5C97BAF8476B} = {B32DB9B2-AD6C-48A5-8682-4373CB045185} + {EBD0CF78-C5D7-4B4B-94C9-C5D8C20B6F59} = {5BA4A8FA-F7F4-45B3-AEC8-8886D35AAC79} + {B0460856-7E6D-4B1E-B243-8E20662FC32E} = {EBD0CF78-C5D7-4B4B-94C9-C5D8C20B6F59} + {50470834-4CD8-479A-8B58-0A1869BA5D37} = {5BA4A8FA-F7F4-45B3-AEC8-8886D35AAC79} + {5BD671F0-9603-4C2F-8364-54B02986EAA2} = {50470834-4CD8-479A-8B58-0A1869BA5D37} + {154525CD-3726-45B7-9A9C-553BBC60EB10} = {50470834-4CD8-479A-8B58-0A1869BA5D37} + {F620D7DC-B58D-4BD0-81A2-E88A2C1E4833} = {50470834-4CD8-479A-8B58-0A1869BA5D37} + {6FE60BB4-DE6A-485C-A38A-1317C56AF2DA} = {50470834-4CD8-479A-8B58-0A1869BA5D37} + {57326431-9C6C-4BAB-AA51-15131C21ADCC} = {C80C8231-D35C-4ACC-9ED6-9F3DB221535E} + {34FAB60D-7259-47B9-B50E-B533C7C3CFEC} = {8CEEC194-820A-4C8D-AB9E-E51E6D3E9CC1} + {8CEEC194-820A-4C8D-AB9E-E51E6D3E9CC1} = {5BA4A8FA-F7F4-45B3-AEC8-8886D35AAC79} + {19329441-2A59-4BAC-A1BE-BBAB70C93CA0} = {8CEEC194-820A-4C8D-AB9E-E51E6D3E9CC1} + {37D16EAF-ACD8-4105-8BD3-B2745819CFF8} = {8CEEC194-820A-4C8D-AB9E-E51E6D3E9CC1} + {CFEC357F-0863-4458-A6C4-5D7AA0E44759} = {50470834-4CD8-479A-8B58-0A1869BA5D37} + {E75762D2-FD12-4165-810B-628C28CB2562} = {50470834-4CD8-479A-8B58-0A1869BA5D37} + {3666CF13-1353-4620-9472-506670214A6A} = {C80C8231-D35C-4ACC-9ED6-9F3DB221535E} + {AA5ACF15-8647-4AC9-B9F5-73FCB92BE7E3} = {C80C8231-D35C-4ACC-9ED6-9F3DB221535E} + {DFFE6199-B5A7-4BA8-A5E1-77D0426C6468} = {B32DB9B2-AD6C-48A5-8682-4373CB045185} + {052C4F97-5909-4D88-AA49-4B0D9058A0A9} = {50470834-4CD8-479A-8B58-0A1869BA5D37} + {9A6D67DE-51B1-456D-B25D-19E0356C8F60} = {8CEEC194-820A-4C8D-AB9E-E51E6D3E9CC1} + {44A03CF6-4EB6-434C-90D1-FF8142FE394E} = {8CEEC194-820A-4C8D-AB9E-E51E6D3E9CC1} + {A9140976-DFF9-432A-B1DC-E188A07C49E5} = {50470834-4CD8-479A-8B58-0A1869BA5D37} + {B3046301-6F00-4885-8B01-080BD489055C} = {50470834-4CD8-479A-8B58-0A1869BA5D37} + {29D12ADC-55E9-40D0-9E4C-F0EBB6E098EC} = {8CEEC194-820A-4C8D-AB9E-E51E6D3E9CC1} + {6C606FEB-9A1F-4816-ABE4-22AFA8CEE771} = {8CEEC194-820A-4C8D-AB9E-E51E6D3E9CC1} + {5F80663C-B072-49DE-9A67-FD804BAD787E} = {6EF07978-A6D2-40EB-891D-7D70C5F37E76} + {630E2D93-7F7D-4A8A-BB52-D8095A1F24D9} = {8CEEC194-820A-4C8D-AB9E-E51E6D3E9CC1} + {59E7614A-3630-4C39-9C7F-9E12BC95D37E} = {8CEEC194-820A-4C8D-AB9E-E51E6D3E9CC1} + {2F3E1026-5054-4E1F-899B-F1A7F70F9912} = {5BA4A8FA-F7F4-45B3-AEC8-8886D35AAC79} + {D5720DBC-8C2B-42D5-9D9F-2FF6EAD4001C} = {2F3E1026-5054-4E1F-899B-F1A7F70F9912} + {2B939AC9-03A4-479E-AA0D-CB58F4A7F480} = {50470834-4CD8-479A-8B58-0A1869BA5D37} {2CDF3E1C-267D-4198-B1C7-7E1F548FC120} = {5BA4A8FA-F7F4-45B3-AEC8-8886D35AAC79} - {BF934627-F531-44FB-BEC2-ECA801FF31E7} = {DD089B8B-DA73-492A-9010-F772D1C178DA} - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {D4B5CEAA-7D70-4FCB-A68E-B03FBE5E0E5E} - EndGlobalSection -EndGlobal + {BF934627-F531-44FB-BEC2-ECA801FF31E7} = {DD089B8B-DA73-492A-9010-F772D1C178DA} + {FFC2EE94-ABD1-4D22-A325-A53F80CC097E} = {5BA4A8FA-F7F4-45B3-AEC8-8886D35AAC79} + {7F620A88-E1CE-4D73-A21A-DE5A5B538BA8} = {FFC2EE94-ABD1-4D22-A325-A53F80CC097E} + {FD22E2B0-E164-4881-9DD4-4E429D178FB9} = {FFC2EE94-ABD1-4D22-A325-A53F80CC097E} + {9C2764B2-8BA4-4184-9B75-C426A593C815} = {FFC2EE94-ABD1-4D22-A325-A53F80CC097E} + {FB1A962B-1299-4B35-9F53-3683BBD3426C} = {FFC2EE94-ABD1-4D22-A325-A53F80CC097E} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {D4B5CEAA-7D70-4FCB-A68E-B03FBE5E0E5E} + EndGlobalSection +EndGlobal diff --git a/src/modules/Elsa.Connections.Api/Elsa.Connections.Api.csproj b/src/modules/Elsa.Connections.Api/Elsa.Connections.Api.csproj new file mode 100644 index 000000000..e265db49a --- /dev/null +++ b/src/modules/Elsa.Connections.Api/Elsa.Connections.Api.csproj @@ -0,0 +1,12 @@ + + + + Provides Activity Connection API endpoints + elsa module activity connection abstraction api + + + + + + + diff --git a/src/modules/Elsa.Connections.Api/Endpoints/ActivityConnectionDescriptor/List/Endpoint.cs b/src/modules/Elsa.Connections.Api/Endpoints/ActivityConnectionDescriptor/List/Endpoint.cs new file mode 100644 index 000000000..0d5f77649 --- /dev/null +++ b/src/modules/Elsa.Connections.Api/Endpoints/ActivityConnectionDescriptor/List/Endpoint.cs @@ -0,0 +1,33 @@ +using System.Collections.ObjectModel; +using System.ComponentModel.DataAnnotations; +using System.Diagnostics.CodeAnalysis; +using System.Reflection; +using System.Text.Json.Nodes; +using Elsa.Abstractions; +using Elsa.Common.Models; +using Elsa.Connections.Contracts; +using Elsa.Connections.Models; +using Elsa.Models; +using Elsa.Workflows; +using Elsa.Workflows.Attributes; +using Elsa.Workflows.Models; +using FastEndpoints; +using Humanizer; + +namespace Elsa.Connections.Api.Endpoints.ActivityConnectionDescriptor.List; + + +public class List(IConnectionDescriptorRegistry registry) : ElsaEndpointWithoutRequest> +{ + public override void Configure() + { + Get("/connection-configuration/descriptors"); + AllowAnonymous(); + } + + public override Task> ExecuteAsync(CancellationToken ct) + { + var descriptors = registry.ListAll().ToList(); + return Task.FromResult(new PagedListResponse(Page.Of(descriptors, descriptors.Count())) ); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Connections.Api/Endpoints/ActivityConnectionDescriptor/List/Get.cs b/src/modules/Elsa.Connections.Api/Endpoints/ActivityConnectionDescriptor/List/Get.cs new file mode 100644 index 000000000..9a60511c5 --- /dev/null +++ b/src/modules/Elsa.Connections.Api/Endpoints/ActivityConnectionDescriptor/List/Get.cs @@ -0,0 +1,26 @@ +using Elsa.Abstractions; +using Elsa.Connections.Contracts; +using Elsa.Workflows.Models; + +namespace Elsa.Connections.Api.Endpoints.ActivityConnectionDescriptor.List; + +public class Get(IConnectionDescriptorRegistry store) : ElsaEndpointWithoutRequest> +{ + public override void Configure() + { + Get("/connection-configuration/input-descriptor/{ActivityType}"); + AllowAnonymous(); + } + + public override async Task HandleAsync(CancellationToken ct) + { + string type = Route("ActivityType"); + var config = await store.GetConnectionDescriptor(type); + + if (config == null) + await SendNotFoundAsync(); + else + await SendOkAsync(config); + + } +} diff --git a/src/modules/Elsa.Connections.Api/Endpoints/ActivityConnectionDescriptor/List/Request.cs b/src/modules/Elsa.Connections.Api/Endpoints/ActivityConnectionDescriptor/List/Request.cs new file mode 100644 index 000000000..de3528cd5 --- /dev/null +++ b/src/modules/Elsa.Connections.Api/Endpoints/ActivityConnectionDescriptor/List/Request.cs @@ -0,0 +1,6 @@ +namespace Elsa.Connections.Api.Endpoints.ActivityConnectionDescriptor.List; + +public class Request +{ + public string ActivityType { get; set; } +} diff --git a/src/modules/Elsa.Connections.Api/Endpoints/Add/Endpoint.cs b/src/modules/Elsa.Connections.Api/Endpoints/Add/Endpoint.cs new file mode 100644 index 000000000..6e18c2917 --- /dev/null +++ b/src/modules/Elsa.Connections.Api/Endpoints/Add/Endpoint.cs @@ -0,0 +1,40 @@ +using Elsa.Abstractions; +using Elsa.Connections.Contracts; +using Elsa.Connections.Models; + +namespace Elsa.Connections.Api.Endpoints.Add; + +public class Endpoint(IConnectionRepository store) : ElsaEndpoint +{ + public override void Configure() + { + Post("/connection-configuration"); + AllowAnonymous(); + } + + public override async Task ExecuteAsync(ConnectionConfigurationMetadataModel model, CancellationToken ct) + { + await store.AddConnectionConfigurationAsync(model, ct); + await SendOkAsync(); + + return null; + } +} + +public class EndpointUpdate(IConnectionRepository store) : ElsaEndpoint +{ + public override void Configure() + { + Put("/connection-configuration/{id}"); + AllowAnonymous(); + } + + public override async Task ExecuteAsync(ConnectionConfigurationMetadataModel model, CancellationToken ct) + { + await store.UpdateConnectionAsync(model.Id , model, ct); + await SendOkAsync(); + + return null; + } +} + diff --git a/src/modules/Elsa.Connections.Api/Endpoints/Delete/Endpoint.cs b/src/modules/Elsa.Connections.Api/Endpoints/Delete/Endpoint.cs new file mode 100644 index 000000000..68b5a3d97 --- /dev/null +++ b/src/modules/Elsa.Connections.Api/Endpoints/Delete/Endpoint.cs @@ -0,0 +1,23 @@ +using Elsa.Abstractions; +using Elsa.Connections.Contracts; + + +namespace Elsa.Connections.Api.Endpoints.Delete; + +public class Endpoint(IConnectionRepository store) : ElsaEndpointWithoutRequest +{ + public override void Configure() + { + Delete("/connection-configuration/{id}"); + AllowAnonymous(); + } + + public override async Task HandleAsync(CancellationToken ct) + { + var configurationId = Route("id"); + await store.DeleteConnectionConfigurationAsync(configurationId, ct); + await SendOkAsync(); + + return null; + } +} diff --git a/src/modules/Elsa.Connections.Api/Endpoints/List/Endpoint.cs b/src/modules/Elsa.Connections.Api/Endpoints/List/Endpoint.cs new file mode 100644 index 000000000..47c7c1ac5 --- /dev/null +++ b/src/modules/Elsa.Connections.Api/Endpoints/List/Endpoint.cs @@ -0,0 +1,24 @@ +using System.ComponentModel.DataAnnotations; +using System.Text.Json.Nodes; +using Elsa.Abstractions; +using Elsa.Common.Models; +using Elsa.Connections.Contracts; +using Elsa.Connections.Models; +using Elsa.Models; + +namespace Elsa.Connections.Api.Endpoints.List; + +public class Endpoint(IConnectionRepository store) : ElsaEndpointWithoutRequest> +{ + public override void Configure() + { + Get("/connection-configuration"); + AllowAnonymous(); + } + + public override async Task> ExecuteAsync(CancellationToken ct) + { + var config = await store.GetConnectionsAsync(); + return new PagedListResponse(Page.Of(config, config.Count())); + } +} diff --git a/src/modules/Elsa.Connections.Api/Extensions/ModuleExtensions.cs b/src/modules/Elsa.Connections.Api/Extensions/ModuleExtensions.cs new file mode 100644 index 000000000..8c4598418 --- /dev/null +++ b/src/modules/Elsa.Connections.Api/Extensions/ModuleExtensions.cs @@ -0,0 +1,19 @@ +using Elsa.Connections.Api.Features; +using Elsa.Features.Services; + +// ReSharper disable once CheckNamespace +namespace Elsa.Extensions; + +/// +/// Extends with methods to Connection API endpoints. +/// +public static class ModuleExtensions +{ + /// + /// Installs the Semantic Kernel API feature. + /// + public static IModule UseConnectionsApi(this IModule module, Action? configure = null) + { + return module.Use(configure); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Connections.Api/Features/ConnectionsApiFeature.cs b/src/modules/Elsa.Connections.Api/Features/ConnectionsApiFeature.cs new file mode 100644 index 000000000..cddc90c46 --- /dev/null +++ b/src/modules/Elsa.Connections.Api/Features/ConnectionsApiFeature.cs @@ -0,0 +1,37 @@ +using Elsa.Connections.Api.Services; +using Elsa.Connections.Contracts; +using Elsa.Connections.Models; +using Elsa.Connections.Persistence.Features; +using Elsa.Extensions; +using Elsa.Features.Abstractions; +using Elsa.Features.Attributes; +using Elsa.Features.Services; +using JetBrains.Annotations; +using Microsoft.Extensions.DependencyInjection; + +namespace Elsa.Connections.Api.Features; + +/// +/// A feature that installs API endpoints to interact connections. +/// +[DependsOn(typeof(ConnectionPersistenceFeature))] +[UsedImplicitly] +public class ConnectionsApiFeature(IModule module) : FeatureBase(module) +{ + /// + public override void Configure() + { + Module.AddFastEndpointsAssembly(); + } + + public override void Apply() + { + + Services.AddSingleton(); + + Services + + .AddMemoryStore(); + + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Connections.Api/FodyWeavers.xml b/src/modules/Elsa.Connections.Api/FodyWeavers.xml new file mode 100644 index 000000000..ac6b5b292 --- /dev/null +++ b/src/modules/Elsa.Connections.Api/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/modules/Elsa.Connections.Api/Services/InMemoryConnectionRepository.cs b/src/modules/Elsa.Connections.Api/Services/InMemoryConnectionRepository.cs new file mode 100644 index 000000000..a34473331 --- /dev/null +++ b/src/modules/Elsa.Connections.Api/Services/InMemoryConnectionRepository.cs @@ -0,0 +1,45 @@ +using Elsa.Common.Services; +using Elsa.Connections.Contracts; +using Elsa.Connections.Models; + +namespace Elsa.Connections.Api.Services; + +public class InMemoryConnectionRepository(MemoryStore memoryStore) : IConnectionRepository +{ + public Task AddConnectionConfigurationAsync(ConnectionConfigurationMetadataModel model, CancellationToken cancellationToken = default) + { + model.Id = Guid.NewGuid().ToString("n"); + memoryStore.Add(model, model =>model.Id); + return Task.CompletedTask; + } + + public Task DeleteConnectionConfigurationAsync(string id, CancellationToken cancellationToken = default) + { + memoryStore.Delete(id); + return Task.CompletedTask; + } + + public Task GetConnectionAsync(string name, CancellationToken cancellationToken = default) + { + var result = memoryStore.Find(c => c.Name == name); + return Task.FromResult(result); + } + + public Task> GetConnectionsAsync(CancellationToken cancellationToken) + { + ICollection results = memoryStore.List().ToList() ; + return Task.FromResult(results); + } + + public Task> GetConnectionsFromTypeAsync(string type, CancellationToken cancellationToken = default) + { + ICollection items = memoryStore.FindMany(c => c.ConnectionType == type).ToList(); + return Task.FromResult(items); + } + + public Task UpdateConnectionAsync(string id, ConnectionConfigurationMetadataModel model, CancellationToken cancellationToken = default) + { + memoryStore.Update(model, model => model.Id); + return Task.CompletedTask; + } +} diff --git a/src/modules/Elsa.Connections.Core/Attributes/ConnectionActivityAttribute.cs b/src/modules/Elsa.Connections.Core/Attributes/ConnectionActivityAttribute.cs new file mode 100644 index 000000000..c7f3f35fc --- /dev/null +++ b/src/modules/Elsa.Connections.Core/Attributes/ConnectionActivityAttribute.cs @@ -0,0 +1,15 @@ +namespace Elsa.Connections.Attributes; + +[AttributeUsage(AttributeTargets.Class)] +public class ConnectionActivityAttribute : Attribute +{ + + public ConnectionActivityAttribute(string type) + { + Type = type; + } + /// + /// The TypeName of the connection + /// + public string Type { get; set; } +} diff --git a/src/modules/Elsa.Connections.Core/Attributes/ConnectionPropertyAttribute.cs b/src/modules/Elsa.Connections.Core/Attributes/ConnectionPropertyAttribute.cs new file mode 100644 index 000000000..7790a0c6b --- /dev/null +++ b/src/modules/Elsa.Connections.Core/Attributes/ConnectionPropertyAttribute.cs @@ -0,0 +1,15 @@ +namespace Elsa.Connections.Attributes; + +public class ConnectionPropertyAttribute : Attribute +{ + public ConnectionPropertyAttribute(string @namespace, string displayName, string? description= default) + { + Namespace = @namespace; + DisplayName = displayName; + Description = description; + + } + public string? Namespace { get; set; } + public string? Description { get; set; } + public string? DisplayName { get; set; } +} \ No newline at end of file diff --git a/src/modules/Elsa.Connections.Core/Attributes/ConnectionTypeAttribute.cs b/src/modules/Elsa.Connections.Core/Attributes/ConnectionTypeAttribute.cs new file mode 100644 index 000000000..e000eb742 --- /dev/null +++ b/src/modules/Elsa.Connections.Core/Attributes/ConnectionTypeAttribute.cs @@ -0,0 +1,13 @@ +namespace Elsa.Connections.Attributes; + +public class ConnectionTypeAttribute : Attribute +{ + public ConnectionTypeAttribute(Type type) + { + Type = type; + } + /// + /// The TypeName of the connection + /// + public Type Type { get; set; } +} diff --git a/src/modules/Elsa.Connections.Core/Attributes/NoLogAttribute.cs b/src/modules/Elsa.Connections.Core/Attributes/NoLogAttribute.cs new file mode 100644 index 000000000..80c4275c9 --- /dev/null +++ b/src/modules/Elsa.Connections.Core/Attributes/NoLogAttribute.cs @@ -0,0 +1,5 @@ +namespace Elsa.Connections.Attributes; + +public class NoLogAttribute : Attribute +{ +} diff --git a/src/modules/Elsa.Connections.Core/Contracts/IConnectionDescriptorRegistry.cs b/src/modules/Elsa.Connections.Core/Contracts/IConnectionDescriptorRegistry.cs new file mode 100644 index 000000000..873122ff6 --- /dev/null +++ b/src/modules/Elsa.Connections.Core/Contracts/IConnectionDescriptorRegistry.cs @@ -0,0 +1,39 @@ +using Elsa.Connections.Models; +using Elsa.Workflows.Models; + +namespace Elsa.Connections.Contracts; + +/// +/// Store all connection descriptors available to the system +/// +public interface IConnectionDescriptorRegistry +{ + /// + /// Adds a connection descriptor to the registry + /// + /// The type of the connection + /// The type desiptor of the connection + void Add(Type connectionType, ConnectionDescriptor connectionDescriptor); + + /// + /// Removes an activity descriptor from the registry. + /// + /// The type of the connection. + void Remove(Type connectionType, ActivityDescriptor descriptor); + + /// + /// Returns all connection descriptors in the registry. + /// + /// All connection descriptors in the registry. + IEnumerable ListAll(); + + Type Get(string type); + + /// + /// Get the Input Descriptors for an connection + /// + /// The type of the connectn + /// + /// + Task> GetConnectionDescriptor(string activityType, CancellationToken cancellationToken = default); +} \ No newline at end of file diff --git a/src/modules/Elsa.Connections.Core/Contracts/IConnectionDescriptorRepository.cs b/src/modules/Elsa.Connections.Core/Contracts/IConnectionDescriptorRepository.cs new file mode 100644 index 000000000..fd61010fa --- /dev/null +++ b/src/modules/Elsa.Connections.Core/Contracts/IConnectionDescriptorRepository.cs @@ -0,0 +1,9 @@ +using Elsa.Connections.Models; +using Elsa.Workflows.Models; + +namespace Elsa.Connections.Contracts; + +public interface IConnectionDescriptorRegistryEX +{ + +} diff --git a/src/modules/Elsa.Connections.Core/Contracts/IConnectionProperty.cs b/src/modules/Elsa.Connections.Core/Contracts/IConnectionProperty.cs new file mode 100644 index 000000000..6e57e8763 --- /dev/null +++ b/src/modules/Elsa.Connections.Core/Contracts/IConnectionProperty.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Text.Json.Serialization; +using System.Threading.Tasks; + +namespace Elsa.Connections.Contracts; +interface IConnectionProperty +{ + public string ConnectionName { get; set; } + + [JsonIgnore] + public object Properties { get; set; } +} + diff --git a/src/modules/Elsa.Connections.Core/Contracts/IConnectionRepository.cs b/src/modules/Elsa.Connections.Core/Contracts/IConnectionRepository.cs new file mode 100644 index 000000000..07fec5e0b --- /dev/null +++ b/src/modules/Elsa.Connections.Core/Contracts/IConnectionRepository.cs @@ -0,0 +1,15 @@ +using Elsa.Connections.Models; + +namespace Elsa.Connections.Contracts; + +public interface IConnectionRepository +{ + public Task GetConnectionAsync(string name, CancellationToken cancellationToken = default); + public Task> GetConnectionsAsync(CancellationToken cancellationToken = default); + public Task> GetConnectionsFromTypeAsync(string type, CancellationToken cancellationToken = default); + + public Task AddConnectionConfigurationAsync(ConnectionConfigurationMetadataModel model, CancellationToken cancellationToken = default); + + public Task UpdateConnectionAsync(string name, ConnectionConfigurationMetadataModel model, CancellationToken cancellationToken = default); + public Task DeleteConnectionConfigurationAsync(string id, CancellationToken cancellationToken = default); +} diff --git a/src/modules/Elsa.Connections.Core/Elsa.Connections.Core.csproj b/src/modules/Elsa.Connections.Core/Elsa.Connections.Core.csproj new file mode 100644 index 000000000..4a93d844b --- /dev/null +++ b/src/modules/Elsa.Connections.Core/Elsa.Connections.Core.csproj @@ -0,0 +1,15 @@ + + + + Provides an connection framework to use connection abtraction in activities + elsa module connection abstratction + Elsa.Connections + + + + + + + + + diff --git a/src/modules/Elsa.Connections.Core/Extensions/ModuleExtensions.cs b/src/modules/Elsa.Connections.Core/Extensions/ModuleExtensions.cs new file mode 100644 index 000000000..9db69531f --- /dev/null +++ b/src/modules/Elsa.Connections.Core/Extensions/ModuleExtensions.cs @@ -0,0 +1,19 @@ +using Elsa.Connections.Features; +using Elsa.Features.Services; + +// ReSharper disable once CheckNamespace +namespace Elsa.Extensions; + +/// +/// Extends with methods to install Semantic Kernel API endpoints. +/// +public static class ModuleExtensions +{ + /// + /// Installs the Semantic Kernel API feature. + /// + public static IModule UseConnections(this IModule module, Action? configure = null) + { + return module.Use(configure); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Connections.Core/Features/ConnectionsFeatures.cs b/src/modules/Elsa.Connections.Core/Features/ConnectionsFeatures.cs new file mode 100644 index 000000000..fb0953dfc --- /dev/null +++ b/src/modules/Elsa.Connections.Core/Features/ConnectionsFeatures.cs @@ -0,0 +1,80 @@ +using System.Reflection; +using Elsa.Connections.Attributes; +using Elsa.Connections.Contracts; +using Elsa.Connections.Filters; +using Elsa.Connections.ServiceProvider; +using Elsa.Connections.Services; +using Elsa.Connections.UIHints; +using Elsa.Extensions; +using Elsa.Features.Abstractions; +using Elsa.Features.Attributes; +using Elsa.Features.Services; +using Elsa.Workflows; +using Elsa.Workflows.Pipelines.ActivityExecution; +using Elsa.Workflows.Features; +using JetBrains.Annotations; +using Microsoft.Extensions.DependencyInjection; +using Elsa.Connections.Middleware; + +namespace Elsa.Connections.Features; + +/// +/// A feature that installs API endpoints to interact with skilled agents. +/// +[DependsOn(typeof(WorkflowsFeature))] +[UsedImplicitly] +public class ConnectionsFeatures(IModule module) : FeatureBase(module) +{ + + /// + /// A set of connection types to make available to the system. + /// + public HashSet ConnectionTypes { get; } = []; + + /// + public override void Apply() + { + // Obfuscate Connection Properties. + Services.AddActivityStateFilter(); + // Activity property options providers. + Services.AddScoped(); + + Services.AddSingleton(); + + //UIHints + Services.AddScoped(); + + Services.Configure(options => + { + foreach (var connectionType in ConnectionTypes.Distinct()) + options.ConnectionTypes.Add(connectionType); + }); + } + public override void Configure() + { + //TODO: Need to insert the middleware just before the BackgroundActivityInvoker + //How to be sure that it is inserted before? + var workflowFeature = Module.Configure() + .WithDefaultActivityExecutionPipeline(pipeline => pipeline.Insert(3)); + base.Configure(); + } + public ConnectionsFeatures AddConnectionsFrom() + { + var connectionTypes = typeof(TMarker).Assembly.GetExportedTypes() + .Where(x => x.GetCustomAttribute() != null ) + .ToList(); + + ConnectionTypes.AddRange(connectionTypes); + + return this; + } + +} + +public class ConnectionOptions +{ + /// + /// A collection of connection types that are available to the system. + /// + public HashSet ConnectionTypes { get; set; } = new(); +} \ No newline at end of file diff --git a/src/modules/Elsa.Connections.Core/Filters/PropertyAttributeFilter.cs b/src/modules/Elsa.Connections.Core/Filters/PropertyAttributeFilter.cs new file mode 100644 index 000000000..398039c3f --- /dev/null +++ b/src/modules/Elsa.Connections.Core/Filters/PropertyAttributeFilter.cs @@ -0,0 +1,27 @@ +using Elsa.Connections.Attributes; +using Elsa.Workflows; + +namespace Elsa.Connections.Filters; + +public class PropertyAttributeFilter : ActivityStateFilterBase +{ + protected override ActivityStateFilterResult OnExecute(ActivityStateFilterContext context) + { + var activityExecutionContext = context.ActivityExecutionContext; + var activity = activityExecutionContext.Activity; + var inputDescriptor = context.InputDescriptor; + + if (Attribute.IsDefined(inputDescriptor.PropertyInfo, typeof(NoLogAttribute))) + { + var contextValue = context.Value.GetProperty("connectionName").GetString(); + + if (contextValue == null) + return ActivityStateFilterResult.Pass(); + + var maskedValue = $"**** see connection information for {contextValue} ****"; + return Filtered(maskedValue); + } + else + return ActivityStateFilterResult.Pass(); + } +} diff --git a/src/modules/Elsa.Connections.Core/FodyWeavers.xml b/src/modules/Elsa.Connections.Core/FodyWeavers.xml new file mode 100644 index 000000000..ac6b5b292 --- /dev/null +++ b/src/modules/Elsa.Connections.Core/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/modules/Elsa.Connections.Core/Middleware/ConnectionMiddleware.cs b/src/modules/Elsa.Connections.Core/Middleware/ConnectionMiddleware.cs new file mode 100644 index 000000000..89bfd7c5a --- /dev/null +++ b/src/modules/Elsa.Connections.Core/Middleware/ConnectionMiddleware.cs @@ -0,0 +1,101 @@ +using System.Reflection; +using System.Text.Json; +using Elsa.Connections.Attributes; +using Elsa.Connections.Contracts; +using Elsa.Connections.Models; +using Elsa.Workflows; +using Elsa.Workflows.Pipelines.ActivityExecution; +using Elsa.Workflows.UIHints.Dropdown; +using JetBrains.Annotations; + +namespace Elsa.Connections.Middleware; + +/// +/// Adds extension methods to . +/// +public static class ConnectionMiddlewareExtensions +{ + /// + /// Installs the component in the activity execution pipeline. + /// + public static IActivityExecutionPipelineBuilder UseConnectionMiddleware(this IActivityExecutionPipelineBuilder pipelineBuilder) => pipelineBuilder.UseMiddleware(); +} + +/// +/// An activity execution middleware component that extracts execution details as objects. +/// +[UsedImplicitly] +public class ConnectionMiddleware(ActivityMiddlewareDelegate next, IConnectionRepository connectionStore) : IActivityExecutionMiddleware +{ + /// + public async ValueTask InvokeAsync(ActivityExecutionContext context) + { + var activityDescriptor = context.ActivityDescriptor; + + if (activityDescriptor.Attributes.Any(attr => attr.GetType() == typeof(ConnectionActivityAttribute))) + { + var inputDescriptors = activityDescriptor.Inputs.Where(x => x?.PropertyInfo.PropertyType.GetGenericTypeDefinition() == typeof(ConnectionProperties<>)); + + if (inputDescriptors != null && inputDescriptors.Any()) + { + var input = inputDescriptors.First(); + var propertyType = input?.PropertyInfo?.PropertyType.GetGenericArguments()[0]; + + dynamic inputValue = input.ValueGetter(context.Activity); + + var connectionName = (string)inputValue?.ConnectionName; + + //Get connection from store, if exist, + var connectionConfiguration = await connectionStore.GetConnectionAsync(connectionName); + if (connectionConfiguration != null) + { + var options = new JsonSerializerOptions + { + PropertyNamingPolicy = JsonNamingPolicy.CamelCase, + }; + options.Converters.Add(new Int32Converter()); + + dynamic deserializedjson = + JsonSerializer.Deserialize(connectionConfiguration.ConnectionConfiguration, propertyType, options); + + inputValue.Properties = deserializedjson; + + input.ValueSetter(context.Activity, inputValue); + } + } + } + + await next(context); + } + + private static bool IsActivityBookmarked(ActivityExecutionContext context) + { + return context.WorkflowExecutionContext.Bookmarks.Any(b => b.ActivityNodeId.Equals(context.ActivityNode.NodeId)); + } +} + +public class Int32Converter : System.Text.Json.Serialization.JsonConverter +{ + public override int Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + if (reader.TokenType == JsonTokenType.String) + { + string stringValue = reader.GetString(); + if (int.TryParse(stringValue, out int value)) + { + return value; + } + } + else if (reader.TokenType == JsonTokenType.Number) + { + return reader.GetInt32(); + } + + throw new JsonException(); + } + + public override void Write(Utf8JsonWriter writer, int value, JsonSerializerOptions options) + { + writer.WriteNumberValue(value); + } +} diff --git a/src/modules/Elsa.Connections.Core/Models/ConnectionConfigurationMetadataModel.cs b/src/modules/Elsa.Connections.Core/Models/ConnectionConfigurationMetadataModel.cs new file mode 100644 index 000000000..5076c6653 --- /dev/null +++ b/src/modules/Elsa.Connections.Core/Models/ConnectionConfigurationMetadataModel.cs @@ -0,0 +1,17 @@ +using System.ComponentModel.DataAnnotations; +using System.Text.Json.Nodes; + +namespace Elsa.Connections.Models; + +public class ConnectionConfigurationMetadataModel +{ + public string Id { get; set; } + [Required] + public string? Name { get; set; } + public string Description { get; set; } + + public JsonObject ConnectionConfiguration { get; set; } + + [Required] + public string ConnectionType { get; set; } +} \ No newline at end of file diff --git a/src/modules/Elsa.Connections.Core/Models/ConnectionDescriptor.cs b/src/modules/Elsa.Connections.Core/Models/ConnectionDescriptor.cs new file mode 100644 index 000000000..e9b536a4d --- /dev/null +++ b/src/modules/Elsa.Connections.Core/Models/ConnectionDescriptor.cs @@ -0,0 +1,3 @@ +namespace Elsa.Connections.Models; + +public record ConnectionDescriptor(string type, string description, string @namespace, string providerName); diff --git a/src/modules/Elsa.Connections.Core/Models/ConnectionProperties.cs b/src/modules/Elsa.Connections.Core/Models/ConnectionProperties.cs new file mode 100644 index 000000000..5d7566774 --- /dev/null +++ b/src/modules/Elsa.Connections.Core/Models/ConnectionProperties.cs @@ -0,0 +1,20 @@ +using System.Text.Json.Serialization; + +namespace Elsa.Connections.Models; + +public class ConnectionProperties where T : class, new() +{ + /// + /// Creates a new instance of the class. + /// + [JsonConstructor] + public ConnectionProperties() + { + } + + public string ConnectionName { get; set; } + + [JsonIgnore] + public T Properties { get; set; } = new T(); +} + diff --git a/src/modules/Elsa.Connections.Core/ServiceProvider/ConnectionOptionsProvider.cs b/src/modules/Elsa.Connections.Core/ServiceProvider/ConnectionOptionsProvider.cs new file mode 100644 index 000000000..b992c6c55 --- /dev/null +++ b/src/modules/Elsa.Connections.Core/ServiceProvider/ConnectionOptionsProvider.cs @@ -0,0 +1,46 @@ +using System.Reflection; +using Elsa.Connections.Attributes; +using Elsa.Connections.Contracts; +using Elsa.Workflows.UIHints.Dropdown; + +namespace Elsa.Connections.ServiceProvider; + +public class ConnectionOptionsProvider : DropDownOptionsProviderBase +{ + private readonly IConnectionRepository _store; + + public ConnectionOptionsProvider(IConnectionRepository store) + { + _store = store; + } + public new async ValueTask> GetUIPropertiesAsync(PropertyInfo propertyInfo, object? context, CancellationToken cancellationToken = default) + { + var options = await base.GetUIPropertiesAsync(propertyInfo, context, cancellationToken); + options.Add("Refresh", true); + return options; + } + protected override async ValueTask> GetItemsAsync(PropertyInfo propertyInfo, object? context, CancellationToken cancellationToken) + { + var connection = new List(); + + var connectionType = propertyInfo.GetCustomAttribute()?.Type; + + + + if (connectionType == null) + return connection; + + var connections = await _store.GetConnectionsFromTypeAsync(connectionType.ToString()); + + foreach(var conn in connections) + connection.Add(new SelectListItem(conn.Name, conn.Name)); + + + + + //connection.Add(new SelectListItem("connection 2", "idConnection2")); + //connection.Add(new SelectListItem("connection 3", "idConnection3")); + return connection; + //throw new NotImplementedException(); + } +} diff --git a/src/modules/Elsa.Connections.Core/Services/ConnectionRegistry.cs b/src/modules/Elsa.Connections.Core/Services/ConnectionRegistry.cs new file mode 100644 index 000000000..26f02f3de --- /dev/null +++ b/src/modules/Elsa.Connections.Core/Services/ConnectionRegistry.cs @@ -0,0 +1,86 @@ +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; +using Elsa.Connections.Attributes; +using Elsa.Connections.Contracts; +using Elsa.Connections.Features; +using Elsa.Connections.Models; +using Elsa.Workflows; +using Elsa.Workflows.Models; +using Microsoft.Extensions.Options; + +namespace Elsa.Connections.Services; +public class ConnectionRegistry : IConnectionDescriptorRegistry +{ + + private readonly ConcurrentDictionary _connectionDescriptors = new(); + private readonly ConnectionOptions _options; + private readonly IActivityDescriber _describer; + + public ConnectionRegistry(IOptions options, IActivityDescriber describer) + { + _options = options.Value; + _describer = describer; + } + public void Add(Type connectionType, ConnectionDescriptor connectionDescriptor) + { + var descriptor = DescribeConnection(connectionType); + + _connectionDescriptors.TryAdd(connectionType, descriptor); + } + + public IEnumerable ListAll() + { + foreach (var connectionType in _options.ConnectionTypes) + yield return DescribeConnection(connectionType); + } + + public void Remove(Type connectionType, ActivityDescriptor descriptor) + { + throw new NotImplementedException(); + } + + public Type Get(string type) + { + var item = _options.ConnectionTypes.Where(c => c.ToString() == type).FirstOrDefault(); + return item; + } + + public async Task> GetConnectionDescriptor(string activityType, CancellationToken cancellationToken = default) + { + var propertyType2 = Type.GetType(activityType); + + var propertyType = Get(activityType); + + if (propertyType == null) + return null; + + var connectionInputProperty = _describer.GetInputProperties(propertyType); + var connectionInputDescriptor = await DescribeInputPropertiesAsync(connectionInputProperty); + + return connectionInputDescriptor; + } + + private async Task> DescribeInputPropertiesAsync(IEnumerable properties, CancellationToken cancellationToken = default) + { + return await Task.WhenAll(properties.Select(async x => await _describer.DescribeInputPropertyAsync(x, cancellationToken))); + } + private ConnectionDescriptor DescribeConnection(Type connectionType) + { + var connectionAttribute = connectionType.GetCustomAttribute(); + + if (connectionAttribute == null) + throw new ArgumentNullException($"{connectionType} is not a valid connection, make sure [ConnectionPropertyAttribute] is set "); + + return new ConnectionDescriptor( + connectionType.ToString(), + connectionAttribute?.Description, + connectionAttribute.Namespace, + connectionAttribute.DisplayName + ); + } +} diff --git a/src/modules/Elsa.Connections.Core/UIHints/ConnexionDropDownUIHintHandler.cs b/src/modules/Elsa.Connections.Core/UIHints/ConnexionDropDownUIHintHandler.cs new file mode 100644 index 000000000..400322ee1 --- /dev/null +++ b/src/modules/Elsa.Connections.Core/UIHints/ConnexionDropDownUIHintHandler.cs @@ -0,0 +1,18 @@ +using System.Reflection; +using Elsa.Workflows; +using Elsa.Workflows.UIHints; +using Elsa.Workflows.UIHints.Dropdown; + +namespace Elsa.Connections.UIHints; + +public class ConnexionDropDownUIHintHandler : IUIHintHandler +{ + /// + public string UIHint => $"connexion-{InputUIHints.DropDown}"; + + /// + public ValueTask> GetPropertyUIHandlersAsync(PropertyInfo propertyInfo, CancellationToken cancellationToken) + { + return new(new[] { typeof(StaticDropDownOptionsProvider) }); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Connections.Models/Elsa.Connections.Models.csproj b/src/modules/Elsa.Connections.Models/Elsa.Connections.Models.csproj new file mode 100644 index 000000000..52ed24920 --- /dev/null +++ b/src/modules/Elsa.Connections.Models/Elsa.Connections.Models.csproj @@ -0,0 +1,13 @@ + + + + net8.0 + enable + enable + + + + + + + diff --git a/src/modules/Elsa.Connections.Persistence/Elsa.Connections.Persistence.csproj b/src/modules/Elsa.Connections.Persistence/Elsa.Connections.Persistence.csproj new file mode 100644 index 000000000..3ea43013e --- /dev/null +++ b/src/modules/Elsa.Connections.Persistence/Elsa.Connections.Persistence.csproj @@ -0,0 +1,13 @@ + + + + Provides Connections persistence services + elsa module connections persistence + + + + + + + + diff --git a/src/modules/Elsa.Connections.Persistence/Features/ConnectionPersistenceFeature.cs b/src/modules/Elsa.Connections.Persistence/Features/ConnectionPersistenceFeature.cs new file mode 100644 index 000000000..d69940b37 --- /dev/null +++ b/src/modules/Elsa.Connections.Persistence/Features/ConnectionPersistenceFeature.cs @@ -0,0 +1,58 @@ +using Elsa.Common.Features; +using Elsa.Connections.Features; +using Elsa.Extensions; +using Elsa.Features.Abstractions; +using Elsa.Features.Attributes; +using Elsa.Features.Services; +using Microsoft.Extensions.DependencyInjection; + +namespace Elsa.Connections.Persistence.Features; + +[DependsOn(typeof(ConnectionsFeatures))] +public class ConnectionPersistenceFeature(IModule module) : FeatureBase(module) +{ + //private Func _apiKeyStoreFactory = sp => sp.GetRequiredService(); + //private Func _serviceStoreFactory = sp => sp.GetRequiredService(); + //private Func _agentStoreFactory = sp => sp.GetRequiredService(); + + //public AgentPersistenceFeature UseApiKeyStore(Func factory) + //{ + // _apiKeyStoreFactory = factory; + // return this; + //} + + //public AgentPersistenceFeature UseServiceStore(Func factory) + //{ + // _serviceStoreFactory = factory; + // return this; + //} + + //public AgentPersistenceFeature UseAgentStore(Func factory) + //{ + // _agentStoreFactory = factory; + // return this; + //} + + //public override void Configure() + //{ + // Module.UseAgents(agents => agents.UseKernelConfigProvider(sp => sp.GetRequiredService())); + //} + + //public override void Apply() + //{ + // Services + // .AddScoped(_apiKeyStoreFactory) + // .AddScoped(_serviceStoreFactory) + // .AddScoped(_agentStoreFactory); + + // Services + // .AddScoped(); + + // Services + // .AddMemoryStore() + // .AddMemoryStore() + // .AddMemoryStore(); + + // Services.AddScoped(); + //} +} \ No newline at end of file diff --git a/src/modules/Elsa.Connections.Persistence/FodyWeavers.xml b/src/modules/Elsa.Connections.Persistence/FodyWeavers.xml new file mode 100644 index 000000000..ac6b5b292 --- /dev/null +++ b/src/modules/Elsa.Connections.Persistence/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file From afc14fab4be9e0a9389f3d022f1be028561d8c9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20DEVILLARD?= Date: Mon, 13 Jan 2025 15:52:03 +0100 Subject: [PATCH 02/10] add virtual method to DropDownOptions provider to allow customization of options in inherited class. clean ConnectionOptionsProvider class --- .../ConnectionOptionsProvider.cs | 17 ++++++++--------- .../Dropdown/DropDownOptionsProviderBase.cs | 16 ++++++++++++++-- 2 files changed, 22 insertions(+), 11 deletions(-) diff --git a/src/modules/Elsa.Connections.Core/ServiceProvider/ConnectionOptionsProvider.cs b/src/modules/Elsa.Connections.Core/ServiceProvider/ConnectionOptionsProvider.cs index b992c6c55..09837e017 100644 --- a/src/modules/Elsa.Connections.Core/ServiceProvider/ConnectionOptionsProvider.cs +++ b/src/modules/Elsa.Connections.Core/ServiceProvider/ConnectionOptionsProvider.cs @@ -25,8 +25,6 @@ public class ConnectionOptionsProvider : DropDownOptionsProviderBase var connectionType = propertyInfo.GetCustomAttribute()?.Type; - - if (connectionType == null) return connection; @@ -34,13 +32,14 @@ public class ConnectionOptionsProvider : DropDownOptionsProviderBase foreach(var conn in connections) connection.Add(new SelectListItem(conn.Name, conn.Name)); - - - - - //connection.Add(new SelectListItem("connection 2", "idConnection2")); - //connection.Add(new SelectListItem("connection 3", "idConnection3")); return connection; - //throw new NotImplementedException(); + } + + protected override IDictionary GetUIPropertyAdditionalOptions() + { + return new Dictionary + { + ["Refresh"] = true + }; } } diff --git a/src/modules/Elsa.Workflows.Core/UIHints/Dropdown/DropDownOptionsProviderBase.cs b/src/modules/Elsa.Workflows.Core/UIHints/Dropdown/DropDownOptionsProviderBase.cs index b97dc3385..1fccfe0dc 100644 --- a/src/modules/Elsa.Workflows.Core/UIHints/Dropdown/DropDownOptionsProviderBase.cs +++ b/src/modules/Elsa.Workflows.Core/UIHints/Dropdown/DropDownOptionsProviderBase.cs @@ -1,4 +1,5 @@ using System.Reflection; +using Elsa.Extensions; namespace Elsa.Workflows.UIHints.Dropdown; @@ -19,7 +20,9 @@ public abstract class DropDownOptionsProviderBase : IPropertyUIHandler var options = new Dictionary { [InputUIHints.DropDown] = props - }; + }; + + options.AddRange(GetUIPropertyAdditionalOptions()); return options; } @@ -27,5 +30,14 @@ public abstract class DropDownOptionsProviderBase : IPropertyUIHandler /// /// Implement this to provide items to the dropdown list. /// - protected abstract ValueTask> GetItemsAsync(PropertyInfo propertyInfo, object? context, CancellationToken cancellationToken); + protected abstract ValueTask> GetItemsAsync(PropertyInfo propertyInfo, object? context, CancellationToken cancellationToken); + + /// + /// Override this to provide additional options to the list + /// + /// + protected virtual IDictionary GetUIPropertyAdditionalOptions() + { + return new Dictionary(); + } } \ No newline at end of file From 5e6acc0f4b161136236902011a274d7e1ca081b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20DEVILLARD?= Date: Tue, 14 Jan 2025 12:42:04 +0100 Subject: [PATCH 03/10] add missing FodyWeavers --- .../ConnectionConfigurationModel.cs | 22 +++++++++++++++++++ .../Elsa.Connections.Models/FodyWeavers.xml | 3 +++ 2 files changed, 25 insertions(+) create mode 100644 src/modules/Elsa.Connections.Models/ConnectionConfigurationModel.cs create mode 100644 src/modules/Elsa.Connections.Models/FodyWeavers.xml diff --git a/src/modules/Elsa.Connections.Models/ConnectionConfigurationModel.cs b/src/modules/Elsa.Connections.Models/ConnectionConfigurationModel.cs new file mode 100644 index 000000000..4d6b2f356 --- /dev/null +++ b/src/modules/Elsa.Connections.Models/ConnectionConfigurationModel.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Text; +using System.Text.Json.Nodes; +using System.Threading.Tasks; + +namespace Elsa.Connections.Models; + +public class ConnectionConfigurationModel +{ + public string Id { get; set; } + [Required] + public string? Name { get; set; } + public string Description { get; set; } + + public JsonObject ConnectionConfiguration { get; set; } + + [Required] + public string ConnectionType { get; set; } +} diff --git a/src/modules/Elsa.Connections.Models/FodyWeavers.xml b/src/modules/Elsa.Connections.Models/FodyWeavers.xml new file mode 100644 index 000000000..96f7a2a75 --- /dev/null +++ b/src/modules/Elsa.Connections.Models/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file From 0d0360fb0b76a340f1966a5cfdc4c95b8b86f851 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20DEVILLARD?= Date: Tue, 14 Jan 2025 16:00:59 +0100 Subject: [PATCH 04/10] exclude Elsa.Connections.Models for CI (weavers issue) --- Elsa.sln | 7 ------- 1 file changed, 7 deletions(-) diff --git a/Elsa.sln b/Elsa.sln index faf54b9c7..286627371 100644 --- a/Elsa.sln +++ b/Elsa.sln @@ -395,8 +395,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Connections.Api", "src EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Connections.Persistence", "src\modules\Elsa.Connections.Persistence\Elsa.Connections.Persistence.csproj", "{9C2764B2-8BA4-4184-9B75-C426A593C815}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Connections.Models", "src\modules\Elsa.Connections.Models\Elsa.Connections.Models.csproj", "{FB1A962B-1299-4B35-9F53-3683BBD3426C}" -EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -845,10 +843,6 @@ Global {9C2764B2-8BA4-4184-9B75-C426A593C815}.Debug|Any CPU.Build.0 = Debug|Any CPU {9C2764B2-8BA4-4184-9B75-C426A593C815}.Release|Any CPU.ActiveCfg = Release|Any CPU {9C2764B2-8BA4-4184-9B75-C426A593C815}.Release|Any CPU.Build.0 = Release|Any CPU - {FB1A962B-1299-4B35-9F53-3683BBD3426C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FB1A962B-1299-4B35-9F53-3683BBD3426C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FB1A962B-1299-4B35-9F53-3683BBD3426C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FB1A962B-1299-4B35-9F53-3683BBD3426C}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -998,7 +992,6 @@ Global {7F620A88-E1CE-4D73-A21A-DE5A5B538BA8} = {FFC2EE94-ABD1-4D22-A325-A53F80CC097E} {FD22E2B0-E164-4881-9DD4-4E429D178FB9} = {FFC2EE94-ABD1-4D22-A325-A53F80CC097E} {9C2764B2-8BA4-4184-9B75-C426A593C815} = {FFC2EE94-ABD1-4D22-A325-A53F80CC097E} - {FB1A962B-1299-4B35-9F53-3683BBD3426C} = {FFC2EE94-ABD1-4D22-A325-A53F80CC097E} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {D4B5CEAA-7D70-4FCB-A68E-B03FBE5E0E5E} From c4e3e42dbcaeac353f5d60059b1033fa481590c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20DEVILLARD?= Date: Mon, 10 Feb 2025 12:40:14 +0100 Subject: [PATCH 05/10] Add Connections to Sample Program --- src/apps/Elsa.ServerAndStudio.Web/Program.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/apps/Elsa.ServerAndStudio.Web/Program.cs b/src/apps/Elsa.ServerAndStudio.Web/Program.cs index 581f25ec5..d5e13c05c 100644 --- a/src/apps/Elsa.ServerAndStudio.Web/Program.cs +++ b/src/apps/Elsa.ServerAndStudio.Web/Program.cs @@ -13,6 +13,7 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.Data.Sqlite; using Proto.Persistence.Sqlite; using WebhooksCore.Options; +using Elsa.Connections.Middleware; const bool useMassTransit = true; const bool useProtoActor = true; @@ -189,6 +190,10 @@ services if (distributedCachingTransport == DistributedCachingTransport.MassTransit) distributedCaching.UseMassTransit(); }); } + + elsa.UseConnections( + configure=> configure.AddConnectionsFrom()); + elsa.UseConnectionsApi(); }); services.Configure(options => configuration.GetSection("Webhooks").Bind(options)); From 0aed8208dc42af6a4915dd1262044928c30e8dcd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20DEVILLARD?= Date: Wed, 12 Feb 2025 00:12:06 +0100 Subject: [PATCH 06/10] Mass Refactoring to be compliant with other code in Elsa Repo - Refactor IStore, InputModel and Entities - Add Persistence Project - Add EntityFameworkCore Project --- .../Elsa.Connections.Api.csproj | 6 ++ .../Endpoints/Add/Endpoint.cs | 84 +++++++++++++++--- .../Endpoints/Delete/Endpoint.cs | 19 ++-- .../Endpoints/Delete/Request.cs | 11 +++ .../Endpoints/List/Endpoint.cs | 13 +-- .../ConnectionDefinitionExtensions.cs | 24 +++++ .../Features/ConnectionsApiFeature.cs | 8 +- .../Services/InMemoryConnectionRepository.cs | 45 ---------- .../Contracts/IConnectionRepository.cs | 15 ---- .../Converters/Int32Converter.cs | 29 ++++++ .../Elsa.Connections.Core.csproj | 2 + .../Extensions/LogConnectionExtensions.cs | 24 +++++ .../Extensions/ModuleExtensions.cs | 16 +++- .../Features/ConnectionsFeatures.cs | 9 +- .../Middleware/ConnectionMiddleware.cs | 88 +++++++------------ .../ConnectionConfigurationMetadataModel.cs | 17 ---- .../Models/ConnectionOptions.cs | 9 ++ .../ConnectionOptionsProvider.cs | 8 +- .../Services/ConnectionRegistry.cs | 1 - .../UIHints/ConnexionDropDownUIHintHandler.cs | 3 + .../ConnectionConfigurationMetadataModel.cs | 31 +++++++ .../ConnectionDescriptor.cs | 0 .../ConnectionModel.cs | 11 +++ .../ConnectionProperties.cs | 2 +- .../Elsa.Connections.Models/FodyWeavers.xml | 3 +- .../Configurations.cs | 19 ++++ .../DbContext.cs | 34 +++++++ ...ons.Persistence.EntityFrameworkCore.csproj | 13 +++ .../FodyWeavers.xml | 3 + .../Contracts/IConnectionStore.cs | 67 ++++++++++++++ .../Elsa.Connections.Persistence.csproj | 2 +- .../Entities/ConnectionDefinition.cs | 30 +++++++ .../ConnectionPersistenceExtensions.cs | 24 +++++ .../Features/ConnectionPersistenceFeature.cs | 63 ++++--------- .../Filters/ConnectionDefinitionFilter.cs | 26 ++++++ .../Services/InMemoryConnectionStore.cs | 51 +++++++++++ 36 files changed, 587 insertions(+), 223 deletions(-) create mode 100644 src/modules/Elsa.Connections.Api/Endpoints/Delete/Request.cs create mode 100644 src/modules/Elsa.Connections.Api/Extensions/ConnectionDefinitionExtensions.cs delete mode 100644 src/modules/Elsa.Connections.Api/Services/InMemoryConnectionRepository.cs delete mode 100644 src/modules/Elsa.Connections.Core/Contracts/IConnectionRepository.cs create mode 100644 src/modules/Elsa.Connections.Core/Converters/Int32Converter.cs create mode 100644 src/modules/Elsa.Connections.Core/Extensions/LogConnectionExtensions.cs delete mode 100644 src/modules/Elsa.Connections.Core/Models/ConnectionConfigurationMetadataModel.cs create mode 100644 src/modules/Elsa.Connections.Core/Models/ConnectionOptions.cs create mode 100644 src/modules/Elsa.Connections.Models/ConnectionConfigurationMetadataModel.cs rename src/modules/{Elsa.Connections.Core/Models => Elsa.Connections.Models}/ConnectionDescriptor.cs (100%) create mode 100644 src/modules/Elsa.Connections.Models/ConnectionModel.cs rename src/modules/{Elsa.Connections.Core/Models => Elsa.Connections.Models}/ConnectionProperties.cs (85%) create mode 100644 src/modules/Elsa.Connections.Persistence.EntityFrameworkCore/Configurations.cs create mode 100644 src/modules/Elsa.Connections.Persistence.EntityFrameworkCore/DbContext.cs create mode 100644 src/modules/Elsa.Connections.Persistence.EntityFrameworkCore/Elsa.Connections.Persistence.EntityFrameworkCore.csproj create mode 100644 src/modules/Elsa.Connections.Persistence.EntityFrameworkCore/FodyWeavers.xml create mode 100644 src/modules/Elsa.Connections.Persistence/Contracts/IConnectionStore.cs create mode 100644 src/modules/Elsa.Connections.Persistence/Entities/ConnectionDefinition.cs create mode 100644 src/modules/Elsa.Connections.Persistence/Extensions/ConnectionPersistenceExtensions.cs create mode 100644 src/modules/Elsa.Connections.Persistence/Filters/ConnectionDefinitionFilter.cs create mode 100644 src/modules/Elsa.Connections.Persistence/Services/InMemoryConnectionStore.cs diff --git a/src/modules/Elsa.Connections.Api/Elsa.Connections.Api.csproj b/src/modules/Elsa.Connections.Api/Elsa.Connections.Api.csproj index e265db49a..25596b8f9 100644 --- a/src/modules/Elsa.Connections.Api/Elsa.Connections.Api.csproj +++ b/src/modules/Elsa.Connections.Api/Elsa.Connections.Api.csproj @@ -7,6 +7,12 @@ + + + + + + diff --git a/src/modules/Elsa.Connections.Api/Endpoints/Add/Endpoint.cs b/src/modules/Elsa.Connections.Api/Endpoints/Add/Endpoint.cs index 6e18c2917..40a98b176 100644 --- a/src/modules/Elsa.Connections.Api/Endpoints/Add/Endpoint.cs +++ b/src/modules/Elsa.Connections.Api/Endpoints/Add/Endpoint.cs @@ -1,10 +1,15 @@ using Elsa.Abstractions; -using Elsa.Connections.Contracts; using Elsa.Connections.Models; +using Elsa.Connections.Persistence.Contracts; +using Elsa.Connections.Persistence.Filters; +using Elsa.Workflows; +using Elsa.Connections.Persistence.Entities; +using Elsa.Connections.Api.Extensions; +using static FastEndpoints.Ep; namespace Elsa.Connections.Api.Endpoints.Add; -public class Endpoint(IConnectionRepository store) : ElsaEndpoint +public class Endpoint(IConnectionStore store, IIdentityGenerator identityGenerator) : ElsaEndpoint { public override void Configure() { @@ -12,16 +17,42 @@ public class Endpoint(IConnectionRepository store) : ElsaEndpoint ExecuteAsync(ConnectionConfigurationMetadataModel model, CancellationToken ct) + public override async Task ExecuteAsync(ConnectionInputModel model, CancellationToken ct) { - await store.AddConnectionConfigurationAsync(model, ct); + var isNameUnique = await IsNameUniqueAsync(model.Name, ct); + + if (!isNameUnique) + { + AddError("An connection already exists with the specified name"); + await SendErrorsAsync(cancellation: ct); + return null!; + } + + var newEntity = new ConnectionDefinition + { + Id = identityGenerator.GenerateId(), + Name = model.Name, + Description = model.Description, + ConnectionType = model.ConnectionType, + ConnectionConfiguration = model.ConnectionConfiguration, + }; + await store.AddAsync(newEntity, ct); await SendOkAsync(); - return null; + return newEntity.ToModel(); + } + + private async Task IsNameUniqueAsync(string name, CancellationToken ct) + { + var filter = new ConnectionDefinitionFilter + { + Name = name + }; + return await store.FindAsync(filter, ct) == null; } } -public class EndpointUpdate(IConnectionRepository store) : ElsaEndpoint +public class EndpointUpdate(IConnectionStore store) : ElsaEndpoint { public override void Configure() { @@ -29,12 +60,45 @@ public class EndpointUpdate(IConnectionRepository store) : ElsaEndpoint ExecuteAsync(ConnectionConfigurationMetadataModel model, CancellationToken ct) + public override async Task ExecuteAsync(ConnectionInputModel model, CancellationToken ct) { - await store.UpdateConnectionAsync(model.Id , model, ct); - await SendOkAsync(); + var id = Route("id")!; + var entity = await store.GetAsync(id, ct); - return null; + if(entity == null) + { + await SendNotFoundAsync(ct); + return null!; + } + + var isNameDuplicate = await IsNameDuplicateAsync(model.Name, id, ct); + + if (isNameDuplicate) + { + AddError("Another connection already exist with the specified name"); + await SendErrorsAsync(cancellation: ct); + return entity.ToModel(); + } + + entity.Name = model.Name; + entity.Description = model.Description; + entity.ConnectionConfiguration = model.ConnectionConfiguration; + + + await store.UpdateAsync(entity, ct); + + return entity.ToModel(); + } + + private async Task IsNameDuplicateAsync(string name, string id, CancellationToken cancellationToken) + { + var entities = await store.FindAsync(new ConnectionDefinitionFilter + { + NotId = id, + Name = name + }); + + return !(entities == null); } } diff --git a/src/modules/Elsa.Connections.Api/Endpoints/Delete/Endpoint.cs b/src/modules/Elsa.Connections.Api/Endpoints/Delete/Endpoint.cs index 68b5a3d97..94ddc4c5d 100644 --- a/src/modules/Elsa.Connections.Api/Endpoints/Delete/Endpoint.cs +++ b/src/modules/Elsa.Connections.Api/Endpoints/Delete/Endpoint.cs @@ -1,10 +1,10 @@ using Elsa.Abstractions; -using Elsa.Connections.Contracts; +using Elsa.Connections.Persistence.Contracts; namespace Elsa.Connections.Api.Endpoints.Delete; -public class Endpoint(IConnectionRepository store) : ElsaEndpointWithoutRequest +public class Endpoint(IConnectionStore store) : ElsaEndpoint { public override void Configure() { @@ -12,12 +12,17 @@ public class Endpoint(IConnectionRepository store) : ElsaEndpointWithoutRequest AllowAnonymous(); } - public override async Task HandleAsync(CancellationToken ct) + public override async Task HandleAsync(Request req, CancellationToken ct) { - var configurationId = Route("id"); - await store.DeleteConnectionConfigurationAsync(configurationId, ct); - await SendOkAsync(); + var entity = await store.GetAsync(req.Id); - return null; + if (entity == null) + { + await SendNotFoundAsync(ct); + return; + } + + await store.DeleteAsync(entity, ct); + await SendOkAsync(); } } diff --git a/src/modules/Elsa.Connections.Api/Endpoints/Delete/Request.cs b/src/modules/Elsa.Connections.Api/Endpoints/Delete/Request.cs new file mode 100644 index 000000000..046a9130b --- /dev/null +++ b/src/modules/Elsa.Connections.Api/Endpoints/Delete/Request.cs @@ -0,0 +1,11 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Elsa.Connections.Api.Endpoints.Delete; +public class Request +{ [Required] public string Id { get; set; } = default!; +} diff --git a/src/modules/Elsa.Connections.Api/Endpoints/List/Endpoint.cs b/src/modules/Elsa.Connections.Api/Endpoints/List/Endpoint.cs index 47c7c1ac5..9a81a3eae 100644 --- a/src/modules/Elsa.Connections.Api/Endpoints/List/Endpoint.cs +++ b/src/modules/Elsa.Connections.Api/Endpoints/List/Endpoint.cs @@ -2,13 +2,15 @@ using System.Text.Json.Nodes; using Elsa.Abstractions; using Elsa.Common.Models; -using Elsa.Connections.Contracts; +using Elsa.Connections.Api.Extensions; using Elsa.Connections.Models; +using Elsa.Connections.Persistence.Contracts; +using Elsa.Connections.Persistence.Entities; using Elsa.Models; namespace Elsa.Connections.Api.Endpoints.List; -public class Endpoint(IConnectionRepository store) : ElsaEndpointWithoutRequest> +public class Endpoint(IConnectionStore store) : ElsaEndpointWithoutRequest> { public override void Configure() { @@ -16,9 +18,10 @@ public class Endpoint(IConnectionRepository store) : ElsaEndpointWithoutRequest< AllowAnonymous(); } - public override async Task> ExecuteAsync(CancellationToken ct) + public override async Task> ExecuteAsync(CancellationToken ct) { - var config = await store.GetConnectionsAsync(); - return new PagedListResponse(Page.Of(config, config.Count())); + var entities = await store.ListAsync(); + var models = entities.Select(x => x.ToModel()).ToList(); + return new PagedListResponse(Page.Of(models, models.Count())); } } diff --git a/src/modules/Elsa.Connections.Api/Extensions/ConnectionDefinitionExtensions.cs b/src/modules/Elsa.Connections.Api/Extensions/ConnectionDefinitionExtensions.cs new file mode 100644 index 000000000..8fbd2c30f --- /dev/null +++ b/src/modules/Elsa.Connections.Api/Extensions/ConnectionDefinitionExtensions.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Elsa.Connections.Models; +using Elsa.Connections.Persistence.Entities; + +namespace Elsa.Connections.Api.Extensions; +public static class ConnectionDefinitionExtensions +{ + public static ConnectionModel ToModel(this ConnectionDefinition entity) + { + return new ConnectionModel + { + Id = entity.Id, + Name = entity.Name, + Description = entity.Description, + ConnectionType = entity.ConnectionType, + ConnectionConfiguration = entity.ConnectionConfiguration, + + }; + } +} diff --git a/src/modules/Elsa.Connections.Api/Features/ConnectionsApiFeature.cs b/src/modules/Elsa.Connections.Api/Features/ConnectionsApiFeature.cs index cddc90c46..a329f21a0 100644 --- a/src/modules/Elsa.Connections.Api/Features/ConnectionsApiFeature.cs +++ b/src/modules/Elsa.Connections.Api/Features/ConnectionsApiFeature.cs @@ -1,7 +1,7 @@ -using Elsa.Connections.Api.Services; -using Elsa.Connections.Contracts; using Elsa.Connections.Models; +using Elsa.Connections.Persistence.Contracts; using Elsa.Connections.Persistence.Features; +using Elsa.Connections.Persistence.Services; using Elsa.Extensions; using Elsa.Features.Abstractions; using Elsa.Features.Attributes; @@ -27,11 +27,7 @@ public class ConnectionsApiFeature(IModule module) : FeatureBase(module) public override void Apply() { - Services.AddSingleton(); - Services - - .AddMemoryStore(); } } \ No newline at end of file diff --git a/src/modules/Elsa.Connections.Api/Services/InMemoryConnectionRepository.cs b/src/modules/Elsa.Connections.Api/Services/InMemoryConnectionRepository.cs deleted file mode 100644 index a34473331..000000000 --- a/src/modules/Elsa.Connections.Api/Services/InMemoryConnectionRepository.cs +++ /dev/null @@ -1,45 +0,0 @@ -using Elsa.Common.Services; -using Elsa.Connections.Contracts; -using Elsa.Connections.Models; - -namespace Elsa.Connections.Api.Services; - -public class InMemoryConnectionRepository(MemoryStore memoryStore) : IConnectionRepository -{ - public Task AddConnectionConfigurationAsync(ConnectionConfigurationMetadataModel model, CancellationToken cancellationToken = default) - { - model.Id = Guid.NewGuid().ToString("n"); - memoryStore.Add(model, model =>model.Id); - return Task.CompletedTask; - } - - public Task DeleteConnectionConfigurationAsync(string id, CancellationToken cancellationToken = default) - { - memoryStore.Delete(id); - return Task.CompletedTask; - } - - public Task GetConnectionAsync(string name, CancellationToken cancellationToken = default) - { - var result = memoryStore.Find(c => c.Name == name); - return Task.FromResult(result); - } - - public Task> GetConnectionsAsync(CancellationToken cancellationToken) - { - ICollection results = memoryStore.List().ToList() ; - return Task.FromResult(results); - } - - public Task> GetConnectionsFromTypeAsync(string type, CancellationToken cancellationToken = default) - { - ICollection items = memoryStore.FindMany(c => c.ConnectionType == type).ToList(); - return Task.FromResult(items); - } - - public Task UpdateConnectionAsync(string id, ConnectionConfigurationMetadataModel model, CancellationToken cancellationToken = default) - { - memoryStore.Update(model, model => model.Id); - return Task.CompletedTask; - } -} diff --git a/src/modules/Elsa.Connections.Core/Contracts/IConnectionRepository.cs b/src/modules/Elsa.Connections.Core/Contracts/IConnectionRepository.cs deleted file mode 100644 index 07fec5e0b..000000000 --- a/src/modules/Elsa.Connections.Core/Contracts/IConnectionRepository.cs +++ /dev/null @@ -1,15 +0,0 @@ -using Elsa.Connections.Models; - -namespace Elsa.Connections.Contracts; - -public interface IConnectionRepository -{ - public Task GetConnectionAsync(string name, CancellationToken cancellationToken = default); - public Task> GetConnectionsAsync(CancellationToken cancellationToken = default); - public Task> GetConnectionsFromTypeAsync(string type, CancellationToken cancellationToken = default); - - public Task AddConnectionConfigurationAsync(ConnectionConfigurationMetadataModel model, CancellationToken cancellationToken = default); - - public Task UpdateConnectionAsync(string name, ConnectionConfigurationMetadataModel model, CancellationToken cancellationToken = default); - public Task DeleteConnectionConfigurationAsync(string id, CancellationToken cancellationToken = default); -} diff --git a/src/modules/Elsa.Connections.Core/Converters/Int32Converter.cs b/src/modules/Elsa.Connections.Core/Converters/Int32Converter.cs new file mode 100644 index 000000000..adb992078 --- /dev/null +++ b/src/modules/Elsa.Connections.Core/Converters/Int32Converter.cs @@ -0,0 +1,29 @@ +using System.Text.Json; + +namespace Elsa.Connections.Converters; + +public class Int32Converter : System.Text.Json.Serialization.JsonConverter +{ + public override int Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + if (reader.TokenType == JsonTokenType.String) + { + var stringValue = reader.GetString(); + if (int.TryParse(stringValue, out var value)) + { + return value; + } + } + else if (reader.TokenType == JsonTokenType.Number) + { + return reader.GetInt32(); + } + + throw new JsonException(); + } + + public override void Write(Utf8JsonWriter writer, int value, JsonSerializerOptions options) + { + writer.WriteNumberValue(value); + } +} diff --git a/src/modules/Elsa.Connections.Core/Elsa.Connections.Core.csproj b/src/modules/Elsa.Connections.Core/Elsa.Connections.Core.csproj index 4a93d844b..b92c7e94f 100644 --- a/src/modules/Elsa.Connections.Core/Elsa.Connections.Core.csproj +++ b/src/modules/Elsa.Connections.Core/Elsa.Connections.Core.csproj @@ -9,6 +9,8 @@ + + diff --git a/src/modules/Elsa.Connections.Core/Extensions/LogConnectionExtensions.cs b/src/modules/Elsa.Connections.Core/Extensions/LogConnectionExtensions.cs new file mode 100644 index 000000000..0edf36a0f --- /dev/null +++ b/src/modules/Elsa.Connections.Core/Extensions/LogConnectionExtensions.cs @@ -0,0 +1,24 @@ +// ReSharper disable once CheckNamespace +using Elsa.Connections.Middleware; +using Microsoft.Extensions.Logging; + +namespace Elsa.Connections.Core.Extensions; + +/// +/// +/// +public static partial class LogConnectionExtensions +{ + [LoggerMessage( + Level = LogLevel.Warning, + Message = "Connection {name} was not found" + )] + public static partial void LogConnectionNotFound(ILogger logger, string name); + + [LoggerMessage( + Level = LogLevel.Warning, + Message = "Connection is null" + )] + public static partial void LogConnectionIsNull(ILogger logger); + +} \ No newline at end of file diff --git a/src/modules/Elsa.Connections.Core/Extensions/ModuleExtensions.cs b/src/modules/Elsa.Connections.Core/Extensions/ModuleExtensions.cs index 9db69531f..d68959b7a 100644 --- a/src/modules/Elsa.Connections.Core/Extensions/ModuleExtensions.cs +++ b/src/modules/Elsa.Connections.Core/Extensions/ModuleExtensions.cs @@ -1,5 +1,8 @@ using Elsa.Connections.Features; +using Elsa.Connections.Middleware; using Elsa.Features.Services; +using Elsa.Workflows; +using Elsa.Workflows.Pipelines.ActivityExecution; // ReSharper disable once CheckNamespace namespace Elsa.Extensions; @@ -16,4 +19,15 @@ public static class ModuleExtensions { return module.Use(configure); } -} \ No newline at end of file +} + +/// +/// Adds extension methods to . +/// +public static class ConnectionMiddlewareExtensions +{ + /// + /// Installs the component in the activity execution pipeline. + /// + public static IActivityExecutionPipelineBuilder UseConnectionMiddleware(this IActivityExecutionPipelineBuilder pipelineBuilder) => pipelineBuilder.UseMiddleware(); +} diff --git a/src/modules/Elsa.Connections.Core/Features/ConnectionsFeatures.cs b/src/modules/Elsa.Connections.Core/Features/ConnectionsFeatures.cs index fb0953dfc..5842871c3 100644 --- a/src/modules/Elsa.Connections.Core/Features/ConnectionsFeatures.cs +++ b/src/modules/Elsa.Connections.Core/Features/ConnectionsFeatures.cs @@ -15,6 +15,7 @@ using Elsa.Workflows.Features; using JetBrains.Annotations; using Microsoft.Extensions.DependencyInjection; using Elsa.Connections.Middleware; +using Elsa.Connections.Models; namespace Elsa.Connections.Features; @@ -70,11 +71,3 @@ public class ConnectionsFeatures(IModule module) : FeatureBase(module) } } - -public class ConnectionOptions -{ - /// - /// A collection of connection types that are available to the system. - /// - public HashSet ConnectionTypes { get; set; } = new(); -} \ No newline at end of file diff --git a/src/modules/Elsa.Connections.Core/Middleware/ConnectionMiddleware.cs b/src/modules/Elsa.Connections.Core/Middleware/ConnectionMiddleware.cs index 89bfd7c5a..48fdf5699 100644 --- a/src/modules/Elsa.Connections.Core/Middleware/ConnectionMiddleware.cs +++ b/src/modules/Elsa.Connections.Core/Middleware/ConnectionMiddleware.cs @@ -1,32 +1,35 @@ -using System.Reflection; -using System.Text.Json; +using System.Text.Json; using Elsa.Connections.Attributes; -using Elsa.Connections.Contracts; using Elsa.Connections.Models; +using Elsa.Extensions; using Elsa.Workflows; using Elsa.Workflows.Pipelines.ActivityExecution; -using Elsa.Workflows.UIHints.Dropdown; using JetBrains.Annotations; +using Microsoft.Extensions.Logging; +using Elsa.Connections.Core.Extensions; +using Elsa.Connections.Converters; +using Elsa.Connections.Persistence.Contracts; namespace Elsa.Connections.Middleware; /// -/// Adds extension methods to . -/// -public static class ConnectionMiddlewareExtensions -{ - /// - /// Installs the component in the activity execution pipeline. - /// - public static IActivityExecutionPipelineBuilder UseConnectionMiddleware(this IActivityExecutionPipelineBuilder pipelineBuilder) => pipelineBuilder.UseMiddleware(); -} - -/// -/// An activity execution middleware component that extracts execution details as objects. +/// An activity execution middleware component that inject connection property from Connection Name. /// [UsedImplicitly] -public class ConnectionMiddleware(ActivityMiddlewareDelegate next, IConnectionRepository connectionStore) : IActivityExecutionMiddleware +public class ConnectionMiddleware(ActivityMiddlewareDelegate next + , IConnectionStore connectionStore + ,ILogger logger) + : IActivityExecutionMiddleware { + private static JsonSerializerOptions? _serializerOptions; + private readonly ILogger _logger = logger; + + private static JsonSerializerOptions SerializerOptions => + _serializerOptions ??= new JsonSerializerOptions + { + PropertyNamingPolicy = JsonNamingPolicy.CamelCase, + }.WithConverters(new Int32Converter()); + /// public async ValueTask InvokeAsync(ActivityExecutionContext context) { @@ -45,22 +48,23 @@ public class ConnectionMiddleware(ActivityMiddlewareDelegate next, IConnectionRe var connectionName = (string)inputValue?.ConnectionName; - //Get connection from store, if exist, - var connectionConfiguration = await connectionStore.GetConnectionAsync(connectionName); - if (connectionConfiguration != null) + if (connectionName == null) + LogConnectionExtensions.LogConnectionIsNull(_logger); + else { - var options = new JsonSerializerOptions + //Get connection from store, if exist, + var connectionConfiguration = await connectionStore.FindAsync(new Persistence.Filters.ConnectionDefinitionFilter() { Name = connectionName }); + if (connectionConfiguration != null) { - PropertyNamingPolicy = JsonNamingPolicy.CamelCase, - }; - options.Converters.Add(new Int32Converter()); + dynamic deserializedjson = + JsonSerializer.Deserialize(connectionConfiguration.ConnectionConfiguration, propertyType, SerializerOptions); - dynamic deserializedjson = - JsonSerializer.Deserialize(connectionConfiguration.ConnectionConfiguration, propertyType, options); + inputValue.Properties = deserializedjson; - inputValue.Properties = deserializedjson; - - input.ValueSetter(context.Activity, inputValue); + input.ValueSetter(context.Activity, inputValue); + } + else + LogConnectionExtensions.LogConnectionNotFound(_logger, connectionName); } } } @@ -73,29 +77,3 @@ public class ConnectionMiddleware(ActivityMiddlewareDelegate next, IConnectionRe return context.WorkflowExecutionContext.Bookmarks.Any(b => b.ActivityNodeId.Equals(context.ActivityNode.NodeId)); } } - -public class Int32Converter : System.Text.Json.Serialization.JsonConverter -{ - public override int Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) - { - if (reader.TokenType == JsonTokenType.String) - { - string stringValue = reader.GetString(); - if (int.TryParse(stringValue, out int value)) - { - return value; - } - } - else if (reader.TokenType == JsonTokenType.Number) - { - return reader.GetInt32(); - } - - throw new JsonException(); - } - - public override void Write(Utf8JsonWriter writer, int value, JsonSerializerOptions options) - { - writer.WriteNumberValue(value); - } -} diff --git a/src/modules/Elsa.Connections.Core/Models/ConnectionConfigurationMetadataModel.cs b/src/modules/Elsa.Connections.Core/Models/ConnectionConfigurationMetadataModel.cs deleted file mode 100644 index 5076c6653..000000000 --- a/src/modules/Elsa.Connections.Core/Models/ConnectionConfigurationMetadataModel.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System.ComponentModel.DataAnnotations; -using System.Text.Json.Nodes; - -namespace Elsa.Connections.Models; - -public class ConnectionConfigurationMetadataModel -{ - public string Id { get; set; } - [Required] - public string? Name { get; set; } - public string Description { get; set; } - - public JsonObject ConnectionConfiguration { get; set; } - - [Required] - public string ConnectionType { get; set; } -} \ No newline at end of file diff --git a/src/modules/Elsa.Connections.Core/Models/ConnectionOptions.cs b/src/modules/Elsa.Connections.Core/Models/ConnectionOptions.cs new file mode 100644 index 000000000..bf9dc94d3 --- /dev/null +++ b/src/modules/Elsa.Connections.Core/Models/ConnectionOptions.cs @@ -0,0 +1,9 @@ +namespace Elsa.Connections.Models; + +public class ConnectionOptions +{ + /// + /// A collection of connection types that are available to the system. + /// + public HashSet ConnectionTypes { get; set; } = new(); +} \ No newline at end of file diff --git a/src/modules/Elsa.Connections.Core/ServiceProvider/ConnectionOptionsProvider.cs b/src/modules/Elsa.Connections.Core/ServiceProvider/ConnectionOptionsProvider.cs index 09837e017..ad5b6539a 100644 --- a/src/modules/Elsa.Connections.Core/ServiceProvider/ConnectionOptionsProvider.cs +++ b/src/modules/Elsa.Connections.Core/ServiceProvider/ConnectionOptionsProvider.cs @@ -1,15 +1,15 @@ using System.Reflection; using Elsa.Connections.Attributes; -using Elsa.Connections.Contracts; +using Elsa.Connections.Persistence.Contracts; using Elsa.Workflows.UIHints.Dropdown; namespace Elsa.Connections.ServiceProvider; public class ConnectionOptionsProvider : DropDownOptionsProviderBase { - private readonly IConnectionRepository _store; + private readonly IConnectionStore _store; - public ConnectionOptionsProvider(IConnectionRepository store) + public ConnectionOptionsProvider(IConnectionStore store) { _store = store; } @@ -28,7 +28,7 @@ public class ConnectionOptionsProvider : DropDownOptionsProviderBase if (connectionType == null) return connection; - var connections = await _store.GetConnectionsFromTypeAsync(connectionType.ToString()); + var connections = await _store.FindManyAsync(new Persistence.Filters.ConnectionDefinitionFilter() { Type = connectionType.ToString() }); foreach(var conn in connections) connection.Add(new SelectListItem(conn.Name, conn.Name)); diff --git a/src/modules/Elsa.Connections.Core/Services/ConnectionRegistry.cs b/src/modules/Elsa.Connections.Core/Services/ConnectionRegistry.cs index 26f02f3de..6d9293c4e 100644 --- a/src/modules/Elsa.Connections.Core/Services/ConnectionRegistry.cs +++ b/src/modules/Elsa.Connections.Core/Services/ConnectionRegistry.cs @@ -7,7 +7,6 @@ using System.Text; using System.Threading.Tasks; using Elsa.Connections.Attributes; using Elsa.Connections.Contracts; -using Elsa.Connections.Features; using Elsa.Connections.Models; using Elsa.Workflows; using Elsa.Workflows.Models; diff --git a/src/modules/Elsa.Connections.Core/UIHints/ConnexionDropDownUIHintHandler.cs b/src/modules/Elsa.Connections.Core/UIHints/ConnexionDropDownUIHintHandler.cs index 400322ee1..12bf6dc6b 100644 --- a/src/modules/Elsa.Connections.Core/UIHints/ConnexionDropDownUIHintHandler.cs +++ b/src/modules/Elsa.Connections.Core/UIHints/ConnexionDropDownUIHintHandler.cs @@ -5,6 +5,9 @@ using Elsa.Workflows.UIHints.Dropdown; namespace Elsa.Connections.UIHints; +/// +/// UIHint Handler that use DropDown for Connection Property +/// public class ConnexionDropDownUIHintHandler : IUIHintHandler { /// diff --git a/src/modules/Elsa.Connections.Models/ConnectionConfigurationMetadataModel.cs b/src/modules/Elsa.Connections.Models/ConnectionConfigurationMetadataModel.cs new file mode 100644 index 000000000..6bd1826cf --- /dev/null +++ b/src/modules/Elsa.Connections.Models/ConnectionConfigurationMetadataModel.cs @@ -0,0 +1,31 @@ +using System.ComponentModel.DataAnnotations; +using System.Text.Json.Nodes; + +namespace Elsa.Connections.Models; + + +public class ConnectionInputModel +{ + /// + /// The Name of the Connection + /// + [Required] + public string Name { get; set; } = default; + + /// + /// The Description of the Connection + /// + public string? Description { get; set; } = default; + + + /// + /// The Configuration of the Connection in a Json Format + /// + public JsonObject ConnectionConfiguration { get; set; } + + /// + /// The Connection Type Name + /// + [Required] + public string ConnectionType { get; set; } +} diff --git a/src/modules/Elsa.Connections.Core/Models/ConnectionDescriptor.cs b/src/modules/Elsa.Connections.Models/ConnectionDescriptor.cs similarity index 100% rename from src/modules/Elsa.Connections.Core/Models/ConnectionDescriptor.cs rename to src/modules/Elsa.Connections.Models/ConnectionDescriptor.cs diff --git a/src/modules/Elsa.Connections.Models/ConnectionModel.cs b/src/modules/Elsa.Connections.Models/ConnectionModel.cs new file mode 100644 index 000000000..0373b81e6 --- /dev/null +++ b/src/modules/Elsa.Connections.Models/ConnectionModel.cs @@ -0,0 +1,11 @@ +using System.ComponentModel.DataAnnotations; + +namespace Elsa.Connections.Models; + +public class ConnectionModel : ConnectionInputModel +{ + /// + /// The Id of the Connection + /// + [Required] public string Id { get; set; } = default!; +} \ No newline at end of file diff --git a/src/modules/Elsa.Connections.Core/Models/ConnectionProperties.cs b/src/modules/Elsa.Connections.Models/ConnectionProperties.cs similarity index 85% rename from src/modules/Elsa.Connections.Core/Models/ConnectionProperties.cs rename to src/modules/Elsa.Connections.Models/ConnectionProperties.cs index 5d7566774..f64a61462 100644 --- a/src/modules/Elsa.Connections.Core/Models/ConnectionProperties.cs +++ b/src/modules/Elsa.Connections.Models/ConnectionProperties.cs @@ -12,7 +12,7 @@ public class ConnectionProperties where T : class, new() { } - public string ConnectionName { get; set; } + public string? ConnectionName { get; set; } [JsonIgnore] public T Properties { get; set; } = new T(); diff --git a/src/modules/Elsa.Connections.Models/FodyWeavers.xml b/src/modules/Elsa.Connections.Models/FodyWeavers.xml index 96f7a2a75..ba625ed13 100644 --- a/src/modules/Elsa.Connections.Models/FodyWeavers.xml +++ b/src/modules/Elsa.Connections.Models/FodyWeavers.xml @@ -1,3 +1,2 @@ - - + \ No newline at end of file diff --git a/src/modules/Elsa.Connections.Persistence.EntityFrameworkCore/Configurations.cs b/src/modules/Elsa.Connections.Persistence.EntityFrameworkCore/Configurations.cs new file mode 100644 index 000000000..14c375ca5 --- /dev/null +++ b/src/modules/Elsa.Connections.Persistence.EntityFrameworkCore/Configurations.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Elsa.Connections.Models; +using Elsa.Connections.Persistence.Entities; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; + +namespace Elsa.Connections.Persistence.EntityFrameworkCore; +public class Configurations : IEntityTypeConfiguration +{ + public void Configure(EntityTypeBuilder builder) + { + builder.HasIndex(x => x.Name).HasDatabaseName($"IX_{nameof(ConnectionDefinition)}_{nameof(ConnectionDefinition.Name)}"); + builder.HasIndex(x => x.TenantId).HasDatabaseName($"IX_{nameof(ConnectionDefinition)}_{nameof(ConnectionDefinition.TenantId)}"); + } +} diff --git a/src/modules/Elsa.Connections.Persistence.EntityFrameworkCore/DbContext.cs b/src/modules/Elsa.Connections.Persistence.EntityFrameworkCore/DbContext.cs new file mode 100644 index 000000000..f1b521744 --- /dev/null +++ b/src/modules/Elsa.Connections.Persistence.EntityFrameworkCore/DbContext.cs @@ -0,0 +1,34 @@ +using Elsa.Connections.Models; +using Elsa.EntityFrameworkCore; +using Elsa.Connections.Persistence.Entities; +using JetBrains.Annotations; +using Microsoft.EntityFrameworkCore; + +namespace Elsa.Connections.Persistence.EntityFrameworkCore; + + +/// +/// Db Context for the Connection Module +/// +[UsedImplicitly] +public class ConnectionDbContext : ElsaDbContextBase +{ + /// + public ConnectionDbContext(DbContextOptions options, IServiceProvider serviceProvider) + : base(options, serviceProvider) + { + } + + /// + /// The Connection DB set. + /// + public DbSet ConnectionDefinitions { get; set; } = default!; + + /// + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + var configuration = new Configurations(); + modelBuilder.ApplyConfiguration(configuration); + base.OnModelCreating(modelBuilder); + } +} diff --git a/src/modules/Elsa.Connections.Persistence.EntityFrameworkCore/Elsa.Connections.Persistence.EntityFrameworkCore.csproj b/src/modules/Elsa.Connections.Persistence.EntityFrameworkCore/Elsa.Connections.Persistence.EntityFrameworkCore.csproj new file mode 100644 index 000000000..0931ad805 --- /dev/null +++ b/src/modules/Elsa.Connections.Persistence.EntityFrameworkCore/Elsa.Connections.Persistence.EntityFrameworkCore.csproj @@ -0,0 +1,13 @@ + + + + Provides an Entity Framework Core provider for the persistence layer of the Connection module + elsa connection persistence efcore entity framework core + + + + + + + + diff --git a/src/modules/Elsa.Connections.Persistence.EntityFrameworkCore/FodyWeavers.xml b/src/modules/Elsa.Connections.Persistence.EntityFrameworkCore/FodyWeavers.xml new file mode 100644 index 000000000..ac6b5b292 --- /dev/null +++ b/src/modules/Elsa.Connections.Persistence.EntityFrameworkCore/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/modules/Elsa.Connections.Persistence/Contracts/IConnectionStore.cs b/src/modules/Elsa.Connections.Persistence/Contracts/IConnectionStore.cs new file mode 100644 index 000000000..c7746480a --- /dev/null +++ b/src/modules/Elsa.Connections.Persistence/Contracts/IConnectionStore.cs @@ -0,0 +1,67 @@ +using Elsa.Connections.Models; +using Elsa.Connections.Persistence.Filters; +using Elsa.Connections.Persistence.Entities; + +namespace Elsa.Connections.Persistence.Contracts; + +public interface IConnectionStoreEx +{ + /// + /// Get The Connection from the Store + /// + /// + /// + /// + public Task GetConnectionAsync(string name, CancellationToken cancellationToken = default); + + /// + /// Get All Connections from the store + /// + /// + /// + public Task> GetConnectionsAsync(CancellationToken cancellationToken = default); + public Task> GetConnectionsFromTypeAsync(string type, CancellationToken cancellationToken = default); + + public Task AddConnectionConfigurationAsync(ConnectionDefinition model, CancellationToken cancellationToken = default); + + public Task UpdateConnectionAsync(string name, ConnectionDefinition model, CancellationToken cancellationToken = default); + public Task DeleteConnectionConfigurationAsync(string id, CancellationToken cancellationToken = default); +} + +public interface IConnectionStore +{ + /// + /// Get The Connection from the Store + /// + public Task GetAsync(string id, CancellationToken cancellationToken = default); + + /// + /// Get All Connections from the store + /// + public Task> ListAsync(CancellationToken cancellationToken = default); + + /// + /// Get All connection using Filter + /// + public Task FindAsync(ConnectionDefinitionFilter filter, CancellationToken cancellationToken = default); + + /// + /// Get All connection using Filter + /// + public Task> FindManyAsync(ConnectionDefinitionFilter filter, CancellationToken cancellationToken = default); + + /// + /// Add a new entity to the store + /// + public Task AddAsync(ConnectionDefinition entity, CancellationToken cancellationToken = default); + + /// + /// Update the entity to the store + /// + public Task UpdateAsync(ConnectionDefinition entity, CancellationToken cancellationToken = default); + + /// + /// Delete the entity from the store + /// + public Task DeleteAsync(ConnectionDefinition entity, CancellationToken cancellationToken = default); +} diff --git a/src/modules/Elsa.Connections.Persistence/Elsa.Connections.Persistence.csproj b/src/modules/Elsa.Connections.Persistence/Elsa.Connections.Persistence.csproj index 3ea43013e..cf7ec74b8 100644 --- a/src/modules/Elsa.Connections.Persistence/Elsa.Connections.Persistence.csproj +++ b/src/modules/Elsa.Connections.Persistence/Elsa.Connections.Persistence.csproj @@ -7,7 +7,7 @@ - + diff --git a/src/modules/Elsa.Connections.Persistence/Entities/ConnectionDefinition.cs b/src/modules/Elsa.Connections.Persistence/Entities/ConnectionDefinition.cs new file mode 100644 index 000000000..25fbe5ef2 --- /dev/null +++ b/src/modules/Elsa.Connections.Persistence/Entities/ConnectionDefinition.cs @@ -0,0 +1,30 @@ +using System.ComponentModel.DataAnnotations; +using System.Text.Json.Nodes; +using Elsa.Common.Entities; + +namespace Elsa.Connections.Persistence.Entities; + + +public class ConnectionDefinition : Entity +{ + /// + /// The Name of the Connection + /// + public string Name { get; set; } = default!; + + /// + /// The Description of the Connection + /// + public string? Description { get; set; } = default; + + + /// + /// The Configuration of the Connection in a Json Format + /// + public JsonObject ConnectionConfiguration { get; set; } + + /// + /// The Connection Type Name + /// + public string ConnectionType { get; set; } +} \ No newline at end of file diff --git a/src/modules/Elsa.Connections.Persistence/Extensions/ConnectionPersistenceExtensions.cs b/src/modules/Elsa.Connections.Persistence/Extensions/ConnectionPersistenceExtensions.cs new file mode 100644 index 000000000..33c8699a1 --- /dev/null +++ b/src/modules/Elsa.Connections.Persistence/Extensions/ConnectionPersistenceExtensions.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Elsa.Connections.Persistence.Features; +using Elsa.Features.Services; + + +namespace Elsa.Extensions; + +/// +/// Extends with methods to use Connection Persistence Feature. +/// +public static class ConnectionPersistenceExtensions +{ + /// + /// Installs the persistence feature for the Connection module. + /// + public static IModule UseConnectionPersistence(this IModule module, Action? configure = null) + { + return module.Use(configure); + } +} diff --git a/src/modules/Elsa.Connections.Persistence/Features/ConnectionPersistenceFeature.cs b/src/modules/Elsa.Connections.Persistence/Features/ConnectionPersistenceFeature.cs index d69940b37..b73cffca7 100644 --- a/src/modules/Elsa.Connections.Persistence/Features/ConnectionPersistenceFeature.cs +++ b/src/modules/Elsa.Connections.Persistence/Features/ConnectionPersistenceFeature.cs @@ -1,58 +1,31 @@ using Elsa.Common.Features; -using Elsa.Connections.Features; using Elsa.Extensions; using Elsa.Features.Abstractions; using Elsa.Features.Attributes; using Elsa.Features.Services; -using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection; +using Elsa.Connections.Persistence.Contracts; +using Elsa.Connections.Persistence.Services; +using Elsa.Connections.Models; +using Elsa.Connections.Persistence.Entities; namespace Elsa.Connections.Persistence.Features; -[DependsOn(typeof(ConnectionsFeatures))] public class ConnectionPersistenceFeature(IModule module) : FeatureBase(module) -{ - //private Func _apiKeyStoreFactory = sp => sp.GetRequiredService(); - //private Func _serviceStoreFactory = sp => sp.GetRequiredService(); - //private Func _agentStoreFactory = sp => sp.GetRequiredService(); +{ + private Func _connectionStoreFactory = sp => sp.GetRequiredService(); - //public AgentPersistenceFeature UseApiKeyStore(Func factory) - //{ - // _apiKeyStoreFactory = factory; - // return this; - //} + public ConnectionPersistenceFeature UseConnectionStore(Func factory) + { + _connectionStoreFactory = factory; + return this; + } - //public AgentPersistenceFeature UseServiceStore(Func factory) - //{ - // _serviceStoreFactory = factory; - // return this; - //} + public override void Apply() + { + Services.AddScoped(_connectionStoreFactory); - //public AgentPersistenceFeature UseAgentStore(Func factory) - //{ - // _agentStoreFactory = factory; - // return this; - //} - - //public override void Configure() - //{ - // Module.UseAgents(agents => agents.UseKernelConfigProvider(sp => sp.GetRequiredService())); - //} - - //public override void Apply() - //{ - // Services - // .AddScoped(_apiKeyStoreFactory) - // .AddScoped(_serviceStoreFactory) - // .AddScoped(_agentStoreFactory); - - // Services - // .AddScoped(); - - // Services - // .AddMemoryStore() - // .AddMemoryStore() - // .AddMemoryStore(); - - // Services.AddScoped(); - //} + Services + .AddMemoryStore(); + } } \ No newline at end of file diff --git a/src/modules/Elsa.Connections.Persistence/Filters/ConnectionDefinitionFilter.cs b/src/modules/Elsa.Connections.Persistence/Filters/ConnectionDefinitionFilter.cs new file mode 100644 index 000000000..08aa1c52c --- /dev/null +++ b/src/modules/Elsa.Connections.Persistence/Filters/ConnectionDefinitionFilter.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Elsa.Connections.Models; +using Elsa.Connections.Persistence.Entities; + +namespace Elsa.Connections.Persistence.Filters; +public class ConnectionDefinitionFilter +{ + public string? Id { get; set; } + public string? Name { get; set; } + + public string? NotId { get; set; } + public string? Type { get; set; } + + public IQueryable Apply(IQueryable queryable) + { + if(!string.IsNullOrEmpty(Id)) queryable = queryable.Where(x=>x.Id == Id); + if (!string.IsNullOrWhiteSpace(NotId)) queryable = queryable.Where(x => x.Id != NotId); + if (!string.IsNullOrWhiteSpace(Name)) queryable = queryable.Where(x=> x.Name == Name); + if(!string.IsNullOrWhiteSpace(Type)) queryable = queryable.Where(x=>x.ConnectionType == Type); + return queryable; + } +} diff --git a/src/modules/Elsa.Connections.Persistence/Services/InMemoryConnectionStore.cs b/src/modules/Elsa.Connections.Persistence/Services/InMemoryConnectionStore.cs new file mode 100644 index 000000000..d79c26119 --- /dev/null +++ b/src/modules/Elsa.Connections.Persistence/Services/InMemoryConnectionStore.cs @@ -0,0 +1,51 @@ +using Elsa.Common.Services; +using Elsa.Connections.Models; +using Elsa.Connections.Persistence.Contracts; +using Elsa.Connections.Persistence.Filters; +using Elsa.Connections.Persistence.Entities; + +namespace Elsa.Connections.Persistence.Services; + +public class InMemoryConnectionStore(MemoryStore memoryStore) : IConnectionStore +{ + public Task AddAsync(ConnectionDefinition model, CancellationToken cancellationToken = default) + { + memoryStore.Add(model, model => model.Id); + return Task.CompletedTask; + } + + public Task DeleteAsync(ConnectionDefinition model, CancellationToken cancellationToken = default) + { + memoryStore.Delete(model.Id); + return Task.CompletedTask; + } + + public Task GetAsync(string Id, CancellationToken cancellationToken = default) + { + var result = memoryStore.Find(c => c.Id == Id); + return Task.FromResult(result); + } + + public Task> ListAsync(CancellationToken cancellationToken) + { + var results = memoryStore.List(); + return Task.FromResult(results); + } + public Task FindAsync(ConnectionDefinitionFilter filter, CancellationToken cancellationToken = default) + { + var entities = memoryStore.Query(filter.Apply).FirstOrDefault(); + return Task.FromResult(entities); + } + + public Task> FindManyAsync(ConnectionDefinitionFilter filter, CancellationToken cancellationToken = default) + { + var entities = memoryStore.Query(filter.Apply); + return Task.FromResult(entities); + } + + public Task UpdateAsync(ConnectionDefinition model, CancellationToken cancellationToken = default) + { + memoryStore.Update(model, model => model.Id); + return Task.CompletedTask; + } +} From 421ace1f5b6f4e5042aa48e345562cae15192a7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20DEVILLARD?= Date: Wed, 12 Feb 2025 23:56:10 +0100 Subject: [PATCH 07/10] ConfigurePermisssions Add Get Endpoints Add entity framework Core feature SqlLite implementation --- src/modules/Elsa.Connections.Api/Constants.cs | 11 ++++ .../{List/Get.cs => Get/Endpoint.cs} | 8 +-- .../List/Endpoint.cs | 2 +- .../Endpoints/Add/Endpoint.cs | 52 +--------------- .../Endpoints/Delete/Endpoint.cs | 2 +- .../Endpoints/Get/Endpoint.cs | 33 ++++++++++ .../Endpoints/Get/Request.cs | 12 ++++ .../Endpoints/List/Endpoint.cs | 2 +- .../Endpoints/Update/Endpoint.cs | 58 +++++++++++++++++ .../ConnectionConfigurationModel.cs | 22 ------- ...tadataModel.cs => ConnectionInputModel.cs} | 0 .../Elsa.Connections.Models.csproj | 14 ++--- .../DbContextFactories.cs | 15 +++++ ...sistence.EntityFrameworkCore.Sqlite.csproj | 19 ++++++ .../FodyWeavers.xml | 3 + .../20250212220543_V3_3.Designer.cs | 60 ++++++++++++++++++ .../Migrations/20250212220543_V3_3.cs | 62 +++++++++++++++++++ .../ConnectionDbContextModelSnapshot.cs | 57 +++++++++++++++++ .../SqliteProvidersExtensions.cs | 28 +++++++++ .../efcore-3.3.sh | 1 + .../Configurations.cs | 3 + .../EFCoreConnectionStore.cs | 54 ++++++++++++++++ .../Extensions.cs | 22 +++++++ .../Feature.cs | 34 ++++++++++ 24 files changed, 485 insertions(+), 89 deletions(-) create mode 100644 src/modules/Elsa.Connections.Api/Constants.cs rename src/modules/Elsa.Connections.Api/Endpoints/ActivityConnectionDescriptor/{List/Get.cs => Get/Endpoint.cs} (65%) create mode 100644 src/modules/Elsa.Connections.Api/Endpoints/Get/Endpoint.cs create mode 100644 src/modules/Elsa.Connections.Api/Endpoints/Get/Request.cs create mode 100644 src/modules/Elsa.Connections.Api/Endpoints/Update/Endpoint.cs delete mode 100644 src/modules/Elsa.Connections.Models/ConnectionConfigurationModel.cs rename src/modules/Elsa.Connections.Models/{ConnectionConfigurationMetadataModel.cs => ConnectionInputModel.cs} (100%) create mode 100644 src/modules/Elsa.Connections.Persistence.EntityFrameworkCore.Sqlite/DbContextFactories.cs create mode 100644 src/modules/Elsa.Connections.Persistence.EntityFrameworkCore.Sqlite/Elsa.Connections.Persistence.EntityFrameworkCore.Sqlite.csproj create mode 100644 src/modules/Elsa.Connections.Persistence.EntityFrameworkCore.Sqlite/FodyWeavers.xml create mode 100644 src/modules/Elsa.Connections.Persistence.EntityFrameworkCore.Sqlite/Migrations/20250212220543_V3_3.Designer.cs create mode 100644 src/modules/Elsa.Connections.Persistence.EntityFrameworkCore.Sqlite/Migrations/20250212220543_V3_3.cs create mode 100644 src/modules/Elsa.Connections.Persistence.EntityFrameworkCore.Sqlite/Migrations/ConnectionDbContextModelSnapshot.cs create mode 100644 src/modules/Elsa.Connections.Persistence.EntityFrameworkCore.Sqlite/SqliteProvidersExtensions.cs create mode 100644 src/modules/Elsa.Connections.Persistence.EntityFrameworkCore.Sqlite/efcore-3.3.sh create mode 100644 src/modules/Elsa.Connections.Persistence.EntityFrameworkCore/EFCoreConnectionStore.cs create mode 100644 src/modules/Elsa.Connections.Persistence.EntityFrameworkCore/Extensions.cs create mode 100644 src/modules/Elsa.Connections.Persistence.EntityFrameworkCore/Feature.cs diff --git a/src/modules/Elsa.Connections.Api/Constants.cs b/src/modules/Elsa.Connections.Api/Constants.cs new file mode 100644 index 000000000..86cfd703b --- /dev/null +++ b/src/modules/Elsa.Connections.Api/Constants.cs @@ -0,0 +1,11 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Elsa.Connections.Api; +public class Constants +{ + public const string PermissionsNamespace = "connections"; +} diff --git a/src/modules/Elsa.Connections.Api/Endpoints/ActivityConnectionDescriptor/List/Get.cs b/src/modules/Elsa.Connections.Api/Endpoints/ActivityConnectionDescriptor/Get/Endpoint.cs similarity index 65% rename from src/modules/Elsa.Connections.Api/Endpoints/ActivityConnectionDescriptor/List/Get.cs rename to src/modules/Elsa.Connections.Api/Endpoints/ActivityConnectionDescriptor/Get/Endpoint.cs index 9a60511c5..5718d454b 100644 --- a/src/modules/Elsa.Connections.Api/Endpoints/ActivityConnectionDescriptor/List/Get.cs +++ b/src/modules/Elsa.Connections.Api/Endpoints/ActivityConnectionDescriptor/Get/Endpoint.cs @@ -2,19 +2,19 @@ using Elsa.Connections.Contracts; using Elsa.Workflows.Models; -namespace Elsa.Connections.Api.Endpoints.ActivityConnectionDescriptor.List; +namespace Elsa.Connections.Api.Endpoints.ActivityConnectionDescriptor.Get; -public class Get(IConnectionDescriptorRegistry store) : ElsaEndpointWithoutRequest> +public class Endpoint(IConnectionDescriptorRegistry store) : ElsaEndpointWithoutRequest> { public override void Configure() { Get("/connection-configuration/input-descriptor/{ActivityType}"); - AllowAnonymous(); + ConfigurePermissions($"{Constants.PermissionsNamespace}/descriptor:read"); } public override async Task HandleAsync(CancellationToken ct) { - string type = Route("ActivityType"); + var type = Route("ActivityType"); var config = await store.GetConnectionDescriptor(type); if (config == null) diff --git a/src/modules/Elsa.Connections.Api/Endpoints/ActivityConnectionDescriptor/List/Endpoint.cs b/src/modules/Elsa.Connections.Api/Endpoints/ActivityConnectionDescriptor/List/Endpoint.cs index 0d5f77649..1fbc961ac 100644 --- a/src/modules/Elsa.Connections.Api/Endpoints/ActivityConnectionDescriptor/List/Endpoint.cs +++ b/src/modules/Elsa.Connections.Api/Endpoints/ActivityConnectionDescriptor/List/Endpoint.cs @@ -22,7 +22,7 @@ public class List(IConnectionDescriptorRegistry registry) : ElsaEndpointWithoutR public override void Configure() { Get("/connection-configuration/descriptors"); - AllowAnonymous(); + ConfigurePermissions($"{Constants.PermissionsNamespace}/descriptor:read"); } public override Task> ExecuteAsync(CancellationToken ct) diff --git a/src/modules/Elsa.Connections.Api/Endpoints/Add/Endpoint.cs b/src/modules/Elsa.Connections.Api/Endpoints/Add/Endpoint.cs index 40a98b176..ed24cd6f3 100644 --- a/src/modules/Elsa.Connections.Api/Endpoints/Add/Endpoint.cs +++ b/src/modules/Elsa.Connections.Api/Endpoints/Add/Endpoint.cs @@ -14,7 +14,7 @@ public class Endpoint(IConnectionStore store, IIdentityGenerator identityGenerat public override void Configure() { Post("/connection-configuration"); - AllowAnonymous(); + ConfigurePermissions($"{Constants.PermissionsNamespace}:write"); } public override async Task ExecuteAsync(ConnectionInputModel model, CancellationToken ct) @@ -52,53 +52,3 @@ public class Endpoint(IConnectionStore store, IIdentityGenerator identityGenerat } } -public class EndpointUpdate(IConnectionStore store) : ElsaEndpoint -{ - public override void Configure() - { - Put("/connection-configuration/{id}"); - AllowAnonymous(); - } - - public override async Task ExecuteAsync(ConnectionInputModel model, CancellationToken ct) - { - var id = Route("id")!; - var entity = await store.GetAsync(id, ct); - - if(entity == null) - { - await SendNotFoundAsync(ct); - return null!; - } - - var isNameDuplicate = await IsNameDuplicateAsync(model.Name, id, ct); - - if (isNameDuplicate) - { - AddError("Another connection already exist with the specified name"); - await SendErrorsAsync(cancellation: ct); - return entity.ToModel(); - } - - entity.Name = model.Name; - entity.Description = model.Description; - entity.ConnectionConfiguration = model.ConnectionConfiguration; - - - await store.UpdateAsync(entity, ct); - - return entity.ToModel(); - } - - private async Task IsNameDuplicateAsync(string name, string id, CancellationToken cancellationToken) - { - var entities = await store.FindAsync(new ConnectionDefinitionFilter - { - NotId = id, - Name = name - }); - - return !(entities == null); - } -} - diff --git a/src/modules/Elsa.Connections.Api/Endpoints/Delete/Endpoint.cs b/src/modules/Elsa.Connections.Api/Endpoints/Delete/Endpoint.cs index 94ddc4c5d..c4c358494 100644 --- a/src/modules/Elsa.Connections.Api/Endpoints/Delete/Endpoint.cs +++ b/src/modules/Elsa.Connections.Api/Endpoints/Delete/Endpoint.cs @@ -9,7 +9,7 @@ public class Endpoint(IConnectionStore store) : ElsaEndpoint public override void Configure() { Delete("/connection-configuration/{id}"); - AllowAnonymous(); + ConfigurePermissions($"{Constants.PermissionsNamespace}:delete"); } public override async Task HandleAsync(Request req, CancellationToken ct) diff --git a/src/modules/Elsa.Connections.Api/Endpoints/Get/Endpoint.cs b/src/modules/Elsa.Connections.Api/Endpoints/Get/Endpoint.cs new file mode 100644 index 000000000..4a5324a09 --- /dev/null +++ b/src/modules/Elsa.Connections.Api/Endpoints/Get/Endpoint.cs @@ -0,0 +1,33 @@ +using Elsa.Abstractions; +using Elsa.Connections.Models; +using Elsa.Connections.Persistence.Contracts; +using Elsa.Connections.Api.Extensions; + +namespace Elsa.Connections.Api.Endpoints.Get; + +public class Endpoint(IConnectionStore store) : ElsaEndpoint +{ + public override void Configure() + { + Get("/connection-configuration/{id}"); + ConfigurePermissions($"{Constants.PermissionsNamespace}:read"); + } + + public override async Task ExecuteAsync(Request req, CancellationToken ct) + { + var entity = await store.FindAsync( + new Persistence.Filters.ConnectionDefinitionFilter + { + Id = req.Id + } + ); + + if (entity == null) + { + await SendNotFoundAsync(ct); + return null!; + } + + return entity.ToModel(); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Connections.Api/Endpoints/Get/Request.cs b/src/modules/Elsa.Connections.Api/Endpoints/Get/Request.cs new file mode 100644 index 000000000..024c0c055 --- /dev/null +++ b/src/modules/Elsa.Connections.Api/Endpoints/Get/Request.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Elsa.Connections.Api.Endpoints.Get; +public class Request +{ + [Required] public string Id { get; set; } = default!; +} diff --git a/src/modules/Elsa.Connections.Api/Endpoints/List/Endpoint.cs b/src/modules/Elsa.Connections.Api/Endpoints/List/Endpoint.cs index 9a81a3eae..8c82bc3c6 100644 --- a/src/modules/Elsa.Connections.Api/Endpoints/List/Endpoint.cs +++ b/src/modules/Elsa.Connections.Api/Endpoints/List/Endpoint.cs @@ -15,7 +15,7 @@ public class Endpoint(IConnectionStore store) : ElsaEndpointWithoutRequest> ExecuteAsync(CancellationToken ct) diff --git a/src/modules/Elsa.Connections.Api/Endpoints/Update/Endpoint.cs b/src/modules/Elsa.Connections.Api/Endpoints/Update/Endpoint.cs new file mode 100644 index 000000000..350e37999 --- /dev/null +++ b/src/modules/Elsa.Connections.Api/Endpoints/Update/Endpoint.cs @@ -0,0 +1,58 @@ +using Elsa.Abstractions; +using Elsa.Connections.Models; +using Elsa.Connections.Persistence.Contracts; +using Elsa.Connections.Persistence.Filters; +using Elsa.Connections.Api.Extensions; + +namespace Elsa.Connections.Api.Endpoints.Update; + +public class Endpoint(IConnectionStore store) : ElsaEndpoint +{ + public override void Configure() + { + Put("/connection-configuration/{id}"); + ConfigurePermissions($"{Constants.PermissionsNamespace}:write"); + } + + public override async Task ExecuteAsync(ConnectionInputModel model, CancellationToken ct) + { + var id = Route("id")!; + var entity = await store.GetAsync(id, ct); + + if (entity == null) + { + await SendNotFoundAsync(ct); + return null!; + } + + var isNameDuplicate = await IsNameDuplicateAsync(model.Name, id, ct); + + if (isNameDuplicate) + { + AddError("Another connection already exist with the specified name"); + await SendErrorsAsync(cancellation: ct); + return entity.ToModel(); + } + + entity.Name = model.Name; + entity.Description = model.Description; + entity.ConnectionConfiguration = model.ConnectionConfiguration; + + + await store.UpdateAsync(entity, ct); + + return entity.ToModel(); + } + + private async Task IsNameDuplicateAsync(string name, string id, CancellationToken cancellationToken) + { + var entities = await store.FindAsync(new ConnectionDefinitionFilter + { + NotId = id, + Name = name + }); + + return !(entities == null); + } +} + diff --git a/src/modules/Elsa.Connections.Models/ConnectionConfigurationModel.cs b/src/modules/Elsa.Connections.Models/ConnectionConfigurationModel.cs deleted file mode 100644 index 4d6b2f356..000000000 --- a/src/modules/Elsa.Connections.Models/ConnectionConfigurationModel.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.Linq; -using System.Text; -using System.Text.Json.Nodes; -using System.Threading.Tasks; - -namespace Elsa.Connections.Models; - -public class ConnectionConfigurationModel -{ - public string Id { get; set; } - [Required] - public string? Name { get; set; } - public string Description { get; set; } - - public JsonObject ConnectionConfiguration { get; set; } - - [Required] - public string ConnectionType { get; set; } -} diff --git a/src/modules/Elsa.Connections.Models/ConnectionConfigurationMetadataModel.cs b/src/modules/Elsa.Connections.Models/ConnectionInputModel.cs similarity index 100% rename from src/modules/Elsa.Connections.Models/ConnectionConfigurationMetadataModel.cs rename to src/modules/Elsa.Connections.Models/ConnectionInputModel.cs diff --git a/src/modules/Elsa.Connections.Models/Elsa.Connections.Models.csproj b/src/modules/Elsa.Connections.Models/Elsa.Connections.Models.csproj index 52ed24920..1bd63d620 100644 --- a/src/modules/Elsa.Connections.Models/Elsa.Connections.Models.csproj +++ b/src/modules/Elsa.Connections.Models/Elsa.Connections.Models.csproj @@ -1,13 +1,9 @@  - - net8.0 - enable - enable - - - - - + + Provides models that can be shared between the API and API clients + elsa module connections api + Elsa.Connections + diff --git a/src/modules/Elsa.Connections.Persistence.EntityFrameworkCore.Sqlite/DbContextFactories.cs b/src/modules/Elsa.Connections.Persistence.EntityFrameworkCore.Sqlite/DbContextFactories.cs new file mode 100644 index 000000000..cd4fca536 --- /dev/null +++ b/src/modules/Elsa.Connections.Persistence.EntityFrameworkCore.Sqlite/DbContextFactories.cs @@ -0,0 +1,15 @@ +using Elsa.EntityFrameworkCore.Abstractions; +using Elsa.EntityFrameworkCore.Extensions; +using JetBrains.Annotations; +using Microsoft.EntityFrameworkCore; + +namespace Elsa.Connections.Persistence.EntityFrameworkCore.Sqlite; + +[UsedImplicitly] +public class SqliteConnectionDbContextFactory : DesignTimeDbContextFactoryBase +{ + protected override void ConfigureBuilder(DbContextOptionsBuilder builder, string connectionString) + { + builder.UseElsaSqlite(GetType().Assembly, connectionString); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Connections.Persistence.EntityFrameworkCore.Sqlite/Elsa.Connections.Persistence.EntityFrameworkCore.Sqlite.csproj b/src/modules/Elsa.Connections.Persistence.EntityFrameworkCore.Sqlite/Elsa.Connections.Persistence.EntityFrameworkCore.Sqlite.csproj new file mode 100644 index 000000000..0f350f1e2 --- /dev/null +++ b/src/modules/Elsa.Connections.Persistence.EntityFrameworkCore.Sqlite/Elsa.Connections.Persistence.EntityFrameworkCore.Sqlite.csproj @@ -0,0 +1,19 @@ + + + + Provides an EF Core migrations for SQLite for the Connection Persistence module. + elsa module persistence efcore entity framework core sqlite + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/modules/Elsa.Connections.Persistence.EntityFrameworkCore.Sqlite/FodyWeavers.xml b/src/modules/Elsa.Connections.Persistence.EntityFrameworkCore.Sqlite/FodyWeavers.xml new file mode 100644 index 000000000..ac6b5b292 --- /dev/null +++ b/src/modules/Elsa.Connections.Persistence.EntityFrameworkCore.Sqlite/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/modules/Elsa.Connections.Persistence.EntityFrameworkCore.Sqlite/Migrations/20250212220543_V3_3.Designer.cs b/src/modules/Elsa.Connections.Persistence.EntityFrameworkCore.Sqlite/Migrations/20250212220543_V3_3.Designer.cs new file mode 100644 index 000000000..8f3eb3658 --- /dev/null +++ b/src/modules/Elsa.Connections.Persistence.EntityFrameworkCore.Sqlite/Migrations/20250212220543_V3_3.Designer.cs @@ -0,0 +1,60 @@ +// +using Elsa.Connections.Persistence.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace Elsa.Connections.Persistence.EntityFrameworkCore.Sqlite.Migrations +{ + [DbContext(typeof(ConnectionDbContext))] + [Migration("20250212220543_V3_3")] + partial class V3_3 + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasDefaultSchema("Elsa") + .HasAnnotation("ProductVersion", "8.0.12"); + + modelBuilder.Entity("Elsa.Connections.Persistence.Entities.ConnectionDefinition", b => + { + b.Property("Id") + .HasColumnType("TEXT"); + + b.Property("ConnectionConfiguration") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("ConnectionType") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Description") + .HasColumnType("TEXT"); + + b.Property("Name") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("TenantId") + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .HasDatabaseName("IX_ConnectionDefinition_Name"); + + b.HasIndex("TenantId") + .HasDatabaseName("IX_ConnectionDefinition_TenantId"); + + b.ToTable("ConnectionDefinitions", "Elsa"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/modules/Elsa.Connections.Persistence.EntityFrameworkCore.Sqlite/Migrations/20250212220543_V3_3.cs b/src/modules/Elsa.Connections.Persistence.EntityFrameworkCore.Sqlite/Migrations/20250212220543_V3_3.cs new file mode 100644 index 000000000..dd64e3a5f --- /dev/null +++ b/src/modules/Elsa.Connections.Persistence.EntityFrameworkCore.Sqlite/Migrations/20250212220543_V3_3.cs @@ -0,0 +1,62 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Elsa.Connections.Persistence.EntityFrameworkCore.Sqlite.Migrations +{ + /// + public partial class V3_3 : Migration + { + private readonly Elsa.EntityFrameworkCore.IElsaDbContextSchema _schema; + + /// + public V3_3(Elsa.EntityFrameworkCore.IElsaDbContextSchema schema) + { + _schema = schema; + } + + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.EnsureSchema( + name: _schema.Schema); + + migrationBuilder.CreateTable( + name: "ConnectionDefinitions", + schema: _schema.Schema, + columns: table => new + { + Id = table.Column(type: "TEXT", nullable: false), + Name = table.Column(type: "TEXT", nullable: false), + Description = table.Column(type: "TEXT", nullable: true), + ConnectionConfiguration = table.Column(type: "TEXT", nullable: false), + ConnectionType = table.Column(type: "TEXT", nullable: false), + TenantId = table.Column(type: "TEXT", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_ConnectionDefinitions", x => x.Id); + }); + + migrationBuilder.CreateIndex( + name: "IX_ConnectionDefinition_Name", + schema: _schema.Schema, + table: "ConnectionDefinitions", + column: "Name"); + + migrationBuilder.CreateIndex( + name: "IX_ConnectionDefinition_TenantId", + schema: _schema.Schema, + table: "ConnectionDefinitions", + column: "TenantId"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "ConnectionDefinitions", + schema: _schema.Schema); + } + } +} diff --git a/src/modules/Elsa.Connections.Persistence.EntityFrameworkCore.Sqlite/Migrations/ConnectionDbContextModelSnapshot.cs b/src/modules/Elsa.Connections.Persistence.EntityFrameworkCore.Sqlite/Migrations/ConnectionDbContextModelSnapshot.cs new file mode 100644 index 000000000..50c535a68 --- /dev/null +++ b/src/modules/Elsa.Connections.Persistence.EntityFrameworkCore.Sqlite/Migrations/ConnectionDbContextModelSnapshot.cs @@ -0,0 +1,57 @@ +// +using Elsa.Connections.Persistence.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace Elsa.Connections.Persistence.EntityFrameworkCore.Sqlite.Migrations +{ + [DbContext(typeof(ConnectionDbContext))] + partial class ConnectionDbContextModelSnapshot : ModelSnapshot + { + protected override void BuildModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasDefaultSchema("Elsa") + .HasAnnotation("ProductVersion", "8.0.12"); + + modelBuilder.Entity("Elsa.Connections.Persistence.Entities.ConnectionDefinition", b => + { + b.Property("Id") + .HasColumnType("TEXT"); + + b.Property("ConnectionConfiguration") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("ConnectionType") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Description") + .HasColumnType("TEXT"); + + b.Property("Name") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("TenantId") + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .HasDatabaseName("IX_ConnectionDefinition_Name"); + + b.HasIndex("TenantId") + .HasDatabaseName("IX_ConnectionDefinition_TenantId"); + + b.ToTable("ConnectionDefinitions", "Elsa"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/modules/Elsa.Connections.Persistence.EntityFrameworkCore.Sqlite/SqliteProvidersExtensions.cs b/src/modules/Elsa.Connections.Persistence.EntityFrameworkCore.Sqlite/SqliteProvidersExtensions.cs new file mode 100644 index 000000000..9a38e3722 --- /dev/null +++ b/src/modules/Elsa.Connections.Persistence.EntityFrameworkCore.Sqlite/SqliteProvidersExtensions.cs @@ -0,0 +1,28 @@ +using System.Reflection; +using Elsa.Connections.Persistence.EntityFrameworkCore; + +// ReSharper disable once CheckNamespace +namespace Elsa.EntityFrameworkCore.Extensions; + +/// +/// Provides extensions to configure EF Core to use Sqlite. +/// +public static class ConnectionsSqliteProvidersExtensions +{ + private static Assembly Assembly => typeof(ConnectionsSqliteProvidersExtensions).Assembly; + + /// + /// Configures the feature to use Sqlite. + /// + public static EFCoreConnectionPersistenceFeature UseSqlite(this EFCoreConnectionPersistenceFeature feature, string? connectionString = null, ElsaDbContextOptions? options = null) + { + feature.UseSqlite(Assembly, connectionString, options); + return feature; + } + + public static EFCoreConnectionPersistenceFeature UseSqlite(this EFCoreConnectionPersistenceFeature feature, Func connectionStringFunc, ElsaDbContextOptions? options = null) + { + feature.UseSqlite(Assembly, connectionStringFunc, options); + return feature; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Connections.Persistence.EntityFrameworkCore.Sqlite/efcore-3.3.sh b/src/modules/Elsa.Connections.Persistence.EntityFrameworkCore.Sqlite/efcore-3.3.sh new file mode 100644 index 000000000..e5eb4289e --- /dev/null +++ b/src/modules/Elsa.Connections.Persistence.EntityFrameworkCore.Sqlite/efcore-3.3.sh @@ -0,0 +1 @@ +ef-migration-runtime-schema --interface Elsa.EntityFrameworkCore.IElsaDbContextSchema --efOptions "migrations add V3_3 -c ConnectionDbContext -o Migrations" \ No newline at end of file diff --git a/src/modules/Elsa.Connections.Persistence.EntityFrameworkCore/Configurations.cs b/src/modules/Elsa.Connections.Persistence.EntityFrameworkCore/Configurations.cs index 14c375ca5..cc2a3167d 100644 --- a/src/modules/Elsa.Connections.Persistence.EntityFrameworkCore/Configurations.cs +++ b/src/modules/Elsa.Connections.Persistence.EntityFrameworkCore/Configurations.cs @@ -5,6 +5,7 @@ using System.Text; using System.Threading.Tasks; using Elsa.Connections.Models; using Elsa.Connections.Persistence.Entities; +using Elsa.EntityFrameworkCore.Extensions; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata.Builders; @@ -13,7 +14,9 @@ public class Configurations : IEntityTypeConfiguration { public void Configure(EntityTypeBuilder builder) { + builder.Property(x => x.ConnectionConfiguration).HasJsonValueConversion(); builder.HasIndex(x => x.Name).HasDatabaseName($"IX_{nameof(ConnectionDefinition)}_{nameof(ConnectionDefinition.Name)}"); builder.HasIndex(x => x.TenantId).HasDatabaseName($"IX_{nameof(ConnectionDefinition)}_{nameof(ConnectionDefinition.TenantId)}"); + } } diff --git a/src/modules/Elsa.Connections.Persistence.EntityFrameworkCore/EFCoreConnectionStore.cs b/src/modules/Elsa.Connections.Persistence.EntityFrameworkCore/EFCoreConnectionStore.cs new file mode 100644 index 000000000..b7eea5679 --- /dev/null +++ b/src/modules/Elsa.Connections.Persistence.EntityFrameworkCore/EFCoreConnectionStore.cs @@ -0,0 +1,54 @@ +using Elsa.Connections.Persistence.Contracts; +using Elsa.Connections.Persistence.Entities; +using Elsa.Connections.Persistence.Filters; +using Elsa.EntityFrameworkCore; +using JetBrains.Annotations; + +namespace Elsa.Connections.Persistence.EntityFrameworkCore; + +/// +/// An EF Core implementation of . +/// +[UsedImplicitly] +public class EFCoreConnectionStore(EntityStore store) : IConnectionStore +{ + public Task AddAsync(ConnectionDefinition entity, CancellationToken cancellationToken = default) + { + return store.AddAsync(entity, cancellationToken); + } + + public Task UpdateAsync(ConnectionDefinition entity, CancellationToken cancellationToken = default) + { + return store.UpdateAsync(entity, cancellationToken); + } + + public Task GetAsync(string id, CancellationToken cancellationToken = default) + { + var filter = new ConnectionDefinitionFilter + { + Id = id + }; + + return FindAsync(filter, cancellationToken); + } + + public Task FindAsync(ConnectionDefinitionFilter filter, CancellationToken cancellationToken = default) + { + return store.FindAsync(filter.Apply, cancellationToken); + } + + public Task> ListAsync(CancellationToken cancellationToken = default) + { + return store.ListAsync(cancellationToken); + } + + public Task DeleteAsync(ConnectionDefinition entity, CancellationToken cancellationToken = default) + { + return store.DeleteAsync(entity, cancellationToken); + } + + public Task> FindManyAsync(ConnectionDefinitionFilter filter, CancellationToken cancellationToken = default) + { + return store.QueryAsync(filter.Apply, cancellationToken); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Connections.Persistence.EntityFrameworkCore/Extensions.cs b/src/modules/Elsa.Connections.Persistence.EntityFrameworkCore/Extensions.cs new file mode 100644 index 000000000..718e6446c --- /dev/null +++ b/src/modules/Elsa.Connections.Persistence.EntityFrameworkCore/Extensions.cs @@ -0,0 +1,22 @@ +using Elsa.Connections.Persistence.Features; +using Elsa.Connections.Persistence.EntityFrameworkCore; +using JetBrains.Annotations; + +// ReSharper disable once CheckNamespace +namespace Elsa.Agents; + +/// +/// Provides extensions to the feature. +/// +[PublicAPI] +public static class Extensions +{ + /// + /// Configures the to use EF Core persistence providers. + /// + public static ConnectionPersistenceFeature UseEntityFrameworkCore(this ConnectionPersistenceFeature feature, Action? configure = default) + { + feature.Module.Configure(configure); + return feature; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Connections.Persistence.EntityFrameworkCore/Feature.cs b/src/modules/Elsa.Connections.Persistence.EntityFrameworkCore/Feature.cs new file mode 100644 index 000000000..5d8d9524b --- /dev/null +++ b/src/modules/Elsa.Connections.Persistence.EntityFrameworkCore/Feature.cs @@ -0,0 +1,34 @@ +using Elsa.Connections.Persistence.Entities; +using Elsa.Connections.Persistence.Features; +using Elsa.EntityFrameworkCore; +using Elsa.EntityFrameworkCore.EntityHandlers; +using Elsa.Features.Attributes; +using Elsa.Features.Services; +using Microsoft.Extensions.DependencyInjection; + +namespace Elsa.Connections.Persistence.EntityFrameworkCore; + +/// +/// Configures the default workflow runtime to use EF Core persistence providers. +/// +[DependsOn(typeof(ConnectionPersistenceFeature))] +public class EFCoreConnectionPersistenceFeature(IModule module) : PersistenceFeatureBase(module) +{ + /// + public override void Configure() + { + Module.Configure(feature => + { + feature + .UseConnectionStore(sp=> sp.GetRequiredService()) + ; + }); + } + + /// + public override void Apply() + { + base.Apply(); + AddEntityStore(); + } +} \ No newline at end of file From 17975b659b2edcfe6188de91d580a6a439ac4429 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20DEVILLARD?= Date: Fri, 14 Feb 2025 22:12:49 +0100 Subject: [PATCH 08/10] Add missing reference in csproj --- .../Elsa.ServerAndStudio.Web/Elsa.ServerAndStudio.Web.csproj | 3 +++ src/apps/Elsa.ServerAndStudio.Web/Program.cs | 1 + 2 files changed, 4 insertions(+) diff --git a/src/apps/Elsa.ServerAndStudio.Web/Elsa.ServerAndStudio.Web.csproj b/src/apps/Elsa.ServerAndStudio.Web/Elsa.ServerAndStudio.Web.csproj index 7cfa13de3..95ad44225 100644 --- a/src/apps/Elsa.ServerAndStudio.Web/Elsa.ServerAndStudio.Web.csproj +++ b/src/apps/Elsa.ServerAndStudio.Web/Elsa.ServerAndStudio.Web.csproj @@ -13,6 +13,9 @@ + + + diff --git a/src/apps/Elsa.ServerAndStudio.Web/Program.cs b/src/apps/Elsa.ServerAndStudio.Web/Program.cs index 85af86498..807f711a0 100644 --- a/src/apps/Elsa.ServerAndStudio.Web/Program.cs +++ b/src/apps/Elsa.ServerAndStudio.Web/Program.cs @@ -197,6 +197,7 @@ services elsa.UseConnections( configure=> configure.AddConnectionsFrom()); + elsa.UseConnectionPersistence(ef=> ef.UseEntityFrameworkCore(f=>f.UseSqlite())); elsa.UseConnectionsApi(); }); From e2ec2e47b4efdfc1b523524b486c26b30f2ba2f3 Mon Sep 17 00:00:00 2001 From: Sipke Schoorstra Date: Sun, 23 Feb 2025 13:46:59 +0100 Subject: [PATCH 09/10] Add Connections modules and update dependencies. Added new Connections modules to the solution and updated project references to include necessary dependencies. Also modified DictionaryExtensions to return null as the default value instead of default. Removed an unused JavaScript helper import to streamline the code. --- Elsa.sln | 45 +++++++++++++++++++ .../Elsa.ServerAndStudio.Web.csproj | 1 + ...ineWithVariablesAndInputOutputAccessors.cs | 1 - .../Extensions/DictionaryExtensions.cs | 2 +- 4 files changed, 47 insertions(+), 2 deletions(-) diff --git a/Elsa.sln b/Elsa.sln index 3bd4eac22..34eb44ccf 100644 --- a/Elsa.sln +++ b/Elsa.sln @@ -403,6 +403,20 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "oracle-setup", "oracle-setu docker\oracle-setup\setup.sql = docker\oracle-setup\setup.sql EndProjectSection EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "connections", "connections", "{9DF81143-2F39-4CFB-9DA3-902279010622}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Connections.Models", "src\modules\Elsa.Connections.Models\Elsa.Connections.Models.csproj", "{75E08B0E-A41A-425C-9DCA-155505CE41CD}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Connections.Api", "src\modules\Elsa.Connections.Api\Elsa.Connections.Api.csproj", "{BD120D97-4862-469E-B2CF-4109F7F21C20}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Connections.Core", "src\modules\Elsa.Connections.Core\Elsa.Connections.Core.csproj", "{8A3443F3-D40E-44B9-9805-B4CB7A3F022C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Connections.Persistence", "src\modules\Elsa.Connections.Persistence\Elsa.Connections.Persistence.csproj", "{FA2B2B44-7E3E-444B-A157-7526B376E9CA}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Connections.Persistence.EntityFrameworkCore", "src\modules\Elsa.Connections.Persistence.EntityFrameworkCore\Elsa.Connections.Persistence.EntityFrameworkCore.csproj", "{DF0CA7E2-F5DF-40ED-91B6-748767084FC7}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Connections.Persistence.EntityFrameworkCore.Sqlite", "src\modules\Elsa.Connections.Persistence.EntityFrameworkCore.Sqlite\Elsa.Connections.Persistence.EntityFrameworkCore.Sqlite.csproj", "{DB20B168-CD90-41F2-BE08-3D8C6F142459}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -859,6 +873,30 @@ Global {A51F9683-DA9F-45E7-82DE-1E261ACD6D68}.Debug|Any CPU.Build.0 = Debug|Any CPU {A51F9683-DA9F-45E7-82DE-1E261ACD6D68}.Release|Any CPU.ActiveCfg = Release|Any CPU {A51F9683-DA9F-45E7-82DE-1E261ACD6D68}.Release|Any CPU.Build.0 = Release|Any CPU + {75E08B0E-A41A-425C-9DCA-155505CE41CD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {75E08B0E-A41A-425C-9DCA-155505CE41CD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {75E08B0E-A41A-425C-9DCA-155505CE41CD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {75E08B0E-A41A-425C-9DCA-155505CE41CD}.Release|Any CPU.Build.0 = Release|Any CPU + {BD120D97-4862-469E-B2CF-4109F7F21C20}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BD120D97-4862-469E-B2CF-4109F7F21C20}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BD120D97-4862-469E-B2CF-4109F7F21C20}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BD120D97-4862-469E-B2CF-4109F7F21C20}.Release|Any CPU.Build.0 = Release|Any CPU + {8A3443F3-D40E-44B9-9805-B4CB7A3F022C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8A3443F3-D40E-44B9-9805-B4CB7A3F022C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8A3443F3-D40E-44B9-9805-B4CB7A3F022C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8A3443F3-D40E-44B9-9805-B4CB7A3F022C}.Release|Any CPU.Build.0 = Release|Any CPU + {FA2B2B44-7E3E-444B-A157-7526B376E9CA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FA2B2B44-7E3E-444B-A157-7526B376E9CA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FA2B2B44-7E3E-444B-A157-7526B376E9CA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FA2B2B44-7E3E-444B-A157-7526B376E9CA}.Release|Any CPU.Build.0 = Release|Any CPU + {DF0CA7E2-F5DF-40ED-91B6-748767084FC7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DF0CA7E2-F5DF-40ED-91B6-748767084FC7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DF0CA7E2-F5DF-40ED-91B6-748767084FC7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DF0CA7E2-F5DF-40ED-91B6-748767084FC7}.Release|Any CPU.Build.0 = Release|Any CPU + {DB20B168-CD90-41F2-BE08-3D8C6F142459}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DB20B168-CD90-41F2-BE08-3D8C6F142459}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DB20B168-CD90-41F2-BE08-3D8C6F142459}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DB20B168-CD90-41F2-BE08-3D8C6F142459}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -1011,6 +1049,13 @@ Global {FA5E857F-B173-4B5D-8049-B817A210DEF5} = {A0DC5F8E-5D7F-4E8A-A5DF-B1FC31F7336E} {A51F9683-DA9F-45E7-82DE-1E261ACD6D68} = {A0DC5F8E-5D7F-4E8A-A5DF-B1FC31F7336E} {66E2E2CF-967F-4564-89E8-F46FA973C99B} = {986E5482-0482-448C-B9E4-EC67A9474B85} + {9DF81143-2F39-4CFB-9DA3-902279010622} = {5BA4A8FA-F7F4-45B3-AEC8-8886D35AAC79} + {75E08B0E-A41A-425C-9DCA-155505CE41CD} = {9DF81143-2F39-4CFB-9DA3-902279010622} + {BD120D97-4862-469E-B2CF-4109F7F21C20} = {9DF81143-2F39-4CFB-9DA3-902279010622} + {8A3443F3-D40E-44B9-9805-B4CB7A3F022C} = {9DF81143-2F39-4CFB-9DA3-902279010622} + {FA2B2B44-7E3E-444B-A157-7526B376E9CA} = {9DF81143-2F39-4CFB-9DA3-902279010622} + {DF0CA7E2-F5DF-40ED-91B6-748767084FC7} = {9DF81143-2F39-4CFB-9DA3-902279010622} + {DB20B168-CD90-41F2-BE08-3D8C6F142459} = {9DF81143-2F39-4CFB-9DA3-902279010622} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {D4B5CEAA-7D70-4FCB-A68E-B03FBE5E0E5E} diff --git a/src/apps/Elsa.ServerAndStudio.Web/Elsa.ServerAndStudio.Web.csproj b/src/apps/Elsa.ServerAndStudio.Web/Elsa.ServerAndStudio.Web.csproj index 95ad44225..7df79071e 100644 --- a/src/apps/Elsa.ServerAndStudio.Web/Elsa.ServerAndStudio.Web.csproj +++ b/src/apps/Elsa.ServerAndStudio.Web/Elsa.ServerAndStudio.Web.csproj @@ -16,6 +16,7 @@ + diff --git a/src/modules/Elsa.JavaScript/Handlers/ConfigureEngineWithVariablesAndInputOutputAccessors.cs b/src/modules/Elsa.JavaScript/Handlers/ConfigureEngineWithVariablesAndInputOutputAccessors.cs index c64611074..14e407125 100644 --- a/src/modules/Elsa.JavaScript/Handlers/ConfigureEngineWithVariablesAndInputOutputAccessors.cs +++ b/src/modules/Elsa.JavaScript/Handlers/ConfigureEngineWithVariablesAndInputOutputAccessors.cs @@ -1,7 +1,6 @@ using Elsa.Expressions.Models; using Elsa.Extensions; using Elsa.JavaScript.Extensions; -using Elsa.JavaScript.Helpers; using Elsa.JavaScript.Notifications; using Elsa.JavaScript.Options; using Elsa.Mediator.Contracts; diff --git a/src/modules/Elsa.Workflows.Core/Extensions/DictionaryExtensions.cs b/src/modules/Elsa.Workflows.Core/Extensions/DictionaryExtensions.cs index bc1bb6c44..33cb94f5f 100644 --- a/src/modules/Elsa.Workflows.Core/Extensions/DictionaryExtensions.cs +++ b/src/modules/Elsa.Workflows.Core/Extensions/DictionaryExtensions.cs @@ -57,7 +57,7 @@ public static class DictionaryExtensions public static T? GetValueOrDefault(this IDictionary dictionary, string key, Func defaultValueFactory) => TryGetValue(dictionary, key, out var value) ? value : defaultValueFactory(); public static T? GetValueOrDefault(this IDictionary dictionary, IEnumerable keys, Func defaultValueFactory) => TryGetValue(dictionary, keys, out var value) ? value : defaultValueFactory(); public static T? GetValueOrDefault(this IDictionary dictionary, string key) => GetValueOrDefault(dictionary, key, () => default); - public static object? GetValueOrDefault(this IDictionary dictionary, string key) => GetValueOrDefault(dictionary, key, () => default); + public static object? GetValueOrDefault(this IDictionary dictionary, string key) => GetValueOrDefault(dictionary, key, () => null); public static T GetOrAdd(this IDictionary dictionary, TKey key, Func valueFactory) { From 78c6df152e171ea7254513a25d6c2885f8edf8e2 Mon Sep 17 00:00:00 2001 From: Sipke Schoorstra Date: Sun, 23 Feb 2025 14:07:32 +0100 Subject: [PATCH 10/10] Refactor and clean up Connections API and Core components Removed unused code, optimized imports, and updated method signatures for better null-safety and consistency. Consolidated redundant logic, improved error handling in endpoints, and applied modern syntax and practices across the Connections module. --- src/modules/Elsa.Connections.Api/Constants.cs | 8 +-- .../Elsa.Connections.Api.csproj | 4 -- .../Get/Endpoint.cs | 17 +++-- .../List/Endpoint.cs | 15 +--- .../List/Request.cs | 6 -- .../Endpoints/Add/Endpoint.cs | 5 +- .../Endpoints/Delete/Endpoint.cs | 5 +- .../Endpoints/Delete/Request.cs | 13 ++-- .../Endpoints/Get/Endpoint.cs | 5 +- .../Endpoints/Get/Request.cs | 12 ++-- .../Endpoints/List/Endpoint.cs | 9 +-- .../Endpoints/Update/Endpoint.cs | 13 ++-- .../ConnectionDefinitionExtensions.cs | 13 ++-- .../Extensions/ModuleExtensions.cs | 2 +- .../Features/ConnectionsApiFeature.cs | 11 --- .../Attributes/ConnectionActivityAttribute.cs | 9 +-- .../Attributes/ConnectionPropertyAttribute.cs | 15 ++-- .../IConnectionDescriptorRegistry.cs | 5 +- .../IConnectionDescriptorRepository.cs | 5 +- .../Contracts/IConnectionProperty.cs | 7 +- .../Extensions/LogConnectionExtensions.cs | 6 +- .../Features/ConnectionsFeatures.cs | 68 +++++++++---------- .../Filters/PropertyAttributeFilter.cs | 6 +- .../Middleware/ConnectionMiddleware.cs | 28 +++----- .../ConnectionOptionsProvider.cs | 15 ++-- .../Services/ConnectionRegistry.cs | 49 +++++-------- ....cs => ConnectionDropDownUIHintHandler.cs} | 16 ++--- .../ConnectionDescriptor.cs | 2 +- .../ConnectionInputModel.cs | 16 ++--- .../ConnectionModel.cs | 2 +- .../ConnectionProperties.cs | 2 +- .../EFCoreConnectionStore.cs | 24 +++---- .../Contracts/IConnectionStore.cs | 31 +-------- .../Entities/ConnectionDefinition.cs | 13 ++-- .../ConnectionPersistenceExtensions.cs | 9 +-- .../Features/ConnectionPersistenceFeature.cs | 23 +++---- .../Filters/ConnectionDefinitionFilter.cs | 9 +-- .../Services/InMemoryConnectionStore.cs | 17 ++--- 38 files changed, 183 insertions(+), 332 deletions(-) delete mode 100644 src/modules/Elsa.Connections.Api/Endpoints/ActivityConnectionDescriptor/List/Request.cs rename src/modules/Elsa.Connections.Core/UIHints/{ConnexionDropDownUIHintHandler.cs => ConnectionDropDownUIHintHandler.cs} (68%) diff --git a/src/modules/Elsa.Connections.Api/Constants.cs b/src/modules/Elsa.Connections.Api/Constants.cs index 86cfd703b..732c2da99 100644 --- a/src/modules/Elsa.Connections.Api/Constants.cs +++ b/src/modules/Elsa.Connections.Api/Constants.cs @@ -1,10 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Elsa.Connections.Api; +namespace Elsa.Connections.Api; public class Constants { public const string PermissionsNamespace = "connections"; diff --git a/src/modules/Elsa.Connections.Api/Elsa.Connections.Api.csproj b/src/modules/Elsa.Connections.Api/Elsa.Connections.Api.csproj index 25596b8f9..fbf376330 100644 --- a/src/modules/Elsa.Connections.Api/Elsa.Connections.Api.csproj +++ b/src/modules/Elsa.Connections.Api/Elsa.Connections.Api.csproj @@ -11,8 +11,4 @@ - - - - diff --git a/src/modules/Elsa.Connections.Api/Endpoints/ActivityConnectionDescriptor/Get/Endpoint.cs b/src/modules/Elsa.Connections.Api/Endpoints/ActivityConnectionDescriptor/Get/Endpoint.cs index 5718d454b..7bf4aa6eb 100644 --- a/src/modules/Elsa.Connections.Api/Endpoints/ActivityConnectionDescriptor/Get/Endpoint.cs +++ b/src/modules/Elsa.Connections.Api/Endpoints/ActivityConnectionDescriptor/Get/Endpoint.cs @@ -15,12 +15,15 @@ public class Endpoint(IConnectionDescriptorRegistry store) : ElsaEndpointWithout public override async Task HandleAsync(CancellationToken ct) { var type = Route("ActivityType"); - var config = await store.GetConnectionDescriptor(type); - - if (config == null) - await SendNotFoundAsync(); - else - await SendOkAsync(config); - + + if (string.IsNullOrWhiteSpace(type)) + { + AddError("ActivityType is required"); + await SendErrorsAsync(cancellation: ct); + return; + } + + var config = await store.GetConnectionDescriptorAsync(type, ct); + await SendOkAsync(config, ct); } } diff --git a/src/modules/Elsa.Connections.Api/Endpoints/ActivityConnectionDescriptor/List/Endpoint.cs b/src/modules/Elsa.Connections.Api/Endpoints/ActivityConnectionDescriptor/List/Endpoint.cs index 1fbc961ac..62e35582b 100644 --- a/src/modules/Elsa.Connections.Api/Endpoints/ActivityConnectionDescriptor/List/Endpoint.cs +++ b/src/modules/Elsa.Connections.Api/Endpoints/ActivityConnectionDescriptor/List/Endpoint.cs @@ -1,22 +1,11 @@ -using System.Collections.ObjectModel; -using System.ComponentModel.DataAnnotations; -using System.Diagnostics.CodeAnalysis; -using System.Reflection; -using System.Text.Json.Nodes; -using Elsa.Abstractions; +using Elsa.Abstractions; using Elsa.Common.Models; using Elsa.Connections.Contracts; using Elsa.Connections.Models; using Elsa.Models; -using Elsa.Workflows; -using Elsa.Workflows.Attributes; -using Elsa.Workflows.Models; -using FastEndpoints; -using Humanizer; namespace Elsa.Connections.Api.Endpoints.ActivityConnectionDescriptor.List; - public class List(IConnectionDescriptorRegistry registry) : ElsaEndpointWithoutRequest> { public override void Configure() @@ -28,6 +17,6 @@ public class List(IConnectionDescriptorRegistry registry) : ElsaEndpointWithoutR public override Task> ExecuteAsync(CancellationToken ct) { var descriptors = registry.ListAll().ToList(); - return Task.FromResult(new PagedListResponse(Page.Of(descriptors, descriptors.Count())) ); + return Task.FromResult(new PagedListResponse(Page.Of(descriptors, descriptors.Count)) ); } } \ No newline at end of file diff --git a/src/modules/Elsa.Connections.Api/Endpoints/ActivityConnectionDescriptor/List/Request.cs b/src/modules/Elsa.Connections.Api/Endpoints/ActivityConnectionDescriptor/List/Request.cs deleted file mode 100644 index de3528cd5..000000000 --- a/src/modules/Elsa.Connections.Api/Endpoints/ActivityConnectionDescriptor/List/Request.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Elsa.Connections.Api.Endpoints.ActivityConnectionDescriptor.List; - -public class Request -{ - public string ActivityType { get; set; } -} diff --git a/src/modules/Elsa.Connections.Api/Endpoints/Add/Endpoint.cs b/src/modules/Elsa.Connections.Api/Endpoints/Add/Endpoint.cs index ed24cd6f3..8f7cf39c5 100644 --- a/src/modules/Elsa.Connections.Api/Endpoints/Add/Endpoint.cs +++ b/src/modules/Elsa.Connections.Api/Endpoints/Add/Endpoint.cs @@ -5,7 +5,6 @@ using Elsa.Connections.Persistence.Filters; using Elsa.Workflows; using Elsa.Connections.Persistence.Entities; using Elsa.Connections.Api.Extensions; -using static FastEndpoints.Ep; namespace Elsa.Connections.Api.Endpoints.Add; @@ -23,7 +22,7 @@ public class Endpoint(IConnectionStore store, IIdentityGenerator identityGenerat if (!isNameUnique) { - AddError("An connection already exists with the specified name"); + AddError("A connection already exists with the specified name"); await SendErrorsAsync(cancellation: ct); return null!; } @@ -37,7 +36,7 @@ public class Endpoint(IConnectionStore store, IIdentityGenerator identityGenerat ConnectionConfiguration = model.ConnectionConfiguration, }; await store.AddAsync(newEntity, ct); - await SendOkAsync(); + await SendOkAsync(ct); return newEntity.ToModel(); } diff --git a/src/modules/Elsa.Connections.Api/Endpoints/Delete/Endpoint.cs b/src/modules/Elsa.Connections.Api/Endpoints/Delete/Endpoint.cs index c4c358494..d8fda228e 100644 --- a/src/modules/Elsa.Connections.Api/Endpoints/Delete/Endpoint.cs +++ b/src/modules/Elsa.Connections.Api/Endpoints/Delete/Endpoint.cs @@ -1,7 +1,6 @@ using Elsa.Abstractions; using Elsa.Connections.Persistence.Contracts; - namespace Elsa.Connections.Api.Endpoints.Delete; public class Endpoint(IConnectionStore store) : ElsaEndpoint @@ -14,7 +13,7 @@ public class Endpoint(IConnectionStore store) : ElsaEndpoint public override async Task HandleAsync(Request req, CancellationToken ct) { - var entity = await store.GetAsync(req.Id); + var entity = await store.GetAsync(req.Id, ct); if (entity == null) { @@ -23,6 +22,6 @@ public class Endpoint(IConnectionStore store) : ElsaEndpoint } await store.DeleteAsync(entity, ct); - await SendOkAsync(); + await SendOkAsync(ct); } } diff --git a/src/modules/Elsa.Connections.Api/Endpoints/Delete/Request.cs b/src/modules/Elsa.Connections.Api/Endpoints/Delete/Request.cs index 046a9130b..6e33ffacf 100644 --- a/src/modules/Elsa.Connections.Api/Endpoints/Delete/Request.cs +++ b/src/modules/Elsa.Connections.Api/Endpoints/Delete/Request.cs @@ -1,11 +1,8 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using System.ComponentModel.DataAnnotations; namespace Elsa.Connections.Api.Endpoints.Delete; + public class Request -{ [Required] public string Id { get; set; } = default!; -} +{ + [Required] public string Id { get; set; } = null!; +} \ No newline at end of file diff --git a/src/modules/Elsa.Connections.Api/Endpoints/Get/Endpoint.cs b/src/modules/Elsa.Connections.Api/Endpoints/Get/Endpoint.cs index 4a5324a09..bbf6ab953 100644 --- a/src/modules/Elsa.Connections.Api/Endpoints/Get/Endpoint.cs +++ b/src/modules/Elsa.Connections.Api/Endpoints/Get/Endpoint.cs @@ -16,11 +16,10 @@ public class Endpoint(IConnectionStore store) : ElsaEndpoint ExecuteAsync(Request req, CancellationToken ct) { var entity = await store.FindAsync( - new Persistence.Filters.ConnectionDefinitionFilter + new() { Id = req.Id - } - ); + }, ct); if (entity == null) { diff --git a/src/modules/Elsa.Connections.Api/Endpoints/Get/Request.cs b/src/modules/Elsa.Connections.Api/Endpoints/Get/Request.cs index 024c0c055..933b0c2fb 100644 --- a/src/modules/Elsa.Connections.Api/Endpoints/Get/Request.cs +++ b/src/modules/Elsa.Connections.Api/Endpoints/Get/Request.cs @@ -1,12 +1,8 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using System.ComponentModel.DataAnnotations; namespace Elsa.Connections.Api.Endpoints.Get; + public class Request { - [Required] public string Id { get; set; } = default!; -} + [Required] public string Id { get; set; } = null!; +} \ No newline at end of file diff --git a/src/modules/Elsa.Connections.Api/Endpoints/List/Endpoint.cs b/src/modules/Elsa.Connections.Api/Endpoints/List/Endpoint.cs index 8c82bc3c6..9f791b69e 100644 --- a/src/modules/Elsa.Connections.Api/Endpoints/List/Endpoint.cs +++ b/src/modules/Elsa.Connections.Api/Endpoints/List/Endpoint.cs @@ -1,11 +1,8 @@ -using System.ComponentModel.DataAnnotations; -using System.Text.Json.Nodes; -using Elsa.Abstractions; +using Elsa.Abstractions; using Elsa.Common.Models; using Elsa.Connections.Api.Extensions; using Elsa.Connections.Models; using Elsa.Connections.Persistence.Contracts; -using Elsa.Connections.Persistence.Entities; using Elsa.Models; namespace Elsa.Connections.Api.Endpoints.List; @@ -20,8 +17,8 @@ public class Endpoint(IConnectionStore store) : ElsaEndpointWithoutRequest> ExecuteAsync(CancellationToken ct) { - var entities = await store.ListAsync(); + var entities = await store.ListAsync(ct); var models = entities.Select(x => x.ToModel()).ToList(); - return new PagedListResponse(Page.Of(models, models.Count())); + return new(Page.Of(models, models.Count())); } } diff --git a/src/modules/Elsa.Connections.Api/Endpoints/Update/Endpoint.cs b/src/modules/Elsa.Connections.Api/Endpoints/Update/Endpoint.cs index 350e37999..ffba22422 100644 --- a/src/modules/Elsa.Connections.Api/Endpoints/Update/Endpoint.cs +++ b/src/modules/Elsa.Connections.Api/Endpoints/Update/Endpoint.cs @@ -37,22 +37,19 @@ public class Endpoint(IConnectionStore store) : ElsaEndpoint IsNameDuplicateAsync(string name, string id, CancellationToken cancellationToken) { - var entities = await store.FindAsync(new ConnectionDefinitionFilter + var entities = await store.FindAsync(new() { NotId = id, Name = name - }); + }, cancellationToken); - return !(entities == null); + return entities != null; } -} - +} \ No newline at end of file diff --git a/src/modules/Elsa.Connections.Api/Extensions/ConnectionDefinitionExtensions.cs b/src/modules/Elsa.Connections.Api/Extensions/ConnectionDefinitionExtensions.cs index 8fbd2c30f..fef90c617 100644 --- a/src/modules/Elsa.Connections.Api/Extensions/ConnectionDefinitionExtensions.cs +++ b/src/modules/Elsa.Connections.Api/Extensions/ConnectionDefinitionExtensions.cs @@ -1,24 +1,19 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Elsa.Connections.Models; +using Elsa.Connections.Models; using Elsa.Connections.Persistence.Entities; namespace Elsa.Connections.Api.Extensions; + public static class ConnectionDefinitionExtensions { public static ConnectionModel ToModel(this ConnectionDefinition entity) { - return new ConnectionModel + return new() { Id = entity.Id, Name = entity.Name, Description = entity.Description, ConnectionType = entity.ConnectionType, ConnectionConfiguration = entity.ConnectionConfiguration, - }; } -} +} \ No newline at end of file diff --git a/src/modules/Elsa.Connections.Api/Extensions/ModuleExtensions.cs b/src/modules/Elsa.Connections.Api/Extensions/ModuleExtensions.cs index 8c4598418..10cc54185 100644 --- a/src/modules/Elsa.Connections.Api/Extensions/ModuleExtensions.cs +++ b/src/modules/Elsa.Connections.Api/Extensions/ModuleExtensions.cs @@ -10,7 +10,7 @@ namespace Elsa.Extensions; public static class ModuleExtensions { /// - /// Installs the Semantic Kernel API feature. + /// Installs the Connections API feature. /// public static IModule UseConnectionsApi(this IModule module, Action? configure = null) { diff --git a/src/modules/Elsa.Connections.Api/Features/ConnectionsApiFeature.cs b/src/modules/Elsa.Connections.Api/Features/ConnectionsApiFeature.cs index a329f21a0..d3fc3c7a4 100644 --- a/src/modules/Elsa.Connections.Api/Features/ConnectionsApiFeature.cs +++ b/src/modules/Elsa.Connections.Api/Features/ConnectionsApiFeature.cs @@ -1,13 +1,9 @@ -using Elsa.Connections.Models; -using Elsa.Connections.Persistence.Contracts; using Elsa.Connections.Persistence.Features; -using Elsa.Connections.Persistence.Services; using Elsa.Extensions; using Elsa.Features.Abstractions; using Elsa.Features.Attributes; using Elsa.Features.Services; using JetBrains.Annotations; -using Microsoft.Extensions.DependencyInjection; namespace Elsa.Connections.Api.Features; @@ -22,12 +18,5 @@ public class ConnectionsApiFeature(IModule module) : FeatureBase(module) public override void Configure() { Module.AddFastEndpointsAssembly(); - } - - public override void Apply() - { - - - } } \ No newline at end of file diff --git a/src/modules/Elsa.Connections.Core/Attributes/ConnectionActivityAttribute.cs b/src/modules/Elsa.Connections.Core/Attributes/ConnectionActivityAttribute.cs index c7f3f35fc..9156be919 100644 --- a/src/modules/Elsa.Connections.Core/Attributes/ConnectionActivityAttribute.cs +++ b/src/modules/Elsa.Connections.Core/Attributes/ConnectionActivityAttribute.cs @@ -1,15 +1,10 @@ namespace Elsa.Connections.Attributes; [AttributeUsage(AttributeTargets.Class)] -public class ConnectionActivityAttribute : Attribute +public class ConnectionActivityAttribute(string type) : Attribute { - - public ConnectionActivityAttribute(string type) - { - Type = type; - } /// /// The TypeName of the connection /// - public string Type { get; set; } + public string Type { get; set; } = type; } diff --git a/src/modules/Elsa.Connections.Core/Attributes/ConnectionPropertyAttribute.cs b/src/modules/Elsa.Connections.Core/Attributes/ConnectionPropertyAttribute.cs index 7790a0c6b..98c6d79c3 100644 --- a/src/modules/Elsa.Connections.Core/Attributes/ConnectionPropertyAttribute.cs +++ b/src/modules/Elsa.Connections.Core/Attributes/ConnectionPropertyAttribute.cs @@ -1,15 +1,8 @@ namespace Elsa.Connections.Attributes; -public class ConnectionPropertyAttribute : Attribute +public class ConnectionPropertyAttribute(string ns, string displayName, string? description = null) : Attribute { - public ConnectionPropertyAttribute(string @namespace, string displayName, string? description= default) - { - Namespace = @namespace; - DisplayName = displayName; - Description = description; - - } - public string? Namespace { get; set; } - public string? Description { get; set; } - public string? DisplayName { get; set; } + public string? Namespace { get; set; } = ns; + public string? Description { get; set; } = description; + public string? DisplayName { get; set; } = displayName; } \ No newline at end of file diff --git a/src/modules/Elsa.Connections.Core/Contracts/IConnectionDescriptorRegistry.cs b/src/modules/Elsa.Connections.Core/Contracts/IConnectionDescriptorRegistry.cs index 873122ff6..61e525987 100644 --- a/src/modules/Elsa.Connections.Core/Contracts/IConnectionDescriptorRegistry.cs +++ b/src/modules/Elsa.Connections.Core/Contracts/IConnectionDescriptorRegistry.cs @@ -19,6 +19,7 @@ public interface IConnectionDescriptorRegistry /// Removes an activity descriptor from the registry. /// /// The type of the connection. + /// void Remove(Type connectionType, ActivityDescriptor descriptor); /// @@ -27,7 +28,7 @@ public interface IConnectionDescriptorRegistry /// All connection descriptors in the registry. IEnumerable ListAll(); - Type Get(string type); + Type? Get(string type); /// /// Get the Input Descriptors for an connection @@ -35,5 +36,5 @@ public interface IConnectionDescriptorRegistry /// The type of the connectn /// /// - Task> GetConnectionDescriptor(string activityType, CancellationToken cancellationToken = default); + Task> GetConnectionDescriptorAsync(string activityType, CancellationToken cancellationToken = default); } \ No newline at end of file diff --git a/src/modules/Elsa.Connections.Core/Contracts/IConnectionDescriptorRepository.cs b/src/modules/Elsa.Connections.Core/Contracts/IConnectionDescriptorRepository.cs index fd61010fa..ffb11ba74 100644 --- a/src/modules/Elsa.Connections.Core/Contracts/IConnectionDescriptorRepository.cs +++ b/src/modules/Elsa.Connections.Core/Contracts/IConnectionDescriptorRepository.cs @@ -1,7 +1,4 @@ -using Elsa.Connections.Models; -using Elsa.Workflows.Models; - -namespace Elsa.Connections.Contracts; +namespace Elsa.Connections.Contracts; public interface IConnectionDescriptorRegistryEX { diff --git a/src/modules/Elsa.Connections.Core/Contracts/IConnectionProperty.cs b/src/modules/Elsa.Connections.Core/Contracts/IConnectionProperty.cs index 6e57e8763..fd89db4df 100644 --- a/src/modules/Elsa.Connections.Core/Contracts/IConnectionProperty.cs +++ b/src/modules/Elsa.Connections.Core/Contracts/IConnectionProperty.cs @@ -1,9 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Text.Json.Serialization; -using System.Threading.Tasks; +using System.Text.Json.Serialization; namespace Elsa.Connections.Contracts; interface IConnectionProperty diff --git a/src/modules/Elsa.Connections.Core/Extensions/LogConnectionExtensions.cs b/src/modules/Elsa.Connections.Core/Extensions/LogConnectionExtensions.cs index 0edf36a0f..a11192cb8 100644 --- a/src/modules/Elsa.Connections.Core/Extensions/LogConnectionExtensions.cs +++ b/src/modules/Elsa.Connections.Core/Extensions/LogConnectionExtensions.cs @@ -1,7 +1,7 @@ // ReSharper disable once CheckNamespace -using Elsa.Connections.Middleware; -using Microsoft.Extensions.Logging; - + +using Microsoft.Extensions.Logging; + namespace Elsa.Connections.Core.Extensions; /// diff --git a/src/modules/Elsa.Connections.Core/Features/ConnectionsFeatures.cs b/src/modules/Elsa.Connections.Core/Features/ConnectionsFeatures.cs index 5842871c3..8fc227e7a 100644 --- a/src/modules/Elsa.Connections.Core/Features/ConnectionsFeatures.cs +++ b/src/modules/Elsa.Connections.Core/Features/ConnectionsFeatures.cs @@ -1,39 +1,39 @@ -using System.Reflection; -using Elsa.Connections.Attributes; -using Elsa.Connections.Contracts; -using Elsa.Connections.Filters; -using Elsa.Connections.ServiceProvider; -using Elsa.Connections.Services; -using Elsa.Connections.UIHints; -using Elsa.Extensions; -using Elsa.Features.Abstractions; -using Elsa.Features.Attributes; -using Elsa.Features.Services; +using System.Reflection; +using Elsa.Connections.Attributes; +using Elsa.Connections.Contracts; +using Elsa.Connections.Filters; +using Elsa.Connections.ServiceProvider; +using Elsa.Connections.Services; +using Elsa.Connections.UIHints; +using Elsa.Extensions; +using Elsa.Features.Abstractions; +using Elsa.Features.Attributes; +using Elsa.Features.Services; using Elsa.Workflows; -using Elsa.Workflows.Pipelines.ActivityExecution; -using Elsa.Workflows.Features; -using JetBrains.Annotations; -using Microsoft.Extensions.DependencyInjection; -using Elsa.Connections.Middleware; -using Elsa.Connections.Models; - -namespace Elsa.Connections.Features; - -/// -/// A feature that installs API endpoints to interact with skilled agents. +using Elsa.Workflows.Pipelines.ActivityExecution; +using Elsa.Workflows.Features; +using JetBrains.Annotations; +using Microsoft.Extensions.DependencyInjection; +using Elsa.Connections.Middleware; +using Elsa.Connections.Models; + +namespace Elsa.Connections.Features; + +/// +/// A feature that installs API endpoints to interact with skilled agents. /// -[DependsOn(typeof(WorkflowsFeature))] -[UsedImplicitly] -public class ConnectionsFeatures(IModule module) : FeatureBase(module) +[DependsOn(typeof(WorkflowsFeature))] +[UsedImplicitly] +public class ConnectionsFeatures(IModule module) : FeatureBase(module) { - /// - /// A set of connection types to make available to the system. - /// + /// + /// A set of connection types to make available to the system. + /// public HashSet ConnectionTypes { get; } = []; - /// - public override void Apply() + /// + public override void Apply() { // Obfuscate Connection Properties. Services.AddActivityStateFilter(); @@ -43,13 +43,13 @@ public class ConnectionsFeatures(IModule module) : FeatureBase(module) Services.AddSingleton(); //UIHints - Services.AddScoped(); + Services.AddScoped(); Services.Configure(options => { - foreach (var connectionType in ConnectionTypes.Distinct()) + foreach (var connectionType in ConnectionTypes.Distinct()) options.ConnectionTypes.Add(connectionType); - }); + }); } public override void Configure() { @@ -69,5 +69,5 @@ public class ConnectionsFeatures(IModule module) : FeatureBase(module) return this; } - + } diff --git a/src/modules/Elsa.Connections.Core/Filters/PropertyAttributeFilter.cs b/src/modules/Elsa.Connections.Core/Filters/PropertyAttributeFilter.cs index 398039c3f..14773afa7 100644 --- a/src/modules/Elsa.Connections.Core/Filters/PropertyAttributeFilter.cs +++ b/src/modules/Elsa.Connections.Core/Filters/PropertyAttributeFilter.cs @@ -7,8 +7,6 @@ public class PropertyAttributeFilter : ActivityStateFilterBase { protected override ActivityStateFilterResult OnExecute(ActivityStateFilterContext context) { - var activityExecutionContext = context.ActivityExecutionContext; - var activity = activityExecutionContext.Activity; var inputDescriptor = context.InputDescriptor; if (Attribute.IsDefined(inputDescriptor.PropertyInfo, typeof(NoLogAttribute))) @@ -21,7 +19,7 @@ public class PropertyAttributeFilter : ActivityStateFilterBase var maskedValue = $"**** see connection information for {contextValue} ****"; return Filtered(maskedValue); } - else - return ActivityStateFilterResult.Pass(); + + return ActivityStateFilterResult.Pass(); } } diff --git a/src/modules/Elsa.Connections.Core/Middleware/ConnectionMiddleware.cs b/src/modules/Elsa.Connections.Core/Middleware/ConnectionMiddleware.cs index 48fdf5699..736470521 100644 --- a/src/modules/Elsa.Connections.Core/Middleware/ConnectionMiddleware.cs +++ b/src/modules/Elsa.Connections.Core/Middleware/ConnectionMiddleware.cs @@ -13,7 +13,7 @@ using Elsa.Connections.Persistence.Contracts; namespace Elsa.Connections.Middleware; /// -/// An activity execution middleware component that inject connection property from Connection Name. +/// An activity execution middleware component that injects connection properties from Connection Name. /// [UsedImplicitly] public class ConnectionMiddleware(ActivityMiddlewareDelegate next @@ -22,7 +22,6 @@ public class ConnectionMiddleware(ActivityMiddlewareDelegate next : IActivityExecutionMiddleware { private static JsonSerializerOptions? _serializerOptions; - private readonly ILogger _logger = logger; private static JsonSerializerOptions SerializerOptions => _serializerOptions ??= new JsonSerializerOptions @@ -37,43 +36,36 @@ public class ConnectionMiddleware(ActivityMiddlewareDelegate next if (activityDescriptor.Attributes.Any(attr => attr.GetType() == typeof(ConnectionActivityAttribute))) { - var inputDescriptors = activityDescriptor.Inputs.Where(x => x?.PropertyInfo.PropertyType.GetGenericTypeDefinition() == typeof(ConnectionProperties<>)); + var inputDescriptors = activityDescriptor.Inputs.Where(x => x.PropertyInfo?.PropertyType.GetGenericTypeDefinition() == typeof(ConnectionProperties<>)).ToList(); - if (inputDescriptors != null && inputDescriptors.Any()) + if (inputDescriptors.Count > 0) { - var input = inputDescriptors.First(); - var propertyType = input?.PropertyInfo?.PropertyType.GetGenericArguments()[0]; + var input = inputDescriptors[0]; + var propertyType = input.PropertyInfo?.PropertyType.GetGenericArguments()[0]; - dynamic inputValue = input.ValueGetter(context.Activity); - - var connectionName = (string)inputValue?.ConnectionName; + dynamic inputValue = input.ValueGetter(context.Activity)!; + var connectionName = (string)inputValue.ConnectionName; if (connectionName == null) - LogConnectionExtensions.LogConnectionIsNull(_logger); + LogConnectionExtensions.LogConnectionIsNull(logger); else { //Get connection from store, if exist, var connectionConfiguration = await connectionStore.FindAsync(new Persistence.Filters.ConnectionDefinitionFilter() { Name = connectionName }); if (connectionConfiguration != null) { - dynamic deserializedjson = - JsonSerializer.Deserialize(connectionConfiguration.ConnectionConfiguration, propertyType, SerializerOptions); + dynamic deserializedjson = JsonSerializer.Deserialize(connectionConfiguration.ConnectionConfiguration, propertyType, SerializerOptions); inputValue.Properties = deserializedjson; input.ValueSetter(context.Activity, inputValue); } else - LogConnectionExtensions.LogConnectionNotFound(_logger, connectionName); + LogConnectionExtensions.LogConnectionNotFound(logger, connectionName); } } } await next(context); } - - private static bool IsActivityBookmarked(ActivityExecutionContext context) - { - return context.WorkflowExecutionContext.Bookmarks.Any(b => b.ActivityNodeId.Equals(context.ActivityNode.NodeId)); - } } diff --git a/src/modules/Elsa.Connections.Core/ServiceProvider/ConnectionOptionsProvider.cs b/src/modules/Elsa.Connections.Core/ServiceProvider/ConnectionOptionsProvider.cs index ad5b6539a..71657877e 100644 --- a/src/modules/Elsa.Connections.Core/ServiceProvider/ConnectionOptionsProvider.cs +++ b/src/modules/Elsa.Connections.Core/ServiceProvider/ConnectionOptionsProvider.cs @@ -5,33 +5,28 @@ using Elsa.Workflows.UIHints.Dropdown; namespace Elsa.Connections.ServiceProvider; -public class ConnectionOptionsProvider : DropDownOptionsProviderBase +public class ConnectionOptionsProvider(IConnectionStore store) : DropDownOptionsProviderBase { - private readonly IConnectionStore _store; - - public ConnectionOptionsProvider(IConnectionStore store) - { - _store = store; - } public new async ValueTask> GetUIPropertiesAsync(PropertyInfo propertyInfo, object? context, CancellationToken cancellationToken = default) { var options = await base.GetUIPropertiesAsync(propertyInfo, context, cancellationToken); options.Add("Refresh", true); return options; } + protected override async ValueTask> GetItemsAsync(PropertyInfo propertyInfo, object? context, CancellationToken cancellationToken) { var connection = new List(); - var connectionType = propertyInfo.GetCustomAttribute()?.Type; if (connectionType == null) return connection; - var connections = await _store.FindManyAsync(new Persistence.Filters.ConnectionDefinitionFilter() { Type = connectionType.ToString() }); + var connections = await store.FindManyAsync(new() { Type = connectionType.ToString() }, cancellationToken); foreach(var conn in connections) - connection.Add(new SelectListItem(conn.Name, conn.Name)); + connection.Add(new(conn.Name, conn.Name)); + return connection; } diff --git a/src/modules/Elsa.Connections.Core/Services/ConnectionRegistry.cs b/src/modules/Elsa.Connections.Core/Services/ConnectionRegistry.cs index 6d9293c4e..6c94e1b59 100644 --- a/src/modules/Elsa.Connections.Core/Services/ConnectionRegistry.cs +++ b/src/modules/Elsa.Connections.Core/Services/ConnectionRegistry.cs @@ -1,10 +1,5 @@ -using System; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Linq; +using System.Collections.Concurrent; using System.Reflection; -using System.Text; -using System.Threading.Tasks; using Elsa.Connections.Attributes; using Elsa.Connections.Contracts; using Elsa.Connections.Models; @@ -13,23 +8,17 @@ using Elsa.Workflows.Models; using Microsoft.Extensions.Options; namespace Elsa.Connections.Services; -public class ConnectionRegistry : IConnectionDescriptorRegistry + +public class ConnectionRegistry(IOptions options, IActivityDescriber describer) : IConnectionDescriptorRegistry { - private readonly ConcurrentDictionary _connectionDescriptors = new(); - private readonly ConnectionOptions _options; - private readonly IActivityDescriber _describer; + private readonly ConnectionOptions _options = options.Value; - public ConnectionRegistry(IOptions options, IActivityDescriber describer) - { - _options = options.Value; - _describer = describer; - } public void Add(Type connectionType, ConnectionDescriptor connectionDescriptor) { var descriptor = DescribeConnection(connectionType); - _connectionDescriptors.TryAdd(connectionType, descriptor); + _connectionDescriptors.TryAdd(connectionType, descriptor); } public IEnumerable ListAll() @@ -43,31 +32,29 @@ public class ConnectionRegistry : IConnectionDescriptorRegistry throw new NotImplementedException(); } - public Type Get(string type) + public Type? Get(string type) { - var item = _options.ConnectionTypes.Where(c => c.ToString() == type).FirstOrDefault(); - return item; + return _options.ConnectionTypes.FirstOrDefault(c => c.ToString() == type); } - public async Task> GetConnectionDescriptor(string activityType, CancellationToken cancellationToken = default) + public async Task> GetConnectionDescriptorAsync(string activityType, CancellationToken cancellationToken = default) { - var propertyType2 = Type.GetType(activityType); - var propertyType = Get(activityType); if (propertyType == null) - return null; + return []; - var connectionInputProperty = _describer.GetInputProperties(propertyType); - var connectionInputDescriptor = await DescribeInputPropertiesAsync(connectionInputProperty); + var connectionInputProperty = describer.GetInputProperties(propertyType); + var connectionInputDescriptor = await DescribeInputPropertiesAsync(connectionInputProperty, cancellationToken); return connectionInputDescriptor; } private async Task> DescribeInputPropertiesAsync(IEnumerable properties, CancellationToken cancellationToken = default) { - return await Task.WhenAll(properties.Select(async x => await _describer.DescribeInputPropertyAsync(x, cancellationToken))); + return await Task.WhenAll(properties.Select(async x => await describer.DescribeInputPropertyAsync(x, cancellationToken))); } + private ConnectionDescriptor DescribeConnection(Type connectionType) { var connectionAttribute = connectionType.GetCustomAttribute(); @@ -75,11 +62,11 @@ public class ConnectionRegistry : IConnectionDescriptorRegistry if (connectionAttribute == null) throw new ArgumentNullException($"{connectionType} is not a valid connection, make sure [ConnectionPropertyAttribute] is set "); - return new ConnectionDescriptor( + return new( connectionType.ToString(), - connectionAttribute?.Description, - connectionAttribute.Namespace, + connectionAttribute.Description, + connectionAttribute.Namespace, connectionAttribute.DisplayName - ); + ); } -} +} \ No newline at end of file diff --git a/src/modules/Elsa.Connections.Core/UIHints/ConnexionDropDownUIHintHandler.cs b/src/modules/Elsa.Connections.Core/UIHints/ConnectionDropDownUIHintHandler.cs similarity index 68% rename from src/modules/Elsa.Connections.Core/UIHints/ConnexionDropDownUIHintHandler.cs rename to src/modules/Elsa.Connections.Core/UIHints/ConnectionDropDownUIHintHandler.cs index 12bf6dc6b..060ad752b 100644 --- a/src/modules/Elsa.Connections.Core/UIHints/ConnexionDropDownUIHintHandler.cs +++ b/src/modules/Elsa.Connections.Core/UIHints/ConnectionDropDownUIHintHandler.cs @@ -3,19 +3,19 @@ using Elsa.Workflows; using Elsa.Workflows.UIHints; using Elsa.Workflows.UIHints.Dropdown; -namespace Elsa.Connections.UIHints; - -/// -/// UIHint Handler that use DropDown for Connection Property -/// -public class ConnexionDropDownUIHintHandler : IUIHintHandler +namespace Elsa.Connections.UIHints; + +/// +/// UIHint Handler that use DropDown for Connection Property +/// +public class ConnectionDropDownUIHintHandler : IUIHintHandler { /// - public string UIHint => $"connexion-{InputUIHints.DropDown}"; + public string UIHint => $"connection-{InputUIHints.DropDown}"; /// public ValueTask> GetPropertyUIHandlersAsync(PropertyInfo propertyInfo, CancellationToken cancellationToken) { - return new(new[] { typeof(StaticDropDownOptionsProvider) }); + return new([typeof(StaticDropDownOptionsProvider)]); } } \ No newline at end of file diff --git a/src/modules/Elsa.Connections.Models/ConnectionDescriptor.cs b/src/modules/Elsa.Connections.Models/ConnectionDescriptor.cs index e9b536a4d..b79c1a516 100644 --- a/src/modules/Elsa.Connections.Models/ConnectionDescriptor.cs +++ b/src/modules/Elsa.Connections.Models/ConnectionDescriptor.cs @@ -1,3 +1,3 @@ namespace Elsa.Connections.Models; -public record ConnectionDescriptor(string type, string description, string @namespace, string providerName); +public record ConnectionDescriptor(string Type, string? Description, string? Namespace, string? ProviderName); diff --git a/src/modules/Elsa.Connections.Models/ConnectionInputModel.cs b/src/modules/Elsa.Connections.Models/ConnectionInputModel.cs index 6bd1826cf..497cdb1a8 100644 --- a/src/modules/Elsa.Connections.Models/ConnectionInputModel.cs +++ b/src/modules/Elsa.Connections.Models/ConnectionInputModel.cs @@ -3,29 +3,25 @@ using System.Text.Json.Nodes; namespace Elsa.Connections.Models; - public class ConnectionInputModel { /// /// The Name of the Connection /// - [Required] - public string Name { get; set; } = default; + [Required] public string Name { get; set; } = null!; /// /// The Description of the Connection /// - public string? Description { get; set; } = default; - - + public string? Description { get; set; } + /// /// The Configuration of the Connection in a Json Format /// - public JsonObject ConnectionConfiguration { get; set; } + public JsonObject ConnectionConfiguration { get; set; } = new(); /// /// The Connection Type Name /// - [Required] - public string ConnectionType { get; set; } -} + [Required] public string ConnectionType { get; set; } = null!; +} \ No newline at end of file diff --git a/src/modules/Elsa.Connections.Models/ConnectionModel.cs b/src/modules/Elsa.Connections.Models/ConnectionModel.cs index 0373b81e6..6caa8959f 100644 --- a/src/modules/Elsa.Connections.Models/ConnectionModel.cs +++ b/src/modules/Elsa.Connections.Models/ConnectionModel.cs @@ -7,5 +7,5 @@ public class ConnectionModel : ConnectionInputModel /// /// The Id of the Connection /// - [Required] public string Id { get; set; } = default!; + [Required] public string Id { get; set; } = null!; } \ No newline at end of file diff --git a/src/modules/Elsa.Connections.Models/ConnectionProperties.cs b/src/modules/Elsa.Connections.Models/ConnectionProperties.cs index f64a61462..ebed4e6d7 100644 --- a/src/modules/Elsa.Connections.Models/ConnectionProperties.cs +++ b/src/modules/Elsa.Connections.Models/ConnectionProperties.cs @@ -15,6 +15,6 @@ public class ConnectionProperties where T : class, new() public string? ConnectionName { get; set; } [JsonIgnore] - public T Properties { get; set; } = new T(); + public T Properties { get; set; } = new(); } diff --git a/src/modules/Elsa.Connections.Persistence.EntityFrameworkCore/EFCoreConnectionStore.cs b/src/modules/Elsa.Connections.Persistence.EntityFrameworkCore/EFCoreConnectionStore.cs index b7eea5679..bfe4a6203 100644 --- a/src/modules/Elsa.Connections.Persistence.EntityFrameworkCore/EFCoreConnectionStore.cs +++ b/src/modules/Elsa.Connections.Persistence.EntityFrameworkCore/EFCoreConnectionStore.cs @@ -15,24 +15,24 @@ public class EFCoreConnectionStore(EntityStore GetAsync(string id, CancellationToken cancellationToken = default) + public Task GetAsync(string id, CancellationToken cancellationToken = default) { var filter = new ConnectionDefinitionFilter { Id = id - }; - + }; + return FindAsync(filter, cancellationToken); } - public Task FindAsync(ConnectionDefinitionFilter filter, CancellationToken cancellationToken = default) + public Task FindAsync(ConnectionDefinitionFilter filter, CancellationToken cancellationToken = default) { return store.FindAsync(filter.Apply, cancellationToken); } @@ -45,10 +45,10 @@ public class EFCoreConnectionStore(EntityStore> FindManyAsync(ConnectionDefinitionFilter filter, CancellationToken cancellationToken = default) - { - return store.QueryAsync(filter.Apply, cancellationToken); - } + } + + public Task> FindManyAsync(ConnectionDefinitionFilter filter, CancellationToken cancellationToken = default) + { + return store.QueryAsync(filter.Apply, cancellationToken); + } } \ No newline at end of file diff --git a/src/modules/Elsa.Connections.Persistence/Contracts/IConnectionStore.cs b/src/modules/Elsa.Connections.Persistence/Contracts/IConnectionStore.cs index c7746480a..1e4b63cb4 100644 --- a/src/modules/Elsa.Connections.Persistence/Contracts/IConnectionStore.cs +++ b/src/modules/Elsa.Connections.Persistence/Contracts/IConnectionStore.cs @@ -1,39 +1,14 @@ -using Elsa.Connections.Models; -using Elsa.Connections.Persistence.Filters; +using Elsa.Connections.Persistence.Filters; using Elsa.Connections.Persistence.Entities; namespace Elsa.Connections.Persistence.Contracts; -public interface IConnectionStoreEx -{ - /// - /// Get The Connection from the Store - /// - /// - /// - /// - public Task GetConnectionAsync(string name, CancellationToken cancellationToken = default); - - /// - /// Get All Connections from the store - /// - /// - /// - public Task> GetConnectionsAsync(CancellationToken cancellationToken = default); - public Task> GetConnectionsFromTypeAsync(string type, CancellationToken cancellationToken = default); - - public Task AddConnectionConfigurationAsync(ConnectionDefinition model, CancellationToken cancellationToken = default); - - public Task UpdateConnectionAsync(string name, ConnectionDefinition model, CancellationToken cancellationToken = default); - public Task DeleteConnectionConfigurationAsync(string id, CancellationToken cancellationToken = default); -} - public interface IConnectionStore { /// /// Get The Connection from the Store /// - public Task GetAsync(string id, CancellationToken cancellationToken = default); + public Task GetAsync(string id, CancellationToken cancellationToken = default); /// /// Get All Connections from the store @@ -43,7 +18,7 @@ public interface IConnectionStore /// /// Get All connection using Filter /// - public Task FindAsync(ConnectionDefinitionFilter filter, CancellationToken cancellationToken = default); + public Task FindAsync(ConnectionDefinitionFilter filter, CancellationToken cancellationToken = default); /// /// Get All connection using Filter diff --git a/src/modules/Elsa.Connections.Persistence/Entities/ConnectionDefinition.cs b/src/modules/Elsa.Connections.Persistence/Entities/ConnectionDefinition.cs index 25fbe5ef2..15a1e46ff 100644 --- a/src/modules/Elsa.Connections.Persistence/Entities/ConnectionDefinition.cs +++ b/src/modules/Elsa.Connections.Persistence/Entities/ConnectionDefinition.cs @@ -1,30 +1,27 @@ -using System.ComponentModel.DataAnnotations; -using System.Text.Json.Nodes; +using System.Text.Json.Nodes; using Elsa.Common.Entities; namespace Elsa.Connections.Persistence.Entities; - public class ConnectionDefinition : Entity { /// /// The Name of the Connection /// - public string Name { get; set; } = default!; + public string Name { get; set; } = null!; /// /// The Description of the Connection /// - public string? Description { get; set; } = default; - + public string? Description { get; set; } /// /// The Configuration of the Connection in a Json Format /// - public JsonObject ConnectionConfiguration { get; set; } + public JsonObject ConnectionConfiguration { get; set; } = new(); /// /// The Connection Type Name /// - public string ConnectionType { get; set; } + public string ConnectionType { get; set; } = null!; } \ No newline at end of file diff --git a/src/modules/Elsa.Connections.Persistence/Extensions/ConnectionPersistenceExtensions.cs b/src/modules/Elsa.Connections.Persistence/Extensions/ConnectionPersistenceExtensions.cs index 33c8699a1..af3eb822b 100644 --- a/src/modules/Elsa.Connections.Persistence/Extensions/ConnectionPersistenceExtensions.cs +++ b/src/modules/Elsa.Connections.Persistence/Extensions/ConnectionPersistenceExtensions.cs @@ -1,12 +1,7 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Elsa.Connections.Persistence.Features; +using Elsa.Connections.Persistence.Features; using Elsa.Features.Services; - +// ReSharper disable once CheckNamespace namespace Elsa.Extensions; /// diff --git a/src/modules/Elsa.Connections.Persistence/Features/ConnectionPersistenceFeature.cs b/src/modules/Elsa.Connections.Persistence/Features/ConnectionPersistenceFeature.cs index b73cffca7..b93658e06 100644 --- a/src/modules/Elsa.Connections.Persistence/Features/ConnectionPersistenceFeature.cs +++ b/src/modules/Elsa.Connections.Persistence/Features/ConnectionPersistenceFeature.cs @@ -1,17 +1,14 @@ -using Elsa.Common.Features; -using Elsa.Extensions; -using Elsa.Features.Abstractions; -using Elsa.Features.Attributes; -using Elsa.Features.Services; +using Elsa.Extensions; +using Elsa.Features.Abstractions; +using Elsa.Features.Services; using Microsoft.Extensions.DependencyInjection; using Elsa.Connections.Persistence.Contracts; -using Elsa.Connections.Persistence.Services; -using Elsa.Connections.Models; -using Elsa.Connections.Persistence.Entities; - -namespace Elsa.Connections.Persistence.Features; - -public class ConnectionPersistenceFeature(IModule module) : FeatureBase(module) +using Elsa.Connections.Persistence.Services; +using Elsa.Connections.Persistence.Entities; + +namespace Elsa.Connections.Persistence.Features; + +public class ConnectionPersistenceFeature(IModule module) : FeatureBase(module) { private Func _connectionStoreFactory = sp => sp.GetRequiredService(); @@ -27,5 +24,5 @@ public class ConnectionPersistenceFeature(IModule module) : FeatureBase(module) Services .AddMemoryStore(); - } + } } \ No newline at end of file diff --git a/src/modules/Elsa.Connections.Persistence/Filters/ConnectionDefinitionFilter.cs b/src/modules/Elsa.Connections.Persistence/Filters/ConnectionDefinitionFilter.cs index 08aa1c52c..021a519cb 100644 --- a/src/modules/Elsa.Connections.Persistence/Filters/ConnectionDefinitionFilter.cs +++ b/src/modules/Elsa.Connections.Persistence/Filters/ConnectionDefinitionFilter.cs @@ -1,17 +1,10 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Elsa.Connections.Models; -using Elsa.Connections.Persistence.Entities; +using Elsa.Connections.Persistence.Entities; namespace Elsa.Connections.Persistence.Filters; public class ConnectionDefinitionFilter { public string? Id { get; set; } public string? Name { get; set; } - public string? NotId { get; set; } public string? Type { get; set; } diff --git a/src/modules/Elsa.Connections.Persistence/Services/InMemoryConnectionStore.cs b/src/modules/Elsa.Connections.Persistence/Services/InMemoryConnectionStore.cs index d79c26119..3a9af9fa7 100644 --- a/src/modules/Elsa.Connections.Persistence/Services/InMemoryConnectionStore.cs +++ b/src/modules/Elsa.Connections.Persistence/Services/InMemoryConnectionStore.cs @@ -1,16 +1,17 @@ using Elsa.Common.Services; -using Elsa.Connections.Models; using Elsa.Connections.Persistence.Contracts; using Elsa.Connections.Persistence.Filters; using Elsa.Connections.Persistence.Entities; +using JetBrains.Annotations; namespace Elsa.Connections.Persistence.Services; +[UsedImplicitly] public class InMemoryConnectionStore(MemoryStore memoryStore) : IConnectionStore { public Task AddAsync(ConnectionDefinition model, CancellationToken cancellationToken = default) { - memoryStore.Add(model, model => model.Id); + memoryStore.Add(model, x => x.Id); return Task.CompletedTask; } @@ -20,9 +21,9 @@ public class InMemoryConnectionStore(MemoryStore memorySto return Task.CompletedTask; } - public Task GetAsync(string Id, CancellationToken cancellationToken = default) + public Task GetAsync(string id, CancellationToken cancellationToken = default) { - var result = memoryStore.Find(c => c.Id == Id); + var result = memoryStore.Find(c => c.Id == id); return Task.FromResult(result); } @@ -31,10 +32,10 @@ public class InMemoryConnectionStore(MemoryStore memorySto var results = memoryStore.List(); return Task.FromResult(results); } - public Task FindAsync(ConnectionDefinitionFilter filter, CancellationToken cancellationToken = default) + public Task FindAsync(ConnectionDefinitionFilter filter, CancellationToken cancellationToken = default) { - var entities = memoryStore.Query(filter.Apply).FirstOrDefault(); - return Task.FromResult(entities); + var entity = memoryStore.Query(filter.Apply).FirstOrDefault(); + return Task.FromResult(entity); } public Task> FindManyAsync(ConnectionDefinitionFilter filter, CancellationToken cancellationToken = default) @@ -45,7 +46,7 @@ public class InMemoryConnectionStore(MemoryStore memorySto public Task UpdateAsync(ConnectionDefinition model, CancellationToken cancellationToken = default) { - memoryStore.Update(model, model => model.Id); + memoryStore.Update(model, x => x.Id); return Task.CompletedTask; } }