From 7460a3158665c402563ae833ccb761dceb0d2635 Mon Sep 17 00:00:00 2001 From: Phil Schneider Date: Thu, 11 Jan 2024 13:40:36 +0100 Subject: [PATCH] feat(mailing): adjust mail process creation Refs: CPLP-3383 --- src/Portal.Backend.sln | 62 ++--- .../Administration.Service.csproj | 1 + .../BusinessLogic/CompanyDataBusinessLogic.cs | 18 +- .../RegistrationBusinessLogic.cs | 10 +- .../BusinessLogic/UserBusinessLogic.cs | 19 +- .../BusinessLogic/UserUploadBusinessLogic.cs | 16 +- .../Framework.Web/Framework.Web.csproj | 1 + .../Framework.Web/StartupServiceExtensions.cs | 2 + .../Mailing.Service/IRoleBaseMailService.cs | 1 - .../Mailing.Service/RoleBaseMailService.cs | 41 ---- .../OfferSetupServiceExtensions.cs | 4 +- .../Offers.Library/Offers.Library.csproj | 2 +- .../Offers.Library/Service/OfferService.cs | 14 +- .../Service/OfferSetupService.cs | 12 +- .../Service/OfferSubscriptionService.cs | 12 +- .../CompanyInvitationRepository.cs | 10 - .../ICompanyInvitationRepository.cs | 1 - .../IInvitationProcessService.cs | 1 - .../Invitation.Executor.csproj | 1 + .../InvitationProcessService.cs | 59 ++--- .../InvitationProcessTypeExecutor.cs | 2 - .../MailingProcessCollectionExtensions.cs | 2 - .../Mailing.Executor.csproj} | 0 .../MailingProcessTypeExecutor.cs | 0 ...ilingProcessCreationDependencyInjection.cs | 29 +++ .../IMailingProcessCreation.cs | 28 +++ .../Mailing.Library/Mailing.Library.csproj | 34 +++ .../Mailing.Library/MailingProcessCreation.cs | 86 +++++++ .../NetworkRegistration.Library.csproj | 1 + .../NetworkRegistrationHandler.cs | 10 +- .../Processes.Worker/Processes.Worker.csproj | 2 +- .../Provisioning.Mail/UserEmailSettings.cs | 4 +- .../ApplicationActivation.Library.csproj | 1 + .../ApplicationActivationService.cs | 8 +- .../RegistrationBusinessLogic.cs | 20 +- .../Registration.Service/Program.cs | 1 - .../Registration.Service.csproj | 1 + .../CompanyDataBusinessLogicTests.cs | 28 +-- .../RegistrationBusinessLogicTest.cs | 12 +- .../BusinessLogic/UserBusinessLogicTests.cs | 58 +++-- .../UserUploadBusinessLogicTests.cs | 51 ++--- .../Mailing.Service.Tests.csproj | 23 +- .../Offers.Library.Tests.csproj | 1 - .../Service/OfferServiceTests.cs | 12 +- .../Service/OfferSetupServiceTests.cs | 18 +- .../Service/OfferSubscriptionServiceTests.cs | 13 +- .../CompanyInvitationRepositoryTests.cs | 32 --- .../InvitationProcessServiceTests.cs | 90 +------- .../InvitationProcessTypeExecutorTests.cs | 5 +- .../Mailing.Library.Tests/GlobalUsings.cs | 1 + .../Mailing.Library.Tests.csproj | 54 +++++ .../RoleBaseMailServiceTests.cs | 165 ++++++++++++++ .../NetworkRegistrationHandlerTests.cs | 17 +- .../ApplicationActivationTests.cs | 24 +- .../RegistrationBusinessLogicTest.cs | 214 ++++++++++-------- 55 files changed, 770 insertions(+), 564 deletions(-) rename src/processes/{Mailing.Executer => Mailing.Executor}/DependencyInjection/MailingProcessCollectionExtensions.cs (93%) rename src/processes/{Mailing.Executer/Mailing.Executer.csproj => Mailing.Executor/Mailing.Executor.csproj} (100%) rename src/processes/{Mailing.Executer => Mailing.Executor}/MailingProcessTypeExecutor.cs (100%) create mode 100644 src/processes/Mailing.Library/DependencyInjection/MailingProcessCreationDependencyInjection.cs create mode 100644 src/processes/Mailing.Library/IMailingProcessCreation.cs create mode 100644 src/processes/Mailing.Library/Mailing.Library.csproj create mode 100644 src/processes/Mailing.Library/MailingProcessCreation.cs create mode 100644 tests/processes/Mailing.Library.Tests/GlobalUsings.cs create mode 100644 tests/processes/Mailing.Library.Tests/Mailing.Library.Tests.csproj create mode 100644 tests/processes/Mailing.Library.Tests/RoleBaseMailServiceTests.cs diff --git a/src/Portal.Backend.sln b/src/Portal.Backend.sln index d77b8b353b..5908040479 100644 --- a/src/Portal.Backend.sln +++ b/src/Portal.Backend.sln @@ -212,10 +212,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Keycloak.Seeding", "keycloa EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Keycloak.Seeding.Tests", "..\tests\keycloak\Keycloak.Seeding.Tests\Keycloak.Seeding.Tests.csproj", "{A5BEDD89-7280-466E-8D14-EC5E177AAD07}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Mailing.Service", "mailing\Mailing.Service\Mailing.Service.csproj", "{6113B579-C995-47F8-9AC1-4CC6EFDDD883}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Mailing.Service.Tests", "..\tests\mailing\Mailing.Service.Tests\Mailing.Service.Tests.csproj", "{1EAF34DA-6D16-4F5E-86F4-344185F53942}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetworkRegistration.Executor", "processes\NetworkRegistration.Executor\NetworkRegistration.Executor.csproj", "{19639645-A115-4824-865F-5559DA8B892A}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetworkRegistration.Library.Tests", "..\tests\processes\NetworkRegistration.Library.Tests\NetworkRegistration.Library.Tests.csproj", "{3B41408A-CDFE-4EEE-9660-FE6755FD2075}" @@ -236,7 +232,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Registration.Common", "regi EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Keycloak.Authentication.Tests", "..\tests\keycloak\Keycloak.Authentication.Tests\Keycloak.Authentication.Tests.csproj", "{C7ACF748-DEF4-4646-A791-F1DA437CC965}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Mailing.Executer", "processes\Mailing.Executer\Mailing.Executer.csproj", "{D666EADA-770A-42FF-B891-5745F7A6BC2F}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Mailing.Executor", "processes\Mailing.Executor\Mailing.Executor.csproj", "{D666EADA-770A-42FF-B891-5745F7A6BC2F}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Invitation.Executor", "processes\Invitation.Executor\Invitation.Executor.csproj", "{0551F0AF-5373-4516-87AA-01D7FFD29C0D}" EndProject @@ -250,6 +246,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Provisioning.Library", "ext EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ExternalSystems.Provisioning.Library.Tests", "..\tests\externalsystems\ExternalSystems.Provisioning.Library.Tests\ExternalSystems.Provisioning.Library.Tests.csproj", "{B6A2A753-5876-4C6C-8CC2-151B022C87F7}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Mailing.Library", "processes\Mailing.Library\Mailing.Library.csproj", "{F2F9E057-668E-43BB-B3EB-10E8DE8E7BB4}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Mailing.Library.Tests", "..\tests\processes\Mailing.Library.Tests\Mailing.Library.Tests.csproj", "{07BDC20D-23DD-4C0E-9C3D-B1D232AF17E3}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -1364,30 +1364,6 @@ Global {A5BEDD89-7280-466E-8D14-EC5E177AAD07}.Release|x64.Build.0 = Release|Any CPU {A5BEDD89-7280-466E-8D14-EC5E177AAD07}.Release|x86.ActiveCfg = Release|Any CPU {A5BEDD89-7280-466E-8D14-EC5E177AAD07}.Release|x86.Build.0 = Release|Any CPU - {6113B579-C995-47F8-9AC1-4CC6EFDDD883}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6113B579-C995-47F8-9AC1-4CC6EFDDD883}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6113B579-C995-47F8-9AC1-4CC6EFDDD883}.Debug|x64.ActiveCfg = Debug|Any CPU - {6113B579-C995-47F8-9AC1-4CC6EFDDD883}.Debug|x64.Build.0 = Debug|Any CPU - {6113B579-C995-47F8-9AC1-4CC6EFDDD883}.Debug|x86.ActiveCfg = Debug|Any CPU - {6113B579-C995-47F8-9AC1-4CC6EFDDD883}.Debug|x86.Build.0 = Debug|Any CPU - {6113B579-C995-47F8-9AC1-4CC6EFDDD883}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6113B579-C995-47F8-9AC1-4CC6EFDDD883}.Release|Any CPU.Build.0 = Release|Any CPU - {6113B579-C995-47F8-9AC1-4CC6EFDDD883}.Release|x64.ActiveCfg = Release|Any CPU - {6113B579-C995-47F8-9AC1-4CC6EFDDD883}.Release|x64.Build.0 = Release|Any CPU - {6113B579-C995-47F8-9AC1-4CC6EFDDD883}.Release|x86.ActiveCfg = Release|Any CPU - {6113B579-C995-47F8-9AC1-4CC6EFDDD883}.Release|x86.Build.0 = Release|Any CPU - {1EAF34DA-6D16-4F5E-86F4-344185F53942}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1EAF34DA-6D16-4F5E-86F4-344185F53942}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1EAF34DA-6D16-4F5E-86F4-344185F53942}.Debug|x64.ActiveCfg = Debug|Any CPU - {1EAF34DA-6D16-4F5E-86F4-344185F53942}.Debug|x64.Build.0 = Debug|Any CPU - {1EAF34DA-6D16-4F5E-86F4-344185F53942}.Debug|x86.ActiveCfg = Debug|Any CPU - {1EAF34DA-6D16-4F5E-86F4-344185F53942}.Debug|x86.Build.0 = Debug|Any CPU - {1EAF34DA-6D16-4F5E-86F4-344185F53942}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1EAF34DA-6D16-4F5E-86F4-344185F53942}.Release|Any CPU.Build.0 = Release|Any CPU - {1EAF34DA-6D16-4F5E-86F4-344185F53942}.Release|x64.ActiveCfg = Release|Any CPU - {1EAF34DA-6D16-4F5E-86F4-344185F53942}.Release|x64.Build.0 = Release|Any CPU - {1EAF34DA-6D16-4F5E-86F4-344185F53942}.Release|x86.ActiveCfg = Release|Any CPU - {1EAF34DA-6D16-4F5E-86F4-344185F53942}.Release|x86.Build.0 = Release|Any CPU {19639645-A115-4824-865F-5559DA8B892A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {19639645-A115-4824-865F-5559DA8B892A}.Debug|Any CPU.Build.0 = Debug|Any CPU {19639645-A115-4824-865F-5559DA8B892A}.Debug|x64.ActiveCfg = Debug|Any CPU @@ -1592,6 +1568,30 @@ Global {B6A2A753-5876-4C6C-8CC2-151B022C87F7}.Release|x64.Build.0 = Release|Any CPU {B6A2A753-5876-4C6C-8CC2-151B022C87F7}.Release|x86.ActiveCfg = Release|Any CPU {B6A2A753-5876-4C6C-8CC2-151B022C87F7}.Release|x86.Build.0 = Release|Any CPU + {F2F9E057-668E-43BB-B3EB-10E8DE8E7BB4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F2F9E057-668E-43BB-B3EB-10E8DE8E7BB4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F2F9E057-668E-43BB-B3EB-10E8DE8E7BB4}.Debug|x64.ActiveCfg = Debug|Any CPU + {F2F9E057-668E-43BB-B3EB-10E8DE8E7BB4}.Debug|x64.Build.0 = Debug|Any CPU + {F2F9E057-668E-43BB-B3EB-10E8DE8E7BB4}.Debug|x86.ActiveCfg = Debug|Any CPU + {F2F9E057-668E-43BB-B3EB-10E8DE8E7BB4}.Debug|x86.Build.0 = Debug|Any CPU + {F2F9E057-668E-43BB-B3EB-10E8DE8E7BB4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F2F9E057-668E-43BB-B3EB-10E8DE8E7BB4}.Release|Any CPU.Build.0 = Release|Any CPU + {F2F9E057-668E-43BB-B3EB-10E8DE8E7BB4}.Release|x64.ActiveCfg = Release|Any CPU + {F2F9E057-668E-43BB-B3EB-10E8DE8E7BB4}.Release|x64.Build.0 = Release|Any CPU + {F2F9E057-668E-43BB-B3EB-10E8DE8E7BB4}.Release|x86.ActiveCfg = Release|Any CPU + {F2F9E057-668E-43BB-B3EB-10E8DE8E7BB4}.Release|x86.Build.0 = Release|Any CPU + {07BDC20D-23DD-4C0E-9C3D-B1D232AF17E3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {07BDC20D-23DD-4C0E-9C3D-B1D232AF17E3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {07BDC20D-23DD-4C0E-9C3D-B1D232AF17E3}.Debug|x64.ActiveCfg = Debug|Any CPU + {07BDC20D-23DD-4C0E-9C3D-B1D232AF17E3}.Debug|x64.Build.0 = Debug|Any CPU + {07BDC20D-23DD-4C0E-9C3D-B1D232AF17E3}.Debug|x86.ActiveCfg = Debug|Any CPU + {07BDC20D-23DD-4C0E-9C3D-B1D232AF17E3}.Debug|x86.Build.0 = Debug|Any CPU + {07BDC20D-23DD-4C0E-9C3D-B1D232AF17E3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {07BDC20D-23DD-4C0E-9C3D-B1D232AF17E3}.Release|Any CPU.Build.0 = Release|Any CPU + {07BDC20D-23DD-4C0E-9C3D-B1D232AF17E3}.Release|x64.ActiveCfg = Release|Any CPU + {07BDC20D-23DD-4C0E-9C3D-B1D232AF17E3}.Release|x64.Build.0 = Release|Any CPU + {07BDC20D-23DD-4C0E-9C3D-B1D232AF17E3}.Release|x86.ActiveCfg = Release|Any CPU + {07BDC20D-23DD-4C0E-9C3D-B1D232AF17E3}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -1603,7 +1603,6 @@ Global {996CAB8C-B43A-4E76-B906-034A395C1429} = {323C198D-A8C6-4EB0-8B79-72624275E35F} {146865E5-7DFF-4CC2-8521-9E22CFCEEA20} = {323C198D-A8C6-4EB0-8B79-72624275E35F} {A43B5ACA-1209-46E9-84DB-A48553ED623E} = {323C198D-A8C6-4EB0-8B79-72624275E35F} - {1EAF34DA-6D16-4F5E-86F4-344185F53942} = {323C198D-A8C6-4EB0-8B79-72624275E35F} {A5BEDD89-7280-466E-8D14-EC5E177AAD07} = {323C198D-A8C6-4EB0-8B79-72624275E35F} {EA9BA26E-83F6-47C4-BA3B-880AF1AD6A82} = {323C198D-A8C6-4EB0-8B79-72624275E35F} {4B40193E-2C67-4DC4-8EF4-3286DAA01D8B} = {323C198D-A8C6-4EB0-8B79-72624275E35F} @@ -1696,7 +1695,6 @@ Global {47E089E3-E875-4045-9E58-C1223BE899E9} = {23500169-FC01-4D2B-A997-E7FAE2169FC0} {9D574E57-75A6-4965-AF23-ACE0BB9CD0B3} = {323C198D-A8C6-4EB0-8B79-72624275E35F} {E1D41A07-F468-4D13-8185-35F127230B17} = {46383371-8252-4598-9350-A97692851408} - {6113B579-C995-47F8-9AC1-4CC6EFDDD883} = {68D43DB1-DFC5-4F15-A2B4-6BA18B875F9E} {19639645-A115-4824-865F-5559DA8B892A} = {282CEF03-292F-4A49-83C6-997567D0FF5F} {3B41408A-CDFE-4EEE-9660-FE6755FD2075} = {323C198D-A8C6-4EB0-8B79-72624275E35F} {C53EAB34-1F66-48F8-88AB-226BE142D1CF} = {282CEF03-292F-4A49-83C6-997567D0FF5F} @@ -1711,5 +1709,7 @@ Global {BF8EB6BB-E8CA-423C-AC50-01FB44D0D08B} = {323C198D-A8C6-4EB0-8B79-72624275E35F} {16E69264-C872-41EB-9914-112416D1220C} = {C8957230-4203-452C-A085-34091C5E370B} {B6A2A753-5876-4C6C-8CC2-151B022C87F7} = {323C198D-A8C6-4EB0-8B79-72624275E35F} + {F2F9E057-668E-43BB-B3EB-10E8DE8E7BB4} = {282CEF03-292F-4A49-83C6-997567D0FF5F} + {07BDC20D-23DD-4C0E-9C3D-B1D232AF17E3} = {323C198D-A8C6-4EB0-8B79-72624275E35F} EndGlobalSection EndGlobal diff --git a/src/administration/Administration.Service/Administration.Service.csproj b/src/administration/Administration.Service/Administration.Service.csproj index 7f95b4a5ba..2c77edec10 100644 --- a/src/administration/Administration.Service/Administration.Service.csproj +++ b/src/administration/Administration.Service/Administration.Service.csproj @@ -54,6 +54,7 @@ + diff --git a/src/administration/Administration.Service/BusinessLogic/CompanyDataBusinessLogic.cs b/src/administration/Administration.Service/BusinessLogic/CompanyDataBusinessLogic.cs index 15c0fb8d2b..ba9f816736 100644 --- a/src/administration/Administration.Service/BusinessLogic/CompanyDataBusinessLogic.cs +++ b/src/administration/Administration.Service/BusinessLogic/CompanyDataBusinessLogic.cs @@ -35,6 +35,7 @@ using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.DBAccess.Repositories; using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Enums; using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Identities; +using Org.Eclipse.TractusX.Portal.Backend.Processes.Mailing.Library; using System.Globalization; using System.Text.Json; @@ -48,6 +49,7 @@ public class CompanyDataBusinessLogic : ICompanyDataBusinessLogic private readonly ICustodianService _custodianService; private readonly IDateTimeProvider _dateTimeProvider; private readonly IIdentityData _identityData; + private readonly IMailingProcessCreation _mailingProcessCreation; private readonly CompanyDataSettings _settings; /// @@ -57,13 +59,15 @@ public class CompanyDataBusinessLogic : ICompanyDataBusinessLogic /// /// /// + /// /// - public CompanyDataBusinessLogic(IPortalRepositories portalRepositories, ICustodianService custodianService, IDateTimeProvider dateTimeProvider, IIdentityService identityService, IOptions options) + public CompanyDataBusinessLogic(IPortalRepositories portalRepositories, ICustodianService custodianService, IDateTimeProvider dateTimeProvider, IIdentityService identityService, IMailingProcessCreation mailingProcessCreation, IOptions options) { _portalRepositories = portalRepositories; _custodianService = custodianService; _dateTimeProvider = dateTimeProvider; _identityData = identityService.IdentityData; + _mailingProcessCreation = mailingProcessCreation; _settings = options.Value; } @@ -430,9 +434,6 @@ public async Task ApproveCredential(Guid credentialId, CancellationToken cancell if (!string.IsNullOrWhiteSpace(data.RequesterData.RequesterEmail)) { - var processStepRepository = _portalRepositories.GetInstance(); - var processId = processStepRepository.CreateProcess(ProcessTypeId.MAILING).Id; - processStepRepository.CreateProcessStep(ProcessStepTypeId.SEND_MAIL, ProcessStepStatusId.TODO, processId); var userName = string.Join(" ", new[] { data.RequesterData.Firstname, data.RequesterData.Lastname }.Where(item => !string.IsNullOrWhiteSpace(item))); var mailParameters = new Dictionary { @@ -442,8 +443,7 @@ public async Task ApproveCredential(Guid credentialId, CancellationToken cancell { "credentialType", typeValue }, { "expiryDate", data.ExpiryDate == null ? string.Empty : data.ExpiryDate.Value.ToString("o", CultureInfo.InvariantCulture) } }; - - _portalRepositories.GetInstance().CreateMailingInformation(processId, data.RequesterData.RequesterEmail, "CredentialApproval", mailParameters); + _mailingProcessCreation.CreateMailProcess(data.RequesterData.RequesterEmail, "CredentialApproval", mailParameters); } await _portalRepositories.SaveAsync().ConfigureAwait(false); } @@ -483,17 +483,13 @@ public async Task RejectCredential(Guid credentialId) if (!string.IsNullOrWhiteSpace(requesterEmail)) { - var processStepRepository = _portalRepositories.GetInstance(); - var processId = processStepRepository.CreateProcess(ProcessTypeId.MAILING).Id; - processStepRepository.CreateProcessStep(ProcessStepTypeId.SEND_MAIL, ProcessStepStatusId.TODO, processId); var userName = string.Join(" ", new[] { requesterFirstname, requesterLastname }.Where(item => !string.IsNullOrWhiteSpace(item))); var mailParameters = new Dictionary { { "userName", !string.IsNullOrWhiteSpace(userName) ? userName : requesterEmail }, { "requestName", typeValue } }; - - _portalRepositories.GetInstance().CreateMailingInformation(processId, requesterEmail, "CredentialRejected", mailParameters); + _mailingProcessCreation.CreateMailProcess(requesterEmail, "CredentialRejected", mailParameters); } await _portalRepositories.SaveAsync().ConfigureAwait(false); diff --git a/src/administration/Administration.Service/BusinessLogic/RegistrationBusinessLogic.cs b/src/administration/Administration.Service/BusinessLogic/RegistrationBusinessLogic.cs index 4234bf17d9..3218fac284 100644 --- a/src/administration/Administration.Service/BusinessLogic/RegistrationBusinessLogic.cs +++ b/src/administration/Administration.Service/BusinessLogic/RegistrationBusinessLogic.cs @@ -33,6 +33,7 @@ using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Entities; using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Enums; using Org.Eclipse.TractusX.Portal.Backend.Processes.ApplicationChecklist.Library; +using Org.Eclipse.TractusX.Portal.Backend.Processes.Mailing.Library; using Org.Eclipse.TractusX.Portal.Backend.Provisioning.Library; using Org.Eclipse.TractusX.Portal.Backend.SdFactory.Library.BusinessLogic; using Org.Eclipse.TractusX.Portal.Backend.SdFactory.Library.Models; @@ -50,6 +51,7 @@ public sealed class RegistrationBusinessLogic : IRegistrationBusinessLogic private readonly IClearinghouseBusinessLogic _clearinghouseBusinessLogic; private readonly ISdFactoryBusinessLogic _sdFactoryBusinessLogic; private readonly IProvisioningManager _provisioningManager; + private readonly IMailingProcessCreation _mailingProcessCreation; private readonly ILogger _logger; public RegistrationBusinessLogic( @@ -59,6 +61,7 @@ public RegistrationBusinessLogic( IClearinghouseBusinessLogic clearinghouseBusinessLogic, ISdFactoryBusinessLogic sdFactoryBusinessLogic, IProvisioningManager provisioningManager, + IMailingProcessCreation mailingProcessCreation, ILogger logger) { _portalRepositories = portalRepositories; @@ -67,6 +70,7 @@ public RegistrationBusinessLogic( _clearinghouseBusinessLogic = clearinghouseBusinessLogic; _sdFactoryBusinessLogic = sdFactoryBusinessLogic; _provisioningManager = provisioningManager; + _mailingProcessCreation = mailingProcessCreation; _logger = logger; } @@ -505,10 +509,6 @@ private async Task PostRegistrationCancelEmailAsync(Guid applicationId, string c throw new ConflictException($"user {userName} has no assigned email"); } - var processStepRepository = _portalRepositories.GetInstance(); - var processId = processStepRepository.CreateProcess(ProcessTypeId.MAILING).Id; - processStepRepository.CreateProcessStep(ProcessStepTypeId.SEND_MAIL, ProcessStepStatusId.TODO, processId); - var mailParameters = new Dictionary { { "userName", !string.IsNullOrWhiteSpace(userName) ? userName : user.Email }, @@ -516,7 +516,7 @@ private async Task PostRegistrationCancelEmailAsync(Guid applicationId, string c { "declineComment", comment}, { "helpUrl", _settings.HelpAddress } }; - _portalRepositories.GetInstance().CreateMailingInformation(processId, user.Email, "EmailRegistrationDeclineTemplate", mailParameters); + _mailingProcessCreation.CreateMailProcess(user.Email, "EmailRegistrationDeclineTemplate", mailParameters); } } diff --git a/src/administration/Administration.Service/BusinessLogic/UserBusinessLogic.cs b/src/administration/Administration.Service/BusinessLogic/UserBusinessLogic.cs index 644699c26e..27462ae02c 100644 --- a/src/administration/Administration.Service/BusinessLogic/UserBusinessLogic.cs +++ b/src/administration/Administration.Service/BusinessLogic/UserBusinessLogic.cs @@ -27,6 +27,7 @@ using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.DBAccess.Repositories; using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Enums; using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Identities; +using Org.Eclipse.TractusX.Portal.Backend.Processes.Mailing.Library; using Org.Eclipse.TractusX.Portal.Backend.Provisioning.DBAccess; using Org.Eclipse.TractusX.Portal.Backend.Provisioning.Library; using Org.Eclipse.TractusX.Portal.Backend.Provisioning.Library.Models; @@ -44,6 +45,7 @@ public class UserBusinessLogic : IUserBusinessLogic private readonly IProvisioningDBAccess _provisioningDbAccess; private readonly IPortalRepositories _portalRepositories; private readonly IIdentityData _identityData; + private readonly IMailingProcessCreation _mailingProcessCreation; private readonly ILogger _logger; private readonly UserSettings _settings; @@ -54,6 +56,7 @@ public class UserBusinessLogic : IUserBusinessLogic /// User Provisioning Service /// Provisioning DBAccess /// Access to the identity + /// /// logger /// Settings /// Portal Repositories @@ -63,6 +66,7 @@ public UserBusinessLogic( IProvisioningDBAccess provisioningDbAccess, IPortalRepositories portalRepositories, IIdentityService identityService, + IMailingProcessCreation mailingProcessCreation, ILogger logger, IOptions settings) { @@ -70,6 +74,7 @@ public UserBusinessLogic( _userProvisioningService = userProvisioningService; _provisioningDbAccess = provisioningDbAccess; _portalRepositories = portalRepositories; + _mailingProcessCreation = mailingProcessCreation; _identityData = identityService.IdentityData; _logger = logger; _settings = settings.Value; @@ -126,10 +131,6 @@ private async IAsyncEnumerable CreateOwnCompanyUsersInternalAsync(IEnume continue; } - var processStepRepository = _portalRepositories.GetInstance(); - var processId = processStepRepository.CreateProcess(ProcessTypeId.MAILING).Id; - processStepRepository.CreateProcessStep(ProcessStepTypeId.SEND_MAIL, ProcessStepStatusId.TODO, processId); - var mailParameters = new Dictionary { { "password", password ?? "" }, @@ -138,8 +139,8 @@ private async IAsyncEnumerable CreateOwnCompanyUsersInternalAsync(IEnume { "url", _settings.Portal.BasePortalAddress }, { "passwordResendUrl", _settings.Portal.PasswordResendAddress }, }; - _portalRepositories.GetInstance().CreateMailingInformation(processId, email, "NewUserTemplate", mailParameters); - _portalRepositories.GetInstance().CreateMailingInformation(processId, email, "NewUserPasswordTemplate", mailParameters); + _mailingProcessCreation.CreateMailProcess(email, "NewUserTemplate", mailParameters); + _mailingProcessCreation.CreateMailProcess(email, "NewUserPasswordTemplate", mailParameters); await _portalRepositories.SaveAsync().ConfigureAwait(false); yield return email; @@ -205,13 +206,9 @@ public async Task CreateOwnCompanyIdpUserAsync(Guid identityProviderId, Us mailParameters["password"] = result.Password; } - var processStepRepository = _portalRepositories.GetInstance(); - var processId = processStepRepository.CreateProcess(ProcessTypeId.MAILING).Id; - processStepRepository.CreateProcessStep(ProcessStepTypeId.SEND_MAIL, ProcessStepStatusId.TODO, processId); - foreach (var template in mailTemplates) { - _portalRepositories.GetInstance().CreateMailingInformation(processId, userCreationInfo.Email, template, mailParameters); + _mailingProcessCreation.CreateMailProcess(userCreationInfo.Email, template, mailParameters); } return result.CompanyUserId; diff --git a/src/administration/Administration.Service/BusinessLogic/UserUploadBusinessLogic.cs b/src/administration/Administration.Service/BusinessLogic/UserUploadBusinessLogic.cs index fc37b1fc0f..5b0161e37b 100644 --- a/src/administration/Administration.Service/BusinessLogic/UserUploadBusinessLogic.cs +++ b/src/administration/Administration.Service/BusinessLogic/UserUploadBusinessLogic.cs @@ -28,6 +28,7 @@ using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.DBAccess.Repositories; using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Enums; using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Identities; +using Org.Eclipse.TractusX.Portal.Backend.Processes.Mailing.Library; using Org.Eclipse.TractusX.Portal.Backend.Provisioning.Library.Models; using Org.Eclipse.TractusX.Portal.Backend.Provisioning.Library.Service; using System.Runtime.CompilerServices; @@ -37,7 +38,7 @@ namespace Org.Eclipse.TractusX.Portal.Backend.Administration.Service.BusinessLog public class UserUploadBusinessLogic : IUserUploadBusinessLogic { private readonly IUserProvisioningService _userProvisioningService; - private readonly IPortalRepositories _portalRepositories; + private readonly IMailingProcessCreation _mailingProcessCreation; private readonly UserSettings _settings; private readonly IIdentityData _identityData; private readonly IErrorMessageService _errorMessageService; @@ -46,19 +47,19 @@ public class UserUploadBusinessLogic : IUserUploadBusinessLogic /// Constructor. /// /// User Provisioning Service - /// The portalRepositories + /// The mailingProcessCreation /// Access to the identity Service /// ErrorMessage Service /// Settings public UserUploadBusinessLogic( IUserProvisioningService userProvisioningService, - IPortalRepositories portalRepositories, + IMailingProcessCreation mailingProcessCreation, IIdentityService identityService, IErrorMessageService errorMessageService, IOptions settings) { _userProvisioningService = userProvisioningService; - _portalRepositories = portalRepositories; + _mailingProcessCreation = mailingProcessCreation; _identityData = identityService.IdentityData; _errorMessageService = errorMessageService; _settings = settings.Value; @@ -158,12 +159,7 @@ await GetUserRoleDatas(parsed.Roles, validRoleData, _identityData.CompanyId).Con { "nameCreatedBy", nameCreatedBy }, { "url", _settings.Portal.BasePortalAddress }, }; - - var processStepRepository = _portalRepositories.GetInstance(); - var processId = processStepRepository.CreateProcess(ProcessTypeId.MAILING).Id; - processStepRepository.CreateProcessStep(ProcessStepTypeId.SEND_MAIL, ProcessStepStatusId.TODO, processId); - - _portalRepositories.GetInstance().CreateMailingInformation(processId, userCreationInfo.Email, "NewUserOwnIdpTemplate", mailParameters); + _mailingProcessCreation.CreateMailProcess(userCreationInfo.Email, "NewUserOwnIdpTemplate", mailParameters); yield return (result.CompanyUserId, result.UserName, result.Password, null); } diff --git a/src/framework/Framework.Web/Framework.Web.csproj b/src/framework/Framework.Web/Framework.Web.csproj index 42d499da6a..ce9f31bdf5 100644 --- a/src/framework/Framework.Web/Framework.Web.csproj +++ b/src/framework/Framework.Web/Framework.Web.csproj @@ -28,6 +28,7 @@ + diff --git a/src/framework/Framework.Web/StartupServiceExtensions.cs b/src/framework/Framework.Web/StartupServiceExtensions.cs index 7b159eb9ab..de586a51e4 100644 --- a/src/framework/Framework.Web/StartupServiceExtensions.cs +++ b/src/framework/Framework.Web/StartupServiceExtensions.cs @@ -28,6 +28,7 @@ using Org.Eclipse.TractusX.Portal.Backend.Framework.PublicInfos.DependencyInjection; using Org.Eclipse.TractusX.Portal.Backend.Framework.Swagger; using Org.Eclipse.TractusX.Portal.Backend.Keycloak.Authentication; +using Org.Eclipse.TractusX.Portal.Backend.Processes.Mailing.Library.DependencyInjection; using System.IdentityModel.Tokens.Jwt; using System.Text.Json.Serialization; @@ -93,6 +94,7 @@ public static IServiceCollection AddDefaultServices(this IServiceColle services.AddDateTimeProvider(); services.AddPublicInfos(); + services.AddMailingProcessCreation(); return services; } } diff --git a/src/mailing/Mailing.Service/IRoleBaseMailService.cs b/src/mailing/Mailing.Service/IRoleBaseMailService.cs index 7b578bb337..1942a9b57c 100644 --- a/src/mailing/Mailing.Service/IRoleBaseMailService.cs +++ b/src/mailing/Mailing.Service/IRoleBaseMailService.cs @@ -24,5 +24,4 @@ namespace Org.Eclipse.TractusX.Portal.Backend.Mailing.Service; public interface IRoleBaseMailService { - Task RoleBaseSendMail(IEnumerable receiverRoles, IEnumerable<(string ParameterName, string ParameterValue)> parameters, (string ParameterName, string ParameterValue)? userNameParameter, IEnumerable templates, Guid companyId); } diff --git a/src/mailing/Mailing.Service/RoleBaseMailService.cs b/src/mailing/Mailing.Service/RoleBaseMailService.cs index b416ec597e..938c6469a8 100644 --- a/src/mailing/Mailing.Service/RoleBaseMailService.cs +++ b/src/mailing/Mailing.Service/RoleBaseMailService.cs @@ -38,45 +38,4 @@ public RoleBaseMailService(IPortalRepositories portalRepositories) _portalRepositories = portalRepositories; } - public async Task RoleBaseSendMail(IEnumerable receiverRoles, IEnumerable<(string ParameterName, string ParameterValue)> parameters, (string ParameterName, string ParameterValue)? userNameParameter, IEnumerable templates, Guid companyId) - { - var receiverUserRoles = receiverRoles; - var userRolesRepository = _portalRepositories.GetInstance(); - var roleData = await userRolesRepository - .GetUserRoleIdsUntrackedAsync(receiverUserRoles) - .ToListAsync() - .ConfigureAwait(false); - if (roleData.Count < receiverUserRoles.Sum(clientRoles => clientRoles.UserRoleNames.Count())) - { - throw new ConfigurationException( - $"invalid configuration, at least one of the configured roles does not exist in the database: {string.Join(", ", receiverUserRoles.Select(clientRoles => $"client: {clientRoles.ClientId}, roles: [{string.Join(", ", clientRoles.UserRoleNames)}]"))}"); - } - - var companyUserWithRoleIdForCompany = _portalRepositories.GetInstance() - .GetCompanyUserEmailForCompanyAndRoleId(roleData, companyId); - - await foreach (var (receiver, firstName, lastName) in companyUserWithRoleIdForCompany) - { - IEnumerable<(string ParameterName, string ParameterValue)> ParametersWithUserName() - { - if (userNameParameter.HasValue) - { - var userName = string.Join(" ", new[] { firstName, lastName }.Where(item => !string.IsNullOrWhiteSpace(item))); - return parameters.Append( - string.IsNullOrWhiteSpace(userName) - ? userNameParameter.Value - : new(userNameParameter.Value.ParameterName, userName)); - } - return parameters; - } - - var processStepRepository = _portalRepositories.GetInstance(); - var processId = processStepRepository.CreateProcess(ProcessTypeId.MAILING).Id; - processStepRepository.CreateProcessStep(ProcessStepTypeId.SEND_MAIL, ProcessStepStatusId.TODO, processId); - foreach (var template in templates) - { - _portalRepositories.GetInstance().CreateMailingInformation(processId, receiver, template, ParametersWithUserName().ToDictionary(x => x.ParameterName, x => x.ParameterValue)); - } - } - } } diff --git a/src/marketplace/Offers.Library/DependencyInjection/OfferSetupServiceExtensions.cs b/src/marketplace/Offers.Library/DependencyInjection/OfferSetupServiceExtensions.cs index ec176e1c93..b1e530c6b7 100644 --- a/src/marketplace/Offers.Library/DependencyInjection/OfferSetupServiceExtensions.cs +++ b/src/marketplace/Offers.Library/DependencyInjection/OfferSetupServiceExtensions.cs @@ -20,8 +20,8 @@ using Microsoft.Extensions.DependencyInjection; using Org.Eclipse.TractusX.Portal.Backend.Framework.Logging; -using Org.Eclipse.TractusX.Portal.Backend.Mailing.Service; using Org.Eclipse.TractusX.Portal.Backend.Offers.Library.Service; +using Org.Eclipse.TractusX.Portal.Backend.Processes.Mailing.Library.DependencyInjection; using Org.Eclipse.TractusX.Portal.Backend.Processes.OfferSubscription.Library.DependencyInjection; namespace Org.Eclipse.TractusX.Portal.Backend.Offers.Library.DependencyInjection; @@ -36,8 +36,8 @@ public static IServiceCollection AddOfferServices(this IServiceCollection servic return services .AddTransient() .AddTransient() - .AddTransient() .AddTransient() + .AddMailingProcessCreation() .AddOfferSubscriptionProcess(); } } diff --git a/src/marketplace/Offers.Library/Offers.Library.csproj b/src/marketplace/Offers.Library/Offers.Library.csproj index 4c2b2a8076..8d1985e388 100644 --- a/src/marketplace/Offers.Library/Offers.Library.csproj +++ b/src/marketplace/Offers.Library/Offers.Library.csproj @@ -35,9 +35,9 @@ + - diff --git a/src/marketplace/Offers.Library/Service/OfferService.cs b/src/marketplace/Offers.Library/Service/OfferService.cs index 75db16e188..8950f45fc7 100644 --- a/src/marketplace/Offers.Library/Service/OfferService.cs +++ b/src/marketplace/Offers.Library/Service/OfferService.cs @@ -23,7 +23,6 @@ using Org.Eclipse.TractusX.Portal.Backend.Framework.ErrorHandling; using Org.Eclipse.TractusX.Portal.Backend.Framework.Models; using Org.Eclipse.TractusX.Portal.Backend.Framework.Models.Configuration; -using Org.Eclipse.TractusX.Portal.Backend.Mailing.Service; using Org.Eclipse.TractusX.Portal.Backend.Notifications.Library; using Org.Eclipse.TractusX.Portal.Backend.Offers.Library.Models; using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.DBAccess; @@ -33,6 +32,7 @@ using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Entities; using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Enums; using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Identities; +using Org.Eclipse.TractusX.Portal.Backend.Processes.Mailing.Library; using System.Text.Json; namespace Org.Eclipse.TractusX.Portal.Backend.Offers.Library.Service; @@ -41,7 +41,7 @@ public class OfferService : IOfferService { private readonly IPortalRepositories _portalRepositories; private readonly INotificationService _notificationService; - private readonly IRoleBaseMailService _roleBaseMailService; + private readonly IMailingProcessCreation _mailingProcessCreation; private readonly IIdentityData _identityData; private readonly IOfferSetupService _offerSetupService; private readonly ILogger _logger; @@ -51,20 +51,20 @@ public class OfferService : IOfferService /// /// Factory to access the repositories /// Creates notifications for the user - /// Mailing service to send mails to the user + /// Mailing service to send mails to the user /// Access to the identity /// The offer Setup Service /// Access to the logger public OfferService(IPortalRepositories portalRepositories, INotificationService notificationService, - IRoleBaseMailService roleBaseMailService, + IMailingProcessCreation mailingProcessCreation, IIdentityService identityService, IOfferSetupService offerSetupService, ILogger logger) { _portalRepositories = portalRepositories; _notificationService = notificationService; - _roleBaseMailService = roleBaseMailService; + _mailingProcessCreation = mailingProcessCreation; _identityData = identityService.IdentityData; _offerSetupService = offerSetupService; _logger = logger; @@ -522,7 +522,7 @@ public async Task ApproveOfferRequestAsync(Guid offerId, OfferTypeId offerTypeId await _portalRepositories.SaveAsync().ConfigureAwait(false); - await _roleBaseMailService.RoleBaseSendMail( + await _mailingProcessCreation.RoleBaseSendMail( notificationRecipients, new[] { @@ -597,7 +597,7 @@ public async Task DeclineOfferAsync(Guid offerId, OfferDeclineRequest data, Offe await _portalRepositories.SaveAsync().ConfigureAwait(false); - await _roleBaseMailService.RoleBaseSendMail( + await _mailingProcessCreation.RoleBaseSendMail( notificationRecipients, new[] { diff --git a/src/marketplace/Offers.Library/Service/OfferSetupService.cs b/src/marketplace/Offers.Library/Service/OfferSetupService.cs index 53563445c6..5d9bbaa065 100644 --- a/src/marketplace/Offers.Library/Service/OfferSetupService.cs +++ b/src/marketplace/Offers.Library/Service/OfferSetupService.cs @@ -30,6 +30,7 @@ using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.DBAccess.Repositories; using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Enums; using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Identities; +using Org.Eclipse.TractusX.Portal.Backend.Processes.Mailing.Library; using Org.Eclipse.TractusX.Portal.Backend.Processes.OfferSubscription.Library; using Org.Eclipse.TractusX.Portal.Backend.Provisioning.Library; using Org.Eclipse.TractusX.Portal.Backend.Provisioning.Library.Models; @@ -45,6 +46,7 @@ public class OfferSetupService : IOfferSetupService private readonly IServiceAccountCreation _serviceAccountCreation; private readonly INotificationService _notificationService; private readonly IOfferSubscriptionProcessService _offerSubscriptionProcessService; + private readonly IMailingProcessCreation _mailingProcessCreation; private readonly ITechnicalUserProfileService _technicalUserProfileService; private readonly IIdentityData _identityData; private readonly ILogger _logger; @@ -59,6 +61,7 @@ public class OfferSetupService : IOfferSetupService /// Access to offer subscription process service /// Access to the technical user profile service /// Access to the identity of the user + /// Mailing Process Creation /// Access to the logger public OfferSetupService( IPortalRepositories portalRepositories, @@ -68,6 +71,7 @@ public OfferSetupService( IOfferSubscriptionProcessService offerSubscriptionProcessService, ITechnicalUserProfileService technicalUserProfileService, IIdentityService identityService, + IMailingProcessCreation mailingProcessCreation, ILogger logger) { _portalRepositories = portalRepositories; @@ -76,6 +80,7 @@ public OfferSetupService( _notificationService = notificationService; _offerSubscriptionProcessService = offerSubscriptionProcessService; _technicalUserProfileService = technicalUserProfileService; + _mailingProcessCreation = mailingProcessCreation; _identityData = identityService.IdentityData; _logger = logger; } @@ -388,12 +393,7 @@ private void SendMail(string basePortalAddress, string userName, string requeste {"offerName", offerName ?? "unnamed Offer"}, {"url", basePortalAddress}, }; - - var processStepRepository = _portalRepositories.GetInstance(); - var processId = processStepRepository.CreateProcess(ProcessTypeId.MAILING).Id; - processStepRepository.CreateProcessStep(ProcessStepTypeId.SEND_MAIL, ProcessStepStatusId.TODO, processId); - - _portalRepositories.GetInstance().CreateMailingInformation(processId, requesterEmail, $"{offerType.ToString().ToLower()}-subscription-activation", mailParams); + _mailingProcessCreation.CreateMailProcess(requesterEmail, $"{offerType.ToString().ToLower()}-subscription-activation", mailParams); } /// diff --git a/src/marketplace/Offers.Library/Service/OfferSubscriptionService.cs b/src/marketplace/Offers.Library/Service/OfferSubscriptionService.cs index 7f0bb1676b..e14b2507b6 100644 --- a/src/marketplace/Offers.Library/Service/OfferSubscriptionService.cs +++ b/src/marketplace/Offers.Library/Service/OfferSubscriptionService.cs @@ -20,7 +20,6 @@ using Org.Eclipse.TractusX.Portal.Backend.Framework.ErrorHandling; using Org.Eclipse.TractusX.Portal.Backend.Framework.Models.Configuration; -using Org.Eclipse.TractusX.Portal.Backend.Mailing.Service; using Org.Eclipse.TractusX.Portal.Backend.Offers.Library.Models; using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.DBAccess; using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.DBAccess.Models; @@ -28,6 +27,7 @@ using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Entities; using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Enums; using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Identities; +using Org.Eclipse.TractusX.Portal.Backend.Processes.Mailing.Library; using System.Collections.Immutable; using System.Text.Json; @@ -37,22 +37,22 @@ public class OfferSubscriptionService : IOfferSubscriptionService { private readonly IPortalRepositories _portalRepositories; private readonly IIdentityData _identityData; - private readonly IRoleBaseMailService _roleBaseMailService; + private readonly IMailingProcessCreation _mailingProcessCreation; /// /// Constructor. /// /// Factory to access the repositories /// Access to the identity of the user - /// Mail service. + /// Mail service. public OfferSubscriptionService( IPortalRepositories portalRepositories, IIdentityService identityService, - IRoleBaseMailService roleBaseMailService) + IMailingProcessCreation mailingProcessCreation) { _portalRepositories = portalRepositories; _identityData = identityService.IdentityData; - _roleBaseMailService = roleBaseMailService; + _mailingProcessCreation = mailingProcessCreation; } /// @@ -87,7 +87,7 @@ public async Task AddOfferSubscriptionAsync(Guid offerId, IEnumerable GetMailData(Guid companyInvitationId) => - _context.CompanyInvitations - .Where(x => x.Id == companyInvitationId) - .Select(x => new ValueTuple( - true, - x.OrganisationName, - x.Password, - x.Email)) - .SingleOrDefaultAsync(); - public Task GetIdpNameForInvitationId(Guid invitationId) => _context.CompanyInvitations .Where(x => x.Id == invitationId) diff --git a/src/portalbackend/PortalBackend.DBAccess/Repositories/ICompanyInvitationRepository.cs b/src/portalbackend/PortalBackend.DBAccess/Repositories/ICompanyInvitationRepository.cs index 558061a910..b2fac16162 100644 --- a/src/portalbackend/PortalBackend.DBAccess/Repositories/ICompanyInvitationRepository.cs +++ b/src/portalbackend/PortalBackend.DBAccess/Repositories/ICompanyInvitationRepository.cs @@ -30,7 +30,6 @@ public interface ICompanyInvitationRepository Task<(bool Exists, Guid? ApplicationId, Guid? CompanyId, string CompanyName, IEnumerable<(Guid IdpId, string IdpName)> IdpInformation, UserInvitationInformation UserInformation)> GetInvitationUserData(Guid companyInvitationId); Task<(bool Exists, string OrgName, string? IdpName)> GetInvitationIdpCreationData(Guid invitationId); void AttachAndModifyCompanyInvitation(Guid invitationId, Action? initialize, Action modify); - Task<(bool Exists, string OrgName, byte[]? UserPassword, string Email)> GetMailData(Guid companyInvitationId); Task GetIdpNameForInvitationId(Guid invitationId); Task<(string orgName, string? idpName, string? clientId, byte[]? clientSecret)> GetUpdateCentralIdpUrlData(Guid invitationId); Task<(string orgName, string? idpName)> GetIdpAndOrgNameAsync(Guid invitationId); diff --git a/src/processes/Invitation.Executor/IInvitationProcessService.cs b/src/processes/Invitation.Executor/IInvitationProcessService.cs index 51287acd0a..f4e677b2ef 100644 --- a/src/processes/Invitation.Executor/IInvitationProcessService.cs +++ b/src/processes/Invitation.Executor/IInvitationProcessService.cs @@ -31,7 +31,6 @@ public interface IInvitationProcessService Task<(IEnumerable? nextStepTypeIds, ProcessStepStatusId stepStatusId, bool modified, string? processMessage)> EnableCentralIdp(Guid invitationId); Task<(IEnumerable? nextStepTypeIds, ProcessStepStatusId stepStatusId, bool modified, string? processMessage)> CreateIdpDatabase(Guid companyInvitationId); Task<(IEnumerable? nextStepTypeIds, ProcessStepStatusId stepStatusId, bool modified, string? processMessage)> CreateUser(Guid companyInvitationId, CancellationToken cancellationToken); - Task<(IEnumerable? nextStepTypeIds, ProcessStepStatusId stepStatusId, bool modified, string? processMessage)> SendMail(Guid companyInvitationId); Task<(IEnumerable? nextStepTypeIds, ProcessStepStatusId stepStatusId, bool modified, string? processMessage)> AddRealmRoleMappingsToUserAsync(Guid invitationId); Task<(IEnumerable? nextStepTypeIds, ProcessStepStatusId stepStatusId, bool modified, string? processMessage)> CreateSharedClient(Guid invitationId); } diff --git a/src/processes/Invitation.Executor/Invitation.Executor.csproj b/src/processes/Invitation.Executor/Invitation.Executor.csproj index 18fb1a5836..4fce5d3893 100644 --- a/src/processes/Invitation.Executor/Invitation.Executor.csproj +++ b/src/processes/Invitation.Executor/Invitation.Executor.csproj @@ -31,6 +31,7 @@ + diff --git a/src/processes/Invitation.Executor/InvitationProcessService.cs b/src/processes/Invitation.Executor/InvitationProcessService.cs index 1806cb9e24..adde3c4e6b 100644 --- a/src/processes/Invitation.Executor/InvitationProcessService.cs +++ b/src/processes/Invitation.Executor/InvitationProcessService.cs @@ -26,6 +26,7 @@ using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.DBAccess.Repositories; using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Enums; using Org.Eclipse.TractusX.Portal.Backend.Processes.Invitation.Executor.DependencyInjection; +using Org.Eclipse.TractusX.Portal.Backend.Processes.Mailing.Library; using Org.Eclipse.TractusX.Portal.Backend.Provisioning.Library.Models; using Org.Eclipse.TractusX.Portal.Backend.Provisioning.Library.Service; using System.Security.Cryptography; @@ -37,9 +38,9 @@ public class InvitationProcessService : IInvitationProcessService { private readonly IIdpManagement _idpManagement; private readonly IUserProvisioningService _userProvisioningService; - private readonly IMailingService _mailingService; private readonly InvitationSettings _settings; private readonly IPortalRepositories _portalRepositories; + private readonly IMailingProcessCreation _mailingProcessCreation; /// /// Constructor. @@ -47,19 +48,19 @@ public class InvitationProcessService : IInvitationProcessService /// Shared Idp Creation /// User Provisioning Service /// Portal Repositories - /// Mailing Service + /// MailingProcessCreation /// Settings public InvitationProcessService( IIdpManagement idpManagement, IUserProvisioningService userProvisioningService, IPortalRepositories portalRepositories, - IMailingService mailingService, + IMailingProcessCreation mailingProcessCreation, IOptions settings) { _idpManagement = idpManagement; _userProvisioningService = userProvisioningService; _portalRepositories = portalRepositories; - _mailingService = mailingService; + _mailingProcessCreation = mailingProcessCreation; _settings = settings.Value; } @@ -375,6 +376,18 @@ await _idpManagement throw error; } + foreach (var template in new[] { "RegistrationTemplate", "PasswordForRegistrationTemplate" }) + { + var mailParameters = new Dictionary + { + {"password", password ?? ""}, + {"companyName", companyName}, + {"url", _settings.RegistrationAppAddress}, + {"passwordResendUrl", _settings.PasswordResendAddress}, + }; + _mailingProcessCreation.CreateMailProcess(userInformation.Email, template, mailParameters); + } + using var aes = Aes.Create(); aes.Key = Encoding.UTF8.GetBytes(_settings.EncryptionKey); aes.Mode = CipherMode.ECB; @@ -401,44 +414,6 @@ await _idpManagement _portalRepositories.GetInstance().CreateInvitation(applicationId.Value, companyUserId); - return (Enumerable.Repeat(ProcessStepTypeId.INVITATION_SEND_MAIL, 1), ProcessStepStatusId.DONE, true, null); - } - - public async Task<(IEnumerable? nextStepTypeIds, ProcessStepStatusId stepStatusId, bool modified, string? processMessage)> SendMail(Guid companyInvitationId) - { - var (exists, orgName, userPassword, email) = await _portalRepositories.GetInstance().GetMailData(companyInvitationId).ConfigureAwait(false); - if (!exists) - { - throw new NotFoundException($"CompanyInvitation {companyInvitationId} does not exist"); - } - - if (userPassword is null) - { - throw new ConflictException("Password needs to be set"); - } - - using var aes = Aes.Create(); - aes.Key = Encoding.UTF8.GetBytes(_settings.EncryptionKey); - aes.Mode = CipherMode.ECB; - aes.Padding = PaddingMode.PKCS7; - var decryptor = aes.CreateDecryptor(aes.Key, aes.IV); - using (var msDecrypt = new MemoryStream(userPassword)) - { - using var csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read); - using var srDecrypt = new StreamReader(csDecrypt, Encoding.UTF8); - var password = srDecrypt.ReadToEnd(); - var mailParameters = new Dictionary - { - { "password", password ?? "" }, - { "companyName", orgName }, - { "url", _settings.RegistrationAppAddress }, - { "passwordResendUrl", _settings.PasswordResendAddress }, - }; - - await _mailingService.SendMails(email, mailParameters, "RegistrationTemplate").ConfigureAwait(false); - await _mailingService.SendMails(email, mailParameters, "PasswordForRegistrationTemplate").ConfigureAwait(false); - } - return (null, ProcessStepStatusId.DONE, true, null); } } diff --git a/src/processes/Invitation.Executor/InvitationProcessTypeExecutor.cs b/src/processes/Invitation.Executor/InvitationProcessTypeExecutor.cs index f6aab32282..0b8223be98 100644 --- a/src/processes/Invitation.Executor/InvitationProcessTypeExecutor.cs +++ b/src/processes/Invitation.Executor/InvitationProcessTypeExecutor.cs @@ -121,8 +121,6 @@ public InvitationProcessTypeExecutor(IPortalRepositories portalRepositories, IIn .ConfigureAwait(false), ProcessStepTypeId.INVITATION_CREATE_USER => await _invitationProcessService.CreateUser(_companyInvitationId, cancellationToken) .ConfigureAwait(false), - ProcessStepTypeId.INVITATION_SEND_MAIL => await _invitationProcessService.SendMail(_companyInvitationId) - .ConfigureAwait(false), _ => throw new UnexpectedConditionException($"Execution for {processStepTypeId} is currently not supported.") }; } diff --git a/src/processes/Mailing.Executer/DependencyInjection/MailingProcessCollectionExtensions.cs b/src/processes/Mailing.Executor/DependencyInjection/MailingProcessCollectionExtensions.cs similarity index 93% rename from src/processes/Mailing.Executer/DependencyInjection/MailingProcessCollectionExtensions.cs rename to src/processes/Mailing.Executor/DependencyInjection/MailingProcessCollectionExtensions.cs index daaa8cd83f..23f365b565 100644 --- a/src/processes/Mailing.Executer/DependencyInjection/MailingProcessCollectionExtensions.cs +++ b/src/processes/Mailing.Executor/DependencyInjection/MailingProcessCollectionExtensions.cs @@ -17,9 +17,7 @@ * SPDX-License-Identifier: Apache-2.0 ********************************************************************************/ -using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; -using Org.Eclipse.TractusX.Portal.Backend.Mailing.SendMail; using Org.Eclipse.TractusX.Portal.Backend.Processes.Worker.Library; namespace Org.Eclipse.TractusX.Portal.Backend.Processes.Mailing.Executor.DependencyInjection; diff --git a/src/processes/Mailing.Executer/Mailing.Executer.csproj b/src/processes/Mailing.Executor/Mailing.Executor.csproj similarity index 100% rename from src/processes/Mailing.Executer/Mailing.Executer.csproj rename to src/processes/Mailing.Executor/Mailing.Executor.csproj diff --git a/src/processes/Mailing.Executer/MailingProcessTypeExecutor.cs b/src/processes/Mailing.Executor/MailingProcessTypeExecutor.cs similarity index 100% rename from src/processes/Mailing.Executer/MailingProcessTypeExecutor.cs rename to src/processes/Mailing.Executor/MailingProcessTypeExecutor.cs diff --git a/src/processes/Mailing.Library/DependencyInjection/MailingProcessCreationDependencyInjection.cs b/src/processes/Mailing.Library/DependencyInjection/MailingProcessCreationDependencyInjection.cs new file mode 100644 index 0000000000..d12c61a855 --- /dev/null +++ b/src/processes/Mailing.Library/DependencyInjection/MailingProcessCreationDependencyInjection.cs @@ -0,0 +1,29 @@ +/******************************************************************************** + * Copyright (c) 2021, 2024 Contributors to the Eclipse Foundation + * + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. + * + * This program and the accompanying materials are made available under the + * terms of the Apache License, Version 2.0 which is available at + * https://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * SPDX-License-Identifier: Apache-2.0 + ********************************************************************************/ + +using Microsoft.Extensions.DependencyInjection; + +namespace Org.Eclipse.TractusX.Portal.Backend.Processes.Mailing.Library.DependencyInjection; + +public static class MailingProcessCreationDependencyInjection +{ + public static IServiceCollection AddMailingProcessCreation(this IServiceCollection services) => + services + .AddTransient(); +} diff --git a/src/processes/Mailing.Library/IMailingProcessCreation.cs b/src/processes/Mailing.Library/IMailingProcessCreation.cs new file mode 100644 index 0000000000..55b4aec027 --- /dev/null +++ b/src/processes/Mailing.Library/IMailingProcessCreation.cs @@ -0,0 +1,28 @@ +/******************************************************************************** + * Copyright (c) 2021, 2024 Contributors to the Eclipse Foundation + * + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. + * + * This program and the accompanying materials are made available under the + * terms of the Apache License, Version 2.0 which is available at + * https://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * SPDX-License-Identifier: Apache-2.0 + ********************************************************************************/ + +using Org.Eclipse.TractusX.Portal.Backend.Framework.Models.Configuration; + +namespace Org.Eclipse.TractusX.Portal.Backend.Processes.Mailing.Library; + +public interface IMailingProcessCreation +{ + void CreateMailProcess(string email, string template, Dictionary mailParameters); + Task RoleBaseSendMail(IEnumerable receiverRoles, IEnumerable<(string ParameterName, string ParameterValue)> parameters, (string ParameterName, string ParameterValue)? userNameParameter, IEnumerable templates, Guid companyId); +} diff --git a/src/processes/Mailing.Library/Mailing.Library.csproj b/src/processes/Mailing.Library/Mailing.Library.csproj new file mode 100644 index 0000000000..f5cd24bc44 --- /dev/null +++ b/src/processes/Mailing.Library/Mailing.Library.csproj @@ -0,0 +1,34 @@ + + + + + + Org.Eclipse.TractusX.Portal.Backend.Processes.Mailing.Library + Org.Eclipse.TractusX.Portal.Backend.Processes.Mailing.Library + net7.0 + enable + enable + + + + + + + diff --git a/src/processes/Mailing.Library/MailingProcessCreation.cs b/src/processes/Mailing.Library/MailingProcessCreation.cs new file mode 100644 index 0000000000..a299bd5329 --- /dev/null +++ b/src/processes/Mailing.Library/MailingProcessCreation.cs @@ -0,0 +1,86 @@ +/******************************************************************************** + * Copyright (c) 2021, 2024 Contributors to the Eclipse Foundation + * + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. + * + * This program and the accompanying materials are made available under the + * terms of the Apache License, Version 2.0 which is available at + * https://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * SPDX-License-Identifier: Apache-2.0 + ********************************************************************************/ + +using Org.Eclipse.TractusX.Portal.Backend.Framework.ErrorHandling; +using Org.Eclipse.TractusX.Portal.Backend.Framework.Models.Configuration; +using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.DBAccess; +using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.DBAccess.Repositories; +using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Enums; + +namespace Org.Eclipse.TractusX.Portal.Backend.Processes.Mailing.Library; + +public class MailingProcessCreation : IMailingProcessCreation +{ + private readonly IPortalRepositories _portalRepositories; + + public MailingProcessCreation(IPortalRepositories portalRepositories) + { + _portalRepositories = portalRepositories; + } + + public void CreateMailProcess(string email, string template, Dictionary mailParameters) + { + var processStepRepository = _portalRepositories.GetInstance(); + var processId = processStepRepository.CreateProcess(ProcessTypeId.MAILING).Id; + processStepRepository.CreateProcessStep(ProcessStepTypeId.SEND_MAIL, ProcessStepStatusId.TODO, processId); + _portalRepositories.GetInstance().CreateMailingInformation(processId, email, template, mailParameters); + } + + public async Task RoleBaseSendMail(IEnumerable receiverRoles, IEnumerable<(string ParameterName, string ParameterValue)> parameters, (string ParameterName, string ParameterValue)? userNameParameter, IEnumerable templates, Guid companyId) + { + var receiverUserRoles = receiverRoles; + var userRolesRepository = _portalRepositories.GetInstance(); + var roleData = await userRolesRepository + .GetUserRoleIdsUntrackedAsync(receiverUserRoles) + .ToListAsync() + .ConfigureAwait(false); + if (roleData.Count < receiverUserRoles.Sum(clientRoles => clientRoles.UserRoleNames.Count())) + { + throw new ConfigurationException( + $"invalid configuration, at least one of the configured roles does not exist in the database: {string.Join(", ", receiverUserRoles.Select(clientRoles => $"client: {clientRoles.ClientId}, roles: [{string.Join(", ", clientRoles.UserRoleNames)}]"))}"); + } + + var companyUserWithRoleIdForCompany = _portalRepositories.GetInstance() + .GetCompanyUserEmailForCompanyAndRoleId(roleData, companyId); + + await foreach (var (receiver, firstName, lastName) in companyUserWithRoleIdForCompany) + { + IEnumerable<(string ParameterName, string ParameterValue)> ParametersWithUserName() + { + if (userNameParameter.HasValue) + { + var userName = string.Join(" ", new[] { firstName, lastName }.Where(item => !string.IsNullOrWhiteSpace(item))); + return parameters.Append( + string.IsNullOrWhiteSpace(userName) + ? userNameParameter.Value + : new(userNameParameter.Value.ParameterName, userName)); + } + return parameters; + } + + var processStepRepository = _portalRepositories.GetInstance(); + var processId = processStepRepository.CreateProcess(ProcessTypeId.MAILING).Id; + processStepRepository.CreateProcessStep(ProcessStepTypeId.SEND_MAIL, ProcessStepStatusId.TODO, processId); + foreach (var template in templates) + { + _portalRepositories.GetInstance().CreateMailingInformation(processId, receiver, template, ParametersWithUserName().ToDictionary(x => x.ParameterName, x => x.ParameterValue)); + } + } + } +} diff --git a/src/processes/NetworkRegistration.Library/NetworkRegistration.Library.csproj b/src/processes/NetworkRegistration.Library/NetworkRegistration.Library.csproj index 4db5590cf9..2c96fa4fa0 100644 --- a/src/processes/NetworkRegistration.Library/NetworkRegistration.Library.csproj +++ b/src/processes/NetworkRegistration.Library/NetworkRegistration.Library.csproj @@ -31,6 +31,7 @@ + diff --git a/src/processes/NetworkRegistration.Library/NetworkRegistrationHandler.cs b/src/processes/NetworkRegistration.Library/NetworkRegistrationHandler.cs index 23aca5bce3..0ab76ccd21 100644 --- a/src/processes/NetworkRegistration.Library/NetworkRegistrationHandler.cs +++ b/src/processes/NetworkRegistration.Library/NetworkRegistrationHandler.cs @@ -23,6 +23,7 @@ using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.DBAccess.Models; using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.DBAccess.Repositories; using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Enums; +using Org.Eclipse.TractusX.Portal.Backend.Processes.Mailing.Library; using Org.Eclipse.TractusX.Portal.Backend.Processes.NetworkRegistration.Library.DependencyInjection; using Org.Eclipse.TractusX.Portal.Backend.Processes.NetworkRegistration.Library.Models; using Org.Eclipse.TractusX.Portal.Backend.Provisioning.Library; @@ -36,17 +37,20 @@ public class NetworkRegistrationHandler : INetworkRegistrationHandler private readonly IPortalRepositories _portalRepositories; private readonly IUserProvisioningService _userProvisioningService; private readonly IProvisioningManager _provisioningManager; + private readonly IMailingProcessCreation _mailingProcessCreation; private readonly NetworkRegistrationProcessSettings _settings; public NetworkRegistrationHandler( IPortalRepositories portalRepositories, IUserProvisioningService userProvisioningService, IProvisioningManager provisioningManager, + IMailingProcessCreation mailingProcessCreation, IOptions options) { _portalRepositories = portalRepositories; _userProvisioningService = userProvisioningService; _provisioningManager = provisioningManager; + _mailingProcessCreation = mailingProcessCreation; _settings = options.Value; } @@ -147,12 +151,8 @@ await Task.WhenAll( private async Task CreateMailProcess(IAsyncEnumerable companyUserWithRoleIdForCompany, string ospName) { - var processStepRepository = _portalRepositories.GetInstance(); await foreach (var (receiver, firstName, lastName, displayNames) in companyUserWithRoleIdForCompany) { - var processId = processStepRepository.CreateProcess(ProcessTypeId.MAILING).Id; - processStepRepository.CreateProcessStep(ProcessStepTypeId.SEND_MAIL, ProcessStepStatusId.TODO, processId); - var userName = string.Join(" ", firstName, lastName); var mailParameters = new Dictionary { @@ -164,7 +164,7 @@ private async Task CreateMailProcess(IAsyncEnumerable compa { "url", _settings.BasePortalAddress }, { "idpAlias", string.Join(",", displayNames) } }; - _portalRepositories.GetInstance().CreateMailingInformation(processId, receiver, "CredentialRejected", mailParameters); + _mailingProcessCreation.CreateMailProcess(receiver, "CredentialRejected", mailParameters); } } } diff --git a/src/processes/Processes.Worker/Processes.Worker.csproj b/src/processes/Processes.Worker/Processes.Worker.csproj index 54494cc2cd..6b40387eb8 100644 --- a/src/processes/Processes.Worker/Processes.Worker.csproj +++ b/src/processes/Processes.Worker/Processes.Worker.csproj @@ -48,7 +48,7 @@ - + diff --git a/src/provisioning/Provisioning.Mail/UserEmailSettings.cs b/src/provisioning/Provisioning.Mail/UserEmailSettings.cs index fee175ba9f..4f28f521cb 100644 --- a/src/provisioning/Provisioning.Mail/UserEmailSettings.cs +++ b/src/provisioning/Provisioning.Mail/UserEmailSettings.cs @@ -25,8 +25,8 @@ namespace Org.Eclipse.TractusX.Portal.Backend.Provisioning.Mail { public class UserEmailSettings { - public string SenderEmail { get; set; } - public string Template { get; set; } + public string SenderEmail { get; set; } = null!; + public string Template { get; set; } = null!; } public static class UserEmailSettingsExtention { diff --git a/src/registration/ApplicationActivation.Library/ApplicationActivation.Library.csproj b/src/registration/ApplicationActivation.Library/ApplicationActivation.Library.csproj index f08dfcad62..757439f4a4 100644 --- a/src/registration/ApplicationActivation.Library/ApplicationActivation.Library.csproj +++ b/src/registration/ApplicationActivation.Library/ApplicationActivation.Library.csproj @@ -38,6 +38,7 @@ + diff --git a/src/registration/ApplicationActivation.Library/ApplicationActivationService.cs b/src/registration/ApplicationActivation.Library/ApplicationActivationService.cs index e05ae794a8..99bc99207b 100644 --- a/src/registration/ApplicationActivation.Library/ApplicationActivationService.cs +++ b/src/registration/ApplicationActivation.Library/ApplicationActivationService.cs @@ -32,6 +32,7 @@ using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.DBAccess.Repositories; using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Enums; using Org.Eclipse.TractusX.Portal.Backend.Processes.ApplicationChecklist.Library; +using Org.Eclipse.TractusX.Portal.Backend.Processes.Mailing.Library; using Org.Eclipse.TractusX.Portal.Backend.Provisioning.Library; using System.Collections.Immutable; @@ -44,6 +45,7 @@ public class ApplicationActivationService : IApplicationActivationService private readonly IProvisioningManager _provisioningManager; private readonly IDateTimeProvider _dateTime; private readonly ICustodianService _custodianService; + private readonly IMailingProcessCreation _mailingProcessCreation; private readonly ApplicationActivationSettings _settings; public ApplicationActivationService( @@ -52,6 +54,7 @@ public ApplicationActivationService( IProvisioningManager provisioningManager, IDateTimeProvider dateTime, ICustodianService custodianService, + IMailingProcessCreation mailingProcessCreation, IOptions options) { _portalRepositories = portalRepositories; @@ -59,6 +62,7 @@ public ApplicationActivationService( _provisioningManager = provisioningManager; _dateTime = dateTime; _custodianService = custodianService; + _mailingProcessCreation = mailingProcessCreation; _settings = options.Value; } @@ -255,8 +259,6 @@ private async Task PostRegistrationWelcomeEmailAsync(IApplicationRepository appl continue; } - var processId = processStepRepository.CreateProcess(ProcessTypeId.MAILING).Id; - processStepRepository.CreateProcessStep(ProcessStepTypeId.SEND_MAIL, ProcessStepStatusId.TODO, processId); var mailParameters = new Dictionary { { "userName", !string.IsNullOrWhiteSpace(userName) ? userName : user.Email }, @@ -267,7 +269,7 @@ private async Task PostRegistrationWelcomeEmailAsync(IApplicationRepository appl { "companyRolesParticipantUrl", _settings.CompanyRolesParticipantAddress }, { "dataspaceUrl", _settings.DataspaceAddress } }; - _portalRepositories.GetInstance().CreateMailingInformation(processId, user.Email, "EmailRegistrationWelcomeTemplate", mailParameters); + _mailingProcessCreation.CreateMailProcess(user.Email, "EmailRegistrationWelcomeTemplate", mailParameters); } if (failedUserNames.Any()) diff --git a/src/registration/Registration.Service/BusinessLogic/RegistrationBusinessLogic.cs b/src/registration/Registration.Service/BusinessLogic/RegistrationBusinessLogic.cs index 342f7c4bef..852641a238 100644 --- a/src/registration/Registration.Service/BusinessLogic/RegistrationBusinessLogic.cs +++ b/src/registration/Registration.Service/BusinessLogic/RegistrationBusinessLogic.cs @@ -33,6 +33,7 @@ using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Enums; using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Identities; using Org.Eclipse.TractusX.Portal.Backend.Processes.ApplicationChecklist.Library; +using Org.Eclipse.TractusX.Portal.Backend.Processes.Mailing.Library; using Org.Eclipse.TractusX.Portal.Backend.Provisioning.Library.Models; using Org.Eclipse.TractusX.Portal.Backend.Provisioning.Library.Service; using Org.Eclipse.TractusX.Portal.Backend.Registration.Common; @@ -52,6 +53,7 @@ public class RegistrationBusinessLogic : IRegistrationBusinessLogic private readonly IApplicationChecklistCreationService _checklistService; private readonly IIdentityData _identityData; private readonly IDateTimeProvider _dateTimeProvider; + private readonly IMailingProcessCreation _mailingProcessCreation; private static readonly Regex bpnRegex = new(@"(\w|\d){16}", RegexOptions.None, TimeSpan.FromSeconds(1)); @@ -63,7 +65,8 @@ public RegistrationBusinessLogic( IPortalRepositories portalRepositories, IApplicationChecklistCreationService checklistService, IIdentityService identityService, - IDateTimeProvider dateTimeProvider) + IDateTimeProvider dateTimeProvider, + IMailingProcessCreation mailingProcessCreation) { _settings = settings.Value; _bpnAccess = bpnAccess; @@ -73,6 +76,7 @@ public RegistrationBusinessLogic( _checklistService = checklistService; _identityData = identityService.IdentityData; _dateTimeProvider = dateTimeProvider; + _mailingProcessCreation = mailingProcessCreation; } public IAsyncEnumerable GetClientRolesCompositeAsync() => @@ -458,12 +462,8 @@ private async Task InviteNewUserInternalAsync(Guid applicationId, UserCreat { "username", userCreationInfo.eMail }, }; - var processStepRepository = _portalRepositories.GetInstance(); - var processId = processStepRepository.CreateProcess(ProcessTypeId.MAILING).Id; - processStepRepository.CreateProcessStep(ProcessStepTypeId.SEND_MAIL, ProcessStepStatusId.TODO, processId); - - _portalRepositories.GetInstance().CreateMailingInformation(processId, userCreationInfo.eMail, inviteTemplateName, mailParameters); - _portalRepositories.GetInstance().CreateMailingInformation(processId, userCreationInfo.eMail, "password", mailParameters); + _mailingProcessCreation.CreateMailProcess(userCreationInfo.eMail, inviteTemplateName, mailParameters); + _mailingProcessCreation.CreateMailProcess(userCreationInfo.eMail, "password", mailParameters); return modified; } @@ -622,11 +622,7 @@ public async Task SubmitRegistrationAsync(Guid applicationId) if (applicationUserData.Email != null) { - var processStepRepository = _portalRepositories.GetInstance(); - var processId = processStepRepository.CreateProcess(ProcessTypeId.MAILING).Id; - processStepRepository.CreateProcessStep(ProcessStepTypeId.SEND_MAIL, ProcessStepStatusId.TODO, processId); - - _portalRepositories.GetInstance().CreateMailingInformation(processId, applicationUserData.Email, "SubmitRegistrationTemplate", mailParameters); + _mailingProcessCreation.CreateMailProcess(applicationUserData.Email, "SubmitRegistrationTemplate", mailParameters); } else { diff --git a/src/registration/Registration.Service/Program.cs b/src/registration/Registration.Service/Program.cs index 577cc3d67b..111dc290e0 100644 --- a/src/registration/Registration.Service/Program.cs +++ b/src/registration/Registration.Service/Program.cs @@ -34,7 +34,6 @@ .BuildAndRunWebApplication(args, "registration", VERSION, builder => { builder.Services - .AddMailingAndTemplateManager(builder.Configuration) .AddPortalRepositories(builder.Configuration) .AddProvisioningManager(builder.Configuration); diff --git a/src/registration/Registration.Service/Registration.Service.csproj b/src/registration/Registration.Service/Registration.Service.csproj index 76b15830b1..c5cadfd48d 100644 --- a/src/registration/Registration.Service/Registration.Service.csproj +++ b/src/registration/Registration.Service/Registration.Service.csproj @@ -49,6 +49,7 @@ + diff --git a/tests/administration/Administration.Service.Tests/BusinessLogic/CompanyDataBusinessLogicTests.cs b/tests/administration/Administration.Service.Tests/BusinessLogic/CompanyDataBusinessLogicTests.cs index daa2e8f7cf..6907f566b6 100644 --- a/tests/administration/Administration.Service.Tests/BusinessLogic/CompanyDataBusinessLogicTests.cs +++ b/tests/administration/Administration.Service.Tests/BusinessLogic/CompanyDataBusinessLogicTests.cs @@ -31,6 +31,7 @@ using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Entities; using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Enums; using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Identities; +using Org.Eclipse.TractusX.Portal.Backend.Processes.Mailing.Library; using Org.Eclipse.TractusX.Portal.Backend.Tests.Shared; namespace Org.Eclipse.TractusX.Portal.Backend.Administration.Service.Tests.BusinessLogic; @@ -49,7 +50,7 @@ public class CompanyDataBusinessLogicTests private readonly IDocumentRepository _documentRepository; private readonly ILanguageRepository _languageRepository; private readonly ICompanySsiDetailsRepository _companySsiDetailsRepository; - private readonly IMailingInformationRepository _mailingInformationRepository; + private readonly IMailingProcessCreation _mailingProcessCreation; private readonly ICustodianService _custodianService; private readonly IDateTimeProvider _dateTimeProvider; @@ -72,14 +73,13 @@ public CompanyDataBusinessLogicTests() _languageRepository = A.Fake(); _notificationRepository = A.Fake(); _companySsiDetailsRepository = A.Fake(); - _mailingInformationRepository = A.Fake(); + _mailingProcessCreation = A.Fake(); _custodianService = A.Fake(); _dateTimeProvider = A.Fake(); _identityService = A.Fake(); _identity = A.Fake(); - A.CallTo(() => _portalRepositories.GetInstance()).Returns(_mailingInformationRepository); A.CallTo(() => _portalRepositories.GetInstance()).Returns(_companyRepository); A.CallTo(() => _portalRepositories.GetInstance()).Returns(_consentRepository); A.CallTo(() => _portalRepositories.GetInstance()).Returns(_companyRolesRepository); @@ -94,7 +94,7 @@ public CompanyDataBusinessLogicTests() A.CallTo(() => _identityService.IdentityData).Returns(_identity); var options = Options.Create(new CompanyDataSettings { MaxPageSize = 20, UseCaseParticipationMediaTypes = new[] { MediaTypeId.PDF }, SsiCertificateMediaTypes = new[] { MediaTypeId.PDF } }); - _sut = new CompanyDataBusinessLogic(_portalRepositories, _custodianService, _dateTimeProvider, _identityService, options); + _sut = new CompanyDataBusinessLogic(_portalRepositories, _custodianService, _dateTimeProvider, _identityService, _mailingProcessCreation, options); } #region GetOwnCompanyDetails @@ -1033,7 +1033,7 @@ public async Task ApproveCredential_WithoutExistingSsiDetail_ThrowsNotFoundExcep // Assert ex.Message.Should().Be($"CompanySsiDetail {notExistingId} does not exists"); - A.CallTo(() => _mailingInformationRepository.CreateMailingInformation(A._, A._, "CredentialApproval", A>._)) + A.CallTo(() => _mailingProcessCreation.CreateMailProcess(A._, "CredentialApproval", A>._)) .MustNotHaveHappened(); A.CallTo(() => _portalRepositories.SaveAsync()).MustNotHaveHappened(); } @@ -1057,7 +1057,7 @@ public async Task ApproveCredential_WithStatusNotPending_ThrowsConflictException // Assert ex.Message.Should().Be($"Credential {alreadyActiveId} must be {CompanySsiDetailStatusId.PENDING}"); - A.CallTo(() => _mailingInformationRepository.CreateMailingInformation(A._, A._, "CredentialApproval", A>._)) + A.CallTo(() => _mailingProcessCreation.CreateMailProcess(A._, "CredentialApproval", A>._)) .MustNotHaveHappened(); A.CallTo(() => _portalRepositories.SaveAsync()).MustNotHaveHappened(); } @@ -1081,7 +1081,7 @@ public async Task ApproveCredential_WithBpnNotSetActiveSsiDetail_ThrowsConflictE // Assert ex.Message.Should().Be($"Bpn should be set for company {approvalData.CompanyName}"); - A.CallTo(() => _mailingInformationRepository.CreateMailingInformation(A._, A._, "CredentialApproval", A>._)) + A.CallTo(() => _mailingProcessCreation.CreateMailProcess(A._, "CredentialApproval", A>._)) .MustNotHaveHappened(); A.CallTo(() => _portalRepositories.SaveAsync()).MustNotHaveHappened(); } @@ -1107,7 +1107,7 @@ public async Task ApproveCredential_WithoutExternalDetailSet_ThrowsConflictExcep // Assert ex.Message.Should().Be("The VerifiedCredentialExternalTypeUseCaseDetail must be set"); - A.CallTo(() => _mailingInformationRepository.CreateMailingInformation(A._, A._, "CredentialApproval", A>._)) + A.CallTo(() => _mailingProcessCreation.CreateMailProcess(A._, "CredentialApproval", A>._)) .MustNotHaveHappened(); A.CallTo(() => _portalRepositories.SaveAsync()).MustNotHaveHappened(); } @@ -1171,7 +1171,7 @@ public async Task ApproveCredential_WithValidRequest_ReturnsExpected(VerifiedCre await _sut.ApproveCredential(_validCredentialId, CancellationToken.None).ConfigureAwait(false); // Assert - A.CallTo(() => _mailingInformationRepository.CreateMailingInformation(A._, recipientMail, "CredentialApproval", A>._)) + A.CallTo(() => _mailingProcessCreation.CreateMailProcess(recipientMail, "CredentialApproval", A>._)) .MustHaveHappenedOnceExactly(); A.CallTo(() => _portalRepositories.SaveAsync()).MustHaveHappenedOnceExactly(); if (kindId == VerifiedCredentialTypeKindId.USE_CASE) @@ -1298,7 +1298,7 @@ public async Task ApproveCredential_WithoutUserMail_ReturnsExpected(VerifiedCred await _sut.ApproveCredential(_validCredentialId, CancellationToken.None).ConfigureAwait(false); // Assert - A.CallTo(() => _mailingInformationRepository.CreateMailingInformation(A._, A._, "CredentialRejected", A>._)) + A.CallTo(() => _mailingProcessCreation.CreateMailProcess(A._, "CredentialRejected", A>._)) .MustNotHaveHappened(); A.CallTo(() => _portalRepositories.SaveAsync()).MustHaveHappenedOnceExactly(); if (kindId == VerifiedCredentialTypeKindId.USE_CASE) @@ -1343,7 +1343,7 @@ public async Task RejectCredential_WithoutExistingSsiDetail_ThrowsNotFoundExcept // Assert ex.Message.Should().Be($"CompanySsiDetail {notExistingId} does not exists"); - A.CallTo(() => _mailingInformationRepository.CreateMailingInformation(A._, A._, "CredentialRejected", A>._)) + A.CallTo(() => _mailingProcessCreation.CreateMailProcess(A._, "CredentialRejected", A>._)) .MustNotHaveHappened(); A.CallTo(() => _portalRepositories.SaveAsync()).MustNotHaveHappened(); } @@ -1364,7 +1364,7 @@ public async Task RejectCredential_WithNotPendingSsiDetail_ThrowsNotFoundExcepti // Assert ex.Message.Should().Be($"Credential {alreadyInactiveId} must be {CompanySsiDetailStatusId.PENDING}"); - A.CallTo(() => _mailingInformationRepository.CreateMailingInformation(A._, A._, "CredentialRejected", A>._)) + A.CallTo(() => _mailingProcessCreation.CreateMailProcess(A._, "CredentialRejected", A>._)) .MustNotHaveHappened(); A.CallTo(() => _portalRepositories.SaveAsync()).MustNotHaveHappened(); } @@ -1400,7 +1400,7 @@ public async Task RejectCredential_WithValidRequest_ReturnsExpected() await _sut.RejectCredential(_validCredentialId).ConfigureAwait(false); // Assert - A.CallTo(() => _mailingInformationRepository.CreateMailingInformation(A._, A._, "CredentialRejected", A>._)) + A.CallTo(() => _mailingProcessCreation.CreateMailProcess(A._, "CredentialRejected", A>._)) .MustHaveHappenedOnceExactly(); A.CallTo(() => _portalRepositories.SaveAsync()).MustHaveHappenedOnceExactly(); @@ -1442,7 +1442,7 @@ public async Task RejectCredential_WithoutUserMail_ReturnsExpected() await _sut.RejectCredential(_validCredentialId).ConfigureAwait(false); // Assert - A.CallTo(() => _mailingInformationRepository.CreateMailingInformation(A._, A._, "CredentialRejected", A>._)) + A.CallTo(() => _mailingProcessCreation.CreateMailProcess(A._, "CredentialRejected", A>._)) .MustNotHaveHappened(); A.CallTo(() => _portalRepositories.SaveAsync()).MustHaveHappenedOnceExactly(); diff --git a/tests/administration/Administration.Service.Tests/BusinessLogic/RegistrationBusinessLogicTest.cs b/tests/administration/Administration.Service.Tests/BusinessLogic/RegistrationBusinessLogicTest.cs index 39726bef1b..b976427a0a 100644 --- a/tests/administration/Administration.Service.Tests/BusinessLogic/RegistrationBusinessLogicTest.cs +++ b/tests/administration/Administration.Service.Tests/BusinessLogic/RegistrationBusinessLogicTest.cs @@ -33,6 +33,7 @@ using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Entities; using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Enums; using Org.Eclipse.TractusX.Portal.Backend.Processes.ApplicationChecklist.Library; +using Org.Eclipse.TractusX.Portal.Backend.Processes.Mailing.Library; using Org.Eclipse.TractusX.Portal.Backend.Provisioning.Library; using Org.Eclipse.TractusX.Portal.Backend.SdFactory.Library.BusinessLogic; using Org.Eclipse.TractusX.Portal.Backend.SdFactory.Library.Models; @@ -60,7 +61,7 @@ public class RegistrationBusinessLogicTest private readonly IPortalRepositories _portalRepositories; private readonly IApplicationRepository _applicationRepository; - private readonly IMailingInformationRepository _mailingInformationRepository; + private readonly IMailingProcessCreation _mailingProcessCreation; private readonly IIdentityProviderRepository _identityProviderRepository; private readonly IProcessStepRepository _processStepRepository; private readonly IUserRepository _userRepository; @@ -87,7 +88,7 @@ public RegistrationBusinessLogicTest() _processStepRepository = A.Fake(); _userRepository = A.Fake(); _companyRepository = A.Fake(); - _mailingInformationRepository = A.Fake(); + _mailingProcessCreation = A.Fake(); var options = A.Fake>(); var settings = A.Fake(); @@ -102,14 +103,13 @@ public RegistrationBusinessLogicTest() A.CallTo(() => _portalRepositories.GetInstance()).Returns(_applicationRepository); A.CallTo(() => _portalRepositories.GetInstance()).Returns(_identityProviderRepository); A.CallTo(() => _portalRepositories.GetInstance()).Returns(_documentRepository); - A.CallTo(() => _portalRepositories.GetInstance()).Returns(_mailingInformationRepository); A.CallTo(() => _portalRepositories.GetInstance()).Returns(_userRepository); A.CallTo(() => _portalRepositories.GetInstance()).Returns(_companyRepository); A.CallTo(() => _portalRepositories.GetInstance()).Returns(_processStepRepository); var logger = A.Fake>(); - _logic = new RegistrationBusinessLogic(_portalRepositories, options, _checklistService, _clearinghouseBusinessLogic, _sdFactoryBusinessLogic, _provisioningManager, logger); + _logic = new RegistrationBusinessLogic(_portalRepositories, options, _checklistService, _clearinghouseBusinessLogic, _sdFactoryBusinessLogic, _provisioningManager, _mailingProcessCreation, logger); } #region GetCompanyApplicationDetailsAsync @@ -427,7 +427,7 @@ public async Task SetRegistrationVerification_WithApproval_CallsExpected() entry.Comment.Should().BeNull(); entry.ApplicationChecklistEntryStatusId.Should().Be(ApplicationChecklistEntryStatusId.DONE); - A.CallTo(() => _mailingInformationRepository.CreateMailingInformation(A._, A._, A._, A>._)) + A.CallTo(() => _mailingProcessCreation.CreateMailProcess(A._, A._, A>._)) .MustNotHaveHappened(); A.CallTo(() => _checklistService.FinalizeChecklistEntryAndProcessSteps( A._, @@ -451,7 +451,7 @@ public async Task SetRegistrationVerification_WithBpnNotDone_CallsExpected() A.CallTo(() => _portalRepositories.SaveAsync()).MustHaveHappenedOnceExactly(); entry.Comment.Should().BeNull(); entry.ApplicationChecklistEntryStatusId.Should().Be(ApplicationChecklistEntryStatusId.DONE); - A.CallTo(() => _mailingInformationRepository.CreateMailingInformation(A._, A._, A._, A>._)) + A.CallTo(() => _mailingProcessCreation.CreateMailProcess(A._, A._, A>._)) .MustNotHaveHappened(); A.CallTo(() => _checklistService.FinalizeChecklistEntryAndProcessSteps(A._, null, A>._, null)).MustHaveHappenedOnceExactly(); } diff --git a/tests/administration/Administration.Service.Tests/BusinessLogic/UserBusinessLogicTests.cs b/tests/administration/Administration.Service.Tests/BusinessLogic/UserBusinessLogicTests.cs index 5d8e919262..4f04afa487 100644 --- a/tests/administration/Administration.Service.Tests/BusinessLogic/UserBusinessLogicTests.cs +++ b/tests/administration/Administration.Service.Tests/BusinessLogic/UserBusinessLogicTests.cs @@ -31,6 +31,7 @@ using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Entities; using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Enums; using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Identities; +using Org.Eclipse.TractusX.Portal.Backend.Processes.Mailing.Library; using Org.Eclipse.TractusX.Portal.Backend.Provisioning.Library; using Org.Eclipse.TractusX.Portal.Backend.Provisioning.Library.Models; using Org.Eclipse.TractusX.Portal.Backend.Provisioning.Library.Service; @@ -52,7 +53,7 @@ public class UserBusinessLogicTests private readonly IUserRolesRepository _userRolesRepository; private readonly IUserBusinessPartnerRepository _userBusinessPartnerRepository; private readonly IApplicationRepository _applicationRepository; - private readonly IMailingInformationRepository _mailingInformationRepository; + private readonly IMailingProcessCreation _mailingProcessCreation; private readonly IMockLogger _mockLogger; private readonly ILogger _logger; private readonly IOptions _options; @@ -98,7 +99,7 @@ public UserBusinessLogicTests() _userRolesRepository = A.Fake(); _userBusinessPartnerRepository = A.Fake(); _applicationRepository = A.Fake(); - _mailingInformationRepository = A.Fake(); + _mailingProcessCreation = A.Fake(); _mockLogger = A.Fake>(); _logger = new MockLogger(_mockLogger); @@ -139,7 +140,6 @@ public UserBusinessLogicTests() }; _error = _fixture.Create(); - A.CallTo(() => _portalRepositories.GetInstance()).Returns(_mailingInformationRepository); A.CallTo(() => _portalRepositories.GetInstance()).Returns(_userRepository); A.CallTo(() => _portalRepositories.GetInstance()).Returns(_userRolesRepository); A.CallTo(() => _portalRepositories.GetInstance()).Returns(_notificationRepository); @@ -166,15 +166,16 @@ public async Task TestUserCreationAllSuccess() null!, _portalRepositories, _identityService, + _mailingProcessCreation, _logger, _options); var result = await sut.CreateOwnCompanyUsersAsync(userList).ToListAsync().ConfigureAwait(false); A.CallTo(() => _mockLogger.Log(A.That.IsEqualTo(LogLevel.Error), A._, A._)).MustNotHaveHappened(); - A.CallTo(() => _mailingInformationRepository.CreateMailingInformation(A._, A._, "NewUserTemplate", A>._)) + A.CallTo(() => _mailingProcessCreation.CreateMailProcess(A._, "NewUserTemplate", A>._)) .MustHaveHappenedANumberOfTimesMatching(times => times == userList.Length); - A.CallTo(() => _mailingInformationRepository.CreateMailingInformation(A._, A._, "NewUserPasswordTemplate", A>._)) + A.CallTo(() => _mailingProcessCreation.CreateMailProcess(A._, "NewUserPasswordTemplate", A>._)) .MustHaveHappenedANumberOfTimesMatching(times => times == userList.Length); result.Should().NotBeNull(); @@ -207,6 +208,7 @@ public async Task TestUserCreation_NoUserNameAndEmail_Throws() null!, _portalRepositories, _identityService, + _mailingProcessCreation, _logger, _options); @@ -239,6 +241,7 @@ public async Task TestUserCreation_NoRoles_Throws() null!, _portalRepositories, _identityService, + _mailingProcessCreation, _logger, _options); @@ -282,6 +285,7 @@ public async Task TestUserCreationCreationError() null!, _portalRepositories, _identityService, + _mailingProcessCreation, _logger, _options); @@ -295,9 +299,9 @@ public async Task TestUserCreationCreationError() A.CallTo(() => _mockLogger.Log(A.That.IsEqualTo(LogLevel.Error), A._, A._)).MustHaveHappenedOnceExactly(); - A.CallTo(() => _mailingInformationRepository.CreateMailingInformation(A._, A._, "NewUserTemplate", A>._)) + A.CallTo(() => _mailingProcessCreation.CreateMailProcess(A._, "NewUserTemplate", A>._)) .MustHaveHappenedANumberOfTimesMatching(times => times == 4); - A.CallTo(() => _mailingInformationRepository.CreateMailingInformation(A._, A._, "NewUserPasswordTemplate", A>._)) + A.CallTo(() => _mailingProcessCreation.CreateMailProcess(A._, "NewUserPasswordTemplate", A>._)) .MustHaveHappenedANumberOfTimesMatching(times => times == 4); result.Should().NotBeNull(); @@ -332,6 +336,7 @@ public async Task TestUserCreationCreationThrows() null!, _portalRepositories, _identityService, + _mailingProcessCreation, _logger, _options); @@ -346,9 +351,9 @@ public async Task TestUserCreationCreationThrows() ))).MustHaveHappenedOnceExactly(); A.CallTo(() => _mockLogger.Log(A.That.IsEqualTo(LogLevel.Error), A._, A._)).MustNotHaveHappened(); - A.CallTo(() => _mailingInformationRepository.CreateMailingInformation(A._, A._, "NewUserTemplate", A>._)) + A.CallTo(() => _mailingProcessCreation.CreateMailProcess(A._, "NewUserTemplate", A>._)) .MustHaveHappenedANumberOfTimesMatching(times => times == 2); - A.CallTo(() => _mailingInformationRepository.CreateMailingInformation(A._, A._, "NewUserPasswordTemplate", A>._)) + A.CallTo(() => _mailingProcessCreation.CreateMailProcess(A._, "NewUserPasswordTemplate", A>._)) .MustHaveHappenedANumberOfTimesMatching(times => times == 2); error.Should().BeSameAs(expected); @@ -371,12 +376,13 @@ public async Task TestCreateOwnCompanyIdpUserAsyncSuccess() null!, _portalRepositories, _identityService, + _mailingProcessCreation, _logger, _options); var result = await sut.CreateOwnCompanyIdpUserAsync(_identityProviderId, userCreationInfoIdp).ConfigureAwait(false); result.Should().NotBe(Guid.Empty); - A.CallTo(() => _mailingInformationRepository.CreateMailingInformation(A._, A.That.IsEqualTo(userCreationInfoIdp.Email), A._, A>.That.Matches(x => x["companyName"] == _displayName))) + A.CallTo(() => _mailingProcessCreation.CreateMailProcess(A.That.IsEqualTo(userCreationInfoIdp.Email), A._, A>.That.Matches(x => x["companyName"] == _displayName))) .MustHaveHappened(); A.CallTo(() => _mockLogger.Log(A.That.IsEqualTo(LogLevel.Error), A._, A._)).MustNotHaveHappened(); } @@ -399,6 +405,7 @@ public async Task TestCreateOwnCompanyIdpUserNoRolesThrowsArgumentException() null!, null!, _identityService, + _mailingProcessCreation, _logger, _options); @@ -428,6 +435,7 @@ public async Task TestCreateOwnCompanyIdpUserAsyncError() null!, null!, _identityService, + _mailingProcessCreation, _logger, _options); @@ -435,7 +443,7 @@ public async Task TestCreateOwnCompanyIdpUserAsyncError() var error = await Assert.ThrowsAsync(Act).ConfigureAwait(false); error.Message.Should().Be(_error.Message); - A.CallTo(() => _mailingInformationRepository.CreateMailingInformation(A._, A._, A._, A>._)) + A.CallTo(() => _mailingProcessCreation.CreateMailProcess(A._, A._, A>._)) .MustNotHaveHappened(); } @@ -454,6 +462,7 @@ public async Task TestCreateOwnCompanyIdpUserAsyncThrows() null!, null!, _identityService, + _mailingProcessCreation, _logger, _options); @@ -461,7 +470,7 @@ public async Task TestCreateOwnCompanyIdpUserAsyncThrows() var error = await Assert.ThrowsAsync(Act).ConfigureAwait(false); error.Message.Should().Be(_error.Message); - A.CallTo(() => _mailingInformationRepository.CreateMailingInformation(A._, A._, A._, A>._)) + A.CallTo(() => _mailingProcessCreation.CreateMailProcess(A._, A._, A>._)) .MustNotHaveHappened(); } @@ -480,6 +489,7 @@ public async Task TestDeleteOwnUserSuccess() null!, _portalRepositories, _identityService, + _mailingProcessCreation, _logger, _options ); @@ -531,6 +541,7 @@ public async Task TestDeleteOwnUserInvalidUserThrows() null!, _portalRepositories, _identityService, + _mailingProcessCreation, _logger, _options ); @@ -561,6 +572,7 @@ public async Task TestDeleteOwnUserInvalidCompanyUserThrows() null!, _portalRepositories, _identityService, + _mailingProcessCreation, _logger, _options ); @@ -1079,6 +1091,7 @@ public async Task TestDeleteOwnCompanyUsersAsyncSuccess() null!, _portalRepositories, _identityService, + _mailingProcessCreation, _logger, _options ); @@ -1111,6 +1124,7 @@ public async Task TestDeleteOwnCompanyUsersAsyncNoSharedIdpSuccess() null!, _portalRepositories, _identityService, + _mailingProcessCreation, _logger, _options ); @@ -1171,6 +1185,7 @@ public async Task TestDeleteOwnCompanyUsersAsyncError() null!, _portalRepositories, _identityService, + _mailingProcessCreation, _logger, _options ); @@ -1227,6 +1242,7 @@ public async Task TestDeleteOwnCompanyUsersAsyncNoSharedIdpError() null!, _portalRepositories, _identityService, + _mailingProcessCreation, _logger, _options ); @@ -1262,7 +1278,7 @@ public async Task GetOwnCompanyAppUsersAsync_ReturnsExpectedResult() A.CallTo(() => _userRepository.GetOwnCompanyAppUsersPaginationSourceAsync(A._, A._, A>._, A>._, A._)) .Returns((int skip, int take) => Task.FromResult((Pagination.Source?)new Pagination.Source(companyUsers.Count(), companyUsers.Skip(skip).Take(take)))); - var sut = new UserBusinessLogic(null!, null!, null!, _portalRepositories, _identityService, null!, A.Fake>()); + var sut = new UserBusinessLogic(null!, null!, null!, _portalRepositories, _identityService, _mailingProcessCreation, null!, A.Fake>()); // Act var results = await sut.GetOwnCompanyAppUsersAsync( @@ -1287,7 +1303,7 @@ public async Task GetOwnCompanyAppUsersAsync_SecondPage_ReturnsExpectedResult() A.CallTo(() => _userRepository.GetOwnCompanyAppUsersPaginationSourceAsync(A._, A._, A>._, A>._, A._)) .Returns((int skip, int take) => Task.FromResult((Pagination.Source?)new Pagination.Source(companyUsers.Count(), companyUsers.Skip(skip).Take(take)))); - var sut = new UserBusinessLogic(null!, null!, null!, _portalRepositories, _identityService, null!, A.Fake>()); + var sut = new UserBusinessLogic(null!, null!, null!, _portalRepositories, _identityService, _mailingProcessCreation, null!, A.Fake>()); // Act var results = await sut.GetOwnCompanyAppUsersAsync( @@ -1317,7 +1333,7 @@ public async Task GetOwnCompanyAppUsersAsync_WithNonExistingCompanyUser_ThrowsNo A.CallTo(() => _userBusinessPartnerRepository.GetOwnCompanyUserWithAssignedBusinessPartnerNumbersAsync(companyUserId, _adminCompanyId, businessPartnerNumber)) .Returns(((bool, bool, bool))default); A.CallTo(() => _portalRepositories.GetInstance()).Returns(_userBusinessPartnerRepository); - var sut = new UserBusinessLogic(null!, null!, null!, _portalRepositories, _identityService, null!, A.Fake>()); + var sut = new UserBusinessLogic(null!, null!, null!, _portalRepositories, _identityService, _mailingProcessCreation, null!, A.Fake>()); // Act async Task Act() => await sut.DeleteOwnUserBusinessPartnerNumbersAsync(companyUserId, businessPartnerNumber).ConfigureAwait(false); @@ -1338,7 +1354,7 @@ public async Task GetOwnCompanyAppUsersAsync_WithUnassignedBusinessPartner_Throw A.CallTo(() => _userBusinessPartnerRepository.GetOwnCompanyUserWithAssignedBusinessPartnerNumbersAsync(companyUserId, _adminCompanyId, businessPartnerNumber)) .Returns((true, false, false)); A.CallTo(() => _portalRepositories.GetInstance()).Returns(_userBusinessPartnerRepository); - var sut = new UserBusinessLogic(null!, null!, null!, _portalRepositories, _identityService, null!, A.Fake>()); + var sut = new UserBusinessLogic(null!, null!, null!, _portalRepositories, _identityService, _mailingProcessCreation, null!, A.Fake>()); // Act async Task Act() => await sut.DeleteOwnUserBusinessPartnerNumbersAsync(companyUserId, businessPartnerNumber).ConfigureAwait(false); @@ -1361,7 +1377,7 @@ public async Task GetOwnCompanyAppUsersAsync_WithoutUserForBpn_ThrowsArgumentExc A.CallTo(() => _userBusinessPartnerRepository.GetOwnCompanyUserWithAssignedBusinessPartnerNumbersAsync(companyUserId, _adminCompanyId, businessPartnerNumber)) .Returns((true, true, true)); A.CallTo(() => _portalRepositories.GetInstance()).Returns(_userBusinessPartnerRepository); - var sut = new UserBusinessLogic(_provisioningManager, null!, null!, _portalRepositories, _identityService, null!, A.Fake>()); + var sut = new UserBusinessLogic(_provisioningManager, null!, null!, _portalRepositories, _identityService, _mailingProcessCreation, null!, A.Fake>()); // Act async Task Act() => await sut.DeleteOwnUserBusinessPartnerNumbersAsync(companyUserId, businessPartnerNumber).ConfigureAwait(false); @@ -1382,7 +1398,7 @@ public async Task GetOwnCompanyAppUsersAsync_WithInvalidUser_ThrowsForbiddenExce A.CallTo(() => _userBusinessPartnerRepository.GetOwnCompanyUserWithAssignedBusinessPartnerNumbersAsync(companyUserId, _adminCompanyId, businessPartnerNumber)) .Returns((true, true, false)); A.CallTo(() => _portalRepositories.GetInstance()).Returns(_userBusinessPartnerRepository); - var sut = new UserBusinessLogic(null!, null!, null!, _portalRepositories, _identityService, null!, A.Fake>()); + var sut = new UserBusinessLogic(null!, null!, null!, _portalRepositories, _identityService, _mailingProcessCreation, null!, A.Fake>()); // Act async Task Act() => await sut.DeleteOwnUserBusinessPartnerNumbersAsync(companyUserId, businessPartnerNumber).ConfigureAwait(false); @@ -1405,7 +1421,7 @@ public async Task GetOwnCompanyAppUsersAsync_WithValidData_ThrowsForbiddenExcept .Returns((true, true, true)); A.CallTo(() => _portalRepositories.GetInstance()).Returns(_userBusinessPartnerRepository); A.CallTo(() => _provisioningManager.GetUserByUserName(companyUserId.ToString())).Returns(iamUserId); - var sut = new UserBusinessLogic(_provisioningManager, null!, null!, _portalRepositories, _identityService, null!, A.Fake>()); + var sut = new UserBusinessLogic(_provisioningManager, null!, null!, _portalRepositories, _identityService, _mailingProcessCreation, null!, A.Fake>()); // Act await sut.DeleteOwnUserBusinessPartnerNumbersAsync(companyUserId, businessPartnerNumber).ConfigureAwait(false); @@ -1434,7 +1450,7 @@ public async Task GetOwnUserDetails_ReturnsExpected() .Returns(userRoleIds.ToAsyncEnumerable()); A.CallTo(() => _userRepository.GetUserDetailsUntrackedAsync(A._, A>._)) .Returns(companyOwnUserDetails); - var sut = new UserBusinessLogic(_provisioningManager, null!, null!, _portalRepositories, _identityService, _logger, _options); + var sut = new UserBusinessLogic(_provisioningManager, null!, null!, _portalRepositories, _identityService, _mailingProcessCreation, _logger, _options); // Act var result = await sut.GetOwnUserDetails().ConfigureAwait(false); @@ -1456,7 +1472,7 @@ public async Task GetOwnUserDetails_ThrowsNotFoundException() A.CallTo(() => _identity.CompanyId).Returns(companyId); A.CallTo(() => _userRepository.GetUserDetailsUntrackedAsync(userId, A>._)) .Returns((CompanyOwnUserDetails)default!); - var sut = new UserBusinessLogic(_provisioningManager, null!, null!, _portalRepositories, _identityService, _logger, _options); + var sut = new UserBusinessLogic(_provisioningManager, null!, null!, _portalRepositories, _identityService, _mailingProcessCreation, _logger, _options); // Act async Task Act() => await sut.GetOwnUserDetails().ConfigureAwait(false); diff --git a/tests/administration/Administration.Service.Tests/BusinessLogic/UserUploadBusinessLogicTests.cs b/tests/administration/Administration.Service.Tests/BusinessLogic/UserUploadBusinessLogicTests.cs index 8b3fc42156..799945f421 100644 --- a/tests/administration/Administration.Service.Tests/BusinessLogic/UserUploadBusinessLogicTests.cs +++ b/tests/administration/Administration.Service.Tests/BusinessLogic/UserUploadBusinessLogicTests.cs @@ -29,6 +29,7 @@ using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.DBAccess.Repositories; using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Enums; using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Identities; +using Org.Eclipse.TractusX.Portal.Backend.Processes.Mailing.Library; using Org.Eclipse.TractusX.Portal.Backend.Provisioning.Library.ErrorHandling; using Org.Eclipse.TractusX.Portal.Backend.Provisioning.Library.Models; using Org.Eclipse.TractusX.Portal.Backend.Provisioning.Library.Service; @@ -45,8 +46,7 @@ public class UserUploadBusinessLogicTests private readonly IFormFile _document; private readonly Guid _identityProviderId; private readonly IIdentityData _identity; - private readonly IPortalRepositories _portalRepositories; - private readonly IMailingInformationRepository _mailingInformationRepository; + private readonly IMailingProcessCreation _mailingProcessCreation; private readonly UserSettings _settings; private readonly Encoding _encoding; private readonly Func _processLine; @@ -65,10 +65,7 @@ public UserUploadBusinessLogicTests() _random = new Random(); _userProvisioningService = A.Fake(); - _portalRepositories = A.Fake(); - _mailingInformationRepository = A.Fake(); - A.CallTo(() => _portalRepositories.GetInstance()) - .Returns(_mailingInformationRepository); + _mailingProcessCreation = A.Fake(); _options = A.Fake>(); @@ -99,7 +96,7 @@ public async Task TestSetup() { SetupFakes(new[] { HeaderLine() }); - var sut = new UserUploadBusinessLogic(_userProvisioningService, _portalRepositories, _identityService, _errorMessageService, _options); + var sut = new UserUploadBusinessLogic(_userProvisioningService, _mailingProcessCreation, _identityService, _errorMessageService, _options); var result = await sut.UploadOwnCompanyIdpUsersAsync(_identityProviderId, _document, CancellationToken.None).ConfigureAwait(false); @@ -109,7 +106,7 @@ public async Task TestSetup() result.Error.Should().Be(0); result.Total.Should().Be(0); result.Errors.Should().BeEmpty(); - A.CallTo(() => _mailingInformationRepository.CreateMailingInformation(A._, A._, A._, A>._)) + A.CallTo(() => _mailingProcessCreation.CreateMailProcess(A._, A._, A>._)) .MustNotHaveHappened(); } @@ -125,7 +122,7 @@ public async Task TestUserCreationAllSuccess() NextLine() }); - var sut = new UserUploadBusinessLogic(_userProvisioningService, _portalRepositories, _identityService, _errorMessageService, _options); + var sut = new UserUploadBusinessLogic(_userProvisioningService, _mailingProcessCreation, _identityService, _errorMessageService, _options); var result = await sut.UploadOwnCompanyIdpUsersAsync(_identityProviderId, _document, CancellationToken.None).ConfigureAwait(false); @@ -134,7 +131,7 @@ public async Task TestUserCreationAllSuccess() result.Error.Should().Be(0); result.Total.Should().Be(5); result.Errors.Should().BeEmpty(); - A.CallTo(() => _mailingInformationRepository.CreateMailingInformation(A._, A._, A._, A>._)) + A.CallTo(() => _mailingProcessCreation.CreateMailProcess(A._, A._, A>._)) .MustHaveHappened(5, Times.Exactly); } @@ -152,7 +149,7 @@ public async Task TestUserCreationHeaderParsingThrows() NextLine() }); - var sut = new UserUploadBusinessLogic(_userProvisioningService, _portalRepositories, _identityService, _errorMessageService, _options); + var sut = new UserUploadBusinessLogic(_userProvisioningService, _mailingProcessCreation, _identityService, _errorMessageService, _options); async Task Act() => await sut.UploadOwnCompanyIdpUsersAsync(_identityProviderId, _document, CancellationToken.None).ConfigureAwait(false); @@ -183,7 +180,7 @@ public async Task TestUserCreationCreationError() .With(x => x.Error, detailError) .Create()); - var sut = new UserUploadBusinessLogic(_userProvisioningService, _portalRepositories, _identityService, _errorMessageService, _options); + var sut = new UserUploadBusinessLogic(_userProvisioningService, _mailingProcessCreation, _identityService, _errorMessageService, _options); var result = await sut.UploadOwnCompanyIdpUsersAsync(_identityProviderId, _document, CancellationToken.None).ConfigureAwait(false); @@ -205,7 +202,7 @@ public async Task TestUserCreationCreationError() x.Parameters.Count() == 2 && x.Parameters.First(p => p.Name == "userName").Value == "foo" && x.Parameters.First(p => p.Name == "realm").Value == "bar"); - A.CallTo(() => _mailingInformationRepository.CreateMailingInformation(A._, A._, A._, A>._)) + A.CallTo(() => _mailingProcessCreation.CreateMailProcess(A._, A._, A>._)) .MustHaveHappened(4, Times.Exactly); } @@ -225,7 +222,7 @@ public async Task TestUserCreationCreationNoRolesError() NextLine() }); - var sut = new UserUploadBusinessLogic(_userProvisioningService, _portalRepositories, _identityService, _errorMessageService, _options); + var sut = new UserUploadBusinessLogic(_userProvisioningService, _mailingProcessCreation, _identityService, _errorMessageService, _options); var result = await sut.UploadOwnCompanyIdpUsersAsync(_identityProviderId, _document, CancellationToken.None).ConfigureAwait(false); @@ -237,7 +234,7 @@ public async Task TestUserCreationCreationNoRolesError() result.Error.Should().Be(1); result.Total.Should().Be(5); result.Errors.Should().ContainSingle().Which.Should().Match(x => x.Line == 3 && x.Message == "at least one role must be specified"); - A.CallTo(() => _mailingInformationRepository.CreateMailingInformation(A._, A._, A._, A>._)) + A.CallTo(() => _mailingProcessCreation.CreateMailProcess(A._, A._, A>._)) .MustHaveHappened(4, Times.Exactly); } @@ -253,7 +250,7 @@ public async Task TestUserCreationParsingError() NextLine() }); - var sut = new UserUploadBusinessLogic(_userProvisioningService, _portalRepositories, _identityService, _errorMessageService, _options); + var sut = new UserUploadBusinessLogic(_userProvisioningService, _mailingProcessCreation, _identityService, _errorMessageService, _options); var result = await sut.UploadOwnCompanyIdpUsersAsync(_identityProviderId, _document, CancellationToken.None).ConfigureAwait(false); @@ -262,7 +259,7 @@ public async Task TestUserCreationParsingError() result.Error.Should().Be(1); result.Total.Should().Be(5); result.Errors.Should().ContainSingle().Which.Should().Match(x => x.Line == 3 && x.Message == "value for LastName type string expected (Parameter 'document')"); - A.CallTo(() => _mailingInformationRepository.CreateMailingInformation(A._, A._, A._, A>._)) + A.CallTo(() => _mailingProcessCreation.CreateMailProcess(A._, A._, A>._)) .MustHaveHappened(4, Times.Exactly); } @@ -283,7 +280,7 @@ public async Task TestUserCreationCreationThrows() A.CallTo(() => _processLine(A.That.Matches(info => CreationInfoMatches(info, creationInfo)))) .Throws(_error); - var sut = new UserUploadBusinessLogic(_userProvisioningService, _portalRepositories, _identityService, _errorMessageService, _options); + var sut = new UserUploadBusinessLogic(_userProvisioningService, _mailingProcessCreation, _identityService, _errorMessageService, _options); var result = await sut.UploadOwnCompanyIdpUsersAsync(_identityProviderId, _document, CancellationToken.None).ConfigureAwait(false); @@ -294,7 +291,7 @@ public async Task TestUserCreationCreationThrows() result.Error.Should().Be(1); result.Total.Should().Be(3); result.Errors.Should().ContainSingle().Which.Should().Match(x => x.Line == 3 && x.Message == _error.Message); - A.CallTo(() => _mailingInformationRepository.CreateMailingInformation(A._, A._, A._, A>._)) + A.CallTo(() => _mailingProcessCreation.CreateMailProcess(A._, A._, A>._)) .MustHaveHappened(2, Times.Exactly); } @@ -307,7 +304,7 @@ public async Task TestSetupSharedIdp() { SetupFakes(new[] { HeaderLineSharedIdp() }); - var sut = new UserUploadBusinessLogic(_userProvisioningService, _portalRepositories, _identityService, _errorMessageService, _options); + var sut = new UserUploadBusinessLogic(_userProvisioningService, _mailingProcessCreation, _identityService, _errorMessageService, _options); var result = await sut.UploadOwnCompanySharedIdpUsersAsync(_document, CancellationToken.None).ConfigureAwait(false); @@ -331,7 +328,7 @@ public async Task TestUserCreationSharedIdpAllSuccess() NextLineSharedIdp() }); - var sut = new UserUploadBusinessLogic(_userProvisioningService, _portalRepositories, _identityService, _errorMessageService, _options); + var sut = new UserUploadBusinessLogic(_userProvisioningService, _mailingProcessCreation, _identityService, _errorMessageService, _options); var result = await sut.UploadOwnCompanySharedIdpUsersAsync(_document, CancellationToken.None).ConfigureAwait(false); @@ -340,7 +337,7 @@ public async Task TestUserCreationSharedIdpAllSuccess() result.Error.Should().Be(0); result.Total.Should().Be(5); result.Errors.Should().BeEmpty(); - A.CallTo(() => _mailingInformationRepository.CreateMailingInformation(A._, A._, A._, A>._)) + A.CallTo(() => _mailingProcessCreation.CreateMailProcess(A._, A._, A>._)) .MustNotHaveHappened(); } @@ -358,7 +355,7 @@ public async Task TestUserCreationSharedIdpHeaderParsingThrows() NextLineSharedIdp() }); - var sut = new UserUploadBusinessLogic(_userProvisioningService, _portalRepositories, _identityService, _errorMessageService, _options); + var sut = new UserUploadBusinessLogic(_userProvisioningService, _mailingProcessCreation, _identityService, _errorMessageService, _options); async Task Act() => await sut.UploadOwnCompanySharedIdpUsersAsync(_document, CancellationToken.None).ConfigureAwait(false); @@ -382,7 +379,7 @@ public async Task TestUserCreationSharedIdpNoRolesError() NextLineSharedIdp(), }); - var sut = new UserUploadBusinessLogic(_userProvisioningService, _portalRepositories, _identityService, _errorMessageService, _options); + var sut = new UserUploadBusinessLogic(_userProvisioningService, _mailingProcessCreation, _identityService, _errorMessageService, _options); var result = await sut.UploadOwnCompanySharedIdpUsersAsync(_document, CancellationToken.None).ConfigureAwait(false); @@ -420,7 +417,7 @@ public async Task TestUserCreationSharedIdpCreationError() .With(x => x.Error, detailError) .Create()); - var sut = new UserUploadBusinessLogic(_userProvisioningService, _portalRepositories, _identityService, _errorMessageService, _options); + var sut = new UserUploadBusinessLogic(_userProvisioningService, _mailingProcessCreation, _identityService, _errorMessageService, _options); var result = await sut.UploadOwnCompanySharedIdpUsersAsync(_document, CancellationToken.None).ConfigureAwait(false); @@ -456,7 +453,7 @@ public async Task TestUserCreationSharedIdpParsingError() NextLineSharedIdp() }); - var sut = new UserUploadBusinessLogic(_userProvisioningService, _portalRepositories, _identityService, _errorMessageService, _options); + var sut = new UserUploadBusinessLogic(_userProvisioningService, _mailingProcessCreation, _identityService, _errorMessageService, _options); var result = await sut.UploadOwnCompanySharedIdpUsersAsync(_document, CancellationToken.None).ConfigureAwait(false); @@ -485,7 +482,7 @@ public async Task TestUserCreationSharedIdpCreationThrows() A.CallTo(() => _processLine(A.That.Matches(info => CreationInfoMatchesSharedIdp(info, creationInfo)))) .Throws(_error); - var sut = new UserUploadBusinessLogic(_userProvisioningService, _portalRepositories, _identityService, _errorMessageService, _options); + var sut = new UserUploadBusinessLogic(_userProvisioningService, _mailingProcessCreation, _identityService, _errorMessageService, _options); var result = await sut.UploadOwnCompanySharedIdpUsersAsync(_document, CancellationToken.None).ConfigureAwait(false); diff --git a/tests/mailing/Mailing.Service.Tests/Mailing.Service.Tests.csproj b/tests/mailing/Mailing.Service.Tests/Mailing.Service.Tests.csproj index 0532751633..31574a3420 100644 --- a/tests/mailing/Mailing.Service.Tests/Mailing.Service.Tests.csproj +++ b/tests/mailing/Mailing.Service.Tests/Mailing.Service.Tests.csproj @@ -1,26 +1,6 @@ - + - Org.Eclipse.TractusX.Portal.Backend.Mailing.Service.Tests - Org.Eclipse.TractusX.Portal.Backend.Mailing.Service.Tests net7.0 enable enable @@ -43,7 +23,6 @@ - diff --git a/tests/marketplace/Offers.Library.Tests/Offers.Library.Tests.csproj b/tests/marketplace/Offers.Library.Tests/Offers.Library.Tests.csproj index d47f6acc5e..8f3366cee8 100644 --- a/tests/marketplace/Offers.Library.Tests/Offers.Library.Tests.csproj +++ b/tests/marketplace/Offers.Library.Tests/Offers.Library.Tests.csproj @@ -48,6 +48,5 @@ - diff --git a/tests/marketplace/Offers.Library.Tests/Service/OfferServiceTests.cs b/tests/marketplace/Offers.Library.Tests/Service/OfferServiceTests.cs index 0a2f6c6e5e..4cb887ad5b 100644 --- a/tests/marketplace/Offers.Library.Tests/Service/OfferServiceTests.cs +++ b/tests/marketplace/Offers.Library.Tests/Service/OfferServiceTests.cs @@ -21,7 +21,6 @@ using Org.Eclipse.TractusX.Portal.Backend.Framework.ErrorHandling; using Org.Eclipse.TractusX.Portal.Backend.Framework.Models; using Org.Eclipse.TractusX.Portal.Backend.Framework.Models.Configuration; -using Org.Eclipse.TractusX.Portal.Backend.Mailing.Service; using Org.Eclipse.TractusX.Portal.Backend.Notifications.Library; using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.DBAccess; using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.DBAccess.Models; @@ -29,6 +28,7 @@ using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Entities; using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Enums; using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Identities; +using Org.Eclipse.TractusX.Portal.Backend.Processes.Mailing.Library; using Org.Eclipse.TractusX.Portal.Backend.Tests.Shared.Extensions; using System.Collections.Immutable; @@ -63,7 +63,7 @@ public class OfferServiceTests private readonly IUserRepository _userRepository; private readonly IUserRolesRepository _userRolesRepository; private readonly ILanguageRepository _languageRepository; - private readonly IRoleBaseMailService _roleBaseMailService; + private readonly IMailingProcessCreation _mailingProcessCreation; private readonly IDocumentRepository _documentRepository; private readonly OfferService _sut; private readonly IOfferSetupService _offerSetupService; @@ -96,7 +96,7 @@ public OfferServiceTests() _languageRepository = A.Fake(); _technicalUserProfileRepository = A.Fake(); _notificationService = A.Fake(); - _roleBaseMailService = A.Fake(); + _mailingProcessCreation = A.Fake(); _documentRepository = A.Fake(); _offerSetupService = A.Fake(); _connectorsRepository = A.Fake(); @@ -108,7 +108,7 @@ public OfferServiceTests() A.CallTo(() => _identity.CompanyId).Returns(_companyId); A.CallTo(() => _identityService.IdentityData).Returns(_identity); - _sut = new OfferService(_portalRepositories, _notificationService, _roleBaseMailService, _identityService, _offerSetupService, _logger); + _sut = new OfferService(_portalRepositories, _notificationService, _mailingProcessCreation, _identityService, _offerSetupService, _logger); SetupRepositories(); _createNotificationsEnumerator = SetupServices(); @@ -885,7 +885,7 @@ public async Task ApproveOfferRequestAsync_ExecutesSuccessfully(bool isSingleIns A.CallTo(() => _offerSetupService.ActivateSingleInstanceAppAsync(offer.Id)) .MustNotHaveHappened(); } - A.CallTo(() => _roleBaseMailService.RoleBaseSendMail( + A.CallTo(() => _mailingProcessCreation.RoleBaseSendMail( A>.That.IsSameSequenceAs(recipients), A>.That.IsSameSequenceAs(mailParameters), userNameParameter, @@ -1221,7 +1221,7 @@ public async Task DeclineOfferAsync_WithValidData_CallsExpected(OfferTypeId offe A.CallTo(() => _portalRepositories.SaveAsync()).MustHaveHappenedOnceExactly(); A.CallTo(() => _notificationService.CreateNotifications(A>._, A._, A>._, A._, A._)).MustHaveHappenedOnceExactly(); A.CallTo(() => _createNotificationsEnumerator.MoveNextAsync()).MustHaveHappened(2, Times.Exactly); - A.CallTo(() => _roleBaseMailService.RoleBaseSendMail( + A.CallTo(() => _mailingProcessCreation.RoleBaseSendMail( A>.That.IsSameSequenceAs(recipients), A>.That.IsSameSequenceAs(mailParameters), userNameParameter, diff --git a/tests/marketplace/Offers.Library.Tests/Service/OfferSetupServiceTests.cs b/tests/marketplace/Offers.Library.Tests/Service/OfferSetupServiceTests.cs index c36252710b..1454085953 100644 --- a/tests/marketplace/Offers.Library.Tests/Service/OfferSetupServiceTests.cs +++ b/tests/marketplace/Offers.Library.Tests/Service/OfferSetupServiceTests.cs @@ -29,6 +29,7 @@ using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Enums; using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Identities; using Org.Eclipse.TractusX.Portal.Backend.Processes.Library; +using Org.Eclipse.TractusX.Portal.Backend.Processes.Mailing.Library; using Org.Eclipse.TractusX.Portal.Backend.Processes.OfferSubscription.Library; using Org.Eclipse.TractusX.Portal.Backend.Provisioning.Library; using Org.Eclipse.TractusX.Portal.Backend.Provisioning.Library.Enums; @@ -68,7 +69,7 @@ public class OfferSetupServiceTests private readonly IOfferRepository _offerRepository; private readonly IUserRolesRepository _userRolesRepository; private readonly INotificationRepository _notificationRepository; - private readonly IMailingInformationRepository _mailingInformationRepository; + private readonly IMailingProcessCreation _mailingProcessCreation; private readonly IPortalRepositories _portalRepositories; private readonly IProvisioningManager _provisioningManager; private readonly IServiceAccountCreation _serviceAccountCreation; @@ -89,7 +90,7 @@ public OfferSetupServiceTests() _appInstanceRepository = A.Fake(); _clientRepository = A.Fake(); _offerSubscriptionsRepository = A.Fake(); - _mailingInformationRepository = A.Fake(); + _mailingProcessCreation = A.Fake(); _offerRepository = A.Fake(); _userRolesRepository = A.Fake(); _provisioningManager = A.Fake(); @@ -112,9 +113,8 @@ public OfferSetupServiceTests() A.CallTo(() => _portalRepositories.GetInstance()).Returns(_offerSubscriptionsRepository); A.CallTo(() => _portalRepositories.GetInstance()).Returns(_offerRepository); A.CallTo(() => _portalRepositories.GetInstance()).Returns(_userRolesRepository); - A.CallTo(() => _portalRepositories.GetInstance()).Returns(_mailingInformationRepository); - _sut = new OfferSetupService(_portalRepositories, _provisioningManager, _serviceAccountCreation, _notificationService, _offerSubscriptionProcessService, _technicalUserProfileService, _identityService, A.Fake>()); + _sut = new OfferSetupService(_portalRepositories, _provisioningManager, _serviceAccountCreation, _notificationService, _offerSubscriptionProcessService, _technicalUserProfileService, _identityService, _mailingProcessCreation, A.Fake>()); } #region AutoSetupServiceAsync @@ -243,7 +243,7 @@ public async Task AutoSetup_WithValidData_ReturnsExpectedNotificationAndSecret(O offerSubscription.OfferSubscriptionStatusId.Should().Be(OfferSubscriptionStatusId.ACTIVE); if (!isSingleInstance) { - A.CallTo(() => _mailingInformationRepository.CreateMailingInformation(A._, A._, $"{offerTypeId.ToString().ToLower()}-subscription-activation", A>._)) + A.CallTo(() => _mailingProcessCreation.CreateMailProcess(A._, $"{offerTypeId.ToString().ToLower()}-subscription-activation", A>._)) .MustHaveHappenedOnceExactly(); } A.CallTo(() => _portalRepositories.SaveAsync()).MustHaveHappenedOnceExactly(); @@ -1232,11 +1232,11 @@ public async Task ActivateSingleInstanceSubscription_WithValidData_ReturnsExpect .MustHaveHappenedOnceExactly(); if (string.IsNullOrWhiteSpace(requesterEmail)) { - A.CallTo(() => _mailingInformationRepository.CreateMailingInformation(A._, A._, A._, A>._)).MustNotHaveHappened(); + A.CallTo(() => _mailingProcessCreation.CreateMailProcess(A._, A._, A>._)).MustNotHaveHappened(); } else { - A.CallTo(() => _mailingInformationRepository.CreateMailingInformation(A._, requesterEmail, A._, A>._)).MustHaveHappenedOnceExactly(); + A.CallTo(() => _mailingProcessCreation.CreateMailProcess(requesterEmail, A._, A>._)).MustHaveHappenedOnceExactly(); } } @@ -1302,11 +1302,11 @@ public async Task ActivateMultipleInstancesSubscription_WithValidData_ReturnsExp .MustHaveHappenedOnceExactly(); if (string.IsNullOrWhiteSpace(requesterEmail)) { - A.CallTo(() => _mailingInformationRepository.CreateMailingInformation(A._, A._, A._, A>._)).MustNotHaveHappened(); + A.CallTo(() => _mailingProcessCreation.CreateMailProcess(A._, A._, A>._)).MustNotHaveHappened(); } else { - A.CallTo(() => _mailingInformationRepository.CreateMailingInformation(A._, requesterEmail, A._, A>._)).MustHaveHappenedOnceExactly(); + A.CallTo(() => _mailingProcessCreation.CreateMailProcess(requesterEmail, A._, A>._)).MustHaveHappenedOnceExactly(); } } diff --git a/tests/marketplace/Offers.Library.Tests/Service/OfferSubscriptionServiceTests.cs b/tests/marketplace/Offers.Library.Tests/Service/OfferSubscriptionServiceTests.cs index 942d4cde03..dd0e3237b6 100644 --- a/tests/marketplace/Offers.Library.Tests/Service/OfferSubscriptionServiceTests.cs +++ b/tests/marketplace/Offers.Library.Tests/Service/OfferSubscriptionServiceTests.cs @@ -20,13 +20,13 @@ using Org.Eclipse.TractusX.Portal.Backend.Framework.ErrorHandling; using Org.Eclipse.TractusX.Portal.Backend.Framework.Models; using Org.Eclipse.TractusX.Portal.Backend.Framework.Models.Configuration; -using Org.Eclipse.TractusX.Portal.Backend.Mailing.Service; using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.DBAccess; using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.DBAccess.Models; using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.DBAccess.Repositories; using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Entities; using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Enums; using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Identities; +using Org.Eclipse.TractusX.Portal.Backend.Processes.Mailing.Library; using System.Collections.Immutable; namespace Org.Eclipse.TractusX.Portal.Backend.Offers.Library.Tests.Service; @@ -64,7 +64,7 @@ public class OfferSubscriptionServiceTests private readonly IPortalRepositories _portalRepositories; private readonly IUserRepository _userRepository; private readonly IUserRolesRepository _userRolesRepository; - private readonly IRoleBaseMailService _roleBaseMailService; + private readonly IMailingProcessCreation _mailingProcessCreation; private readonly IProcessStepRepository _processStepRepository; private readonly IIdentityService _identityService; private readonly OfferSubscriptionService _sut; @@ -109,11 +109,11 @@ public OfferSubscriptionServiceTests() _processStepRepository = A.Fake(); _userRepository = A.Fake(); _userRolesRepository = A.Fake(); - _roleBaseMailService = A.Fake(); + _mailingProcessCreation = A.Fake(); SetupRepositories(); - _sut = new OfferSubscriptionService(_portalRepositories, _identityService, _roleBaseMailService); + _sut = new OfferSubscriptionService(_portalRepositories, _identityService, _mailingProcessCreation); } #region Add Offer Subscription @@ -166,7 +166,7 @@ public async Task AddOfferSubscription_WithExistingId_CreatesServiceSubscription A.CallTo(() => _offerSubscriptionsRepository.CheckPendingOrActiveSubscriptionExists(_existingOfferId, _companyId, offerTypeId)).MustHaveHappenedOnceExactly(); } A.CallTo(() => _processStepRepository.CreateProcessStepRange(A>.That.Matches(x => x.Count() == 1 && x.Single().ProcessStepTypeId == ProcessStepTypeId.TRIGGER_PROVIDER))).MustHaveHappenedOnceExactly(); - A.CallTo(() => _roleBaseMailService.RoleBaseSendMail( + A.CallTo(() => _mailingProcessCreation.RoleBaseSendMail( A>.That.IsSameSequenceAs(subscriptionManagerRoles), A>.That.IsSameSequenceAs(mailParameters), userParameter, @@ -223,7 +223,7 @@ public async Task AddOfferSubscription_WithSalesManagerEqualsReceiver_CreatesSer // Assert companyAssignedApps.Should().HaveCount(1); - A.CallTo(() => _roleBaseMailService.RoleBaseSendMail( + A.CallTo(() => _mailingProcessCreation.RoleBaseSendMail( A>.That.IsSameSequenceAs(subscriptionManagerRoles), A>.That.IsSameSequenceAs(mailParameters), userParameter, @@ -611,7 +611,6 @@ private void SetupRepositories() A.CallTo(() => _portalRepositories.GetInstance()).Returns(_processStepRepository); A.CallTo(() => _portalRepositories.GetInstance()).Returns(_userRepository); A.CallTo(() => _portalRepositories.GetInstance()).Returns(_userRolesRepository); - A.CallTo(() => _portalRepositories.GetInstance()).Returns(_roleBaseMailService); _fixture.Inject(_portalRepositories); } diff --git a/tests/portalbackend/PortalBackend.DBAccess.Tests/CompanyInvitationRepositoryTests.cs b/tests/portalbackend/PortalBackend.DBAccess.Tests/CompanyInvitationRepositoryTests.cs index da599754ff..fddbe6dd77 100644 --- a/tests/portalbackend/PortalBackend.DBAccess.Tests/CompanyInvitationRepositoryTests.cs +++ b/tests/portalbackend/PortalBackend.DBAccess.Tests/CompanyInvitationRepositoryTests.cs @@ -213,38 +213,6 @@ public async Task AttachAndModifyCompanyInvitation() #endregion - #region GetMailData - - [Fact] - public async Task GetMailData_WithExistingForProcessId_ReturnsExpected() - { - // Arrange - var sut = await CreateSut().ConfigureAwait(false); - - // Act - var data = await sut.GetMailData(_invitationId).ConfigureAwait(false); - - // Assert - data.Exists.Should().BeTrue(); - data.OrgName.Should().Be("stark industry"); - data.Email.Should().Be("tony@stark.com"); - } - - [Fact] - public async Task GetMailData_WithoutExistingForProcessId_ReturnsExpected() - { - // Arrange - var sut = await CreateSut().ConfigureAwait(false); - - // Act - var data = await sut.GetMailData(Guid.NewGuid()).ConfigureAwait(false); - - // Assert - data.Exists.Should().BeFalse(); - } - - #endregion - #region GetIdpNameForInvitationId [Fact] diff --git a/tests/processes/Invitation.Executor.Tests/InvitationProcessServiceTests.cs b/tests/processes/Invitation.Executor.Tests/InvitationProcessServiceTests.cs index 7cc96e8626..c3574ffcdf 100644 --- a/tests/processes/Invitation.Executor.Tests/InvitationProcessServiceTests.cs +++ b/tests/processes/Invitation.Executor.Tests/InvitationProcessServiceTests.cs @@ -28,6 +28,7 @@ using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Entities; using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Enums; using Org.Eclipse.TractusX.Portal.Backend.Processes.Invitation.Executor.DependencyInjection; +using Org.Eclipse.TractusX.Portal.Backend.Processes.Mailing.Library; using Org.Eclipse.TractusX.Portal.Backend.Provisioning.Library; using Org.Eclipse.TractusX.Portal.Backend.Provisioning.Library.Models; using Org.Eclipse.TractusX.Portal.Backend.Provisioning.Library.Service; @@ -44,7 +45,7 @@ public class InvitationProcessServiceTests private readonly IApplicationRepository _applicationRepository; private readonly IIdpManagement _idpManagement; private readonly IUserProvisioningService _userProvisioningService; - private readonly IMailingService _mailingService; + private readonly IMailingProcessCreation _mailingProcessCreation; private readonly IInvitationProcessService _sut; private readonly IOptions _setting; private readonly IFixture _fixture; @@ -64,7 +65,7 @@ public InvitationProcessServiceTests() _idpManagement = A.Fake(); _userProvisioningService = A.Fake(); - _mailingService = A.Fake(); + _mailingProcessCreation = A.Fake(); A.CallTo(() => portalRepositories.GetInstance()) .Returns(_companyInvitationRepository); @@ -92,7 +93,7 @@ public InvitationProcessServiceTests() _idpManagement, _userProvisioningService, portalRepositories, - _mailingService, + _mailingProcessCreation, _setting); } @@ -695,8 +696,7 @@ public async Task CreateUser_WithValid_ReturnsExpected() result.modified.Should().BeTrue(); result.processMessage.Should().BeNull(); result.stepStatusId.Should().Be(ProcessStepStatusId.DONE); - result.nextStepTypeIds.Should().ContainSingle() - .Which.Should().Be(ProcessStepTypeId.INVITATION_SEND_MAIL); + result.nextStepTypeIds.Should().BeNull(); } [Fact] @@ -809,84 +809,4 @@ public async Task CreateUser_WithWrongUserRoles_ThrowsConfigurationException() } #endregion - - #region SendMail - - [Fact] - public async Task SendMail_WithoutExisting_ThrowsNotFoundException() - { - // Arrange - var companyInvitationId = Guid.NewGuid(); - A.CallTo(() => _companyInvitationRepository.GetMailData(companyInvitationId)) - .Returns((false, string.Empty, (byte[]?)null, string.Empty)); - A.CallTo(() => _userProvisioningService.GetRoleDatas(A>._)) - .Throws(new ConflictException("test")); - - // Act - async Task Act() => await _sut.SendMail(companyInvitationId).ConfigureAwait(false); - var ex = await Assert.ThrowsAsync(Act).ConfigureAwait(false); - - // Act - ex.Message.Should().Be($"CompanyInvitation {companyInvitationId} does not exist"); - } - - [Fact] - public async Task SendMail_WithWrongUserRoles_ThrowsConflictException() - { - // Arrange - var companyInvitationId = Guid.NewGuid(); - A.CallTo(() => _companyInvitationRepository.GetMailData(companyInvitationId)) - .Returns((true, string.Empty, (byte[]?)null, string.Empty)); - A.CallTo(() => _userProvisioningService.GetRoleDatas(A>._)) - .Throws(new ConflictException("test")); - - // Act - async Task Act() => await _sut.SendMail(companyInvitationId).ConfigureAwait(false); - var ex = await Assert.ThrowsAsync(Act).ConfigureAwait(false); - - // Act - ex.Message.Should().Be("Password needs to be set"); - } - - [Fact] - public async Task SendMail_WithValid_ThrowsConflictException() - { - // Arrange - var companyInvitationId = Guid.NewGuid(); - var pw = "test"; - using var aes = Aes.Create(); - aes.Key = Encoding.UTF8.GetBytes(_setting.Value.EncryptionKey); - aes.Mode = CipherMode.ECB; - aes.Padding = PaddingMode.PKCS7; - var encryptor = aes.CreateEncryptor(aes.Key, aes.IV); - using (var memoryStream = new MemoryStream()) - { - using (var cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write)) - { - using var sw = new StreamWriter(cryptoStream, Encoding.UTF8); - sw.Write(pw); - } - - var secret = memoryStream.ToArray(); - A.CallTo(() => _companyInvitationRepository.GetMailData(companyInvitationId)) - .Returns((true, "testCorp", secret, "test@email.com")); - A.CallTo(() => _userProvisioningService.GetRoleDatas(A>._)) - .Throws(new ConflictException("test")); - } - - // Act - var result = await _sut.SendMail(companyInvitationId).ConfigureAwait(false); - - // Act - A.CallTo(() => _mailingService.SendMails("test@email.com", A>._, "RegistrationTemplate")) - .MustHaveHappenedOnceExactly(); - A.CallTo(() => _mailingService.SendMails("test@email.com", A>._, "PasswordForRegistrationTemplate")) - .MustHaveHappenedOnceExactly(); - result.processMessage.Should().BeNull(); - result.stepStatusId.Should().Be(ProcessStepStatusId.DONE); - result.modified.Should().BeTrue(); - result.nextStepTypeIds.Should().BeNull(); - } - - #endregion } diff --git a/tests/processes/Invitation.Executor.Tests/InvitationProcessTypeExecutorTests.cs b/tests/processes/Invitation.Executor.Tests/InvitationProcessTypeExecutorTests.cs index a2879b7770..11033c8fb3 100644 --- a/tests/processes/Invitation.Executor.Tests/InvitationProcessTypeExecutorTests.cs +++ b/tests/processes/Invitation.Executor.Tests/InvitationProcessTypeExecutorTests.cs @@ -132,8 +132,7 @@ public async Task ExecuteProcessStep_InitializeNotCalled_Throws() [InlineData(ProcessStepTypeId.INVITATION_CREATE_SHARED_REALM, ProcessStepTypeId.INVITATION_ENABLE_CENTRAL_IDP)] [InlineData(ProcessStepTypeId.INVITATION_ENABLE_CENTRAL_IDP, ProcessStepTypeId.INVITATION_CREATE_DATABASE_IDP)] [InlineData(ProcessStepTypeId.INVITATION_CREATE_DATABASE_IDP, ProcessStepTypeId.INVITATION_CREATE_USER)] - [InlineData(ProcessStepTypeId.INVITATION_CREATE_USER, ProcessStepTypeId.INVITATION_SEND_MAIL)] - [InlineData(ProcessStepTypeId.INVITATION_SEND_MAIL, null)] + [InlineData(ProcessStepTypeId.INVITATION_CREATE_USER, null)] public async Task ExecuteProcessStep_ReturnsExpected(ProcessStepTypeId processStepTypeId, ProcessStepTypeId? expectedResult) { // Arrange initialize @@ -367,8 +366,6 @@ private void SetupFakes() A.CallTo(() => _invitationProcessService.CreateIdpDatabase(_invitationId)) .Returns(new ValueTuple?, ProcessStepStatusId, bool, string?>(Enumerable.Repeat(ProcessStepTypeId.INVITATION_CREATE_USER, 1), ProcessStepStatusId.DONE, true, null)); A.CallTo(() => _invitationProcessService.CreateUser(_invitationId, A._)) - .Returns(new ValueTuple?, ProcessStepStatusId, bool, string?>(Enumerable.Repeat(ProcessStepTypeId.INVITATION_SEND_MAIL, 1), ProcessStepStatusId.DONE, true, null)); - A.CallTo(() => _invitationProcessService.SendMail(_invitationId)) .Returns(new ValueTuple?, ProcessStepStatusId, bool, string?>(null, ProcessStepStatusId.DONE, true, null)); } diff --git a/tests/processes/Mailing.Library.Tests/GlobalUsings.cs b/tests/processes/Mailing.Library.Tests/GlobalUsings.cs new file mode 100644 index 0000000000..c802f4480b --- /dev/null +++ b/tests/processes/Mailing.Library.Tests/GlobalUsings.cs @@ -0,0 +1 @@ +global using Xunit; diff --git a/tests/processes/Mailing.Library.Tests/Mailing.Library.Tests.csproj b/tests/processes/Mailing.Library.Tests/Mailing.Library.Tests.csproj new file mode 100644 index 0000000000..5d069582bc --- /dev/null +++ b/tests/processes/Mailing.Library.Tests/Mailing.Library.Tests.csproj @@ -0,0 +1,54 @@ + + + + + + Org.Eclipse.TractusX.Portal.Backend.Mailing.Service.Tests + Org.Eclipse.TractusX.Portal.Backend.Mailing.Service.Tests + net7.0 + enable + enable + + false + true + + + + + + + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + + + + + + diff --git a/tests/processes/Mailing.Library.Tests/RoleBaseMailServiceTests.cs b/tests/processes/Mailing.Library.Tests/RoleBaseMailServiceTests.cs new file mode 100644 index 0000000000..0c988ce126 --- /dev/null +++ b/tests/processes/Mailing.Library.Tests/RoleBaseMailServiceTests.cs @@ -0,0 +1,165 @@ +/******************************************************************************** + * Copyright (c) 2021, 2023 BMW Group AG + * Copyright (c) 2021, 2023 Contributors to the Eclipse Foundation + * + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. + * + * This program and the accompanying materials are made available under the + * terms of the Apache License, Version 2.0 which is available at + * https://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * SPDX-License-Identifier: Apache-2.0 + ********************************************************************************/ + +using AutoFixture; +using AutoFixture.AutoFakeItEasy; +using FakeItEasy; +using FluentAssertions; +using Org.Eclipse.TractusX.Portal.Backend.Framework.ErrorHandling; +using Org.Eclipse.TractusX.Portal.Backend.Framework.Models.Configuration; +using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.DBAccess; +using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.DBAccess.Repositories; +using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Enums; +using Org.Eclipse.TractusX.Portal.Backend.Processes.Mailing.Library; + +namespace Org.Eclipse.TractusX.Portal.Backend.Mailing.Service.Tests; + +public class MailingProcessCreationTests +{ + private const string BasePortalUrl = "http//base-url.com"; + private readonly IFixture _fixture; + private readonly IPortalRepositories _portalRepositories; + private readonly IUserRolesRepository _userRolesRepository; + private readonly IUserRepository _userRepository; + private readonly IMailingInformationRepository _mailingInformationRepository; + private readonly IProcessStepRepository _processStepRepository; + private readonly Guid _companyId; + private readonly IEnumerable _userRoleIds; + private readonly MailingProcessCreation _sut; + + public MailingProcessCreationTests() + { + _fixture = new Fixture().Customize(new AutoFakeItEasyCustomization { ConfigureMembers = true }); + _fixture.Behaviors.OfType().ToList() + .ForEach(b => _fixture.Behaviors.Remove(b)); + _fixture.Behaviors.Add(new OmitOnRecursionBehavior()); + + _portalRepositories = A.Fake(); + _userRolesRepository = A.Fake(); + _mailingInformationRepository = A.Fake(); + _processStepRepository = A.Fake(); + _userRepository = A.Fake(); + _companyId = _fixture.Create(); + _userRoleIds = _fixture.CreateMany(2); + + SetupRepositories(); + + _sut = new MailingProcessCreation(_portalRepositories); + } + + [Theory] + [InlineData(true)] + [InlineData(false)] + public async Task RoleBaseSendMail_WithUserNameParameter_ReturnsExpectedCalls(bool hasUserNameParameter) + { + // Arrange + var template = new[] { "test-request" }; + var offerName = _fixture.Create(); + var mailParams = new[] + { + ("offerName", offerName), + ("url", BasePortalUrl) + }; + var userNameParam = hasUserNameParameter + ? ("offerProviderName", "user") + : ((string, string)?)null; + var receiverRoles = new[] + { + new UserRoleConfig("ClientId", new[] { "TestApp Manager", "TestSale Manager" }) + }; + var companyUserData = new (string, string?, string?)[] + { + ("TestApp@bmw", "AppFirst", "AppLast"), + ("TestSale@bmw", "SaleFirst", "SaleLast") + }; + + A.CallTo(() => _userRolesRepository.GetUserRoleIdsUntrackedAsync(A>._)) + .Returns(_userRoleIds.ToAsyncEnumerable()); + A.CallTo(() => _userRepository.GetCompanyUserEmailForCompanyAndRoleId(A>._, A._)) + .Returns(companyUserData.ToAsyncEnumerable()); + + // Act + await _sut.RoleBaseSendMail(receiverRoles, mailParams, userNameParam, template, _companyId); + + // Assert + A.CallTo(() => _userRolesRepository.GetUserRoleIdsUntrackedAsync(A>.That.Matches(x => x.Any(y => y.ClientId == "ClientId")))).MustHaveHappenedOnceExactly(); + A.CallTo(() => _userRepository.GetCompanyUserEmailForCompanyAndRoleId(A>.That.IsSameSequenceAs(_userRoleIds), _companyId)).MustHaveHappenedOnceExactly(); + A.CallTo(() => _processStepRepository.CreateProcess(ProcessTypeId.MAILING)).MustHaveHappenedTwiceExactly(); + A.CallTo(() => _processStepRepository.CreateProcessStep(ProcessStepTypeId.SEND_MAIL, ProcessStepStatusId.TODO, A._)).MustHaveHappenedTwiceExactly(); + A.CallTo(() => _mailingInformationRepository.CreateMailingInformation( + A._, + "TestApp@bmw", + template.Single(), + A>.That.Matches(x => x.Count == (hasUserNameParameter ? 3 : 2) && x["offerName"] == offerName && x["url"] == BasePortalUrl && (!hasUserNameParameter || x["offerProviderName"] == "AppFirst AppLast")))).MustHaveHappenedOnceExactly(); + A.CallTo(() => _mailingInformationRepository.CreateMailingInformation( + A._, + "TestSale@bmw", + template.Single(), + A>.That.Matches(x => x.Count == (hasUserNameParameter ? 3 : 2) && x["offerName"] == offerName && x["url"] == BasePortalUrl && (!hasUserNameParameter || x["offerProviderName"] == "SaleFirst SaleLast"))) + ).MustHaveHappenedOnceExactly(); + } + + [Fact] + public async Task RoleBaseSendMail_ThrowsConfigurationException() + { + // Arrange + var template = new List { "test-request" }; + var mailParams = new[] + { + ("offerName", _fixture.Create()), + ("url", BasePortalUrl), + }; + var userNameParam = ("offerProviderName", "user"); + + var roleData = _fixture.CreateMany(1); + var receiverRoles = new[]{ + new UserRoleConfig("ClientId", new [] { "App Manager", "Sales Manager" }) + }; + + A.CallTo(() => _userRolesRepository.GetUserRoleIdsUntrackedAsync(A>._)) + .Returns(roleData.ToAsyncEnumerable()); + + // Act + async Task Action() => await _sut.RoleBaseSendMail(receiverRoles, mailParams, userNameParam, template, _companyId); + + // Assert + var ex = await Assert.ThrowsAsync(Action); + ex.Message.Should().Be( + $"invalid configuration, at least one of the configured roles does not exist in the database: {string.Join(", ", receiverRoles.Select(clientRoles => $"client: {clientRoles.ClientId}, roles: [{string.Join(", ", clientRoles.UserRoleNames)}]"))}"); + A.CallTo(() => _userRolesRepository.GetUserRoleIdsUntrackedAsync(A>.That.IsSameSequenceAs(receiverRoles))).MustHaveHappenedOnceExactly(); + A.CallTo(() => _userRepository.GetCompanyUserEmailForCompanyAndRoleId(A>.That.IsSameSequenceAs(roleData), _companyId)).MustNotHaveHappened(); + A.CallTo(() => _processStepRepository.CreateProcess(ProcessTypeId.MAILING)).MustNotHaveHappened(); + A.CallTo(() => _processStepRepository.CreateProcessStep(ProcessStepTypeId.SEND_MAIL, ProcessStepStatusId.TODO, A._)).MustNotHaveHappened(); + A.CallTo(() => _mailingInformationRepository.CreateMailingInformation(A._, A._, A._, A>._)).MustNotHaveHappened(); + } + + #region Setup + + private void SetupRepositories() + { + A.CallTo(() => _portalRepositories.GetInstance()).Returns(_userRepository); + A.CallTo(() => _portalRepositories.GetInstance()).Returns(_userRolesRepository); + A.CallTo(() => _portalRepositories.GetInstance()).Returns(_mailingInformationRepository); + A.CallTo(() => _portalRepositories.GetInstance()).Returns(_processStepRepository); + _fixture.Inject(_portalRepositories); + } + + #endregion +} diff --git a/tests/processes/NetworkRegistration.Library.Tests/NetworkRegistrationHandlerTests.cs b/tests/processes/NetworkRegistration.Library.Tests/NetworkRegistrationHandlerTests.cs index c81da4143d..4c385cecd0 100644 --- a/tests/processes/NetworkRegistration.Library.Tests/NetworkRegistrationHandlerTests.cs +++ b/tests/processes/NetworkRegistration.Library.Tests/NetworkRegistrationHandlerTests.cs @@ -26,6 +26,7 @@ using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.DBAccess.Repositories; using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Entities; using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Enums; +using Org.Eclipse.TractusX.Portal.Backend.Processes.Mailing.Library; using Org.Eclipse.TractusX.Portal.Backend.Processes.NetworkRegistration.Library.DependencyInjection; using Org.Eclipse.TractusX.Portal.Backend.Provisioning.Library; using Org.Eclipse.TractusX.Portal.Backend.Provisioning.Library.Models; @@ -44,8 +45,8 @@ public class NetworkRegistrationHandlerTests private readonly IUserRepository _userRepository; private readonly INetworkRepository _networkRepository; private readonly IProcessStepRepository _processStepRepository; - private readonly IMailingInformationRepository _mailingInformationRepository; private readonly NetworkRegistrationHandler _sut; + private readonly IMailingProcessCreation _mailingProcessCreation; public NetworkRegistrationHandlerTests() { @@ -53,7 +54,7 @@ public NetworkRegistrationHandlerTests() _userRepository = A.Fake(); _networkRepository = A.Fake(); _processStepRepository = A.Fake(); - _mailingInformationRepository = A.Fake(); + _mailingProcessCreation = A.Fake(); _userProvisioningService = A.Fake(); _provisioningManger = A.Fake(); @@ -68,9 +69,8 @@ public NetworkRegistrationHandlerTests() A.CallTo(() => portalRepositories.GetInstance()).Returns(_userRepository); A.CallTo(() => portalRepositories.GetInstance()).Returns(_networkRepository); A.CallTo(() => portalRepositories.GetInstance()).Returns(_processStepRepository); - A.CallTo(() => portalRepositories.GetInstance()).Returns(_mailingInformationRepository); - _sut = new NetworkRegistrationHandler(portalRepositories, _userProvisioningService, _provisioningManger, options); + _sut = new NetworkRegistrationHandler(portalRepositories, _userProvisioningService, _provisioningManger, _mailingProcessCreation, options); } [Fact] @@ -223,16 +223,13 @@ public async Task SynchronizeUser_WithValidData_ReturnsExpected() .MustHaveHappenedOnceExactly(); A.CallTo(() => _userRepository.AttachAndModifyIdentity(user2.CompanyUserId, A>._, A>._)) .MustNotHaveHappened(); - A.CallTo(() => _mailingInformationRepository.CreateMailingInformation(A._, "tony@stark.com", "CredentialRejected", A>.That.Matches(x => x["idpAlias"] == "DisplayName for Idp1"))) + A.CallTo(() => _mailingProcessCreation.CreateMailProcess("tony@stark.com", "CredentialRejected", A>.That.Matches(x => x["idpAlias"] == "DisplayName for Idp1"))) .MustHaveHappenedOnceExactly(); - A.CallTo(() => _mailingInformationRepository.CreateMailingInformation(A._, "steven@strange.com", "CredentialRejected", A>.That.Matches(x => x["idpAlias"] == "DisplayName for Idp1"))) + A.CallTo(() => _mailingProcessCreation.CreateMailProcess("steven@strange.com", "CredentialRejected", A>.That.Matches(x => x["idpAlias"] == "DisplayName for Idp1"))) .MustHaveHappenedOnceExactly(); - A.CallTo(() => _mailingInformationRepository.CreateMailingInformation(A._, "foo@bar.com", "CredentialRejected", A>.That.Matches(x => x["idpAlias"] == "DisplayName for Idp2"))) + A.CallTo(() => _mailingProcessCreation.CreateMailProcess("foo@bar.com", "CredentialRejected", A>.That.Matches(x => x["idpAlias"] == "DisplayName for Idp2"))) .MustHaveHappenedOnceExactly(); - A.CallTo(() => _processStepRepository.CreateProcess(ProcessTypeId.MAILING)).MustHaveHappened(3, Times.Exactly); - A.CallTo(() => _processStepRepository.CreateProcessStep(ProcessStepTypeId.SEND_MAIL, ProcessStepStatusId.TODO, A._)).MustHaveHappened(3, Times.Exactly); - result.modified.Should().BeFalse(); result.processMessage.Should().BeNull(); result.stepStatusId.Should().Be(ProcessStepStatusId.DONE); diff --git a/tests/registration/ApplicationActivation.Library.Tests/ApplicationActivationTests.cs b/tests/registration/ApplicationActivation.Library.Tests/ApplicationActivationTests.cs index a97272cc3b..e56ac9339a 100644 --- a/tests/registration/ApplicationActivation.Library.Tests/ApplicationActivationTests.cs +++ b/tests/registration/ApplicationActivation.Library.Tests/ApplicationActivationTests.cs @@ -30,6 +30,7 @@ using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Entities; using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Enums; using Org.Eclipse.TractusX.Portal.Backend.Processes.ApplicationChecklist.Library; +using Org.Eclipse.TractusX.Portal.Backend.Processes.Mailing.Library; using Org.Eclipse.TractusX.Portal.Backend.Provisioning.Library; using System.Collections.Immutable; @@ -62,7 +63,7 @@ public class ApplicationActivationTests private readonly ICompanyRepository _companyRepository; private readonly IUserRolesRepository _rolesRepository; private readonly IProcessStepRepository _processStepRepository; - private readonly IMailingInformationRepository _mailingInformationRepository; + private readonly IMailingProcessCreation _mailingProcessCreation; private readonly List _notifications = new(); private readonly List _notifiedUserIds = new(); private readonly INotificationService _notificationService; @@ -83,7 +84,7 @@ public ApplicationActivationTests() _portalRepositories = A.Fake(); _applicationRepository = A.Fake(); _businessPartnerRepository = A.Fake(); - _mailingInformationRepository = A.Fake(); + _mailingProcessCreation = A.Fake(); _companyRepository = A.Fake(); _rolesRepository = A.Fake(); _notificationService = A.Fake(); @@ -112,10 +113,9 @@ public ApplicationActivationTests() A.CallTo(() => _portalRepositories.GetInstance()).Returns(_rolesRepository); A.CallTo(() => _portalRepositories.GetInstance()).Returns(_companyRepository); A.CallTo(() => _portalRepositories.GetInstance()).Returns(_processStepRepository); - A.CallTo(() => _portalRepositories.GetInstance()).Returns(_mailingInformationRepository); A.CallTo(() => options.Value).Returns(_settings); - _sut = new ApplicationActivationService(_portalRepositories, _notificationService, _provisioningManager, _dateTimeProvider, _custodianService, options); + _sut = new ApplicationActivationService(_portalRepositories, _notificationService, _provisioningManager, _dateTimeProvider, _custodianService, _mailingProcessCreation, options); } #region HandleApplicationActivation @@ -259,9 +259,7 @@ public async Task HandleApplicationActivation_WithMidnightRun_ApprovesRequestAnd A.CallTo(() => _provisioningManager.DeleteClientRolesFromCentralUserAsync(CentralUserId1, A>>._)).MustHaveHappenedOnceExactly(); A.CallTo(() => _provisioningManager.DeleteClientRolesFromCentralUserAsync(CentralUserId2, A>>._)).MustHaveHappenedOnceExactly(); A.CallTo(() => _provisioningManager.DeleteClientRolesFromCentralUserAsync(CentralUserId3, A>>._)).MustHaveHappenedOnceExactly(); - A.CallTo(() => _mailingInformationRepository.CreateMailingInformation(A._, A._, "EmailRegistrationWelcomeTemplate", A>._)) - .MustHaveHappened(3, Times.Exactly); - A.CallTo(() => _processStepRepository.CreateProcess(ProcessTypeId.MAILING)) + A.CallTo(() => _mailingProcessCreation.CreateMailProcess(A._, "EmailRegistrationWelcomeTemplate", A>._)) .MustHaveHappened(3, Times.Exactly); A.CallTo(() => _custodianService.SetMembership(BusinessPartnerNumber, A._)).MustHaveHappenedOnceExactly(); _notifications.Should().HaveCount(5); @@ -344,9 +342,7 @@ public async Task HandleApplicationActivation_WithCompanyAdminUser_ApprovesReque A.CallTo(() => _provisioningManager.DeleteClientRolesFromCentralUserAsync(CentralUserId2, A>>._)).MustHaveHappenedOnceExactly(); A.CallTo(() => _provisioningManager.DeleteClientRolesFromCentralUserAsync(CentralUserId3, A>>._)).MustHaveHappenedOnceExactly(); A.CallTo(() => _rolesRepository.DeleteCompanyUserAssignedRoles(A>._)).MustHaveHappened(3, Times.Exactly); - A.CallTo(() => _mailingInformationRepository.CreateMailingInformation(A._, A._, "EmailRegistrationWelcomeTemplate", A>._)) - .MustHaveHappened(3, Times.Exactly); - A.CallTo(() => _processStepRepository.CreateProcess(ProcessTypeId.MAILING)) + A.CallTo(() => _mailingProcessCreation.CreateMailProcess(A._, "EmailRegistrationWelcomeTemplate", A>._)) .MustHaveHappened(3, Times.Exactly); A.CallTo(() => _custodianService.SetMembership(BusinessPartnerNumber, A._)).MustHaveHappenedOnceExactly(); _notifications.Should().HaveCount(5); @@ -568,9 +564,7 @@ public async Task HandleApplicationActivation_WithNotExistingRoles_ThrowsConfigu A.CallTo(() => _rolesRepository.GetUserWithUserRolesForApplicationId(A._, A>._)).MustNotHaveHappened(); A.CallTo(() => _provisioningManager.DeleteClientRolesFromCentralUserAsync(A._, A>>._)).MustNotHaveHappened(); A.CallTo(() => _rolesRepository.DeleteCompanyUserAssignedRoles(A>._)).MustNotHaveHappened(); - A.CallTo(() => _mailingInformationRepository.CreateMailingInformation(A._, A._, "EmailRegistrationWelcomeTemplate", A>._)) - .MustNotHaveHappened(); - A.CallTo(() => _processStepRepository.CreateProcess(ProcessTypeId.MAILING)) + A.CallTo(() => _mailingProcessCreation.CreateMailProcess(A._, "EmailRegistrationWelcomeTemplate", A>._)) .MustNotHaveHappened(); A.CallTo(() => _custodianService.SetMembership(BusinessPartnerNumber, A._)).MustNotHaveHappened(); _notifications.Should().BeEmpty(); @@ -654,9 +648,7 @@ public async Task HandleApplicationActivation_WithUnassignedRoles_ThrowsUnexpect A.CallTo(() => _provisioningManager.DeleteClientRolesFromCentralUserAsync(CentralUserId2, A>>._)).MustHaveHappenedOnceExactly(); A.CallTo(() => _provisioningManager.DeleteClientRolesFromCentralUserAsync(CentralUserId3, A>>._)).MustHaveHappenedOnceExactly(); A.CallTo(() => _rolesRepository.DeleteCompanyUserAssignedRoles(A>._)).MustHaveHappened(3, Times.Exactly); - A.CallTo(() => _mailingInformationRepository.CreateMailingInformation(A._, A._, "EmailRegistrationWelcomeTemplate", A>._)) - .MustHaveHappened(3, Times.Exactly); - A.CallTo(() => _processStepRepository.CreateProcess(ProcessTypeId.MAILING)) + A.CallTo(() => _mailingProcessCreation.CreateMailProcess(A._, "EmailRegistrationWelcomeTemplate", A>._)) .MustHaveHappened(3, Times.Exactly); A.CallTo(() => _custodianService.SetMembership(BusinessPartnerNumber, A._)).MustHaveHappenedOnceExactly(); _notifications.Should().HaveCount(5); diff --git a/tests/registration/Registration.Service.Tests/BusinessLogic/RegistrationBusinessLogicTest.cs b/tests/registration/Registration.Service.Tests/BusinessLogic/RegistrationBusinessLogicTest.cs index 7bf2a7a6d9..ce23e8a42c 100644 --- a/tests/registration/Registration.Service.Tests/BusinessLogic/RegistrationBusinessLogicTest.cs +++ b/tests/registration/Registration.Service.Tests/BusinessLogic/RegistrationBusinessLogicTest.cs @@ -36,6 +36,7 @@ using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Enums; using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Identities; using Org.Eclipse.TractusX.Portal.Backend.Processes.ApplicationChecklist.Library; +using Org.Eclipse.TractusX.Portal.Backend.Processes.Mailing.Library; using Org.Eclipse.TractusX.Portal.Backend.Provisioning.Library.Models; using Org.Eclipse.TractusX.Portal.Backend.Provisioning.Library.Service; using Org.Eclipse.TractusX.Portal.Backend.Registration.Common; @@ -63,7 +64,7 @@ public class RegistrationBusinessLogicTest private readonly ICountryRepository _countryRepository; private readonly IPortalRepositories _portalRepositories; private readonly ICompanyRolesRepository _companyRolesRepository; - private readonly IMailingInformationRepository _mailingInformationRepository; + private readonly IMailingProcessCreation _mailingProcessCreation; private readonly IConsentRepository _consentRepository; private readonly IProcessStepRepository _processStepRepository; private readonly IApplicationChecklistCreationService _checklistService; @@ -96,7 +97,8 @@ public RegistrationBusinessLogicTest() _applicationRepository = A.Fake(); _countryRepository = A.Fake(); _consentRepository = A.Fake(); - _mailingInformationRepository = A.Fake(); + _mailingProcessCreation = A.Fake(); + _checklistService = A.Fake(); _staticDataRepository = A.Fake(); _processStepRepository = A.Fake(); @@ -115,7 +117,7 @@ public RegistrationBusinessLogicTest() KeycloakClientID = "CatenaX", }); _fixture.Inject(options); - _fixture.Inject(A.Fake()); + _fixture.Inject(_mailingProcessCreation); _fixture.Inject(A.Fake()); _fixture.Inject(A.Fake>()); @@ -148,7 +150,8 @@ public async Task GetClientRolesCompositeAsync_GetsAllRoles() _portalRepositories, null!, _identityService, - _dateTimeProvider); + _dateTimeProvider, + _mailingProcessCreation); // Act var result = sut.GetClientRolesCompositeAsync(); @@ -219,7 +222,8 @@ public async Task GetCompanyBpdmDetailDataByBusinessPartnerNumber_WithValidBpn_R _portalRepositories, null!, _identityService, - _dateTimeProvider); + _dateTimeProvider, + _mailingProcessCreation); // Act var result = await sut.GetCompanyBpdmDetailDataByBusinessPartnerNumber(businessPartnerNumber, token, CancellationToken.None).ConfigureAwait(false); @@ -258,7 +262,8 @@ public async Task GetCompanyBpdmDetailDataByBusinessPartnerNumber_WithValidBpn_T null!, null!, _identityService, - _dateTimeProvider); + _dateTimeProvider, + _mailingProcessCreation); // Act async Task Act() => await sut.GetCompanyBpdmDetailDataByBusinessPartnerNumber("NotLongEnough", "justatoken", CancellationToken.None).ConfigureAwait(false); @@ -290,7 +295,8 @@ public async Task GetAllApplicationsForUserWithStatus_WithValidUser_GetsAllRoles _portalRepositories, null!, _identityService, - _dateTimeProvider); + _dateTimeProvider, + _mailingProcessCreation); var resultList = new[]{ new CompanyApplicationWithStatus( @@ -343,7 +349,8 @@ public async Task GetCompanyWithAddressAsync_WithValidApplication_GetsData() _portalRepositories, null!, _identityService, - _dateTimeProvider); + _dateTimeProvider, + _mailingProcessCreation); A.CallTo(() => _applicationRepository.GetCompanyApplicationDetailDataAsync(applicationId, _identity.CompanyId, null)) .Returns(data); @@ -370,7 +377,8 @@ public async Task GetCompanyWithAddressAsync_WithInvalidApplication_ThrowsNotFou _portalRepositories, null!, _identityService, - _dateTimeProvider); + _dateTimeProvider, + _mailingProcessCreation); A.CallTo(() => _applicationRepository.GetCompanyApplicationDetailDataAsync(applicationId, _identity.CompanyId, null)) .Returns((CompanyApplicationDetailData?)null); @@ -396,7 +404,8 @@ public async Task GetCompanyWithAddressAsync_WithInvalidUser_ThrowsForbiddenExce _portalRepositories, null!, _identityService, - _dateTimeProvider); + _dateTimeProvider, + _mailingProcessCreation); A.CallTo(() => _applicationRepository.GetCompanyApplicationDetailDataAsync(applicationId, _identity.CompanyId, null)) .Returns(_fixture.Build().With(x => x.IsUserOfCompany, false).Create()); @@ -436,7 +445,8 @@ public async Task SetCompanyWithAddressAsync_WithMissingData_ThrowsArgumentExcep null!, null!, _identityService, - _dateTimeProvider); + _dateTimeProvider, + _mailingProcessCreation); var uniqueIdData = uniqueIdentifierIds.Zip(values, (id, value) => new CompanyUniqueIdData(id, value)); var companyData = new CompanyDetailData(Guid.NewGuid(), name!, city!, streetName!, countryCode!, null, null, null, null, null, null, uniqueIdData); @@ -463,7 +473,8 @@ public async Task SetCompanyWithAddressAsync_WithInvalidApplicationId_ThrowsNotF _portalRepositories, null!, _identityService, - _dateTimeProvider); + _dateTimeProvider, + _mailingProcessCreation); var companyData = new CompanyDetailData(companyId, "name", "munich", "main street", "de", null, null, null, null, null, null, Enumerable.Empty()); @@ -499,7 +510,8 @@ public async Task SetCompanyWithAddressAsync_WithoutCompanyUserId_ThrowsForbidde _portalRepositories, null!, _identityService, - _dateTimeProvider); + _dateTimeProvider, + _mailingProcessCreation); A.CallTo(() => _applicationRepository.GetCompanyApplicationDetailDataAsync(applicationId, A._, companyId)) .ReturnsLazily(() => _fixture.Build().With(x => x.IsUserOfCompany, false).Create()); @@ -537,7 +549,8 @@ public async Task SetCompanyWithAddressAsync__WithInvalidBpn_ThrowsControllerArg _portalRepositories, null!, _identityService, - _dateTimeProvider); + _dateTimeProvider, + _mailingProcessCreation); // Act async Task Act() => await sut.SetCompanyDetailDataAsync(applicationId, companyData).ConfigureAwait(false); @@ -574,7 +587,8 @@ public async Task SetCompanyWithAddressAsync__WithExistingBpn_ModifiesCompany() _portalRepositories, null!, _identityService, - _dateTimeProvider); + _dateTimeProvider, + _mailingProcessCreation); var existingData = _fixture.Build() .With(x => x.IsUserOfCompany, true) @@ -638,7 +652,8 @@ public async Task SetCompanyWithAddressAsync_ModifyCompany() _portalRepositories, null!, _identityService, - _dateTimeProvider); + _dateTimeProvider, + _mailingProcessCreation); A.CallTo(() => _applicationRepository.GetCompanyApplicationDetailDataAsync(applicationId, A._, companyId)) .Returns(existingData); @@ -710,7 +725,8 @@ public async Task SetCompanyWithAddressAsync_WithoutInitialCompanyAddress_Create _portalRepositories, null!, _identityService, - _dateTimeProvider); + _dateTimeProvider, + _mailingProcessCreation); A.CallTo(() => _applicationRepository.GetCompanyApplicationDetailDataAsync(applicationId, A._, companyId)) .Returns(existingData); @@ -797,7 +813,8 @@ public async Task SetCompanyWithAddressAsync_WithInitialCompanyAddress_ModifyAdd _portalRepositories, null!, _identityService, - _dateTimeProvider); + _dateTimeProvider, + _mailingProcessCreation); A.CallTo(() => _applicationRepository.GetCompanyApplicationDetailDataAsync(applicationId, A._, companyId)) .Returns(existingData); @@ -895,7 +912,8 @@ public async Task SetCompanyWithAddressAsync_WithUniqueIdentifiers_CreateModifyD _portalRepositories, null!, _identityService, - _dateTimeProvider); + _dateTimeProvider, + _mailingProcessCreation); A.CallTo(() => _dateTimeProvider.OffsetNow).Returns(now); A.CallTo(() => _applicationRepository.GetCompanyApplicationDetailDataAsync(applicationId, A._, companyId)) @@ -951,7 +969,8 @@ public async Task SetCompanyWithAddressAsync_WithInvalidCountryCode_Throws() _portalRepositories, null!, _identityService, - _dateTimeProvider); + _dateTimeProvider, + _mailingProcessCreation); A.CallTo(() => _countryRepository.GetCountryAssignedIdentifiers(A._, A>._)) .Returns((false, null!)); @@ -989,7 +1008,8 @@ public async Task SetCompanyWithAddressAsync_WithInvalidUniqueIdentifiers_Throws _portalRepositories, null!, _identityService, - _dateTimeProvider); + _dateTimeProvider, + _mailingProcessCreation); A.CallTo(() => _countryRepository.GetCountryAssignedIdentifiers(_alpha2code, A>._)) .Returns((true, new[] { identifiers.First() })); @@ -1024,7 +1044,8 @@ public async Task SetOwnCompanyApplicationStatusAsync_WithInvalidStatus_ThrowsCo _portalRepositories, null!, _identityService, - _dateTimeProvider); + _dateTimeProvider, + _mailingProcessCreation); // Act async Task Act() => await sut.SetOwnCompanyApplicationStatusAsync(applicationId, 0).ConfigureAwait(false); @@ -1052,7 +1073,8 @@ public async Task SetOwnCompanyApplicationStatusAsync_WithInvalidApplication_Thr _portalRepositories, null!, _identityService, - _dateTimeProvider); + _dateTimeProvider, + _mailingProcessCreation); A.CallTo(() => _applicationRepository.GetOwnCompanyApplicationUserDataAsync(A._, A._)) .ReturnsLazily(() => new ValueTuple()); @@ -1083,7 +1105,8 @@ public async Task SetOwnCompanyApplicationStatusAsync_WithInvalidStatus_ThrowsAr _portalRepositories, null!, _identityService, - _dateTimeProvider); + _dateTimeProvider, + _mailingProcessCreation); A.CallTo(() => _applicationRepository.GetOwnCompanyApplicationUserDataAsync(A._, A._)) .ReturnsLazily(() => new ValueTuple(true, CompanyApplicationStatusId.CREATED)); @@ -1124,7 +1147,8 @@ public async Task SetOwnCompanyApplicationStatusAsync_WithValidData_SavesChanges _portalRepositories, null!, _identityService, - _dateTimeProvider); + _dateTimeProvider, + _mailingProcessCreation); A.CallTo(() => _applicationRepository.GetOwnCompanyApplicationUserDataAsync(A._, A._)) .ReturnsLazily(() => new ValueTuple(true, CompanyApplicationStatusId.VERIFY)); @@ -1159,7 +1183,8 @@ public async Task GetCompanyRolesAsync_() _portalRepositories, null!, _identityService, - _dateTimeProvider); + _dateTimeProvider, + _mailingProcessCreation); // Act var result = await sut.GetCompanyRoles().ToListAsync().ConfigureAwait(false); @@ -1246,7 +1271,8 @@ public async Task UploadDocumentAsync_WithValidData_CreatesDocument() _portalRepositories, null!, _identityService, - _dateTimeProvider); + _dateTimeProvider, + _mailingProcessCreation); // Act await sut.UploadDocumentAsync(_existingApplicationId, file, DocumentTypeId.CX_FRAME_CONTRACT, CancellationToken.None); @@ -1308,7 +1334,8 @@ public async Task UploadDocumentAsync_WithNotExistingApplicationId_ThrowsExcepti _portalRepositories, null!, _identityService, - _dateTimeProvider); + _dateTimeProvider, + _mailingProcessCreation); var notExistingId = Guid.NewGuid(); // Act @@ -1342,7 +1369,8 @@ public async Task UploadDocumentAsync_WithNotExistingIamUser_ThrowsException() _portalRepositories, null!, _identityService, - _dateTimeProvider); + _dateTimeProvider, + _mailingProcessCreation); // Act async Task Action() => await sut.UploadDocumentAsync(_existingApplicationId, file, DocumentTypeId.CX_FRAME_CONTRACT, CancellationToken.None); @@ -1374,7 +1402,8 @@ public async Task UploadDocumentAsync_WithInvalidDocumentTypeId_ThrowsException( _portalRepositories, null!, _identityService, - _dateTimeProvider); + _dateTimeProvider, + _mailingProcessCreation); // Act async Task Action() => await sut.UploadDocumentAsync(_existingApplicationId, file, DocumentTypeId.ADDITIONAL_DETAILS, CancellationToken.None); @@ -1412,7 +1441,8 @@ public async Task TestInviteNewUserAsyncSuccess() _portalRepositories, null!, _identityService, - _dateTimeProvider); + _dateTimeProvider, + _mailingProcessCreation); await sut.InviteNewUserAsync(_existingApplicationId, userCreationInfo).ConfigureAwait(false); @@ -1420,7 +1450,7 @@ public async Task TestInviteNewUserAsyncSuccess() A.CallTo(() => _applicationRepository.CreateInvitation(A.That.IsEqualTo(_existingApplicationId), A._)).MustHaveHappened(); A.CallTo(() => _applicationRepository.AttachAndModifyCompanyApplication(_existingApplicationId, A>._)).MustHaveHappenedOnceExactly(); A.CallTo(() => _portalRepositories.SaveAsync()).MustHaveHappened(); - A.CallTo(() => _mailingInformationRepository.CreateMailingInformation(A._, A.That.IsEqualTo(userCreationInfo.eMail), A._, A>.That.Matches(x => x["companyName"] == _displayName))) + A.CallTo(() => _mailingProcessCreation.CreateMailProcess(A.That.IsEqualTo(userCreationInfo.eMail), A._, A>.That.Matches(x => x["companyName"] == _displayName))) .MustHaveHappened(); application.DateLastChanged.Should().Be(now); } @@ -1444,7 +1474,8 @@ public async Task TestInviteNewUserEmptyEmailThrows() _portalRepositories, null!, _identityService, - _dateTimeProvider); + _dateTimeProvider, + _mailingProcessCreation); Task Act() => sut.InviteNewUserAsync(_existingApplicationId, userCreationInfo); @@ -1452,7 +1483,7 @@ public async Task TestInviteNewUserEmptyEmailThrows() error.Message.Should().Be("email must not be empty"); A.CallTo(() => _portalRepositories.SaveAsync()).MustNotHaveHappened(); - A.CallTo(() => _mailingInformationRepository.CreateMailingInformation(A._, A._, A._, A>._)) + A.CallTo(() => _mailingProcessCreation.CreateMailProcess(A._, A._, A>._)) .MustNotHaveHappened(); } @@ -1473,7 +1504,8 @@ public async Task TestInviteNewUserUserAlreadyExistsThrows() _portalRepositories, null!, _identityService, - _dateTimeProvider); + _dateTimeProvider, + _mailingProcessCreation); Task Act() => sut.InviteNewUserAsync(_existingApplicationId, userCreationInfo); @@ -1482,7 +1514,7 @@ public async Task TestInviteNewUserUserAlreadyExistsThrows() A.CallTo(() => _userRepository.IsOwnCompanyUserWithEmailExisting(userCreationInfo.eMail, _identity.CompanyId)).MustHaveHappenedOnceExactly(); A.CallTo(() => _portalRepositories.SaveAsync()).MustNotHaveHappened(); - A.CallTo(() => _mailingInformationRepository.CreateMailingInformation(A._, A._, A._, A>._)) + A.CallTo(() => _mailingProcessCreation.CreateMailProcess(A._, A._, A>._)) .MustNotHaveHappened(); } @@ -1507,7 +1539,8 @@ public async Task TestInviteNewUserAsyncCreationErrorThrows() _portalRepositories, null!, _identityService, - _dateTimeProvider); + _dateTimeProvider, + _mailingProcessCreation); Task Act() => sut.InviteNewUserAsync(_existingApplicationId, userCreationInfo); @@ -1517,7 +1550,7 @@ public async Task TestInviteNewUserAsyncCreationErrorThrows() A.CallTo(() => _userProvisioningService.CreateOwnCompanyIdpUsersAsync(A._, A>._, A._)).MustHaveHappened(); A.CallTo(() => _applicationRepository.CreateInvitation(A.That.IsEqualTo(_existingApplicationId), A._)).MustNotHaveHappened(); A.CallTo(() => _portalRepositories.SaveAsync()).MustNotHaveHappened(); - A.CallTo(() => _mailingInformationRepository.CreateMailingInformation(A._, A.That.IsEqualTo(userCreationInfo.eMail), A._, A>._)) + A.CallTo(() => _mailingProcessCreation.CreateMailProcess(A.That.IsEqualTo(userCreationInfo.eMail), A._, A>._)) .MustNotHaveHappened(); } @@ -1545,7 +1578,8 @@ public async Task GetUploadedDocumentsAsync_ReturnsExpectedOutput() _portalRepositories, null!, _identityService, - _dateTimeProvider); + _dateTimeProvider, + _mailingProcessCreation); // Act var result = await sut.GetUploadedDocumentsAsync(applicationId, DocumentTypeId.APP_CONTRACT).ConfigureAwait(false); @@ -1574,7 +1608,8 @@ public async Task GetUploadedDocumentsAsync_InvalidApplication_ThrowsNotFound() _portalRepositories, null!, _identityService, - _dateTimeProvider); + _dateTimeProvider, + _mailingProcessCreation); Task Act() => sut.GetUploadedDocumentsAsync(applicationId, DocumentTypeId.APP_CONTRACT); @@ -1604,7 +1639,8 @@ public async Task GetUploadedDocumentsAsync_InvalidUser_ThrowsForbidden() _portalRepositories, null!, _identityService, - _dateTimeProvider); + _dateTimeProvider, + _mailingProcessCreation); Task Act() => sut.GetUploadedDocumentsAsync(applicationId, DocumentTypeId.APP_CONTRACT); @@ -1626,7 +1662,7 @@ public async Task SubmitRoleConsentsAsync_WithNotExistingApplication_ThrowsNotFo var notExistingId = _fixture.Create(); A.CallTo(() => _companyRolesRepository.GetCompanyRoleAgreementConsentDataAsync(notExistingId)) .ReturnsLazily(() => (CompanyRoleAgreementConsentData?)null); - var sut = new RegistrationBusinessLogic(Options.Create(new RegistrationSettings()), null!, null!, null!, _portalRepositories, null!, _identityService, _dateTimeProvider); + var sut = new RegistrationBusinessLogic(Options.Create(new RegistrationSettings()), null!, null!, null!, _portalRepositories, null!, _identityService, _dateTimeProvider, _mailingProcessCreation); // Act async Task Act() => await sut.SubmitRoleConsentAsync(notExistingId, _fixture.Create()) @@ -1646,7 +1682,7 @@ public async Task SubmitRoleConsentsAsync_WithWrongCompanyUser_ThrowsForbiddenEx var data = new CompanyRoleAgreementConsentData(Guid.NewGuid(), applicationStatusId, _fixture.CreateMany(2), _fixture.CreateMany(5)); A.CallTo(() => _companyRolesRepository.GetCompanyRoleAgreementConsentDataAsync(applicationId)) .ReturnsLazily(() => data); - var sut = new RegistrationBusinessLogic(Options.Create(new RegistrationSettings()), null!, null!, null!, _portalRepositories, null!, _identityService, _dateTimeProvider); + var sut = new RegistrationBusinessLogic(Options.Create(new RegistrationSettings()), null!, null!, null!, _portalRepositories, null!, _identityService, _dateTimeProvider, _mailingProcessCreation); // Act async Task Act() => await sut.SubmitRoleConsentAsync(applicationId, _fixture.Create()) @@ -1676,7 +1712,7 @@ public async Task SubmitRoleConsentsAsync_WithInvalidRoles_ThrowsControllerArgum .ReturnsLazily(() => data); A.CallTo(() => _companyRolesRepository.GetAgreementAssignedCompanyRolesUntrackedAsync(roleIds)) .Returns(companyRoleAssignedAgreements.ToAsyncEnumerable()); - var sut = new RegistrationBusinessLogic(Options.Create(new RegistrationSettings()), null!, null!, null!, _portalRepositories, null!, _identityService, _dateTimeProvider); + var sut = new RegistrationBusinessLogic(Options.Create(new RegistrationSettings()), null!, null!, null!, _portalRepositories, null!, _identityService, _dateTimeProvider, _mailingProcessCreation); // Act async Task Act() => await sut.SubmitRoleConsentAsync(applicationId, _fixture.Create()) @@ -1716,7 +1752,7 @@ public async Task SubmitRoleConsentsAsync_WithoutAllRolesConsentGiven_ThrowsCont A.CallTo(() => _companyRolesRepository.GetAgreementAssignedCompanyRolesUntrackedAsync(A>._)) .Returns(companyRoleAssignedAgreements.ToAsyncEnumerable()); - var sut = new RegistrationBusinessLogic(Options.Create(new RegistrationSettings()), null!, null!, null!, _portalRepositories, null!, _identityService, _dateTimeProvider); + var sut = new RegistrationBusinessLogic(Options.Create(new RegistrationSettings()), null!, null!, null!, _portalRepositories, null!, _identityService, _dateTimeProvider, _mailingProcessCreation); // Act async Task Act() => await sut.SubmitRoleConsentAsync(applicationId, consents) @@ -1801,7 +1837,7 @@ public async Task SubmitRoleConsentsAsync_WithValidData_CallsExpected() removedCompanyRoleIds = companyRoleIds; }); - var sut = new RegistrationBusinessLogic(Options.Create(new RegistrationSettings()), null!, null!, null!, _portalRepositories, null!, _identityService, _dateTimeProvider); + var sut = new RegistrationBusinessLogic(Options.Create(new RegistrationSettings()), null!, null!, null!, _portalRepositories, null!, _identityService, _dateTimeProvider, _mailingProcessCreation); // Act await sut.SubmitRoleConsentAsync(applicationId, consents).ConfigureAwait(false); @@ -1854,7 +1890,7 @@ public async Task SubmitRoleConsentsAsync_WithextraAgreement_ThrowsControllerArg A.CallTo(() => _companyRolesRepository.GetAgreementAssignedCompanyRolesUntrackedAsync(A>._)) .Returns(companyRoleAssignedAgreements.ToAsyncEnumerable()); - var sut = new RegistrationBusinessLogic(Options.Create(new RegistrationSettings()), null!, null!, null!, _portalRepositories, null!, _identityService, _dateTimeProvider); + var sut = new RegistrationBusinessLogic(Options.Create(new RegistrationSettings()), null!, null!, null!, _portalRepositories, null!, _identityService, _dateTimeProvider, _mailingProcessCreation); // Act async Task Act() => await sut.SubmitRoleConsentAsync(applicationId, consents) @@ -1882,7 +1918,7 @@ public async Task SubmitRegistrationAsync_WithNotExistingApplication_ThrowsNotFo }; A.CallTo(() => _applicationRepository.GetOwnCompanyApplicationUserEmailDataAsync(A._, A._, A>._)) .Returns((CompanyApplicationUserEmailData?)null); - var sut = new RegistrationBusinessLogic(Options.Create(settings), null!, null!, null!, _portalRepositories, null!, _identityService, _dateTimeProvider); + var sut = new RegistrationBusinessLogic(Options.Create(settings), null!, null!, null!, _portalRepositories, null!, _identityService, _dateTimeProvider, _mailingProcessCreation); // Act async Task Act() => await sut.SubmitRegistrationAsync(notExistingId) @@ -1973,7 +2009,7 @@ public async Task SubmitRegistrationAsync_WithDocumentId_Success() DocumentTypeId.COMMERCIAL_REGISTER_EXTRACT } }; - var sut = new RegistrationBusinessLogic(Options.Create(settings), null!, null!, null!, _portalRepositories, _checklistService, _identityService, _dateTimeProvider); + var sut = new RegistrationBusinessLogic(Options.Create(settings), null!, null!, null!, _portalRepositories, _checklistService, _identityService, _dateTimeProvider, _mailingProcessCreation); // Act await sut.SubmitRegistrationAsync(applicationId); @@ -1998,8 +2034,6 @@ public async Task SubmitRegistrationAsync_WithDocumentId_Success() A.CallTo(() => _processStepRepository.CreateProcess(ProcessTypeId.APPLICATION_CHECKLIST)) .MustHaveHappenedOnceExactly(); - A.CallTo(() => _processStepRepository.CreateProcess(ProcessTypeId.MAILING)) - .MustHaveHappenedOnceExactly(); process.Should().NotBeNull(); process!.ProcessTypeId.Should().Be(ProcessTypeId.APPLICATION_CHECKLIST); @@ -2066,7 +2100,7 @@ public async Task SubmitRegistrationAsync_InvalidStatus_ThrowsForbiddenException var companyData = new CompanyData("Test Company", Guid.NewGuid(), "Strabe Street", "Munich", "Germany", uniqueIds, companyRoleIds); A.CallTo(() => _applicationRepository.GetOwnCompanyApplicationUserEmailDataAsync(A._, A._, A>._)) .Returns(new CompanyApplicationUserEmailData(statusId, true, _fixture.Create(), documents, companyData, agreementConsents)); - var sut = new RegistrationBusinessLogic(Options.Create(settings), null!, null!, null!, _portalRepositories, null!, _identityService, _dateTimeProvider); + var sut = new RegistrationBusinessLogic(Options.Create(settings), null!, null!, null!, _portalRepositories, null!, _identityService, _dateTimeProvider, _mailingProcessCreation); // Act async Task Act() => await sut.SubmitRegistrationAsync(applicationId) @@ -2112,7 +2146,7 @@ public async Task SubmitRegistrationAsync_AlreadyClosed_ThrowsForbiddenException }; A.CallTo(() => _applicationRepository.GetOwnCompanyApplicationUserEmailDataAsync(A._, A._, A>._)) .Returns(new CompanyApplicationUserEmailData(statusId, true, _fixture.Create(), documents, companyData, agreementConsents)); - var sut = new RegistrationBusinessLogic(Options.Create(settings), null!, null!, null!, _portalRepositories, null!, _identityService, _dateTimeProvider); + var sut = new RegistrationBusinessLogic(Options.Create(settings), null!, null!, null!, _portalRepositories, null!, _identityService, _dateTimeProvider, _mailingProcessCreation); // Act async Task Act() => await sut.SubmitRegistrationAsync(applicationId) @@ -2151,7 +2185,7 @@ public async Task SubmitRegistrationAsync_WithNotExistingCompanyUser_ThrowsForbi }; A.CallTo(() => _applicationRepository.GetOwnCompanyApplicationUserEmailDataAsync(A._, A._, A>._)) .Returns(new CompanyApplicationUserEmailData(CompanyApplicationStatusId.VERIFY, false, null, null!, companyData, agreementConsents)); - var sut = new RegistrationBusinessLogic(Options.Create(settings), null!, null!, null!, _portalRepositories, null!, _identityService, _dateTimeProvider); + var sut = new RegistrationBusinessLogic(Options.Create(settings), null!, null!, null!, _portalRepositories, null!, _identityService, _dateTimeProvider, _mailingProcessCreation); // Act async Task Act() => await sut.SubmitRegistrationAsync(applicationId) @@ -2190,7 +2224,7 @@ public async Task SubmitRegistrationAsync_WithNotExistingStreetName_ThrowsConfli }; A.CallTo(() => _applicationRepository.GetOwnCompanyApplicationUserEmailDataAsync(applicationId, userId, A>._)) .Returns(new CompanyApplicationUserEmailData(CompanyApplicationStatusId.VERIFY, true, _fixture.Create(), Enumerable.Empty(), companyData, agreementConsents)); - var sut = new RegistrationBusinessLogic(Options.Create(settings), null!, null!, null!, _portalRepositories, null!, _identityService, _dateTimeProvider); + var sut = new RegistrationBusinessLogic(Options.Create(settings), null!, null!, null!, _portalRepositories, null!, _identityService, _dateTimeProvider, _mailingProcessCreation); // Act async Task Act() => await sut.SubmitRegistrationAsync(applicationId) @@ -2221,7 +2255,7 @@ public async Task SubmitRegistrationAsync_WithNotExistingAddressId_ThrowsConflic var companyData = new CompanyData("Test Company", null, "Strabe Street", "Munich", "Germany", uniqueIds, companyRoleIds); A.CallTo(() => _applicationRepository.GetOwnCompanyApplicationUserEmailDataAsync(applicationId, userId, A>._)) .ReturnsLazily(() => new CompanyApplicationUserEmailData(CompanyApplicationStatusId.VERIFY, true, _fixture.Create(), Enumerable.Empty(), companyData, agreementConsents)); - var sut = new RegistrationBusinessLogic(Options.Create(new RegistrationSettings()), null!, null!, null!, _portalRepositories, null!, _identityService, _dateTimeProvider); + var sut = new RegistrationBusinessLogic(Options.Create(new RegistrationSettings()), null!, null!, null!, _portalRepositories, null!, _identityService, _dateTimeProvider, _mailingProcessCreation); // Act async Task Act() => await sut.SubmitRegistrationAsync(applicationId) @@ -2252,7 +2286,7 @@ public async Task SubmitRegistrationAsync_WithNotExistingCompanyName_ThrowsConfl var companyData = new CompanyData(string.Empty, Guid.NewGuid(), "Strabe Street", "Munich", "Germany", uniqueIds, companyRoleIds); A.CallTo(() => _applicationRepository.GetOwnCompanyApplicationUserEmailDataAsync(applicationId, userId, A>._)) .Returns(new CompanyApplicationUserEmailData(CompanyApplicationStatusId.VERIFY, true, _fixture.Create(), Enumerable.Empty(), companyData, agreementConsents)); - var sut = new RegistrationBusinessLogic(Options.Create(new RegistrationSettings()), null!, null!, null!, _portalRepositories, null!, _identityService, _dateTimeProvider); + var sut = new RegistrationBusinessLogic(Options.Create(new RegistrationSettings()), null!, null!, null!, _portalRepositories, null!, _identityService, _dateTimeProvider, _mailingProcessCreation); // Act async Task Act() => await sut.SubmitRegistrationAsync(applicationId) @@ -2283,7 +2317,7 @@ public async Task SubmitRegistrationAsync_WithNotExistingUniqueId_ThrowsConflict var companyData = new CompanyData("Test Company", Guid.NewGuid(), "Strabe Street", "Munich", "Germany", uniqueIdentifierData, companyRoleIds); A.CallTo(() => _applicationRepository.GetOwnCompanyApplicationUserEmailDataAsync(applicationId, userId, A>._)) .ReturnsLazily(() => new CompanyApplicationUserEmailData(CompanyApplicationStatusId.VERIFY, true, _fixture.Create(), Enumerable.Empty(), companyData, agreementConsents)); - var sut = new RegistrationBusinessLogic(Options.Create(new RegistrationSettings()), null!, null!, null!, _portalRepositories, null!, _identityService, _dateTimeProvider); + var sut = new RegistrationBusinessLogic(Options.Create(new RegistrationSettings()), null!, null!, null!, _portalRepositories, null!, _identityService, _dateTimeProvider, _mailingProcessCreation); // Act async Task Act() => await sut.SubmitRegistrationAsync(applicationId) @@ -2314,7 +2348,7 @@ public async Task SubmitRegistrationAsync_WithNotExistingCompanyRoleId_ThrowsCon var companyData = new CompanyData("Test Company", Guid.NewGuid(), "Strabe Street", "Munich", "Germany", uniqueIds, companyRoleIdData); A.CallTo(() => _applicationRepository.GetOwnCompanyApplicationUserEmailDataAsync(applicationId, userId, A>._)) .ReturnsLazily(() => new CompanyApplicationUserEmailData(CompanyApplicationStatusId.VERIFY, true, _fixture.Create(), Enumerable.Empty(), companyData, agreementConsents)); - var sut = new RegistrationBusinessLogic(Options.Create(new RegistrationSettings()), null!, null!, null!, _portalRepositories, null!, _identityService, _dateTimeProvider); + var sut = new RegistrationBusinessLogic(Options.Create(new RegistrationSettings()), null!, null!, null!, _portalRepositories, null!, _identityService, _dateTimeProvider, _mailingProcessCreation); // Act async Task Act() => await sut.SubmitRegistrationAsync(applicationId) @@ -2342,7 +2376,7 @@ public async Task SubmitRegistrationAsync_WithNotExistingAgreementandConsent_Thr var companyData = new CompanyData("Test Company", Guid.NewGuid(), "Strabe Street", "Munich", "Germany", uniqueIds, companyRoleIds); A.CallTo(() => _applicationRepository.GetOwnCompanyApplicationUserEmailDataAsync(applicationId, userId, A>._)) .ReturnsLazily(() => new CompanyApplicationUserEmailData(CompanyApplicationStatusId.VERIFY, true, _fixture.Create(), Enumerable.Empty(), companyData, agreementConsents)); - var sut = new RegistrationBusinessLogic(Options.Create(new RegistrationSettings()), null!, null!, null!, _portalRepositories, null!, _identityService, _dateTimeProvider); + var sut = new RegistrationBusinessLogic(Options.Create(new RegistrationSettings()), null!, null!, null!, _portalRepositories, null!, _identityService, _dateTimeProvider, _mailingProcessCreation); // Act async Task Act() => await sut.SubmitRegistrationAsync(applicationId) @@ -2373,7 +2407,7 @@ public async Task SubmitRegistrationAsync_WithNotExistingCity_ThrowsConflictExce var companyData = new CompanyData("Test Company", Guid.NewGuid(), "Strabe Street", string.Empty, "Germany", uniqueIds, companyRoleIds); A.CallTo(() => _applicationRepository.GetOwnCompanyApplicationUserEmailDataAsync(applicationId, userId, A>._)) .ReturnsLazily(() => new CompanyApplicationUserEmailData(CompanyApplicationStatusId.VERIFY, true, _fixture.Create(), Enumerable.Empty(), companyData, agreementConsents)); - var sut = new RegistrationBusinessLogic(Options.Create(new RegistrationSettings()), null!, null!, null!, _portalRepositories, null!, _identityService, _dateTimeProvider); + var sut = new RegistrationBusinessLogic(Options.Create(new RegistrationSettings()), null!, null!, null!, _portalRepositories, null!, _identityService, _dateTimeProvider, _mailingProcessCreation); // Act async Task Act() => await sut.SubmitRegistrationAsync(applicationId) @@ -2405,7 +2439,7 @@ public async Task SubmitRegistrationAsync_WithNotExistingCountry_ThrowsConflictE var companyData = new CompanyData("Test Company", Guid.NewGuid(), "Strabe Street", "Munich", string.Empty, uniqueIds, companyRoleIds); A.CallTo(() => _applicationRepository.GetOwnCompanyApplicationUserEmailDataAsync(applicationId, userId, A>._)) .ReturnsLazily(() => new CompanyApplicationUserEmailData(CompanyApplicationStatusId.VERIFY, true, _fixture.Create(), Enumerable.Empty(), companyData, agreementConsents)); - var sut = new RegistrationBusinessLogic(Options.Create(new RegistrationSettings()), null!, null!, null!, _portalRepositories, null!, _identityService, _dateTimeProvider); + var sut = new RegistrationBusinessLogic(Options.Create(new RegistrationSettings()), null!, null!, null!, _portalRepositories, null!, _identityService, _dateTimeProvider, _mailingProcessCreation); // Act async Task Act() => await sut.SubmitRegistrationAsync(applicationId) @@ -2450,7 +2484,7 @@ public async Task SubmitRegistrationAsync_WithUserEmail_SendsMail() { setOptionalFields.Invoke(application); }); - var sut = new RegistrationBusinessLogic(Options.Create(settings), null!, null!, null!, _portalRepositories, _checklistService, _identityService, _dateTimeProvider); + var sut = new RegistrationBusinessLogic(Options.Create(settings), null!, null!, null!, _portalRepositories, _checklistService, _identityService, _dateTimeProvider, _mailingProcessCreation); // Act var result = await sut.SubmitRegistrationAsync(applicationId) @@ -2461,7 +2495,7 @@ public async Task SubmitRegistrationAsync_WithUserEmail_SendsMail() .MustHaveHappenedOnceExactly(); A.CallTo(() => _applicationRepository.AttachAndModifyCompanyApplication(applicationId, A>._)).MustHaveHappenedOnceExactly(); A.CallTo(() => _checklistService.CreateInitialChecklistAsync(applicationId)).MustHaveHappenedOnceExactly(); - A.CallTo(() => _mailingInformationRepository.CreateMailingInformation(A._, A._, A._, A>._)) + A.CallTo(() => _mailingProcessCreation.CreateMailProcess(A._, A._, A>._)) .MustHaveHappened(); result.Should().BeTrue(); application.DateLastChanged.Should().Be(now); @@ -2501,7 +2535,7 @@ public async Task SubmitRegistrationAsync_WithoutUserEmail_DoesntSendMail() { setOptionalFields.Invoke(application); }); - var sut = new RegistrationBusinessLogic(Options.Create(settings), null!, null!, A.Fake>(), _portalRepositories, _checklistService, _identityService, _dateTimeProvider); + var sut = new RegistrationBusinessLogic(Options.Create(settings), null!, null!, A.Fake>(), _portalRepositories, _checklistService, _identityService, _dateTimeProvider, _mailingProcessCreation); // Act var result = await sut.SubmitRegistrationAsync(applicationId) @@ -2512,7 +2546,7 @@ public async Task SubmitRegistrationAsync_WithoutUserEmail_DoesntSendMail() .MustHaveHappenedOnceExactly(); A.CallTo(() => _applicationRepository.AttachAndModifyCompanyApplication(applicationId, A>._)).MustHaveHappenedOnceExactly(); A.CallTo(() => _checklistService.CreateInitialChecklistAsync(applicationId)).MustHaveHappenedOnceExactly(); - A.CallTo(() => _mailingInformationRepository.CreateMailingInformation(A._, A._, A._, A>._)) + A.CallTo(() => _mailingProcessCreation.CreateMailProcess(A._, A._, A>._)) .MustNotHaveHappened(); result.Should().BeTrue(); application.DateLastChanged.Should().Be(now); @@ -2539,7 +2573,8 @@ public async Task GetCompanyIdentifiers_ReturnsExpectedOutput() _portalRepositories, null!, _identityService, - _dateTimeProvider); + _dateTimeProvider, + _mailingProcessCreation); // Act var result = await sut.GetCompanyIdentifiers(_fixture.Create()).ConfigureAwait(false); @@ -2569,7 +2604,8 @@ public async Task GetCompanyIdentifiers_InvalidCountry_Throws() _portalRepositories, null!, _identityService, - _dateTimeProvider); + _dateTimeProvider, + _mailingProcessCreation); var countryCode = _fixture.Create(); @@ -2593,7 +2629,7 @@ public async Task GetRegistrationDataAsync_ReturnsExpected() A.CallTo(() => _applicationRepository.GetRegistrationDataUntrackedAsync(_existingApplicationId, _identity.CompanyId, A>._)) .Returns((true, true, data)); - var sut = new RegistrationBusinessLogic(_options, null!, null!, null!, _portalRepositories, null!, _identityService, _dateTimeProvider); + var sut = new RegistrationBusinessLogic(_options, null!, null!, null!, _portalRepositories, null!, _identityService, _dateTimeProvider, _mailingProcessCreation); // Act var result = await sut.GetRegistrationDataAsync(_existingApplicationId).ConfigureAwait(false); @@ -2638,7 +2674,7 @@ public async Task GetRegistrationDataAsync_WithInvalidApplicationId_Throws() A.CallTo(() => _applicationRepository.GetRegistrationDataUntrackedAsync(A._, _identity.CompanyId, A>._)) .Returns((false, false, data)); - var sut = new RegistrationBusinessLogic(_options, null!, null!, null!, _portalRepositories, null!, _identityService, _dateTimeProvider); + var sut = new RegistrationBusinessLogic(_options, null!, null!, null!, _portalRepositories, null!, _identityService, _dateTimeProvider, _mailingProcessCreation); // Act var Act = () => sut.GetRegistrationDataAsync(applicationId); @@ -2657,7 +2693,7 @@ public async Task GetRegistrationDataAsync_WithInvalidUser_Throws() A.CallTo(() => _applicationRepository.GetRegistrationDataUntrackedAsync(A._, _identity.CompanyId, A>._)) .Returns((true, false, data)); - var sut = new RegistrationBusinessLogic(_options, null!, null!, null!, _portalRepositories, null!, _identityService, _dateTimeProvider); + var sut = new RegistrationBusinessLogic(_options, null!, null!, null!, _portalRepositories, null!, _identityService, _dateTimeProvider, _mailingProcessCreation); // Act var Act = () => sut.GetRegistrationDataAsync(applicationId); @@ -2676,7 +2712,7 @@ public async Task GetRegistrationDataAsync_WithNullData_Throws() A.CallTo(() => _applicationRepository.GetRegistrationDataUntrackedAsync(A._, _identity.CompanyId, A>._)) .Returns((true, true, null)); - var sut = new RegistrationBusinessLogic(_options, null!, null!, null!, _portalRepositories, null!, _identityService, _dateTimeProvider); + var sut = new RegistrationBusinessLogic(_options, null!, null!, null!, _portalRepositories, null!, _identityService, _dateTimeProvider, _mailingProcessCreation); // Act var Act = () => sut.GetRegistrationDataAsync(applicationId); @@ -2696,7 +2732,7 @@ public async Task GetRegistrationDocumentAsync_ReturnsExpectedResult() var content = new byte[7]; A.CallTo(() => _documentRepository.GetDocumentAsync(documentId, A>._)) .ReturnsLazily(() => new ValueTuple(content, "test.json", true, MediaTypeId.JSON)); - var sut = new RegistrationBusinessLogic(_options, null!, null!, null!, _portalRepositories, null!, _identityService, _dateTimeProvider); + var sut = new RegistrationBusinessLogic(_options, null!, null!, null!, _portalRepositories, null!, _identityService, _dateTimeProvider, _mailingProcessCreation); //Act var result = await sut.GetRegistrationDocumentAsync(documentId).ConfigureAwait(false); @@ -2715,7 +2751,7 @@ public async Task GetRegistrationDocumentAsync_WithInvalidDocumentTypeId_ThrowsN var content = new byte[7]; A.CallTo(() => _documentRepository.GetDocumentAsync(documentId, A>._)) .ReturnsLazily(() => new ValueTuple(content, "test.json", false, MediaTypeId.JSON)); - var sut = new RegistrationBusinessLogic(_options, null!, null!, null!, _portalRepositories, null!, _identityService, _dateTimeProvider); + var sut = new RegistrationBusinessLogic(_options, null!, null!, null!, _portalRepositories, null!, _identityService, _dateTimeProvider, _mailingProcessCreation); //Act var Act = () => sut.GetRegistrationDocumentAsync(documentId); @@ -2733,7 +2769,7 @@ public async Task GetRegistrationDocumentAsync_WithInvalidDocumentId_ThrowsNotFo var content = new byte[7]; A.CallTo(() => _documentRepository.GetDocumentAsync(documentId, A>._)) .ReturnsLazily(() => new ValueTuple()); - var sut = new RegistrationBusinessLogic(_options, null!, null!, null!, _portalRepositories, null!, _identityService, _dateTimeProvider); + var sut = new RegistrationBusinessLogic(_options, null!, null!, null!, _portalRepositories, null!, _identityService, _dateTimeProvider, _mailingProcessCreation); //Act var Act = () => sut.GetRegistrationDocumentAsync(documentId); @@ -2755,7 +2791,7 @@ public async Task GetDocumentAsync_WithValidData_ReturnsExpected() .ReturnsLazily(() => new ValueTuple(documentId, true)); A.CallTo(() => _documentRepository.GetDocumentByIdAsync(documentId)) .ReturnsLazily(() => new Document(documentId, content, content, "test.pdf", MediaTypeId.PDF, DateTimeOffset.UtcNow, DocumentStatusId.LOCKED, DocumentTypeId.APP_CONTRACT)); - var sut = new RegistrationBusinessLogic(Options.Create(new RegistrationSettings()), null!, null!, null!, _portalRepositories, null!, _identityService, _dateTimeProvider); + var sut = new RegistrationBusinessLogic(Options.Create(new RegistrationSettings()), null!, null!, null!, _portalRepositories, null!, _identityService, _dateTimeProvider, _mailingProcessCreation); // Act var result = await sut.GetDocumentContentAsync(documentId).ConfigureAwait(false); @@ -2774,7 +2810,7 @@ public async Task GetDocumentAsync_WithoutDocument_ThrowsNotFoundException() var content = new byte[7]; A.CallTo(() => _documentRepository.GetDocumentIdWithCompanyUserCheckAsync(documentId, _identity.IdentityId)) .ReturnsLazily(() => new ValueTuple(Guid.Empty, false)); - var sut = new RegistrationBusinessLogic(Options.Create(new RegistrationSettings()), null!, null!, null!, _portalRepositories, null!, _identityService, _dateTimeProvider); + var sut = new RegistrationBusinessLogic(Options.Create(new RegistrationSettings()), null!, null!, null!, _portalRepositories, null!, _identityService, _dateTimeProvider, _mailingProcessCreation); // Act async Task Act() => await sut.GetDocumentContentAsync(documentId).ConfigureAwait(false); @@ -2791,7 +2827,7 @@ public async Task GetDocumentAsync_WithWrongUser_ThrowsForbiddenException() var documentId = Guid.NewGuid(); A.CallTo(() => _documentRepository.GetDocumentIdWithCompanyUserCheckAsync(documentId, _identity.IdentityId)) .ReturnsLazily(() => new ValueTuple(documentId, false)); - var sut = new RegistrationBusinessLogic(Options.Create(new RegistrationSettings()), null!, null!, null!, _portalRepositories, null!, _identityService, _dateTimeProvider); + var sut = new RegistrationBusinessLogic(Options.Create(new RegistrationSettings()), null!, null!, null!, _portalRepositories, null!, _identityService, _dateTimeProvider, _mailingProcessCreation); // Act async Task Act() => await sut.GetDocumentContentAsync(documentId).ConfigureAwait(false); @@ -2825,7 +2861,7 @@ public async Task SetInvitationStatusAsync_ReturnsExpected() { setOptionalFields.Invoke(application); }); - var sut = new RegistrationBusinessLogic(_options, null!, null!, null!, _portalRepositories, null!, _identityService, _dateTimeProvider); + var sut = new RegistrationBusinessLogic(_options, null!, null!, null!, _portalRepositories, null!, _identityService, _dateTimeProvider, _mailingProcessCreation); // Act var result = await sut.SetInvitationStatusAsync().ConfigureAwait(false); @@ -2843,7 +2879,7 @@ public async Task SetInvitationStatusAsync_Throws_ForbiddenException() // Arrange A.CallTo(() => _invitationRepository.GetInvitationStatusAsync(A._)) .Returns((Invitation)null!); - var sut = new RegistrationBusinessLogic(_options, null!, null!, null!, _portalRepositories, null!, _identityService, _dateTimeProvider); + var sut = new RegistrationBusinessLogic(_options, null!, null!, null!, _portalRepositories, null!, _identityService, _dateTimeProvider, _mailingProcessCreation); //Act var Act = async () => await sut.SetInvitationStatusAsync().ConfigureAwait(false); @@ -2897,7 +2933,7 @@ public async Task DeleteRegistrationDocumentAsync_ReturnsExpected() A.CallTo(() => _documentRepository.GetDocumentDetailsForApplicationUntrackedAsync(documentId, _identity.CompanyId, settings.ApplicationStatusIds)) .Returns((documentId, DocumentStatusId.PENDING, true, DocumentTypeId.CX_FRAME_CONTRACT, false, applicationIds)); - var sut = new RegistrationBusinessLogic(Options.Create(settings), null!, null!, null!, _portalRepositories, null!, _identityService, _dateTimeProvider); + var sut = new RegistrationBusinessLogic(Options.Create(settings), null!, null!, null!, _portalRepositories, null!, _identityService, _dateTimeProvider, _mailingProcessCreation); // Act var result = await sut.DeleteRegistrationDocumentAsync(documentId).ConfigureAwait(false); @@ -2935,7 +2971,7 @@ public async Task DeleteRegistrationDocumentAsync_DocumentTypeId_ConflictExcepti A.CallTo(() => _documentRepository.GetDocumentDetailsForApplicationUntrackedAsync(documentId, _identity.CompanyId, settings.ApplicationStatusIds)) .Returns((documentId, DocumentStatusId.PENDING, true, DocumentTypeId.CONFORMITY_APPROVAL_BUSINESS_APPS, false, applicationId)); - var sut = new RegistrationBusinessLogic(Options.Create(settings), null!, null!, null!, _portalRepositories, null!, _identityService, _dateTimeProvider); + var sut = new RegistrationBusinessLogic(Options.Create(settings), null!, null!, null!, _portalRepositories, null!, _identityService, _dateTimeProvider, _mailingProcessCreation); // Act var Act = async () => await sut.DeleteRegistrationDocumentAsync(documentId).ConfigureAwait(false); @@ -2952,7 +2988,7 @@ public async Task DeleteRegistrationDocumentAsync_Throws_NotFoundException() A.CallTo(() => _documentRepository.GetDocumentDetailsForApplicationUntrackedAsync(A._, _identity.CompanyId, A>._)) .Returns(new ValueTuple>()); - var sut = new RegistrationBusinessLogic(Options.Create(new RegistrationSettings()), null!, null!, null!, _portalRepositories, null!, _identityService, _dateTimeProvider); + var sut = new RegistrationBusinessLogic(Options.Create(new RegistrationSettings()), null!, null!, null!, _portalRepositories, null!, _identityService, _dateTimeProvider, _mailingProcessCreation); // Act var Act = async () => await sut.DeleteRegistrationDocumentAsync(_fixture.Create()).ConfigureAwait(false); @@ -2983,7 +3019,7 @@ public async Task DeleteRegistrationDocumentAsync_Throws_ConflictException() A.CallTo(() => _documentRepository.GetDocumentDetailsForApplicationUntrackedAsync(A._, _identity.CompanyId, A>._)) .Returns((documentId, DocumentStatusId.PENDING, true, DocumentTypeId.CX_FRAME_CONTRACT, true, applicationId)); - var sut = new RegistrationBusinessLogic(Options.Create(settings), null!, null!, null!, _portalRepositories, null!, _identityService, _dateTimeProvider); + var sut = new RegistrationBusinessLogic(Options.Create(settings), null!, null!, null!, _portalRepositories, null!, _identityService, _dateTimeProvider, _mailingProcessCreation); // Act var Act = async () => await sut.DeleteRegistrationDocumentAsync(documentId).ConfigureAwait(false); @@ -3014,7 +3050,7 @@ public async Task DeleteRegistrationDocumentAsync_Throws_ForbiddenException() A.CallTo(() => _documentRepository.GetDocumentDetailsForApplicationUntrackedAsync(A._, _identity.CompanyId, A>._)) .Returns((documentId, DocumentStatusId.PENDING, false, DocumentTypeId.CX_FRAME_CONTRACT, false, applicationId)); - var sut = new RegistrationBusinessLogic(Options.Create(settings), null!, null!, null!, _portalRepositories, null!, _identityService, _dateTimeProvider); + var sut = new RegistrationBusinessLogic(Options.Create(settings), null!, null!, null!, _portalRepositories, null!, _identityService, _dateTimeProvider, _mailingProcessCreation); // Act var Act = async () => await sut.DeleteRegistrationDocumentAsync(documentId).ConfigureAwait(false); @@ -3045,7 +3081,7 @@ public async Task DeleteRegistrationDocumentAsync_DocumentStatusId_Throws_Confli A.CallTo(() => _documentRepository.GetDocumentDetailsForApplicationUntrackedAsync(A._, _identity.CompanyId, A>._)) .Returns((documentId, DocumentStatusId.LOCKED, true, DocumentTypeId.CX_FRAME_CONTRACT, false, applicationId)); - var sut = new RegistrationBusinessLogic(Options.Create(settings), null!, null!, null!, _portalRepositories, null!, _identityService, _dateTimeProvider); + var sut = new RegistrationBusinessLogic(Options.Create(settings), null!, null!, null!, _portalRepositories, null!, _identityService, _dateTimeProvider, _mailingProcessCreation); // Act var Act = async () => await sut.DeleteRegistrationDocumentAsync(documentId).ConfigureAwait(false); @@ -3059,7 +3095,7 @@ public async Task DeleteRegistrationDocumentAsync_DocumentStatusId_Throws_Confli public async Task DeleteRegistrationDocumentAsync_Throws_ControllerArgumentException() { // Arrange; - var sut = new RegistrationBusinessLogic(Options.Create(new RegistrationSettings()), null!, null!, null!, _portalRepositories, null!, _identityService, _dateTimeProvider); + var sut = new RegistrationBusinessLogic(Options.Create(new RegistrationSettings()), null!, null!, null!, _portalRepositories, null!, _identityService, _dateTimeProvider, _mailingProcessCreation); // Act var Act = async () => await sut.DeleteRegistrationDocumentAsync(default).ConfigureAwait(false); @@ -3129,8 +3165,6 @@ private void SetupRepositories() .Returns(_staticDataRepository); A.CallTo(() => _portalRepositories.GetInstance()) .Returns(_processStepRepository); - A.CallTo(() => _portalRepositories.GetInstance()) - .Returns(_mailingInformationRepository); } private void SetupFakesForInvitation() @@ -3181,7 +3215,7 @@ public async Task Foo() ApplicationDeclineStatusIds = new[] { CompanyApplicationStatusId.CREATED } }); - var sut = new RegistrationBusinessLogic(options, null!, null!, null!, _portalRepositories, null!, _identityService, null!); + var sut = new RegistrationBusinessLogic(options, null!, null!, null!, _portalRepositories, null!, _identityService, null!, _mailingProcessCreation); // Act var result = await sut.GetApplicationsDeclineData().ConfigureAwait(false);