Skip to content

Commit

Permalink
add invitation worker
Browse files Browse the repository at this point in the history
Refs: CPLP-3383
  • Loading branch information
Phil91 committed Nov 22, 2023
1 parent 2279e00 commit a0041b4
Show file tree
Hide file tree
Showing 90 changed files with 12,228 additions and 1,308 deletions.
3 changes: 2 additions & 1 deletion .github/workflows/processes-worker.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,8 @@ on:
- 'src/processes/ApplicationChecklist.Library/**'
- 'src/processes/ApplicationChecklist.Executor/**'
- 'src/processes/NetworkRegistration.Library/**'
- 'src/processes/NetworkRegistration.Executor/**'
- 'src/processes/Mailing.Executor/**'
- 'src/processes/Invitation.Executor/**'
- 'src/externalsystems/**'
- 'src/framework/**'
- 'src/portalbackend/PortalBackend.PortalEntities/**'
Expand Down
60 changes: 60 additions & 0 deletions src/Portal.Backend.sln
Original file line number Diff line number Diff line change
Expand Up @@ -240,6 +240,14 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ServiceAccountSync.Executor
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Registration.Common", "registration\Registration.Common\Registration.Common.csproj", "{09EF5799-B375-49F1-B78F-0A94D8109F8B}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Mailing.Executer", "processes\Mailing.Executer\Mailing.Executer.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
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Invitation.Executor.Tests", "..\tests\processes\Invitation.Executor.Tests\Invitation.Executor.Tests.csproj", "{4693D24A-E6AA-4C3D-9990-5F095EACBD0B}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Mailing.Executor.Tests", "..\tests\processes\Mailing.Executor.Tests\Mailing.Executor.Tests.csproj", "{BF8EB6BB-E8CA-423C-AC50-01FB44D0D08B}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Expand Down Expand Up @@ -1522,6 +1530,54 @@ Global
{09EF5799-B375-49F1-B78F-0A94D8109F8B}.Release|x64.Build.0 = Release|Any CPU
{09EF5799-B375-49F1-B78F-0A94D8109F8B}.Release|x86.ActiveCfg = Release|Any CPU
{09EF5799-B375-49F1-B78F-0A94D8109F8B}.Release|x86.Build.0 = Release|Any CPU
{D666EADA-770A-42FF-B891-5745F7A6BC2F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D666EADA-770A-42FF-B891-5745F7A6BC2F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D666EADA-770A-42FF-B891-5745F7A6BC2F}.Debug|x64.ActiveCfg = Debug|Any CPU
{D666EADA-770A-42FF-B891-5745F7A6BC2F}.Debug|x64.Build.0 = Debug|Any CPU
{D666EADA-770A-42FF-B891-5745F7A6BC2F}.Debug|x86.ActiveCfg = Debug|Any CPU
{D666EADA-770A-42FF-B891-5745F7A6BC2F}.Debug|x86.Build.0 = Debug|Any CPU
{D666EADA-770A-42FF-B891-5745F7A6BC2F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D666EADA-770A-42FF-B891-5745F7A6BC2F}.Release|Any CPU.Build.0 = Release|Any CPU
{D666EADA-770A-42FF-B891-5745F7A6BC2F}.Release|x64.ActiveCfg = Release|Any CPU
{D666EADA-770A-42FF-B891-5745F7A6BC2F}.Release|x64.Build.0 = Release|Any CPU
{D666EADA-770A-42FF-B891-5745F7A6BC2F}.Release|x86.ActiveCfg = Release|Any CPU
{D666EADA-770A-42FF-B891-5745F7A6BC2F}.Release|x86.Build.0 = Release|Any CPU
{0551F0AF-5373-4516-87AA-01D7FFD29C0D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0551F0AF-5373-4516-87AA-01D7FFD29C0D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0551F0AF-5373-4516-87AA-01D7FFD29C0D}.Debug|x64.ActiveCfg = Debug|Any CPU
{0551F0AF-5373-4516-87AA-01D7FFD29C0D}.Debug|x64.Build.0 = Debug|Any CPU
{0551F0AF-5373-4516-87AA-01D7FFD29C0D}.Debug|x86.ActiveCfg = Debug|Any CPU
{0551F0AF-5373-4516-87AA-01D7FFD29C0D}.Debug|x86.Build.0 = Debug|Any CPU
{0551F0AF-5373-4516-87AA-01D7FFD29C0D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0551F0AF-5373-4516-87AA-01D7FFD29C0D}.Release|Any CPU.Build.0 = Release|Any CPU
{0551F0AF-5373-4516-87AA-01D7FFD29C0D}.Release|x64.ActiveCfg = Release|Any CPU
{0551F0AF-5373-4516-87AA-01D7FFD29C0D}.Release|x64.Build.0 = Release|Any CPU
{0551F0AF-5373-4516-87AA-01D7FFD29C0D}.Release|x86.ActiveCfg = Release|Any CPU
{0551F0AF-5373-4516-87AA-01D7FFD29C0D}.Release|x86.Build.0 = Release|Any CPU
{4693D24A-E6AA-4C3D-9990-5F095EACBD0B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4693D24A-E6AA-4C3D-9990-5F095EACBD0B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{4693D24A-E6AA-4C3D-9990-5F095EACBD0B}.Debug|x64.ActiveCfg = Debug|Any CPU
{4693D24A-E6AA-4C3D-9990-5F095EACBD0B}.Debug|x64.Build.0 = Debug|Any CPU
{4693D24A-E6AA-4C3D-9990-5F095EACBD0B}.Debug|x86.ActiveCfg = Debug|Any CPU
{4693D24A-E6AA-4C3D-9990-5F095EACBD0B}.Debug|x86.Build.0 = Debug|Any CPU
{4693D24A-E6AA-4C3D-9990-5F095EACBD0B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4693D24A-E6AA-4C3D-9990-5F095EACBD0B}.Release|Any CPU.Build.0 = Release|Any CPU
{4693D24A-E6AA-4C3D-9990-5F095EACBD0B}.Release|x64.ActiveCfg = Release|Any CPU
{4693D24A-E6AA-4C3D-9990-5F095EACBD0B}.Release|x64.Build.0 = Release|Any CPU
{4693D24A-E6AA-4C3D-9990-5F095EACBD0B}.Release|x86.ActiveCfg = Release|Any CPU
{4693D24A-E6AA-4C3D-9990-5F095EACBD0B}.Release|x86.Build.0 = Release|Any CPU
{BF8EB6BB-E8CA-423C-AC50-01FB44D0D08B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{BF8EB6BB-E8CA-423C-AC50-01FB44D0D08B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{BF8EB6BB-E8CA-423C-AC50-01FB44D0D08B}.Debug|x64.ActiveCfg = Debug|Any CPU
{BF8EB6BB-E8CA-423C-AC50-01FB44D0D08B}.Debug|x64.Build.0 = Debug|Any CPU
{BF8EB6BB-E8CA-423C-AC50-01FB44D0D08B}.Debug|x86.ActiveCfg = Debug|Any CPU
{BF8EB6BB-E8CA-423C-AC50-01FB44D0D08B}.Debug|x86.Build.0 = Debug|Any CPU
{BF8EB6BB-E8CA-423C-AC50-01FB44D0D08B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{BF8EB6BB-E8CA-423C-AC50-01FB44D0D08B}.Release|Any CPU.Build.0 = Release|Any CPU
{BF8EB6BB-E8CA-423C-AC50-01FB44D0D08B}.Release|x64.ActiveCfg = Release|Any CPU
{BF8EB6BB-E8CA-423C-AC50-01FB44D0D08B}.Release|x64.Build.0 = Release|Any CPU
{BF8EB6BB-E8CA-423C-AC50-01FB44D0D08B}.Release|x86.ActiveCfg = Release|Any CPU
{BF8EB6BB-E8CA-423C-AC50-01FB44D0D08B}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
Expand Down Expand Up @@ -1636,5 +1692,9 @@ Global
{B2E5EBAB-AE49-47B6-8220-4844AC9DA456} = {282CEF03-292F-4A49-83C6-997567D0FF5F}
{571DA63A-6B96-4C6C-8D82-D2C1F10BDAE5} = {323C198D-A8C6-4EB0-8B79-72624275E35F}
{09EF5799-B375-49F1-B78F-0A94D8109F8B} = {AB9C5AA2-DD5D-4A38-97C0-674A995C0AE0}
{D666EADA-770A-42FF-B891-5745F7A6BC2F} = {282CEF03-292F-4A49-83C6-997567D0FF5F}
{0551F0AF-5373-4516-87AA-01D7FFD29C0D} = {282CEF03-292F-4A49-83C6-997567D0FF5F}
{4693D24A-E6AA-4C3D-9990-5F095EACBD0B} = {323C198D-A8C6-4EB0-8B79-72624275E35F}
{BF8EB6BB-E8CA-423C-AC50-01FB44D0D08B} = {323C198D-A8C6-4EB0-8B79-72624275E35F}
EndGlobalSection
EndGlobal
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,6 @@ public class CompanyDataBusinessLogic : ICompanyDataBusinessLogic
private static readonly JsonSerializerOptions Options = new() { PropertyNamingPolicy = JsonNamingPolicy.CamelCase };

private readonly IPortalRepositories _portalRepositories;
private readonly IMailingService _mailingService;
private readonly ICustodianService _custodianService;
private readonly IDateTimeProvider _dateTimeProvider;
private readonly IIdentityService _identityService;
Expand All @@ -55,15 +54,13 @@ public class CompanyDataBusinessLogic : ICompanyDataBusinessLogic
/// Constructor
/// </summary>
/// <param name="portalRepositories"></param>
/// <param name="mailingService"></param>
/// <param name="custodianService"></param>
/// <param name="dateTimeProvider"></param>
/// <param name="identityService"></param>
/// <param name="options"></param>
public CompanyDataBusinessLogic(IPortalRepositories portalRepositories, IMailingService mailingService, ICustodianService custodianService, IDateTimeProvider dateTimeProvider, IIdentityService identityService, IOptions<CompanyDataSettings> options)
public CompanyDataBusinessLogic(IPortalRepositories portalRepositories, ICustodianService custodianService, IDateTimeProvider dateTimeProvider, IIdentityService identityService, IOptions<CompanyDataSettings> options)
{
_portalRepositories = portalRepositories;
_mailingService = mailingService;
_custodianService = custodianService;
_dateTimeProvider = dateTimeProvider;
_identityService = identityService;
Expand Down Expand Up @@ -433,10 +430,11 @@ public async Task ApproveCredential(Guid credentialId, CancellationToken cancell
throw new ArgumentOutOfRangeException($"{data.Kind} is currently not supported");
}

await _portalRepositories.SaveAsync().ConfigureAwait(false);

if (!string.IsNullOrWhiteSpace(data.RequesterData.RequesterEmail))
{
var processStepRepository = _portalRepositories.GetInstance<IProcessStepRepository>();
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<string, string>
{
Expand All @@ -447,8 +445,9 @@ public async Task ApproveCredential(Guid credentialId, CancellationToken cancell
{ "expiryDate", data.ExpiryDate == null ? string.Empty : data.ExpiryDate.Value.ToString("o", CultureInfo.InvariantCulture) }
};

await _mailingService.SendMails(data.RequesterData.RequesterEmail, mailParameters, Enumerable.Repeat("CredentialApproval", 1)).ConfigureAwait(false);
_portalRepositories.GetInstance<IMailingInformationRepository>().CreateMailingInformation(processId, data.RequesterData.RequesterEmail, "CredentialApproval", mailParameters);
}
await _portalRepositories.SaveAsync().ConfigureAwait(false);
}

/// <inheritdoc />
Expand Down Expand Up @@ -484,19 +483,22 @@ public async Task RejectCredential(Guid credentialId)
c.DateLastChanged = _dateTimeProvider.OffsetNow;
});

await _portalRepositories.SaveAsync().ConfigureAwait(false);

if (!string.IsNullOrWhiteSpace(requesterEmail))
{
var processStepRepository = _portalRepositories.GetInstance<IProcessStepRepository>();
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<string, string>
{
{ "userName", !string.IsNullOrWhiteSpace(userName) ? userName : requesterEmail },
{ "requestName", typeValue }
};

await _mailingService.SendMails(requesterEmail, mailParameters, Enumerable.Repeat("CredentialRejected", 1)).ConfigureAwait(false);
_portalRepositories.GetInstance<IMailingInformationRepository>().CreateMailingInformation(processId, requesterEmail, "CredentialRejected", mailParameters);
}
await _portalRepositories.SaveAsync().ConfigureAwait(false);

}

/// <inheritdoc />
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
/********************************************************************************
* 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
Expand All @@ -18,57 +17,34 @@
* SPDX-License-Identifier: Apache-2.0
********************************************************************************/

using Microsoft.Extensions.Options;
using Org.Eclipse.TractusX.Portal.Backend.Administration.Service.Models;
using Org.Eclipse.TractusX.Portal.Backend.Framework.ErrorHandling;
using Org.Eclipse.TractusX.Portal.Backend.Mailing.SendMail;
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.Enums;
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;

namespace Org.Eclipse.TractusX.Portal.Backend.Administration.Service.BusinessLogic;

public class InvitationBusinessLogic : IInvitationBusinessLogic
{
private readonly IProvisioningManager _provisioningManager;
private readonly IUserProvisioningService _userProvisioningService;
private readonly IPortalRepositories _portalRepositories;
private readonly IMailingService _mailingService;
private readonly InvitationSettings _settings;

/// <summary>
/// Constructor.
/// </summary>
/// <param name="provisioningManager">Provisioning Manager</param>
/// <param name="userProvisioningService">User Provisioning Service</param>
/// <param name="portalRepositories">Portal Repositories</param>
/// <param name="mailingService">Mailing Service</param>
/// <param name="settings">Settings</param>
public InvitationBusinessLogic(
IProvisioningManager provisioningManager,
IUserProvisioningService userProvisioningService,
IPortalRepositories portalRepositories,
IMailingService mailingService,
IOptions<InvitationSettings> settings)
public InvitationBusinessLogic(IPortalRepositories portalRepositories)
{
_provisioningManager = provisioningManager;
_userProvisioningService = userProvisioningService;
_portalRepositories = portalRepositories;
_mailingService = mailingService;
_settings = settings.Value;
}

public Task ExecuteInvitation(CompanyInvitationData invitationData)
{
if (string.IsNullOrWhiteSpace(invitationData.email))
if (string.IsNullOrWhiteSpace(invitationData.Email))
{
throw new ControllerArgumentException("email must not be empty", "email");
}
if (string.IsNullOrWhiteSpace(invitationData.organisationName))
if (string.IsNullOrWhiteSpace(invitationData.OrganisationName))
{
throw new ControllerArgumentException("organisationName must not be empty", "organisationName");
}
Expand All @@ -77,70 +53,17 @@ public Task ExecuteInvitation(CompanyInvitationData invitationData)

private async Task ExecuteInvitationInternalAsync(CompanyInvitationData invitationData)
{
var idpName = await _provisioningManager.GetNextCentralIdentityProviderNameAsync().ConfigureAwait(false);
await _provisioningManager.SetupSharedIdpAsync(idpName, invitationData.organisationName, _settings.InitialLoginTheme).ConfigureAwait(false);

var company = _portalRepositories.GetInstance<ICompanyRepository>().CreateCompany(invitationData.organisationName);

var identityProviderRepository = _portalRepositories.GetInstance<IIdentityProviderRepository>();
var identityProvider = identityProviderRepository.CreateIdentityProvider(IdentityProviderCategoryId.KEYCLOAK_OIDC, IdentityProviderTypeId.SHARED, company.Id, null);
identityProvider.Companies.Add(company);
identityProviderRepository.CreateIamIdentityProvider(identityProvider.Id, idpName);

var applicationRepository = _portalRepositories.GetInstance<IApplicationRepository>();
var application = applicationRepository.CreateCompanyApplication(company.Id, CompanyApplicationStatusId.CREATED, CompanyApplicationTypeId.INTERNAL);

var (userName, firstName, lastName, email, organisationName) = invitationData;
var processStepRepository = _portalRepositories.GetInstance<IProcessStepRepository>();
var processId = processStepRepository.CreateProcess(ProcessTypeId.INVITATION).Id;
processStepRepository.CreateProcessStep(ProcessStepTypeId.INVITATION_SETUP_IDP, ProcessStepStatusId.TODO, processId);
_portalRepositories.GetInstance<ICompanyInvitationRepository>().CreateCompanyInvitation(firstName, lastName, email, organisationName, processId, ci =>
{
if (!string.IsNullOrWhiteSpace(userName))
{
ci.UserName = userName;
}
});
await _portalRepositories.SaveAsync().ConfigureAwait(false);

var companyNameIdpAliasData = new CompanyNameIdpAliasData(
company.Id,
company.Name,
null,
idpName,
identityProvider.Id,
true
);

IEnumerable<UserRoleData> roleDatas;
try
{
roleDatas = await _userProvisioningService.GetRoleDatas(_settings.InvitedUserInitialRoles).ToListAsync().ConfigureAwait(false);
}
catch (Exception e)
{
throw new ConfigurationException($"{nameof(_settings.InvitedUserInitialRoles)}: {e.Message}");
}

var userCreationInfoIdps = new[] { new UserCreationRoleDataIdpInfo(
invitationData.firstName,
invitationData.lastName,
invitationData.email,
roleDatas,
string.IsNullOrWhiteSpace(invitationData.userName) ? invitationData.email : invitationData.userName,
"",
UserStatusId.ACTIVE,
true
)}.ToAsyncEnumerable();

var (companyUserId, _, password, error) = await _userProvisioningService.CreateOwnCompanyIdpUsersAsync(companyNameIdpAliasData, userCreationInfoIdps).SingleAsync().ConfigureAwait(false);

if (error != null)
{
throw error;
}

applicationRepository.CreateInvitation(application.Id, companyUserId);

await _portalRepositories.SaveAsync().ConfigureAwait(false);

var mailParameters = new Dictionary<string, string>
{
{ "password", password ?? "" },
{ "companyName", invitationData.organisationName },
{ "url", _settings.RegistrationAppAddress },
{ "passwordResendUrl", _settings.PasswordResendAddress },
};

await _mailingService.SendMails(invitationData.email, mailParameters, new List<string> { "RegistrationTemplate", "PasswordForRegistrationTemplate" }).ConfigureAwait(false);
}
}
Loading

0 comments on commit a0041b4

Please sign in to comment.