diff --git a/src/portalbackend/PortalBackend.DBAccess/Models/IdentityProvider.cs b/src/portalbackend/PortalBackend.DBAccess/Models/IdentityProvider.cs new file mode 100644 index 0000000000..e33759c684 --- /dev/null +++ b/src/portalbackend/PortalBackend.DBAccess/Models/IdentityProvider.cs @@ -0,0 +1,28 @@ +/******************************************************************************** + * Copyright (c) 2022 BMW Group AG + * Copyright (c) 2022 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.PortalBackend.PortalEntities.Enums; + +namespace Org.Eclipse.TractusX.Portal.Backend.PortalBackend.DBAccess.Models; + +public record IdentityProviderForTheme( + string IamIdpAliases, + IdentityProviderTypeId IdentityProviderType +); diff --git a/src/portalbackend/PortalBackend.DBAccess/Repositories/ApplicationRepository.cs b/src/portalbackend/PortalBackend.DBAccess/Repositories/ApplicationRepository.cs index a4d2f39cc2..7b513a5ec1 100644 --- a/src/portalbackend/PortalBackend.DBAccess/Repositories/ApplicationRepository.cs +++ b/src/portalbackend/PortalBackend.DBAccess/Repositories/ApplicationRepository.cs @@ -205,15 +205,15 @@ public IQueryable GetExternalCompanyApplicationsFilteredQuer .SingleOrDefaultAsync(); /// - public Task<(Guid CompanyId, string CompanyName, string? BusinessPartnerNumber, IEnumerable IamIdpAliasse, CompanyApplicationTypeId ApplicationTypeId, Guid? NetworkRegistrationProcessId)> GetCompanyAndApplicationDetailsForApprovalAsync(Guid applicationId) => + public Task<(Guid CompanyId, string CompanyName, string? BusinessPartnerNumber, IEnumerable IamIdps, CompanyApplicationTypeId ApplicationTypeId, Guid? NetworkRegistrationProcessId)> GetCompanyAndApplicationDetailsForApprovalAsync(Guid applicationId) => portalDbContext.CompanyApplications.Where(companyApplication => companyApplication.Id == applicationId && companyApplication.ApplicationStatusId == CompanyApplicationStatusId.SUBMITTED) - .Select(ca => new ValueTuple, CompanyApplicationTypeId, Guid?>( + .Select(ca => new ValueTuple, CompanyApplicationTypeId, Guid?>( ca.CompanyId, ca.Company!.Name, ca.Company.BusinessPartnerNumber, - ca.Company.IdentityProviders.Select(x => x.IamIdentityProvider!.IamIdpAlias), + ca.Company.IdentityProviders.Select(x => new IdentityProviderForTheme(x.IamIdentityProvider!.IamIdpAlias, x.IamIdentityProvider!.IdentityProvider!.IdentityProviderTypeId)), ca.CompanyApplicationTypeId, ca.CompanyApplicationTypeId == CompanyApplicationTypeId.EXTERNAL ? ca.Company.NetworkRegistration!.ProcessId : diff --git a/src/portalbackend/PortalBackend.DBAccess/Repositories/IApplicationRepository.cs b/src/portalbackend/PortalBackend.DBAccess/Repositories/IApplicationRepository.cs index 0c9bf25cdb..6bac43ce46 100644 --- a/src/portalbackend/PortalBackend.DBAccess/Repositories/IApplicationRepository.cs +++ b/src/portalbackend/PortalBackend.DBAccess/Repositories/IApplicationRepository.cs @@ -38,7 +38,7 @@ public interface IApplicationRepository Task GetCompanyApplicationDetailDataAsync(Guid applicationId, Guid userCompanyId, Guid? companyId); Task<(string CompanyName, string? FirstName, string? LastName, string? Email, IEnumerable<(Guid ApplicationId, CompanyApplicationStatusId ApplicationStatusId, IEnumerable<(string? FirstName, string? LastName, string? Email)> InvitedUsers)> Applications)> GetCompanyApplicationsDeclineData(Guid companyUserId, IEnumerable applicationStatusIds); Task<(bool IsValidApplicationId, Guid CompanyId, bool IsSubmitted)> GetCompanyIdSubmissionStatusForApplication(Guid applicationId); - Task<(Guid CompanyId, string CompanyName, string? BusinessPartnerNumber, IEnumerable IamIdpAliasse, CompanyApplicationTypeId ApplicationTypeId, Guid? NetworkRegistrationProcessId)> GetCompanyAndApplicationDetailsForApprovalAsync(Guid applicationId); + Task<(Guid CompanyId, string CompanyName, string? BusinessPartnerNumber, IEnumerable IamIdps, CompanyApplicationTypeId ApplicationTypeId, Guid? NetworkRegistrationProcessId)> GetCompanyAndApplicationDetailsForApprovalAsync(Guid applicationId); Task<(Guid CompanyId, string CompanyName, string? BusinessPartnerNumber)> GetCompanyAndApplicationDetailsForCreateWalletAsync(Guid applicationId); IAsyncEnumerable GetInvitedUsersDataByApplicationIdUntrackedAsync(Guid applicationId); IAsyncEnumerable GetEmailDataUntrackedAsync(Guid applicationId); diff --git a/src/registration/ApplicationActivation.Library/ApplicationActivationService.cs b/src/registration/ApplicationActivation.Library/ApplicationActivationService.cs index 8672b2aedf..40181b383e 100644 --- a/src/registration/ApplicationActivation.Library/ApplicationActivationService.cs +++ b/src/registration/ApplicationActivation.Library/ApplicationActivationService.cs @@ -89,8 +89,8 @@ public ApplicationActivationService( { throw new ConflictException($"CompanyApplication {context.ApplicationId} is not in status SUBMITTED"); } + var (companyId, companyName, businessPartnerNumber, iamIdp, applicationTypeId, networkRegistrationProcessId) = result; - var (companyId, companyName, businessPartnerNumber, iamIdpAliasse, applicationTypeId, networkRegistrationProcessId) = result; if (string.IsNullOrWhiteSpace(businessPartnerNumber)) { throw new ConflictException($"BusinessPartnerNumber (bpn) for CompanyApplications {context.ApplicationId} company {companyId} is empty"); @@ -99,7 +99,7 @@ public ApplicationActivationService( var userRolesRepository = _portalRepositories.GetInstance(); var assignedRoles = await AssignRolesAndBpn(context.ApplicationId, userRolesRepository, applicationRepository, businessPartnerNumber).ConfigureAwait(ConfigureAwaitOptions.None); await RemoveRegistrationRoles(context.ApplicationId, userRolesRepository).ConfigureAwait(ConfigureAwaitOptions.None); - await SetTheme(iamIdpAliasse).ConfigureAwait(ConfigureAwaitOptions.None); + await SetTheme(iamIdp).ConfigureAwait(ConfigureAwaitOptions.None); applicationRepository.AttachAndModifyCompanyApplication(context.ApplicationId, ca => { @@ -247,11 +247,14 @@ await _provisioningManager.DeleteClientRolesFromCentralUserAsync(iamUserId, role } } - private async Task SetTheme(IEnumerable iamIdpAliasse) + private async Task SetTheme(IEnumerable iamIdps) { - foreach (var alias in iamIdpAliasse) + foreach (var iamIdp in iamIdps) { - await _provisioningManager.UpdateSharedRealmTheme(alias, _settings.LoginTheme).ConfigureAwait(false); + if (iamIdp.IdentityProviderType == IdentityProviderTypeId.SHARED) + { + await _provisioningManager.UpdateSharedRealmTheme(iamIdp.IamIdpAliases, _settings.LoginTheme).ConfigureAwait(false); + } } } diff --git a/tests/registration/ApplicationActivation.Library.Tests/ApplicationActivationTests.cs b/tests/registration/ApplicationActivation.Library.Tests/ApplicationActivationTests.cs index 420c1d1c5b..19daef5632 100644 --- a/tests/registration/ApplicationActivation.Library.Tests/ApplicationActivationTests.cs +++ b/tests/registration/ApplicationActivation.Library.Tests/ApplicationActivationTests.cs @@ -695,7 +695,7 @@ public async Task HandleApplicationActivation_WithoutCompanyApplication_ThrowsCo Enumerable.Empty()); A.CallTo(() => _applicationRepository.GetCompanyAndApplicationDetailsForApprovalAsync(applicationId)) - .Returns<(Guid, string, string?, IEnumerable, CompanyApplicationTypeId, Guid?)>(default); + .Returns<(Guid, string, string?, IEnumerable, CompanyApplicationTypeId, Guid?)>(default); //Act async Task Action() => await _sut.HandleApplicationActivation(context, CancellationToken.None); @@ -945,13 +945,13 @@ private void SetupFakes( }; A.CallTo(() => _applicationRepository.GetCompanyAndApplicationDetailsForApprovalAsync(A.That.Matches(x => x == Id))) - .Returns((company.Id, company.Name, company.BusinessPartnerNumber, new[] { IdpAlias }, CompanyApplicationTypeId.INTERNAL, null)); + .Returns((company.Id, company.Name, company.BusinessPartnerNumber, new[] { new IdentityProviderForTheme(IdpAlias, IdentityProviderTypeId.SHARED) }, CompanyApplicationTypeId.INTERNAL, null)); A.CallTo(() => _applicationRepository.GetCompanyAndApplicationDetailsForApprovalAsync(A.That.Matches(x => x == IdWithTypeExternal))) - .Returns((company.Id, company.Name, company.BusinessPartnerNumber, new[] { IdpAlias }, CompanyApplicationTypeId.EXTERNAL, ProcessId)); + .Returns((company.Id, company.Name, company.BusinessPartnerNumber, new[] { new IdentityProviderForTheme(IdpAlias, IdentityProviderTypeId.SHARED) }, CompanyApplicationTypeId.EXTERNAL, ProcessId)); A.CallTo(() => _applicationRepository.GetCompanyAndApplicationDetailsForApprovalAsync(A.That.Matches(x => x == IdWithTypeExternalWithoutProcess))) - .Returns((company.Id, company.Name, company.BusinessPartnerNumber, new[] { IdpAlias }, CompanyApplicationTypeId.EXTERNAL, null)); + .Returns((company.Id, company.Name, company.BusinessPartnerNumber, new[] { new IdentityProviderForTheme(IdpAlias, IdentityProviderTypeId.SHARED) }, CompanyApplicationTypeId.EXTERNAL, null)); A.CallTo(() => _applicationRepository.GetCompanyAndApplicationDetailsForApprovalAsync(A.That.Matches(x => x == IdWithoutBpn))) - .Returns((IdWithoutBpn, null!, null, Enumerable.Empty(), CompanyApplicationTypeId.INTERNAL, null)); + .Returns((IdWithoutBpn, null!, null, Enumerable.Empty(), CompanyApplicationTypeId.INTERNAL, null)); A.CallTo(() => _applicationRepository.GetCompanyAndApplicationDetailsForCreateWalletAsync(A.That.Matches(x => x == Id))) .Returns((company.Id, company.Name, company.BusinessPartnerNumber));