diff --git a/CHANGELOG.md b/CHANGELOG.md
index 35862989d3..c3c3b50f1a 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,29 @@
New features, fixed bugs, known defects and other noteworthy changes to each release of the Catena-X Portal Backend.
+## 2.0.0-RC10
+
+### Feature
+* **Processes Worker**
+* added process to decline own companies registration
+* **Administration Service**
+* enabled the retrieval of service accounts with userstatusid != DELETED
+* include pending serviceaccounts and add userstatus to result
+
+### Changes
+* **Seeding**
+* add bpdm roles
+
+### Bugfix
+* **Registration Service**
+* adjusted permission for /declineregistration
+* add valid company policy
+* **Administration Service**
+* allowed deletion of configured url for own company
+* fixed old autosetup process for dim technical user creation
+* fixed conflict errors for inactive and pending service accounts
+* fixed error "Sequence contains more than one element" for GET /serviceAccounts/{serviceAccountID} endpoint
+
## 2.0.0-RC9
### Changes
diff --git a/src/Directory.Build.props b/src/Directory.Build.props
index aab938b2ba..d5135fbe1d 100644
--- a/src/Directory.Build.props
+++ b/src/Directory.Build.props
@@ -20,6 +20,6 @@
2.0.0
- RC9
+ RC10
diff --git a/src/Portal.Backend.sln b/src/Portal.Backend.sln
index b80c37926c..d14470b9fb 100644
--- a/src/Portal.Backend.sln
+++ b/src/Portal.Backend.sln
@@ -1,4 +1,4 @@
-Microsoft Visual Studio Solution File, Format Version 12.00
+Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.1.32407.343
MinimumVisualStudioVersion = 10.0.40219.1
@@ -274,6 +274,14 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DimUserCreationProcess.Exec
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DimUserCreationProcess.Executor.Tests", "..\tests\processes\DimUserCreationProcess.Executor.Tests\DimUserCreationProcess.Executor.Tests.csproj", "{143433B2-2792-4C5F-A3C2-E5C91D68E30D}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IdentityProviderProvisioning.Executor", "processes\IdentityProviderProvisioning.Executor\IdentityProviderProvisioning.Executor.csproj", "{9636BEC8-6929-4852-8DC8-8B41609630A3}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UserProvisioning.Executor", "processes\UserProvisioning.Executor\UserProvisioning.Executor.csproj", "{E5494227-BDFE-41F2-A12F-54292D76C29F}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IdentityProviderProvisioning.Executor.Tests", "..\tests\processes\IdentityProviderProvisioning.Executor.Tests\IdentityProviderProvisioning.Executor.Tests.csproj", "{CD76A7FF-D003-41DE-9442-F9AB223C6051}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UserProvisioning.Executor.Tests", "..\tests\processes\UserProvisioning.Executor.Tests\UserProvisioning.Executor.Tests.csproj", "{0CBCC851-99A1-4005-9BBA-E6A20A0AEDAA}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -1738,6 +1746,54 @@ Global
{143433B2-2792-4C5F-A3C2-E5C91D68E30D}.Release|x64.Build.0 = Release|Any CPU
{143433B2-2792-4C5F-A3C2-E5C91D68E30D}.Release|x86.ActiveCfg = Release|Any CPU
{143433B2-2792-4C5F-A3C2-E5C91D68E30D}.Release|x86.Build.0 = Release|Any CPU
+ {9636BEC8-6929-4852-8DC8-8B41609630A3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {9636BEC8-6929-4852-8DC8-8B41609630A3}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {9636BEC8-6929-4852-8DC8-8B41609630A3}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {9636BEC8-6929-4852-8DC8-8B41609630A3}.Debug|x64.Build.0 = Debug|Any CPU
+ {9636BEC8-6929-4852-8DC8-8B41609630A3}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {9636BEC8-6929-4852-8DC8-8B41609630A3}.Debug|x86.Build.0 = Debug|Any CPU
+ {9636BEC8-6929-4852-8DC8-8B41609630A3}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {9636BEC8-6929-4852-8DC8-8B41609630A3}.Release|Any CPU.Build.0 = Release|Any CPU
+ {9636BEC8-6929-4852-8DC8-8B41609630A3}.Release|x64.ActiveCfg = Release|Any CPU
+ {9636BEC8-6929-4852-8DC8-8B41609630A3}.Release|x64.Build.0 = Release|Any CPU
+ {9636BEC8-6929-4852-8DC8-8B41609630A3}.Release|x86.ActiveCfg = Release|Any CPU
+ {9636BEC8-6929-4852-8DC8-8B41609630A3}.Release|x86.Build.0 = Release|Any CPU
+ {E5494227-BDFE-41F2-A12F-54292D76C29F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {E5494227-BDFE-41F2-A12F-54292D76C29F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {E5494227-BDFE-41F2-A12F-54292D76C29F}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {E5494227-BDFE-41F2-A12F-54292D76C29F}.Debug|x64.Build.0 = Debug|Any CPU
+ {E5494227-BDFE-41F2-A12F-54292D76C29F}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {E5494227-BDFE-41F2-A12F-54292D76C29F}.Debug|x86.Build.0 = Debug|Any CPU
+ {E5494227-BDFE-41F2-A12F-54292D76C29F}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {E5494227-BDFE-41F2-A12F-54292D76C29F}.Release|Any CPU.Build.0 = Release|Any CPU
+ {E5494227-BDFE-41F2-A12F-54292D76C29F}.Release|x64.ActiveCfg = Release|Any CPU
+ {E5494227-BDFE-41F2-A12F-54292D76C29F}.Release|x64.Build.0 = Release|Any CPU
+ {E5494227-BDFE-41F2-A12F-54292D76C29F}.Release|x86.ActiveCfg = Release|Any CPU
+ {E5494227-BDFE-41F2-A12F-54292D76C29F}.Release|x86.Build.0 = Release|Any CPU
+ {CD76A7FF-D003-41DE-9442-F9AB223C6051}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {CD76A7FF-D003-41DE-9442-F9AB223C6051}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {CD76A7FF-D003-41DE-9442-F9AB223C6051}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {CD76A7FF-D003-41DE-9442-F9AB223C6051}.Debug|x64.Build.0 = Debug|Any CPU
+ {CD76A7FF-D003-41DE-9442-F9AB223C6051}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {CD76A7FF-D003-41DE-9442-F9AB223C6051}.Debug|x86.Build.0 = Debug|Any CPU
+ {CD76A7FF-D003-41DE-9442-F9AB223C6051}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {CD76A7FF-D003-41DE-9442-F9AB223C6051}.Release|Any CPU.Build.0 = Release|Any CPU
+ {CD76A7FF-D003-41DE-9442-F9AB223C6051}.Release|x64.ActiveCfg = Release|Any CPU
+ {CD76A7FF-D003-41DE-9442-F9AB223C6051}.Release|x64.Build.0 = Release|Any CPU
+ {CD76A7FF-D003-41DE-9442-F9AB223C6051}.Release|x86.ActiveCfg = Release|Any CPU
+ {CD76A7FF-D003-41DE-9442-F9AB223C6051}.Release|x86.Build.0 = Release|Any CPU
+ {0CBCC851-99A1-4005-9BBA-E6A20A0AEDAA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {0CBCC851-99A1-4005-9BBA-E6A20A0AEDAA}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {0CBCC851-99A1-4005-9BBA-E6A20A0AEDAA}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {0CBCC851-99A1-4005-9BBA-E6A20A0AEDAA}.Debug|x64.Build.0 = Debug|Any CPU
+ {0CBCC851-99A1-4005-9BBA-E6A20A0AEDAA}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {0CBCC851-99A1-4005-9BBA-E6A20A0AEDAA}.Debug|x86.Build.0 = Debug|Any CPU
+ {0CBCC851-99A1-4005-9BBA-E6A20A0AEDAA}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {0CBCC851-99A1-4005-9BBA-E6A20A0AEDAA}.Release|Any CPU.Build.0 = Release|Any CPU
+ {0CBCC851-99A1-4005-9BBA-E6A20A0AEDAA}.Release|x64.ActiveCfg = Release|Any CPU
+ {0CBCC851-99A1-4005-9BBA-E6A20A0AEDAA}.Release|x64.Build.0 = Release|Any CPU
+ {0CBCC851-99A1-4005-9BBA-E6A20A0AEDAA}.Release|x86.ActiveCfg = Release|Any CPU
+ {0CBCC851-99A1-4005-9BBA-E6A20A0AEDAA}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -1746,6 +1802,8 @@ Global
SolutionGuid = {2EB6265F-323A-4BF3-969E-003D64A14B64}
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
+ {0CBCC851-99A1-4005-9BBA-E6A20A0AEDAA} = {323C198D-A8C6-4EB0-8B79-72624275E35F}
+ {CD76A7FF-D003-41DE-9442-F9AB223C6051} = {323C198D-A8C6-4EB0-8B79-72624275E35F}
{A43B5ACA-1209-46E9-84DB-A48553ED623E} = {323C198D-A8C6-4EB0-8B79-72624275E35F}
{A5BEDD89-7280-466E-8D14-EC5E177AAD07} = {323C198D-A8C6-4EB0-8B79-72624275E35F}
{5E80DEEA-B254-425C-8220-27EEF47C10BD} = {323C198D-A8C6-4EB0-8B79-72624275E35F}
@@ -1868,5 +1926,7 @@ Global
{C8E23437-963C-4277-8A65-FDE330C20AAC} = {323C198D-A8C6-4EB0-8B79-72624275E35F}
{AD692510-23BA-4021-A44D-DE480A771C23} = {282CEF03-292F-4A49-83C6-997567D0FF5F}
{143433B2-2792-4C5F-A3C2-E5C91D68E30D} = {323C198D-A8C6-4EB0-8B79-72624275E35F}
+ {9636BEC8-6929-4852-8DC8-8B41609630A3} = {282CEF03-292F-4A49-83C6-997567D0FF5F}
+ {E5494227-BDFE-41F2-A12F-54292D76C29F} = {282CEF03-292F-4A49-83C6-997567D0FF5F}
EndGlobalSection
EndGlobal
diff --git a/src/administration/Administration.Service/BusinessLogic/IRegistrationBusinessLogic.cs b/src/administration/Administration.Service/BusinessLogic/IRegistrationBusinessLogic.cs
index a23ab22067..1d69686213 100644
--- a/src/administration/Administration.Service/BusinessLogic/IRegistrationBusinessLogic.cs
+++ b/src/administration/Administration.Service/BusinessLogic/IRegistrationBusinessLogic.cs
@@ -1,5 +1,4 @@
/********************************************************************************
- * 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
@@ -107,4 +106,28 @@ public interface IRegistrationBusinessLogic
/// the response data
/// cancellation token
Task ProcessIssuerMembershipResponseAsync(IssuerResponseData data, CancellationToken cancellationToken);
+
+ ///
+ /// Retrigger the DeleteIdpSharedRealm ProcessStepType
+ ///
+ /// Id of the Process
+ Task RetriggerDeleteIdpSharedRealm(Guid processId);
+
+ ///
+ /// Retrigger the DeleteIdpSharedServiceAccount ProcessStepType
+ ///
+ /// Id of the Process
+ Task RetriggerDeleteIdpSharedServiceAccount(Guid processId);
+
+ ///
+ /// Retrigger the DeleteCentralIdentityProvider ProcessStepType
+ ///
+ /// Id of the Process
+ Task RetriggerDeleteCentralIdentityProvider(Guid processId);
+
+ ///
+ /// Retrigger the DeleteCentralUser ProcessStepType
+ ///
+ /// Id of the Process
+ Task RetriggerDeleteCentralUser(Guid processId);
}
diff --git a/src/administration/Administration.Service/BusinessLogic/IServiceAccountBusinessLogic.cs b/src/administration/Administration.Service/BusinessLogic/IServiceAccountBusinessLogic.cs
index a42ec3326b..29126427cf 100644
--- a/src/administration/Administration.Service/BusinessLogic/IServiceAccountBusinessLogic.cs
+++ b/src/administration/Administration.Service/BusinessLogic/IServiceAccountBusinessLogic.cs
@@ -21,6 +21,7 @@
using Org.Eclipse.TractusX.Portal.Backend.Dim.Library.Models;
using Org.Eclipse.TractusX.Portal.Backend.Framework.Models;
using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.DBAccess.Models;
+using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Enums;
using Org.Eclipse.TractusX.Portal.Backend.Provisioning.Library.Models;
namespace Org.Eclipse.TractusX.Portal.Backend.Administration.Service.BusinessLogic;
@@ -32,7 +33,7 @@ public interface IServiceAccountBusinessLogic
Task GetOwnCompanyServiceAccountDetailsAsync(Guid serviceAccountId);
Task UpdateOwnCompanyServiceAccountDetailsAsync(Guid serviceAccountId, ServiceAccountEditableDetails serviceAccountDetails);
Task ResetOwnCompanyServiceAccountSecretAsync(Guid serviceAccountId);
- Task> GetOwnCompanyServiceAccountsDataAsync(int page, int size, string? clientId, bool? isOwner, bool filterForInactive);
+ Task> GetOwnCompanyServiceAccountsDataAsync(int page, int size, string? clientId, bool? isOwner, bool filterForInactive, IEnumerable? userStatusIds);
IAsyncEnumerable GetServiceAccountRolesAsync(string? languageShortName);
Task HandleServiceAccountCreationCallback(Guid processId, AuthenticationDetail callbackData);
}
diff --git a/src/administration/Administration.Service/BusinessLogic/IdentityProviderBusinessLogic.cs b/src/administration/Administration.Service/BusinessLogic/IdentityProviderBusinessLogic.cs
index 6462cca6b3..fccb1642f0 100644
--- a/src/administration/Administration.Service/BusinessLogic/IdentityProviderBusinessLogic.cs
+++ b/src/administration/Administration.Service/BusinessLogic/IdentityProviderBusinessLogic.cs
@@ -376,24 +376,11 @@ public async ValueTask DeleteCompanyIdentityProviderAsync(Guid identityProviderI
{
await DeleteManagedIdpLinks(identityProviderId, alias, ownerCompanyName, identityProviderRepository).ConfigureAwait(ConfigureAwaitOptions.None);
}
- else
- {
- await DeleteOwnCompanyIdpLinks(identityProviderId, identityProviderRepository).ConfigureAwait(ConfigureAwaitOptions.None);
- }
identityProviderRepository.DeleteIdentityProvider(identityProviderId);
await _portalRepositories.SaveAsync().ConfigureAwait(ConfigureAwaitOptions.None);
}
- private async Task DeleteOwnCompanyIdpLinks(Guid identityProviderId, IIdentityProviderRepository identityProviderRepository)
- {
- var companyId = _identityData.CompanyId;
- var companyUserIds = await identityProviderRepository.GetIdpLinkedCompanyUserIds(identityProviderId, companyId).ToListAsync();
-
- identityProviderRepository.DeleteCompanyIdentityProvider(companyId, identityProviderId);
- _portalRepositories.GetInstance().RemoveCompanyUserAssignedIdentityProviders(companyUserIds.Select(id => (id, identityProviderId)));
- }
-
private async Task DeleteManagedIdpLinks(Guid identityProviderId, string? alias, string ownerCompanyName, IIdentityProviderRepository identityProviderRepository)
{
var roleIds = await _mailingProcessCreation.GetRoleData(_settings.DeleteIdpRoles).ConfigureAwait(ConfigureAwaitOptions.None);
@@ -417,9 +404,6 @@ private async Task DeleteManagedIdpLinks(Guid identityProviderId, string? alias,
await DeleteKeycloakUsers(data.Identities.Select(i => i.IdentityId));
}
- identityProviderRepository.DeleteCompanyIdentityProvider(data.CompanyId, identityProviderId);
- userRepository.RemoveCompanyUserAssignedIdentityProviders(data.Identities.Where(x => x.IsLinkedCompanyUser).Select(x => (x.IdentityId, identityProviderId)));
-
foreach (var userData in data.Identities.Where(i => i is { IsInUserRoles: true, Userdata.UserMail: not null }).Select(i => i.Userdata))
{
var userName = string.Join(" ", new[] { userData.FirstName, userData.LastName }.Where(item => !string.IsNullOrWhiteSpace(item)));
diff --git a/src/administration/Administration.Service/BusinessLogic/RegistrationBusinessLogic.cs b/src/administration/Administration.Service/BusinessLogic/RegistrationBusinessLogic.cs
index abd7a95014..4b453d2f21 100644
--- a/src/administration/Administration.Service/BusinessLogic/RegistrationBusinessLogic.cs
+++ b/src/administration/Administration.Service/BusinessLogic/RegistrationBusinessLogic.cs
@@ -36,6 +36,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.Library;
using Org.Eclipse.TractusX.Portal.Backend.Processes.Mailing.Library;
using Org.Eclipse.TractusX.Portal.Backend.Provisioning.Library;
using Org.Eclipse.TractusX.Portal.Backend.Registration.Common;
@@ -491,14 +492,18 @@ public async Task DeclineRegistrationVerification(Guid applicationId, string com
await _provisioningManager.DeleteSharedIdpRealmAsync(idpAlias).ConfigureAwait(false);
}
- identityProviderRepository.DeleteCompanyIdentityProvider(companyId, idpId);
if (idpType is IdentityProviderTypeId.OWN or IdentityProviderTypeId.SHARED)
{
await _provisioningManager.DeleteCentralIdentityProviderAsync(idpAlias).ConfigureAwait(ConfigureAwaitOptions.None);
identityProviderRepository.DeleteIamIdentityProvider(idpAlias);
identityProviderRepository.DeleteIdentityProvider(idpId);
}
- userRepository.RemoveCompanyUserAssignedIdentityProviders(linkedUserIds.Select(userId => (userId, idpId)));
+ else
+ {
+ // a managed identityprovider is just unlinked from company and users
+ identityProviderRepository.DeleteCompanyIdentityProvider(companyId, idpId);
+ userRepository.RemoveCompanyUserAssignedIdentityProviders(linkedUserIds.Select(userId => (userId, idpId)));
+ }
}
_portalRepositories.GetInstance().AttachAndModifyCompanyApplication(applicationId, application =>
@@ -631,4 +636,38 @@ private async Task GetApplicationIdByBpn(IssuerResponseData data, Cancella
return result.Single();
}
+
+ public Task RetriggerDeleteIdpSharedRealm(Guid processId) => RetriggerProcessStepInternal(processId, ProcessStepTypeId.RETRIGGER_DELETE_IDP_SHARED_REALM);
+
+ ///
+ public Task RetriggerDeleteIdpSharedServiceAccount(Guid processId) => RetriggerProcessStepInternal(processId, ProcessStepTypeId.RETRIGGER_DELETE_IDP_SHARED_SERVICEACCOUNT);
+
+ ///
+ public Task RetriggerDeleteCentralIdentityProvider(Guid processId) => RetriggerProcessStepInternal(processId, ProcessStepTypeId.RETRIGGER_DELETE_CENTRAL_IDENTITY_PROVIDER);
+
+ public Task RetriggerDeleteCentralUser(Guid processId) => RetriggerProcessStepInternal(processId, ProcessStepTypeId.RETRIGGER_DELETE_CENTRAL_USER);
+
+ private async Task RetriggerProcessStepInternal(Guid processId, ProcessStepTypeId stepToTrigger)
+ {
+ var (processType, nextStep) = stepToTrigger switch
+ {
+ ProcessStepTypeId.RETRIGGER_DELETE_IDP_SHARED_REALM => (ProcessTypeId.IDENTITYPROVIDER_PROVISIONING, ProcessStepTypeId.DELETE_IDP_SHARED_REALM),
+ ProcessStepTypeId.RETRIGGER_DELETE_IDP_SHARED_SERVICEACCOUNT => (ProcessTypeId.IDENTITYPROVIDER_PROVISIONING, ProcessStepTypeId.DELETE_IDP_SHARED_SERVICEACCOUNT),
+ ProcessStepTypeId.RETRIGGER_DELETE_CENTRAL_IDENTITY_PROVIDER => (ProcessTypeId.IDENTITYPROVIDER_PROVISIONING, ProcessStepTypeId.DELETE_CENTRAL_IDENTITY_PROVIDER),
+ ProcessStepTypeId.RETRIGGER_DELETE_CENTRAL_USER => (ProcessTypeId.USER_PROVISIONING, ProcessStepTypeId.DELETE_CENTRAL_USER),
+ _ => throw new UnexpectedConditionException($"Step {stepToTrigger} is not retriggerable")
+ };
+
+ var (validProcessId, processData) = await _portalRepositories.GetInstance().IsValidProcess(processId, processType, Enumerable.Repeat(stepToTrigger, 1)).ConfigureAwait(false);
+ if (!validProcessId)
+ {
+ throw new NotFoundException($"process {processId} does not exist");
+ }
+
+ var context = processData.CreateManualProcessData(stepToTrigger, _portalRepositories, () => $"processId {processId}");
+
+ context.ScheduleProcessSteps(Enumerable.Repeat(nextStep, 1));
+ context.FinalizeProcessStep();
+ await _portalRepositories.SaveAsync().ConfigureAwait(false);
+ }
}
diff --git a/src/administration/Administration.Service/BusinessLogic/ServiceAccountBusinessLogic.cs b/src/administration/Administration.Service/BusinessLogic/ServiceAccountBusinessLogic.cs
index 74a7884796..3c66d98834 100644
--- a/src/administration/Administration.Service/BusinessLogic/ServiceAccountBusinessLogic.cs
+++ b/src/administration/Administration.Service/BusinessLogic/ServiceAccountBusinessLogic.cs
@@ -79,7 +79,7 @@ public async Task> CreateOwnCompanyServiceAcc
.IfAny(unassignable => throw ControllerArgumentException.Create(AdministrationServiceAccountErrors.SERVICE_ROLES_NOT_ASSIGN_ARGUMENT, parameters: [new("unassignable", string.Join(",", unassignable)), new("userRoleIds", string.Join(",", result.TechnicalUserRoleIds))]));
const CompanyServiceAccountTypeId CompanyServiceAccountTypeId = CompanyServiceAccountTypeId.OWN;
- var (_, serviceAccounts) = await serviceAccountCreation.CreateServiceAccountAsync(serviceAccountCreationInfos, companyId, [result.Bpn], CompanyServiceAccountTypeId, false, true, new ServiceAccountCreationProcessData(ProcessTypeId.DIM_TECHNICAL_USER, null)).ConfigureAwait(ConfigureAwaitOptions.None);
+ var (_, _, serviceAccounts) = await serviceAccountCreation.CreateServiceAccountAsync(serviceAccountCreationInfos, companyId, [result.Bpn], CompanyServiceAccountTypeId, false, true, new ServiceAccountCreationProcessData(ProcessTypeId.DIM_TECHNICAL_USER, null)).ConfigureAwait(ConfigureAwaitOptions.None);
await portalRepositories.SaveAsync().ConfigureAwait(ConfigureAwaitOptions.None);
return serviceAccounts.Select(sa => new ServiceAccountDetails(
@@ -147,19 +147,24 @@ public async Task GetOwnCompanyServiceAccountD
{
var companyId = _identityData.CompanyId;
var result = await portalRepositories.GetInstance().GetOwnCompanyServiceAccountDetailedDataUntrackedAsync(serviceAccountId, companyId);
+
if (result == null)
{
- throw ConflictException.Create(AdministrationServiceAccountErrors.SERVICE_ACCOUNT_NOT_CONFLICT, [new("serviceAccountId", serviceAccountId.ToString()), new(CompanyId, companyId.ToString())]);
+ throw NotFoundException.Create(AdministrationServiceAccountErrors.SERVICE_ACCOUNT_NOT_CONFLICT, [new("serviceAccountId", serviceAccountId.ToString()), new(CompanyId, companyId.ToString())]);
}
- if (result.ClientClientId == null)
+ IamClientAuthMethod? iamClientAuthMethod;
+ string? secret;
+
+ if (result.DimServiceAccountData != null)
{
- throw ConflictException.Create(AdministrationServiceAccountErrors.SERVICE_UNDEFINED_CLIENTID_CONFLICT, [new("serviceAccountId", serviceAccountId.ToString())]);
+ iamClientAuthMethod = IamClientAuthMethod.SECRET;
+ secret = Decrypt(
+ result.DimServiceAccountData.ClientSecret,
+ result.DimServiceAccountData.InitializationVector,
+ result.DimServiceAccountData.EncryptionMode);
}
-
- IamClientAuthMethod iamClientAuthMethod;
- string? secret;
- if (result.DimServiceAccountData == null)
+ else if (result.ClientClientId != null)
{
var internalClientId = await provisioningManager.GetIdOfCentralClientAsync(result.ClientClientId).ConfigureAwait(ConfigureAwaitOptions.None);
var authData = await provisioningManager.GetCentralClientAuthDataAsync(internalClientId).ConfigureAwait(ConfigureAwaitOptions.None);
@@ -168,11 +173,8 @@ public async Task GetOwnCompanyServiceAccountD
}
else
{
- iamClientAuthMethod = IamClientAuthMethod.SECRET;
- secret = Decrypt(
- result.DimServiceAccountData.ClientSecret,
- result.DimServiceAccountData.InitializationVector,
- result.DimServiceAccountData.EncryptionMode);
+ iamClientAuthMethod = null;
+ secret = null;
}
return new ServiceAccountConnectorOfferData(
@@ -183,6 +185,7 @@ public async Task GetOwnCompanyServiceAccountD
iamClientAuthMethod,
result.UserRoleDatas,
result.CompanyServiceAccountTypeId,
+ result.Status,
secret,
result.ConnectorData,
result.OfferSubscriptionData,
@@ -311,12 +314,24 @@ public async Task UpdateOwnCompanyServiceAccountDetailsAs
result.OfferSubscriptionId);
}
- public Task> GetOwnCompanyServiceAccountsDataAsync(int page, int size, string? clientId, bool? isOwner, bool filterForInactive) =>
- Pagination.CreateResponseAsync(
+ public Task> GetOwnCompanyServiceAccountsDataAsync(int page, int size, string? clientId, bool? isOwner, bool filterForInactive, IEnumerable? userStatusIds)
+ {
+ IEnumerable filterUserStatusIds;
+ if (userStatusIds?.Any() ?? false)
+ {
+ filterUserStatusIds = userStatusIds;
+ }
+ else
+ {
+ filterUserStatusIds = filterForInactive ? [UserStatusId.INACTIVE] : [UserStatusId.ACTIVE, UserStatusId.PENDING];
+ }
+
+ return Pagination.CreateResponseAsync(
page,
size,
15,
- portalRepositories.GetInstance().GetOwnCompanyServiceAccountsUntracked(_identityData.CompanyId, clientId, isOwner, filterForInactive ? UserStatusId.INACTIVE : UserStatusId.ACTIVE));
+ portalRepositories.GetInstance().GetOwnCompanyServiceAccountsUntracked(_identityData.CompanyId, clientId, isOwner, filterUserStatusIds));
+ }
public IAsyncEnumerable GetServiceAccountRolesAsync(string? languageShortName) =>
portalRepositories.GetInstance().GetServiceAccountRolesAsync(_identityData.CompanyId, _settings.ClientId, languageShortName ?? Constants.DefaultLanguage);
diff --git a/src/administration/Administration.Service/BusinessLogic/SubscriptionConfigurationBusinessLogic.cs b/src/administration/Administration.Service/BusinessLogic/SubscriptionConfigurationBusinessLogic.cs
index b80013a5cd..7c044fa24f 100644
--- a/src/administration/Administration.Service/BusinessLogic/SubscriptionConfigurationBusinessLogic.cs
+++ b/src/administration/Administration.Service/BusinessLogic/SubscriptionConfigurationBusinessLogic.cs
@@ -64,10 +64,10 @@ public async Task GetProviderCompanyDetailsAsync()
///
public Task SetProviderCompanyDetailsAsync(ProviderDetailData data)
{
- data.Url.EnsureValidHttpsUrl(() => nameof(data.Url));
+ data.Url?.EnsureValidHttpsUrl(() => nameof(data.Url));
data.CallbackUrl?.EnsureValidHttpsUrl(() => nameof(data.CallbackUrl));
- if (data.Url.Length > 100)
+ if (data.Url is { Length: > 100 })
{
throw new ControllerArgumentException(
"the maximum allowed length is 100 characters", nameof(data.Url));
@@ -82,29 +82,11 @@ private async Task SetOfferProviderCompanyDetailsInternalAsync(ProviderDetailDat
var providerDetailData = await companyRepository
.GetProviderCompanyDetailsExistsForUser(companyId)
.ConfigureAwait(ConfigureAwaitOptions.None);
- if (providerDetailData == default)
+ if (providerDetailData == default && data.Url != null)
{
- var result = await companyRepository
- .IsValidCompanyRoleOwner(companyId, new[] { CompanyRoleId.APP_PROVIDER, CompanyRoleId.SERVICE_PROVIDER })
- .ConfigureAwait(ConfigureAwaitOptions.None);
- if (!result.IsValidCompanyId)
- {
- throw new ConflictException($"Company {companyId} not found");
- }
- if (!result.IsCompanyRoleOwner)
- {
- throw new ForbiddenException($"Company {companyId} is not an app- or service-provider");
- }
- companyRepository.CreateProviderCompanyDetail(companyId, data.Url, providerDetails =>
- {
- if (data.CallbackUrl != null)
- {
- providerDetails.AutoSetupCallbackUrl = data.CallbackUrl;
- }
- providerDetails.DateLastChanged = DateTimeOffset.UtcNow;
- });
+ await HandleCreateProviderCompanyDetails(data, companyId, companyRepository);
}
- else
+ else if (data.Url != null)
{
companyRepository.AttachAndModifyProviderCompanyDetails(
providerDetailData.ProviderCompanyDetailId,
@@ -115,9 +97,40 @@ private async Task SetOfferProviderCompanyDetailsInternalAsync(ProviderDetailDat
details.DateLastChanged = DateTimeOffset.UtcNow;
});
}
+ else
+ {
+ companyRepository.RemoveProviderCompanyDetails(providerDetailData.ProviderCompanyDetailId);
+ }
+
await _portalRepositories.SaveAsync().ConfigureAwait(ConfigureAwaitOptions.None);
}
+ private static async Task HandleCreateProviderCompanyDetails(ProviderDetailData data, Guid companyId, ICompanyRepository companyRepository)
+ {
+ var result = await companyRepository
+ .IsValidCompanyRoleOwner(companyId, new[] { CompanyRoleId.APP_PROVIDER, CompanyRoleId.SERVICE_PROVIDER })
+ .ConfigureAwait(ConfigureAwaitOptions.None);
+ if (!result.IsValidCompanyId)
+ {
+ throw new ConflictException($"Company {companyId} not found");
+ }
+
+ if (!result.IsCompanyRoleOwner)
+ {
+ throw new ForbiddenException($"Company {companyId} is not an app- or service-provider");
+ }
+
+ companyRepository.CreateProviderCompanyDetail(companyId, data.Url!, providerDetails =>
+ {
+ if (data.CallbackUrl != null)
+ {
+ providerDetails.AutoSetupCallbackUrl = data.CallbackUrl;
+ }
+
+ providerDetails.DateLastChanged = DateTimeOffset.UtcNow;
+ });
+ }
+
///
public Task RetriggerProvider(Guid offerSubscriptionId) =>
TriggerProcessStep(offerSubscriptionId, ProcessStepTypeId.RETRIGGER_PROVIDER, true);
diff --git a/src/administration/Administration.Service/Controllers/RegistrationController.cs b/src/administration/Administration.Service/Controllers/RegistrationController.cs
index 43cafed1b9..abe8ff82bc 100644
--- a/src/administration/Administration.Service/Controllers/RegistrationController.cs
+++ b/src/administration/Administration.Service/Controllers/RegistrationController.cs
@@ -1,5 +1,4 @@
/********************************************************************************
- * 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
@@ -477,4 +476,88 @@ public async Task ProcessIssuerMembershipResponse([FromBody] Is
await _logic.ProcessIssuerMembershipResponseAsync(responseData, cancellationToken).ConfigureAwait(false);
return NoContent();
}
+
+ ///
+ /// Retriggers the last failed step
+ ///
+ /// Id of the process that should be triggered
+ /// NoContent
+ /// Example: POST: api/administration/registration/{processId}/retrigger-delete-idpSharedRealm
+ /// Empty response on success.
+ /// No Process found for the processId
+ [HttpPost]
+ [Authorize(Roles = "decline_new_partner")]
+ [Authorize(Policy = PolicyTypes.CompanyUser)]
+ [Route("{processId}/retrigger-delete-idpSharedRealm")]
+ [ProducesResponseType(StatusCodes.Status204NoContent)]
+ [ProducesResponseType(typeof(ErrorResponse), StatusCodes.Status400BadRequest)]
+ [ProducesResponseType(typeof(ErrorResponse), StatusCodes.Status404NotFound)]
+ public async Task RetriggerDeleteIdpSharedRealm([FromRoute] Guid processId)
+ {
+ await _logic.RetriggerDeleteIdpSharedRealm(processId).ConfigureAwait(false);
+ return NoContent();
+ }
+
+ ///
+ /// Retriggers the last failed step
+ ///
+ /// Id of the process that should be triggered
+ /// NoContent
+ /// Example: POST: api/administration/registration/{processId}/retrigger-delete-idpSharedServiceAccount
+ /// Empty response on success.
+ /// No Process found for the processId
+ [HttpPost]
+ [Authorize(Roles = "decline_new_partner")]
+ [Authorize(Policy = PolicyTypes.CompanyUser)]
+ [Route("{processId}/retrigger-delete-idpSharedServiceAccount")]
+ [ProducesResponseType(StatusCodes.Status204NoContent)]
+ [ProducesResponseType(typeof(ErrorResponse), StatusCodes.Status400BadRequest)]
+ [ProducesResponseType(typeof(ErrorResponse), StatusCodes.Status404NotFound)]
+ public async Task RetriggerDeleteIdpSharedServiceAccount([FromRoute] Guid processId)
+ {
+ await _logic.RetriggerDeleteIdpSharedServiceAccount(processId).ConfigureAwait(false);
+ return NoContent();
+ }
+
+ ///
+ /// Retriggers the last failed step
+ ///
+ /// Id of the process that should be triggered
+ /// NoContent
+ /// Example: POST: api/administration/registration/{processId}/retrigger-delete-centralIdentityProvider
+ /// Empty response on success.
+ /// No Process found for the processId
+ [HttpPost]
+ [Authorize(Roles = "decline_new_partner")]
+ [Authorize(Policy = PolicyTypes.CompanyUser)]
+ [Route("{processId}/retrigger-delete-centralIdentityProvider")]
+ [ProducesResponseType(StatusCodes.Status204NoContent)]
+ [ProducesResponseType(typeof(ErrorResponse), StatusCodes.Status400BadRequest)]
+ [ProducesResponseType(typeof(ErrorResponse), StatusCodes.Status404NotFound)]
+ public async Task RetriggerDeleteCentralIdentityProvider([FromRoute] Guid processId)
+ {
+ await _logic.RetriggerDeleteCentralIdentityProvider(processId).ConfigureAwait(false);
+ return NoContent();
+ }
+
+ ///
+ /// Retriggers the last failed step
+ ///
+ /// Id of the process that should be triggered
+ /// NoContent
+ /// Example: POST: api/administration/registration/{processId}/retrigger-delete-centraluser
+ /// Empty response on success.
+ /// No Process found for the processId
+ [HttpPost]
+ [Authorize(Roles = "decline_new_partner")]
+ [Authorize(Policy = PolicyTypes.CompanyUser)]
+ [Route("{processId}/retrigger-delete-centraluser")]
+ [ProducesResponseType(StatusCodes.Status204NoContent)]
+ [ProducesResponseType(typeof(ErrorResponse), StatusCodes.Status400BadRequest)]
+ [ProducesResponseType(typeof(ErrorResponse), StatusCodes.Status404NotFound)]
+ public async Task RetriggerDeleteCentralUser([FromRoute] Guid processId)
+ {
+ await _logic.RetriggerDeleteCentralUser(processId).ConfigureAwait(false);
+ return NoContent();
+ }
}
diff --git a/src/administration/Administration.Service/Controllers/ServiceAccountController.cs b/src/administration/Administration.Service/Controllers/ServiceAccountController.cs
index b6bd8d7178..069706ed26 100644
--- a/src/administration/Administration.Service/Controllers/ServiceAccountController.cs
+++ b/src/administration/Administration.Service/Controllers/ServiceAccountController.cs
@@ -26,6 +26,7 @@
using Org.Eclipse.TractusX.Portal.Backend.Framework.Models;
using Org.Eclipse.TractusX.Portal.Backend.Framework.Web;
using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.DBAccess.Models;
+using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Enums;
using Org.Eclipse.TractusX.Portal.Backend.Provisioning.Library.Models;
using Org.Eclipse.TractusX.Portal.Backend.Web.Identity;
@@ -162,6 +163,7 @@ public Task ResetServiceAccountCredentials([FromRoute] Gu
/// isOwner either true or false
/// clientId is string clientclientid
/// isUserStatusActive is True or False
+ /// userStatus is ACTIVE, INACTIVE, PENDING or DELETED (optional, multiple values allowed)
/// Returns the specific number of service account data for the given page.
/// Example: GET: api/administration/serviceaccount/owncompany/serviceaccounts
/// Returns the specific number of service account data for the given page.
@@ -170,8 +172,8 @@ public Task ResetServiceAccountCredentials([FromRoute] Gu
[Authorize(Policy = PolicyTypes.ValidCompany)]
[Route("owncompany/serviceaccounts")]
[ProducesResponseType(typeof(Pagination.Response), StatusCodes.Status200OK)]
- public Task> GetServiceAccountsData([FromQuery] int page, [FromQuery] int size, [FromQuery] bool? isOwner, [FromQuery] string? clientId, [FromQuery] bool filterForInactive) =>
- _logic.GetOwnCompanyServiceAccountsDataAsync(page, size, clientId, isOwner, filterForInactive);
+ public Task> GetServiceAccountsData([FromQuery] int page, [FromQuery] int size, [FromQuery] bool? isOwner, [FromQuery] string? clientId, [FromQuery] bool filterForInactive = false, [FromQuery] IEnumerable? userStatus = null) =>
+ _logic.GetOwnCompanyServiceAccountsDataAsync(page, size, clientId, isOwner, filterForInactive, userStatus);
///
/// Get all service account roles
diff --git a/src/administration/Administration.Service/Models/ServiceAccountConnectorOfferData.cs b/src/administration/Administration.Service/Models/ServiceAccountConnectorOfferData.cs
index 1416aea89a..ac2e4a0ca4 100644
--- a/src/administration/Administration.Service/Models/ServiceAccountConnectorOfferData.cs
+++ b/src/administration/Administration.Service/Models/ServiceAccountConnectorOfferData.cs
@@ -27,12 +27,13 @@ namespace Org.Eclipse.TractusX.Portal.Backend.Administration.Service.Models;
public record ServiceAccountConnectorOfferData(
[property: JsonPropertyName("serviceAccountId")] Guid ServiceAccountId,
- [property: JsonPropertyName("clientId")] string ClientId,
+ [property: JsonPropertyName("clientId")] string? ClientId,
[property: JsonPropertyName("name")] string Name,
[property: JsonPropertyName("description")] string Description,
- [property: JsonPropertyName("authenticationType")] IamClientAuthMethod IamClientAuthMethod,
+ [property: JsonPropertyName("authenticationType")] IamClientAuthMethod? IamClientAuthMethod,
[property: JsonPropertyName("roles")] IEnumerable UserRoleDatas,
[property: JsonPropertyName("companyServiceAccountTypeId")] CompanyServiceAccountTypeId CompanyServiceAccountTypeId,
+ [property: JsonPropertyName("status")] UserStatusId UserStatusId,
[property: JsonPropertyName("secret")] string? Secret,
[property: JsonPropertyName("connector")] ConnectorResponseData? Connector,
[property: JsonPropertyName("offer")] OfferResponseData? Offer,
diff --git a/src/marketplace/Offers.Library/Service/IOfferSetupService.cs b/src/marketplace/Offers.Library/Service/IOfferSetupService.cs
index dde1abf28f..b1c385a6cf 100644
--- a/src/marketplace/Offers.Library/Service/IOfferSetupService.cs
+++ b/src/marketplace/Offers.Library/Service/IOfferSetupService.cs
@@ -1,5 +1,4 @@
/********************************************************************************
- * 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
diff --git a/src/marketplace/Offers.Library/Service/OfferService.cs b/src/marketplace/Offers.Library/Service/OfferService.cs
index d56dfba2c1..892630e5ce 100644
--- a/src/marketplace/Offers.Library/Service/OfferService.cs
+++ b/src/marketplace/Offers.Library/Service/OfferService.cs
@@ -74,7 +74,7 @@ public OfferService(IPortalRepositories portalRepositories,
///
public async Task CreateOfferSubscriptionAgreementConsentAsync(Guid subscriptionId, Guid agreementId, ConsentStatusId consentStatusId, OfferTypeId offerTypeId)
{
- var (companyId, offerSubscription, companyUserId) = await GetOfferSubscriptionCompanyAndUserAsync(subscriptionId, offerTypeId).ConfigureAwait(ConfigureAwaitOptions.None);
+ var (companyId, offerSubscriptionId, companyUserId) = await GetOfferSubscriptionCompanyAndUserAsync(subscriptionId, offerTypeId).ConfigureAwait(ConfigureAwaitOptions.None);
if (!await _portalRepositories.GetInstance()
.CheckAgreementExistsForSubscriptionAsync(agreementId, subscriptionId, offerTypeId).ConfigureAwait(ConfigureAwaitOptions.None))
@@ -83,7 +83,7 @@ public async Task CreateOfferSubscriptionAgreementConsentAsync(Guid subscr
}
var consent = _portalRepositories.GetInstance().CreateConsent(agreementId, companyId, companyUserId, consentStatusId);
- _portalRepositories.GetInstance().CreateConsentAssignedOfferSubscription(consent.Id, offerSubscription.Id);
+ _portalRepositories.GetInstance().CreateConsentAssignedOfferSubscription(consent.Id, offerSubscriptionId);
await _portalRepositories.SaveAsync();
return consent.Id;
@@ -92,7 +92,7 @@ public async Task CreateOfferSubscriptionAgreementConsentAsync(Guid subscr
///
public async Task CreateOrUpdateOfferSubscriptionAgreementConsentAsync(Guid subscriptionId, IEnumerable offerAgreementConsentData, OfferTypeId offerTypeId)
{
- var (companyId, offerSubscription, companyUserId) = await GetOfferSubscriptionCompanyAndUserAsync(subscriptionId, offerTypeId).ConfigureAwait(ConfigureAwaitOptions.None);
+ var (companyId, offerSubscriptionId, companyUserId) = await GetOfferSubscriptionCompanyAndUserAsync(subscriptionId, offerTypeId).ConfigureAwait(ConfigureAwaitOptions.None);
if (!await _portalRepositories
.GetInstance()
@@ -118,11 +118,11 @@ public async Task CreateOrUpdateOfferSubscriptionAgreementConsentAsync(Guid subs
foreach (var consentData in offerAgreementConsentData.ExceptBy(offerSubscriptionConsents.Select(x => x.AgreementId), consentData => consentData.AgreementId))
{
var consent = _portalRepositories.GetInstance().CreateConsent(consentData.AgreementId, companyId, companyUserId, consentData.ConsentStatusId);
- consentAssignedOfferSubscriptionRepository.CreateConsentAssignedOfferSubscription(consent.Id, offerSubscription.Id);
+ consentAssignedOfferSubscriptionRepository.CreateConsentAssignedOfferSubscription(consent.Id, offerSubscriptionId);
}
}
- private async Task<(Guid CompanyId, OfferSubscription OfferSubscription, Guid CompanyUserId)> GetOfferSubscriptionCompanyAndUserAsync(Guid subscriptionId, OfferTypeId offerTypeId)
+ private async Task<(Guid CompanyId, Guid OfferSubscriptionId, Guid CompanyUserId)> GetOfferSubscriptionCompanyAndUserAsync(Guid subscriptionId, OfferTypeId offerTypeId)
{
var result = await _portalRepositories.GetInstance()
.GetCompanyIdWithAssignedOfferForCompanyUserAndSubscriptionAsync(subscriptionId, _identityData.IdentityId, offerTypeId)
@@ -131,12 +131,11 @@ public async Task CreateOrUpdateOfferSubscriptionAgreementConsentAsync(Guid subs
{
throw new ControllerArgumentException("Company or CompanyUser not assigned correctly.", nameof(_identityData.IdentityId));
}
- var (companyId, offerSubscription) = result;
- if (offerSubscription is null)
+ if (!result.IsValidOfferSubscription)
{
throw new NotFoundException($"Invalid OfferSubscription {subscriptionId} for OfferType {offerTypeId}");
}
- return (companyId, offerSubscription, _identityData.IdentityId);
+ return (result.CompanyId, subscriptionId, _identityData.IdentityId);
}
///
diff --git a/src/marketplace/Offers.Library/Service/OfferSetupService.cs b/src/marketplace/Offers.Library/Service/OfferSetupService.cs
index ac08c2b2c3..b87ae2b0b8 100644
--- a/src/marketplace/Offers.Library/Service/OfferSetupService.cs
+++ b/src/marketplace/Offers.Library/Service/OfferSetupService.cs
@@ -102,25 +102,32 @@ public async Task AutoSetupOfferAsync(OfferAutoSetup
var offerSubscriptionsRepository = _portalRepositories.GetInstance();
var offerDetails = await GetAndValidateOfferDetails(data.RequestId, _identityData.CompanyId, offerTypeId, offerSubscriptionsRepository).ConfigureAwait(ConfigureAwaitOptions.None);
+ return await (offerDetails.InstanceData.IsSingleInstance
+ ? AutoSetupOfferSingleInstance(data, offerDetails, itAdminRoles, offerTypeId, serviceManagerRoles, offerSubscriptionsRepository)
+ : AutoSetupOfferMultiInstance(data, offerDetails, itAdminRoles, offerTypeId, basePortalAddress, serviceManagerRoles, offerSubscriptionsRepository)).ConfigureAwait(ConfigureAwaitOptions.None);
+ }
+
+ private async Task AutoSetupOfferSingleInstance(OfferAutoSetupData data, OfferSubscriptionTransferData offerDetails, IEnumerable itAdminRoles, OfferTypeId offerTypeId, IEnumerable serviceManagerRoles, IOfferSubscriptionsRepository offerSubscriptionsRepository)
+ {
offerSubscriptionsRepository.AttachAndModifyOfferSubscription(data.RequestId, subscription =>
{
subscription.OfferSubscriptionStatusId = OfferSubscriptionStatusId.ACTIVE;
});
- if (offerDetails.InstanceData.IsSingleInstance)
- {
- _portalRepositories.GetInstance()
- .CreateAppSubscriptionDetail(data.RequestId, appSubscriptionDetail =>
- {
- appSubscriptionDetail.AppInstanceId = offerDetails.AppInstanceIds.Single();
- appSubscriptionDetail.AppSubscriptionUrl = offerDetails.InstanceData.InstanceUrl;
- });
- await CreateNotifications(itAdminRoles, offerTypeId, offerDetails, _identityData.IdentityId).ConfigureAwait(ConfigureAwaitOptions.None);
- await SetNotificationsToDone(serviceManagerRoles, offerTypeId, offerDetails.OfferId, offerDetails.SalesManagerId).ConfigureAwait(ConfigureAwaitOptions.None);
- await _portalRepositories.SaveAsync().ConfigureAwait(ConfigureAwaitOptions.None);
- return new OfferAutoSetupResponseData(Enumerable.Empty(), null);
- }
+ _portalRepositories.GetInstance()
+ .CreateAppSubscriptionDetail(data.RequestId, appSubscriptionDetail =>
+ {
+ appSubscriptionDetail.AppInstanceId = offerDetails.AppInstanceIds.Single();
+ appSubscriptionDetail.AppSubscriptionUrl = offerDetails.InstanceData.InstanceUrl;
+ });
+ await CreateNotifications(itAdminRoles, offerTypeId, offerDetails, _identityData.IdentityId).ConfigureAwait(ConfigureAwaitOptions.None);
+ await SetNotificationsToDone(serviceManagerRoles, offerTypeId, offerDetails.OfferId, offerDetails.SalesManagerId).ConfigureAwait(ConfigureAwaitOptions.None);
+ await _portalRepositories.SaveAsync().ConfigureAwait(ConfigureAwaitOptions.None);
+ return new OfferAutoSetupResponseData(Enumerable.Empty(), null);
+ }
+ private async Task AutoSetupOfferMultiInstance(OfferAutoSetupData data, OfferSubscriptionTransferData offerDetails, IEnumerable itAdminRoles, OfferTypeId offerTypeId, string basePortalAddress, IEnumerable serviceManagerRoles, IOfferSubscriptionsRepository offerSubscriptionsRepository)
+ {
var userRolesRepository = _portalRepositories.GetInstance();
ClientInfoData? clientInfoData = null;
if (offerTypeId == OfferTypeId.APP)
@@ -132,7 +139,13 @@ public async Task AutoSetupOfferAsync(OfferAutoSetup
var technicalUserClientId = clientInfoData?.ClientId ?? $"{offerDetails.OfferName}-{offerDetails.CompanyName}";
var createTechnicalUserData = new CreateTechnicalUserData(offerDetails.CompanyId, offerDetails.OfferName, offerDetails.Bpn, technicalUserClientId, offerTypeId == OfferTypeId.APP, true);
- var (_, technicalUsers) = await CreateTechnicalUserForSubscription(data.RequestId, createTechnicalUserData, null).ConfigureAwait(ConfigureAwaitOptions.None);
+ var (_, processId, technicalUsers) = await CreateTechnicalUserForSubscription(data.RequestId, createTechnicalUserData, null).ConfigureAwait(ConfigureAwaitOptions.None);
+
+ offerSubscriptionsRepository.AttachAndModifyOfferSubscription(data.RequestId, subscription =>
+ {
+ subscription.OfferSubscriptionStatusId = OfferSubscriptionStatusId.ACTIVE;
+ subscription.ProcessId = processId;
+ });
await CreateNotifications(itAdminRoles, offerTypeId, offerDetails, _identityData.IdentityId).ConfigureAwait(ConfigureAwaitOptions.None);
await SetNotificationsToDone(serviceManagerRoles, offerTypeId, offerDetails.OfferId, offerDetails.SalesManagerId).ConfigureAwait(ConfigureAwaitOptions.None);
@@ -148,7 +161,7 @@ public async Task AutoSetupOfferAsync(OfferAutoSetup
clientInfoData);
}
- private async Task<(bool HasExternalServiceAccount, IEnumerable ServiceAccounts)> CreateTechnicalUserForSubscription(Guid subscriptionId, CreateTechnicalUserData data, Guid? processId)
+ private async Task<(bool HasExternalServiceAccount, Guid? ProcessId, IEnumerable ServiceAccounts)> CreateTechnicalUserForSubscription(Guid subscriptionId, CreateTechnicalUserData data, Guid? processId)
{
var technicalUserInfoCreations = await _technicalUserProfileService.GetTechnicalUserProfilesForOfferSubscription(subscriptionId).ConfigureAwait(ConfigureAwaitOptions.None);
@@ -164,7 +177,7 @@ public async Task AutoSetupOfferAsync(OfferAutoSetup
if (serviceAccountCreationInfo == null)
{
- return (false, []);
+ return (false, null, []);
}
return await _serviceAccountCreation
@@ -262,7 +275,7 @@ private async IAsyncEnumerable> CreateTechnic
var creationData = await _technicalUserProfileService.GetTechnicalUserProfilesForOffer(offerId, offerTypeId).ConfigureAwait(ConfigureAwaitOptions.None);
foreach (var creationInfo in creationData)
{
- var (_, result) = await _serviceAccountCreation
+ var (_, _, result) = await _serviceAccountCreation
.CreateServiceAccountAsync(
creationInfo,
data.CompanyId,
@@ -530,7 +543,7 @@ public async Task CreateSingleInstanceSubscriptionDetail(Guid offerSubscriptionI
var technicalUserClientId = data.ClientId ?? $"{data.OfferName}-{data.CompanyName}";
var createTechnicalUserData = new CreateTechnicalUserData(data.CompanyId, data.OfferName, data.Bpn, technicalUserClientId, true, false);
- var (hasExternalServiceAccount, serviceAccounts) = await CreateTechnicalUserForSubscription(offerSubscriptionId, createTechnicalUserData, processId).ConfigureAwait(ConfigureAwaitOptions.None);
+ var (hasExternalServiceAccount, _, serviceAccounts) = await CreateTechnicalUserForSubscription(offerSubscriptionId, createTechnicalUserData, processId).ConfigureAwait(ConfigureAwaitOptions.None);
var technicalClientIds = serviceAccounts.Select(x => x.ClientId);
var content = JsonSerializer.Serialize(new
diff --git a/src/portalbackend/PortalBackend.DBAccess/Models/CompanyApplicationWithStatus.cs b/src/portalbackend/PortalBackend.DBAccess/Models/CompanyApplicationWithStatus.cs
index 04751ab5dd..c6a5ec1197 100644
--- a/src/portalbackend/PortalBackend.DBAccess/Models/CompanyApplicationWithStatus.cs
+++ b/src/portalbackend/PortalBackend.DBAccess/Models/CompanyApplicationWithStatus.cs
@@ -1,5 +1,4 @@
/********************************************************************************
- * 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
@@ -22,15 +21,17 @@
namespace Org.Eclipse.TractusX.Portal.Backend.PortalBackend.DBAccess.Models
{
- public record CompanyApplicationWithStatus
- (
+ public record CompanyApplicationWithStatus(
Guid ApplicationId,
CompanyApplicationStatusId ApplicationStatus,
CompanyApplicationTypeId ApplicationType,
IEnumerable ApplicationChecklist
);
- public record ApplicationChecklistData(ApplicationChecklistEntryTypeId TypeId, ApplicationChecklistEntryStatusId StatusId);
+ public record ApplicationChecklistData(
+ ApplicationChecklistEntryTypeId TypeId,
+ ApplicationChecklistEntryStatusId StatusId
+ );
public record CompanyApplicationDeclineData(
Guid ApplicationId,
@@ -39,4 +40,38 @@ public record CompanyApplicationDeclineData(
string CompanyName,
IEnumerable Users
);
+
+ public record ApplicationDeclineData(
+ IEnumerable IdentityProviderStatusDatas,
+ string CompanyName,
+ CompanyApplicationStatusId CompanyApplicationStatusId,
+ IEnumerable InvitationsStatusDatas,
+ IEnumerable CompanyUserStatusDatas,
+ IEnumerable DocumentStatusDatas
+ );
+
+ public record IdentityProviderStatusData(
+ Guid IdentityProviderId,
+ IdentityProviderTypeId IdentityProviderTypeId
+ );
+
+ public record InvitationsStatusData(
+ Guid InvitationId,
+ InvitationStatusId InvitationStatusId
+ );
+
+ public record CompanyUserStatusData(
+ Guid CompanyUserId,
+ string? FirstName,
+ string? LastName,
+ string? Email,
+ UserStatusId UserStatusId,
+ IEnumerable IdentityAssignedRoleIds
+ );
+
+ public record IdpData(
+ Guid IdentityProviderId,
+ string IamAlias,
+ IdentityProviderTypeId IdentityProviderTypeId
+ );
}
diff --git a/src/portalbackend/PortalBackend.DBAccess/Models/CompanyServiceAccountData.cs b/src/portalbackend/PortalBackend.DBAccess/Models/CompanyServiceAccountData.cs
index 94672c4ed5..b02924c9db 100644
--- a/src/portalbackend/PortalBackend.DBAccess/Models/CompanyServiceAccountData.cs
+++ b/src/portalbackend/PortalBackend.DBAccess/Models/CompanyServiceAccountData.cs
@@ -28,6 +28,7 @@ public record CompanyServiceAccountData(
[property: JsonPropertyName("clientId")] string? ClientId,
[property: JsonPropertyName("name")] string Name,
[property: JsonPropertyName("serviceAccountType")] CompanyServiceAccountTypeId CompanyServiceAccountTypeId,
+ [property: JsonPropertyName("status")] UserStatusId UserStatusId,
[property: JsonPropertyName("isOwner")] bool IsOwner,
[property: JsonPropertyName("isProvider")] bool IsProvider,
[property: JsonPropertyName("offerSubscriptionId")] Guid? OfferSubscriptionId,
diff --git a/src/portalbackend/PortalBackend.DBAccess/Models/ProviderDetailData.cs b/src/portalbackend/PortalBackend.DBAccess/Models/ProviderDetailData.cs
index 8770773d97..7b53cbfb9c 100644
--- a/src/portalbackend/PortalBackend.DBAccess/Models/ProviderDetailData.cs
+++ b/src/portalbackend/PortalBackend.DBAccess/Models/ProviderDetailData.cs
@@ -20,6 +20,6 @@
namespace Org.Eclipse.TractusX.Portal.Backend.PortalBackend.DBAccess.Models;
-public record ProviderDetailData(string Url, string? CallbackUrl);
+public record ProviderDetailData(string? Url, string? CallbackUrl);
public record ProviderDetailReturnData(Guid? Id, Guid CompanyId, string? Url);
diff --git a/src/portalbackend/PortalBackend.DBAccess/Repositories/ApplicationRepository.cs b/src/portalbackend/PortalBackend.DBAccess/Repositories/ApplicationRepository.cs
index d98c77f9d7..aef436272d 100644
--- a/src/portalbackend/PortalBackend.DBAccess/Repositories/ApplicationRepository.cs
+++ b/src/portalbackend/PortalBackend.DBAccess/Repositories/ApplicationRepository.cs
@@ -510,15 +510,6 @@ public Task IsValidApplicationForCompany(Guid applicationId, Guid companyI
)))
.SingleOrDefaultAsync();
- public Task<(bool Exists, Guid CompanyId, CompanyApplicationStatusId CompanyApplicationStatusId)> GetCompanyIdForSubmittedApplication(Guid applicationId) =>
- portalDbContext.CompanyApplications
- .Where(a => a.Id == applicationId)
- .Select(a => new ValueTuple(
- true,
- a.CompanyId,
- a.ApplicationStatusId))
- .SingleOrDefaultAsync();
-
public Task<(bool Exists, string? Did, string? Bpn)> GetDidAndBpnForApplicationId(Guid applicationId) =>
portalDbContext.CompanyApplications
.Where(ca => ca.Id == applicationId)
@@ -535,4 +526,52 @@ public Task IsValidApplicationForCompany(Guid applicationId, Guid companyI
true,
ca.Company!.CompanyWalletData!.Did))
.SingleOrDefaultAsync();
+
+ public Task<(bool IsValidApplicationId, bool IsValidCompany, ApplicationDeclineData? ApplicationDeclineData)> GetDeclineApplicationDataForApplicationId(Guid applicationId, Guid companyId, IEnumerable companyApplicationStatusIds) =>
+ portalDbContext.CompanyApplications
+ .AsNoTracking()
+ .AsSplitQuery()
+ .Where(application => application.Id == applicationId && companyApplicationStatusIds.Contains(application.ApplicationStatusId))
+ .Select(application => new
+ {
+ IsValidCompany = application.CompanyId == companyId,
+ Application = application,
+ application.Company,
+ application.Company!.Identities
+ })
+ .Select(x => new ValueTuple(
+ true,
+ x.IsValidCompany,
+ x.IsValidCompany
+ ? new ApplicationDeclineData(
+ x.Company!.IdentityProviders
+ .Select(x => new IdentityProviderStatusData(
+ x.Id,
+ x.IdentityProviderTypeId)),
+ x.Company.Name,
+ x.Application.ApplicationStatusId,
+ x.Application.Invitations
+ .Where(invitation => invitation.InvitationStatusId != InvitationStatusId.DECLINED)
+ .Select(invitation => new InvitationsStatusData(
+ invitation.Id,
+ invitation.InvitationStatusId)),
+ x.Identities
+ .Where(identity =>
+ identity.IdentityTypeId == IdentityTypeId.COMPANY_USER &&
+ identity.UserStatusId != UserStatusId.DELETED)
+ .Select(identity => new CompanyUserStatusData(
+ identity.Id,
+ identity.CompanyUser!.Firstname,
+ identity.CompanyUser.Lastname,
+ identity.CompanyUser.Email,
+ identity.UserStatusId,
+ identity.IdentityAssignedRoles.Select(iar => iar.UserRoleId))),
+ x.Identities.SelectMany(identity =>
+ identity.CompanyUser!.Documents
+ .Where(document => document.DocumentStatusId != DocumentStatusId.INACTIVE)
+ .Select(document => new DocumentStatusData(
+ document.Id,
+ document.DocumentStatusId))))
+ : null))
+ .SingleOrDefaultAsync();
}
diff --git a/src/portalbackend/PortalBackend.DBAccess/Repositories/CompanyRepository.cs b/src/portalbackend/PortalBackend.DBAccess/Repositories/CompanyRepository.cs
index 6e9eac8dbd..80b2e19b8c 100644
--- a/src/portalbackend/PortalBackend.DBAccess/Repositories/CompanyRepository.cs
+++ b/src/portalbackend/PortalBackend.DBAccess/Repositories/CompanyRepository.cs
@@ -408,4 +408,8 @@ public void CreateWalletData(Guid companyId, string did, JsonDocument didDocumen
c.Wallet.AuthenticationServiceUrl
)))
.SingleOrDefaultAsync();
+
+ public void RemoveProviderCompanyDetails(Guid providerCompanyDetailId) =>
+ context.ProviderCompanyDetails
+ .Remove(new ProviderCompanyDetail(providerCompanyDetailId, Guid.Empty, null!, default));
}
diff --git a/src/portalbackend/PortalBackend.DBAccess/Repositories/IApplicationRepository.cs b/src/portalbackend/PortalBackend.DBAccess/Repositories/IApplicationRepository.cs
index 9e6e942f9a..c6571d5944 100644
--- a/src/portalbackend/PortalBackend.DBAccess/Repositories/IApplicationRepository.cs
+++ b/src/portalbackend/PortalBackend.DBAccess/Repositories/IApplicationRepository.cs
@@ -103,4 +103,5 @@ public interface IApplicationRepository
Task<(bool Exists, string? Holder, string? BusinessPartnerNumber, WalletInformation? WalletInformation)> GetBpnlCredentialIformationByApplicationId(Guid applicationId);
Task<(bool Exists, string? Did, string? Bpn)> GetDidAndBpnForApplicationId(Guid applicationId);
Task<(bool Exists, string? Did)> GetDidForApplicationId(Guid applicationId);
+ Task<(bool IsValidApplicationId, bool IsValidCompany, ApplicationDeclineData? ApplicationDeclineData)> GetDeclineApplicationDataForApplicationId(Guid applicationId, Guid companyId, IEnumerable companyApplicationStatusIds);
}
diff --git a/src/portalbackend/PortalBackend.DBAccess/Repositories/ICompanyRepository.cs b/src/portalbackend/PortalBackend.DBAccess/Repositories/ICompanyRepository.cs
index d8ca26f2b5..d77170ded7 100644
--- a/src/portalbackend/PortalBackend.DBAccess/Repositories/ICompanyRepository.cs
+++ b/src/portalbackend/PortalBackend.DBAccess/Repositories/ICompanyRepository.cs
@@ -178,4 +178,5 @@ public interface ICompanyRepository
Task<(bool Exists, Guid CompanyId, IEnumerable SubmittedCompanyApplicationId)> GetCompanyIdByBpn(string bpn);
Task<(string? Bpn, string? Did, string? WalletUrl)> GetDimServiceUrls(Guid companyId);
Task<(string? Holder, string? BusinessPartnerNumber, WalletInformation? WalletInformation)> GetWalletData(Guid identityId);
+ void RemoveProviderCompanyDetails(Guid providerCompanyDetailId);
}
diff --git a/src/portalbackend/PortalBackend.DBAccess/Repositories/IIdentityProviderRepository.cs b/src/portalbackend/PortalBackend.DBAccess/Repositories/IIdentityProviderRepository.cs
index c16fe86a55..1d288aa6dc 100644
--- a/src/portalbackend/PortalBackend.DBAccess/Repositories/IIdentityProviderRepository.cs
+++ b/src/portalbackend/PortalBackend.DBAccess/Repositories/IIdentityProviderRepository.cs
@@ -35,6 +35,7 @@ public interface IIdentityProviderRepository
void AttachAndModifyIamIdentityProvider(string idpAlias, Action? initialize, Action modify);
CompanyIdentityProvider CreateCompanyIdentityProvider(Guid companyId, Guid identityProviderId);
void DeleteCompanyIdentityProvider(Guid companyId, Guid identityProviderId);
+ void DeleteCompanyIdentityProviderRange(IEnumerable<(Guid CompanyId, Guid IdentityProviderId)> companyIdentityProviderIds);
void CreateCompanyIdentityProviders(IEnumerable<(Guid CompanyId, Guid IdentityProviderId)> companyIdIdentityProviderIds);
Task GetSharedIdentityProviderIamAliasDataUntrackedAsync(Guid companyId);
Task<(string? Alias, bool IsValidUser)> GetIdpCategoryIdByUserIdAsync(Guid companyUserId, Guid userCompanyId);
@@ -59,4 +60,6 @@ public interface IIdentityProviderRepository
IAsyncEnumerable GetIdpLinkedCompanyUserIds(Guid identityProviderId, Guid companyId);
IAsyncEnumerable<(Guid CompanyId, CompanyStatusId CompanyStatusId, bool HasMoreIdentityProviders, IEnumerable<(Guid IdentityId, bool IsLinkedCompanyUser, (string? UserMail, string? FirstName, string? LastName) Userdata, bool IsInUserRoles, IEnumerable UserRoleIds)> Identities)> GetManagedIdpLinkedData(Guid identityProviderId, IEnumerable userRoleIds);
IAsyncEnumerable<(string Email, string? FirstName, string? LastName)> GetCompanyUserEmailForIdpWithoutOwnerAndRoleId(IEnumerable userRoleIds, Guid identityProviderId);
+ Task GetIdentityProviderDataForProcessIdAsync(Guid processId);
+ void CreateIdentityProviderAssignedProcessRange(IEnumerable<(Guid IdentityProviderId, Guid ProcessId)> identityProviderProcessIds);
}
diff --git a/src/portalbackend/PortalBackend.DBAccess/Repositories/IIdentityRepository.cs b/src/portalbackend/PortalBackend.DBAccess/Repositories/IIdentityRepository.cs
index 5b00b65e53..20d88e1366 100644
--- a/src/portalbackend/PortalBackend.DBAccess/Repositories/IIdentityRepository.cs
+++ b/src/portalbackend/PortalBackend.DBAccess/Repositories/IIdentityRepository.cs
@@ -26,5 +26,4 @@ public interface IIdentityRepository
Task GetActiveCompanyIdByIdentityId(Guid identityId);
Task<(IdentityTypeId IdentityTypeId, Guid CompanyId)> GetActiveIdentityDataByIdentityId(Guid identityId);
Task<(Guid IdentityId, IdentityTypeId IdentityTypeId, Guid CompanyId)> GetActiveIdentityDataByUserEntityId(string userEntityId);
- IAsyncEnumerable<(string Email, string? FirstName, string? LastName)> GetCompanyUserEmailForIdentityIdsWithoutOwnerAndRoleId(IEnumerable userRoleIds, IEnumerable identityIds);
}
diff --git a/src/portalbackend/PortalBackend.DBAccess/Repositories/IOfferSubscriptionsRepository.cs b/src/portalbackend/PortalBackend.DBAccess/Repositories/IOfferSubscriptionsRepository.cs
index 54dc4ee6bd..f13e63de6d 100644
--- a/src/portalbackend/PortalBackend.DBAccess/Repositories/IOfferSubscriptionsRepository.cs
+++ b/src/portalbackend/PortalBackend.DBAccess/Repositories/IOfferSubscriptionsRepository.cs
@@ -52,7 +52,7 @@ public interface IOfferSubscriptionsRepository
Task<(OfferSubscriptionStatusId OfferSubscriptionStatusId, bool IsSubscribingCompany, bool IsValidSubscriptionId, IEnumerable ConnectorIds, IEnumerable ServiceAccounts)> GetCompanyAssignedOfferSubscriptionDataForCompanyUserAsync(Guid subscriptionId, Guid userCompanyId);
- Task<(Guid companyId, OfferSubscription? offerSubscription)> GetCompanyIdWithAssignedOfferForCompanyUserAndSubscriptionAsync(Guid subscriptionId, Guid userId, OfferTypeId offerTypeId);
+ Task<(Guid CompanyId, bool IsValidOfferSubscription)> GetCompanyIdWithAssignedOfferForCompanyUserAndSubscriptionAsync(Guid subscriptionId, Guid userId, OfferTypeId offerTypeId);
///
/// Gets the subscription detail data for the given id and user
diff --git a/src/portalbackend/PortalBackend.DBAccess/Repositories/IProcessStepRepository.cs b/src/portalbackend/PortalBackend.DBAccess/Repositories/IProcessStepRepository.cs
index 164463f30f..3334fd7df4 100644
--- a/src/portalbackend/PortalBackend.DBAccess/Repositories/IProcessStepRepository.cs
+++ b/src/portalbackend/PortalBackend.DBAccess/Repositories/IProcessStepRepository.cs
@@ -29,6 +29,7 @@ namespace Org.Eclipse.TractusX.Portal.Backend.PortalBackend.DBAccess.Repositorie
public interface IProcessStepRepository
{
Process CreateProcess(ProcessTypeId processTypeId);
+ IEnumerable CreateProcessRange(IEnumerable processTypeIds);
ProcessStep CreateProcessStep(ProcessStepTypeId processStepTypeId, ProcessStepStatusId processStepStatusId, Guid processId);
IEnumerable CreateProcessStepRange(IEnumerable<(ProcessStepTypeId ProcessStepTypeId, ProcessStepStatusId ProcessStepStatusId, Guid ProcessId)> processStepTypeStatus);
void AttachAndModifyProcessStep(Guid processStepId, Action? initialize, Action modify);
diff --git a/src/portalbackend/PortalBackend.DBAccess/Repositories/IServiceAccountRepository.cs b/src/portalbackend/PortalBackend.DBAccess/Repositories/IServiceAccountRepository.cs
index 368502d740..1e1c7577f2 100644
--- a/src/portalbackend/PortalBackend.DBAccess/Repositories/IServiceAccountRepository.cs
+++ b/src/portalbackend/PortalBackend.DBAccess/Repositories/IServiceAccountRepository.cs
@@ -38,7 +38,7 @@ CompanyServiceAccount CreateCompanyServiceAccount(Guid identityId,
Task GetOwnCompanyServiceAccountWithIamClientIdAsync(Guid serviceAccountId, Guid userCompanyId);
Task<(IEnumerable UserRoleIds, Guid? ConnectorId, string? ClientClientId, ConnectorStatusId? statusId, OfferSubscriptionStatusId? OfferStatusId)> GetOwnCompanyServiceAccountWithIamServiceAccountRolesAsync(Guid serviceAccountId, Guid companyId);
Task GetOwnCompanyServiceAccountDetailedDataUntrackedAsync(Guid serviceAccountId, Guid companyId);
- Func?>> GetOwnCompanyServiceAccountsUntracked(Guid userCompanyId, string? clientId, bool? isOwner, UserStatusId userStatusId);
+ Func?>> GetOwnCompanyServiceAccountsUntracked(Guid userCompanyId, string? clientId, bool? isOwner, IEnumerable userStatusIds);
Task CheckActiveServiceAccountExistsForCompanyAsync(Guid technicalUserId, Guid companyId);
public Task<(Guid IdentityId, Guid CompanyId)> GetServiceAccountDataByClientId(string clientId);
void CreateDimCompanyServiceAccount(Guid serviceAccountId, string authenticationServiceUrl, byte[] secret, byte[] initializationVector, int encryptionMode);
diff --git a/src/portalbackend/PortalBackend.DBAccess/Repositories/IUserRepository.cs b/src/portalbackend/PortalBackend.DBAccess/Repositories/IUserRepository.cs
index fc8894a8d3..7e258ce840 100644
--- a/src/portalbackend/PortalBackend.DBAccess/Repositories/IUserRepository.cs
+++ b/src/portalbackend/PortalBackend.DBAccess/Repositories/IUserRepository.cs
@@ -131,4 +131,7 @@ public interface IUserRepository
void AttachAndModifyUserAssignedIdentityProvider(Guid companyUserId, Guid identityProviderId, Action? initialize, Action modify);
Task<(bool Exists, string? RecipientMail)> GetUserMailData(Guid companyUserId);
Task CheckUserExists(Guid companyUserId);
+ void CreateCompanyUserAssignedProcessRange(IEnumerable<(Guid CompanyUserId, Guid ProcessId)> companyUserProcessIds);
+ Task GetCompanyUserIdForProcessIdAsync(Guid processId);
+ void DeleteCompanyUserAssignedProcess(Guid companyUserId, Guid processId);
}
diff --git a/src/portalbackend/PortalBackend.DBAccess/Repositories/IdentityProviderRepository.cs b/src/portalbackend/PortalBackend.DBAccess/Repositories/IdentityProviderRepository.cs
index 0f8c2e64e6..43d7149a19 100644
--- a/src/portalbackend/PortalBackend.DBAccess/Repositories/IdentityProviderRepository.cs
+++ b/src/portalbackend/PortalBackend.DBAccess/Repositories/IdentityProviderRepository.cs
@@ -66,6 +66,9 @@ public CompanyIdentityProvider CreateCompanyIdentityProvider(Guid companyId, Gui
public void DeleteCompanyIdentityProvider(Guid companyId, Guid identityProviderId) =>
_context.Remove(new CompanyIdentityProvider(companyId, identityProviderId));
+ public void DeleteCompanyIdentityProviderRange(IEnumerable<(Guid CompanyId, Guid IdentityProviderId)> companyIdentityProviderIds) =>
+ _context.RemoveRange(companyIdentityProviderIds.Select(x => new CompanyIdentityProvider(x.CompanyId, x.IdentityProviderId)));
+
public void CreateCompanyIdentityProviders(IEnumerable<(Guid CompanyId, Guid IdentityProviderId)> companyIdIdentityProviderIds) =>
_context.CompanyIdentityProviders
.AddRange(companyIdIdentityProviderIds.Select(x => new CompanyIdentityProvider(
@@ -343,4 +346,18 @@ public IAsyncEnumerable GetIdpLinkedCompanyUserIds(Guid identityProviderId
x.Email != null)
.Select(x => new ValueTuple(x.Email!, x.Firstname, x.Lastname))
.ToAsyncEnumerable();
+
+ ///
+ public Task GetIdentityProviderDataForProcessIdAsync(Guid processId) =>
+ _context.IdentityProviderAssignedProcesses
+ .AsNoTracking()
+ .Where(ipap => ipap.ProcessId == processId)
+ .Select(ipap => new IdpData(
+ ipap.IdentityProviderId,
+ ipap.IdentityProvider!.IamIdentityProvider!.IamIdpAlias,
+ ipap.IdentityProvider.IdentityProviderTypeId))
+ .SingleOrDefaultAsync();
+
+ public void CreateIdentityProviderAssignedProcessRange(IEnumerable<(Guid IdentityProviderId, Guid ProcessId)> identityProviderProcessIds) =>
+ _context.AddRange(identityProviderProcessIds.Select(x => new IdentityProviderAssignedProcess(x.IdentityProviderId, x.ProcessId)));
}
diff --git a/src/portalbackend/PortalBackend.DBAccess/Repositories/IdentityRepository.cs b/src/portalbackend/PortalBackend.DBAccess/Repositories/IdentityRepository.cs
index a7314bb6c7..56365ed7cd 100644
--- a/src/portalbackend/PortalBackend.DBAccess/Repositories/IdentityRepository.cs
+++ b/src/portalbackend/PortalBackend.DBAccess/Repositories/IdentityRepository.cs
@@ -51,14 +51,4 @@ public Task GetActiveCompanyIdByIdentityId(Guid identityId) =>
x.IdentityTypeId,
x.CompanyId))
.SingleOrDefaultAsync();
-
- ///
- public IAsyncEnumerable<(string Email, string? FirstName, string? LastName)> GetCompanyUserEmailForIdentityIdsWithoutOwnerAndRoleId(IEnumerable userRoleIds, IEnumerable identityIds) =>
- _context.CompanyUsers
- .Where(x =>
- identityIds.Contains(x.Id) &&
- x.Identity!.IdentityAssignedRoles.Select(u => u.UserRoleId).Any(u => userRoleIds.Any(ur => ur == u)) &&
- x.Email != null)
- .Select(x => new ValueTuple(x.Email!, x.Firstname, x.Lastname))
- .ToAsyncEnumerable();
}
diff --git a/src/portalbackend/PortalBackend.DBAccess/Repositories/OfferSubscriptionsRepository.cs b/src/portalbackend/PortalBackend.DBAccess/Repositories/OfferSubscriptionsRepository.cs
index ac73f4818a..9eae7e9e8a 100644
--- a/src/portalbackend/PortalBackend.DBAccess/Repositories/OfferSubscriptionsRepository.cs
+++ b/src/portalbackend/PortalBackend.DBAccess/Repositories/OfferSubscriptionsRepository.cs
@@ -115,13 +115,13 @@ public OfferSubscription CreateOfferSubscription(Guid offerId, Guid companyId, O
))
.SingleOrDefaultAsync();
- public Task<(Guid companyId, OfferSubscription? offerSubscription)> GetCompanyIdWithAssignedOfferForCompanyUserAndSubscriptionAsync(Guid subscriptionId, Guid userId, OfferTypeId offerTypeId) =>
+ public Task<(Guid CompanyId, bool IsValidOfferSubscription)> GetCompanyIdWithAssignedOfferForCompanyUserAndSubscriptionAsync(Guid subscriptionId, Guid userId, OfferTypeId offerTypeId) =>
_context.CompanyUsers
.Where(user => user.Id == userId)
.Select(user => user.Identity!.Company)
- .Select(company => new ValueTuple(
+ .Select(company => new ValueTuple(
company!.Id,
- company.OfferSubscriptions.SingleOrDefault(os => os.Id == subscriptionId && os.Offer!.OfferTypeId == offerTypeId)
+ company.OfferSubscriptions.Any(os => os.Id == subscriptionId && os.Offer!.OfferTypeId == offerTypeId)
))
.SingleOrDefaultAsync();
diff --git a/src/portalbackend/PortalBackend.DBAccess/Repositories/ProcessStepRepository.cs b/src/portalbackend/PortalBackend.DBAccess/Repositories/ProcessStepRepository.cs
index 4573d830ac..44fb7aa917 100644
--- a/src/portalbackend/PortalBackend.DBAccess/Repositories/ProcessStepRepository.cs
+++ b/src/portalbackend/PortalBackend.DBAccess/Repositories/ProcessStepRepository.cs
@@ -22,6 +22,7 @@
using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities;
using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Entities;
using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Enums;
+using System.Collections.Immutable;
namespace Org.Eclipse.TractusX.Portal.Backend.PortalBackend.DBAccess.Repositories;
@@ -41,12 +42,19 @@ public ProcessStepRepository(PortalDbContext portalDbContext)
public Process CreateProcess(ProcessTypeId processTypeId) =>
_context.Add(new Process(Guid.NewGuid(), processTypeId, Guid.NewGuid())).Entity;
+ public IEnumerable CreateProcessRange(IEnumerable processTypeIds)
+ {
+ var processes = processTypeIds.Select(x => new Process(Guid.NewGuid(), x, Guid.NewGuid())).ToImmutableList();
+ _context.AddRange(processes);
+ return processes;
+ }
+
public ProcessStep CreateProcessStep(ProcessStepTypeId processStepTypeId, ProcessStepStatusId processStepStatusId, Guid processId) =>
_context.Add(new ProcessStep(Guid.NewGuid(), processStepTypeId, processStepStatusId, processId, DateTimeOffset.UtcNow)).Entity;
public IEnumerable CreateProcessStepRange(IEnumerable<(ProcessStepTypeId ProcessStepTypeId, ProcessStepStatusId ProcessStepStatusId, Guid ProcessId)> processStepTypeStatus)
{
- var processSteps = processStepTypeStatus.Select(x => new ProcessStep(Guid.NewGuid(), x.ProcessStepTypeId, x.ProcessStepStatusId, x.ProcessId, DateTimeOffset.UtcNow)).ToList();
+ var processSteps = processStepTypeStatus.Select(x => new ProcessStep(Guid.NewGuid(), x.ProcessStepTypeId, x.ProcessStepStatusId, x.ProcessId, DateTimeOffset.UtcNow)).ToImmutableList();
_context.AddRange(processSteps);
return processSteps;
}
@@ -67,7 +75,7 @@ public void AttachAndModifyProcessSteps(IEnumerable<(Guid ProcessStepId, Action<
var step = new ProcessStep(data.ProcessStepId, default, default, Guid.Empty, default);
data.Initialize?.Invoke(step);
return (Step: step, data.Modify);
- }).ToList();
+ }).ToImmutableList();
_context.AttachRange(stepModifyData.Select(data => data.Step));
stepModifyData.ForEach(data =>
{
diff --git a/src/portalbackend/PortalBackend.DBAccess/Repositories/ServiceAccountRepository.cs b/src/portalbackend/PortalBackend.DBAccess/Repositories/ServiceAccountRepository.cs
index 22c8c7c3e2..d5fd0ecffb 100644
--- a/src/portalbackend/PortalBackend.DBAccess/Repositories/ServiceAccountRepository.cs
+++ b/src/portalbackend/PortalBackend.DBAccess/Repositories/ServiceAccountRepository.cs
@@ -114,52 +114,62 @@ public void AttachAndModifyCompanyServiceAccount(
public Task GetOwnCompanyServiceAccountDetailedDataUntrackedAsync(Guid serviceAccountId, Guid companyId) =>
_dbContext.CompanyServiceAccounts
.AsNoTracking()
- .Where(serviceAccount =>
- serviceAccount.Id == serviceAccountId &&
- serviceAccount.Identity!.UserStatusId == UserStatusId.ACTIVE &&
- (serviceAccount.CompaniesLinkedServiceAccount!.Owners == companyId || serviceAccount.CompaniesLinkedServiceAccount!.Provider == companyId))
- .Select(serviceAccount => new CompanyServiceAccountDetailedData(
- serviceAccount.Id,
- serviceAccount.ClientClientId,
- serviceAccount.Name,
- serviceAccount.Description,
- serviceAccount.Identity!.UserStatusId,
- serviceAccount.Identity.IdentityAssignedRoles
- .Select(assignedRole => assignedRole.UserRole)
- .Select(userRole => new UserRoleData(
- userRole!.Id,
- userRole.Offer!.AppInstances.First().IamClient!.ClientClientId,
- userRole.UserRoleText)),
- serviceAccount.CompanyServiceAccountTypeId,
- serviceAccount.OfferSubscriptionId,
- serviceAccount.Connector == null
- ? null
- : new ConnectorResponseData(
- serviceAccount.Connector.Id,
- serviceAccount.Connector.Name),
- serviceAccount!.OfferSubscription == null
- ? null
- : new OfferResponseData(
- serviceAccount.OfferSubscription.OfferId,
- serviceAccount.OfferSubscription.Offer!.OfferTypeId,
- serviceAccount.OfferSubscription.Offer.Name,
- serviceAccount.OfferSubscription.Id),
- serviceAccount.Identity.LastEditorId == null
- ? null
- : new CompanyLastEditorData(
- serviceAccount.Identity.LastEditor!.IdentityTypeId == IdentityTypeId.COMPANY_USER
- ? serviceAccount.Identity.LastEditor.CompanyUser!.Lastname
- : serviceAccount.Identity.LastEditor.CompanyServiceAccount!.Name,
- serviceAccount.Identity.LastEditor.Company!.Name),
- serviceAccount.DimCompanyServiceAccount == null
- ? null
- : new DimServiceAccountData(
- serviceAccount.DimCompanyServiceAccount.ClientSecret,
- serviceAccount.DimCompanyServiceAccount.InitializationVector,
- serviceAccount.DimCompanyServiceAccount.EncryptionMode)))
+ .Select(serviceAccount => new
+ {
+ ServiceAccount = serviceAccount,
+ serviceAccount.Identity,
+ serviceAccount.Connector,
+ serviceAccount.OfferSubscription,
+ serviceAccount.Identity!.LastEditor,
+ serviceAccount.DimCompanyServiceAccount,
+ serviceAccount.CompaniesLinkedServiceAccount
+ })
+ .Where(x =>
+ x.ServiceAccount.Id == serviceAccountId &&
+ x.Identity!.UserStatusId != UserStatusId.DELETED &&
+ (x.CompaniesLinkedServiceAccount!.Owners == companyId || x.CompaniesLinkedServiceAccount!.Provider == companyId))
+ .Select(x => new CompanyServiceAccountDetailedData(
+ x.ServiceAccount.Id,
+ x.ServiceAccount.ClientClientId,
+ x.ServiceAccount.Name,
+ x.ServiceAccount.Description,
+ x.Identity!.UserStatusId,
+ x.Identity.IdentityAssignedRoles
+ .Select(assignedRole => assignedRole.UserRole)
+ .Select(userRole => new UserRoleData(
+ userRole!.Id,
+ userRole.Offer!.AppInstances.First().IamClient!.ClientClientId,
+ userRole.UserRoleText)),
+ x.ServiceAccount.CompanyServiceAccountTypeId,
+ x.ServiceAccount.OfferSubscriptionId,
+ x.Connector == null
+ ? null
+ : new ConnectorResponseData(
+ x.Connector.Id,
+ x.Connector.Name),
+ x.OfferSubscription == null
+ ? null
+ : new OfferResponseData(
+ x.OfferSubscription.OfferId,
+ x.OfferSubscription.Offer!.OfferTypeId,
+ x.OfferSubscription.Offer.Name,
+ x.OfferSubscription.Id),
+ x.Identity.LastEditorId == null
+ ? null
+ : new CompanyLastEditorData(
+ x.LastEditor!.IdentityTypeId == IdentityTypeId.COMPANY_USER
+ ? x.LastEditor.CompanyUser!.Lastname
+ : x.LastEditor.CompanyServiceAccount!.Name,
+ x.LastEditor.Company!.Name),
+ x.ServiceAccount.DimCompanyServiceAccount == null
+ ? null
+ : new DimServiceAccountData(
+ x.DimCompanyServiceAccount!.ClientSecret,
+ x.DimCompanyServiceAccount.InitializationVector,
+ x.DimCompanyServiceAccount.EncryptionMode)))
.SingleOrDefaultAsync();
- public Func?>> GetOwnCompanyServiceAccountsUntracked(Guid userCompanyId, string? clientId, bool? isOwner, UserStatusId userStatusId) =>
+ public Func?>> GetOwnCompanyServiceAccountsUntracked(Guid userCompanyId, string? clientId, bool? isOwner, IEnumerable userStatusIds) =>
(skip, take) => Pagination.CreateSourceQueryAsync(
skip,
take,
@@ -175,15 +185,16 @@ public void AttachAndModifyCompanyServiceAccount(
(isOwner.HasValue
? isOwner.Value && x.IsOwner || !isOwner.Value && x.IsProvider
: x.IsOwner || x.IsProvider) &&
- x.ServiceAccount.Identity!.UserStatusId == userStatusId &&
+ userStatusIds.Contains(x.ServiceAccount.Identity!.UserStatusId) &&
(clientId == null || EF.Functions.ILike(x.ServiceAccount.ClientClientId!, $"%{clientId.EscapeForILike()}%")))
- .GroupBy(x => x.ServiceAccount.Identity!.UserStatusId),
+ .GroupBy(x => x.ServiceAccount.Identity!.IdentityTypeId),
x => x.OrderBy(x => x.ServiceAccount.Name),
x => new CompanyServiceAccountData(
x.ServiceAccount.Id,
x.ServiceAccount.ClientClientId,
x.ServiceAccount.Name,
x.ServiceAccount.CompanyServiceAccountTypeId,
+ x.ServiceAccount.Identity!.UserStatusId,
x.IsOwner,
x.IsProvider,
x.ServiceAccount.OfferSubscriptionId,
diff --git a/src/portalbackend/PortalBackend.DBAccess/Repositories/UserRepository.cs b/src/portalbackend/PortalBackend.DBAccess/Repositories/UserRepository.cs
index cfdc2d6c95..52c6e3195e 100644
--- a/src/portalbackend/PortalBackend.DBAccess/Repositories/UserRepository.cs
+++ b/src/portalbackend/PortalBackend.DBAccess/Repositories/UserRepository.cs
@@ -535,4 +535,16 @@ public IAsyncEnumerable GetNextIdentitiesForNetworkRegistration(Guid netwo
.Select(x => x.Id)
.Take(2)
.ToAsyncEnumerable();
+
+ public void CreateCompanyUserAssignedProcessRange(IEnumerable<(Guid CompanyUserId, Guid ProcessId)> companyUserProcessIds) =>
+ _dbContext.AddRange(companyUserProcessIds.Select(x => new CompanyUserAssignedProcess(x.CompanyUserId, x.ProcessId)));
+
+ public Task GetCompanyUserIdForProcessIdAsync(Guid processId) =>
+ _dbContext.CompanyUserAssignedProcesses
+ .Where(cuap => cuap.ProcessId == processId)
+ .Select(cuap => cuap.CompanyUserId)
+ .SingleOrDefaultAsync();
+
+ public void DeleteCompanyUserAssignedProcess(Guid companyUserId, Guid processId) =>
+ _dbContext.Remove(new CompanyUserAssignedProcess(companyUserId, processId));
}
diff --git a/src/portalbackend/PortalBackend.Migrations/Migrations/20240517135403_2.0.0-rc10.Designer.cs b/src/portalbackend/PortalBackend.Migrations/Migrations/20240517135403_2.0.0-rc10.Designer.cs
new file mode 100644
index 0000000000..d9e0aeac8c
--- /dev/null
+++ b/src/portalbackend/PortalBackend.Migrations/Migrations/20240517135403_2.0.0-rc10.Designer.cs
@@ -0,0 +1,10129 @@
+/********************************************************************************
+ * Copyright (c) 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.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities;
+using System.Text.Json;
+
+#nullable disable
+
+namespace Org.Eclipse.TractusX.Portal.Backend.PortalBackend.Migrations.Migrations
+{
+ [DbContext(typeof(PortalDbContext))]
+ [Migration("20240517135403_2.0.0-rc10")]
+ partial class _200rc10
+ {
+ ///
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasDefaultSchema("portal")
+ .UseCollation("en_US.utf8")
+ .HasAnnotation("ProductVersion", "8.0.5")
+ .HasAnnotation("Relational:MaxIdentifierLength", 63);
+
+ NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
+
+ modelBuilder.Entity("Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.AuditEntities.AuditAppSubscriptionDetail20221118", b =>
+ {
+ b.Property("AuditV1Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid")
+ .HasColumnName("audit_v1id");
+
+ b.Property("AppInstanceId")
+ .HasColumnType("uuid")
+ .HasColumnName("app_instance_id");
+
+ b.Property("AppSubscriptionUrl")
+ .HasMaxLength(255)
+ .HasColumnType("character varying(255)")
+ .HasColumnName("app_subscription_url");
+
+ b.Property("AuditV1DateLastChanged")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("audit_v1date_last_changed");
+
+ b.Property("AuditV1LastEditorId")
+ .HasColumnType("uuid")
+ .HasColumnName("audit_v1last_editor_id");
+
+ b.Property("AuditV1OperationId")
+ .HasColumnType("integer")
+ .HasColumnName("audit_v1operation_id");
+
+ b.Property("Id")
+ .HasColumnType("uuid")
+ .HasColumnName("id");
+
+ b.Property("LastEditorId")
+ .HasColumnType("uuid")
+ .HasColumnName("last_editor_id");
+
+ b.Property("OfferSubscriptionId")
+ .HasColumnType("uuid")
+ .HasColumnName("offer_subscription_id");
+
+ b.HasKey("AuditV1Id")
+ .HasName("pk_audit_app_subscription_detail20221118");
+
+ b.ToTable("audit_app_subscription_detail20221118", "portal");
+ });
+
+ modelBuilder.Entity("Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.AuditEntities.AuditAppSubscriptionDetail20231115", b =>
+ {
+ b.Property("AuditV1Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid")
+ .HasColumnName("audit_v1id");
+
+ b.Property("AppInstanceId")
+ .HasColumnType("uuid")
+ .HasColumnName("app_instance_id");
+
+ b.Property("AppSubscriptionUrl")
+ .HasMaxLength(255)
+ .HasColumnType("character varying(255)")
+ .HasColumnName("app_subscription_url");
+
+ b.Property("AuditV1DateLastChanged")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("audit_v1date_last_changed");
+
+ b.Property("AuditV1LastEditorId")
+ .HasColumnType("uuid")
+ .HasColumnName("audit_v1last_editor_id");
+
+ b.Property("AuditV1OperationId")
+ .HasColumnType("integer")
+ .HasColumnName("audit_v1operation_id");
+
+ b.Property("Id")
+ .HasColumnType("uuid")
+ .HasColumnName("id");
+
+ b.Property("LastEditorId")
+ .HasColumnType("uuid")
+ .HasColumnName("last_editor_id");
+
+ b.Property("OfferSubscriptionId")
+ .HasColumnType("uuid")
+ .HasColumnName("offer_subscription_id");
+
+ b.HasKey("AuditV1Id")
+ .HasName("pk_audit_app_subscription_detail20231115");
+
+ b.ToTable("audit_app_subscription_detail20231115", "portal");
+ });
+
+ modelBuilder.Entity("Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.AuditEntities.AuditCertificateManagement20240416", b =>
+ {
+ b.Property("AuditV1Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid")
+ .HasColumnName("audit_v1id");
+
+ b.Property("AuditV1DateLastChanged")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("audit_v1date_last_changed");
+
+ b.Property("AuditV1LastEditorId")
+ .HasColumnType("uuid")
+ .HasColumnName("audit_v1last_editor_id");
+
+ b.Property("AuditV1OperationId")
+ .HasColumnType("integer")
+ .HasColumnName("audit_v1operation_id");
+
+ b.Property("CompanyCertificateStatusId")
+ .HasColumnType("integer")
+ .HasColumnName("company_certificate_status_id");
+
+ b.Property("CompanyCertificateTypeId")
+ .HasColumnType("integer")
+ .HasColumnName("company_certificate_type_id");
+
+ b.Property("CompanyId")
+ .HasColumnType("uuid")
+ .HasColumnName("company_id");
+
+ b.Property("DateLastChanged")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("date_last_changed");
+
+ b.Property("DocumentId")
+ .HasColumnType("uuid")
+ .HasColumnName("document_id");
+
+ b.Property("Id")
+ .HasColumnType("uuid")
+ .HasColumnName("id");
+
+ b.Property("LastEditorId")
+ .HasColumnType("uuid")
+ .HasColumnName("last_editor_id");
+
+ b.Property("ValidFrom")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("valid_from");
+
+ b.Property("ValidTill")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("valid_till");
+
+ b.HasKey("AuditV1Id")
+ .HasName("pk_audit_certificate_management20240416");
+
+ b.ToTable("audit_certificate_management20240416", "portal");
+ });
+
+ modelBuilder.Entity("Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.AuditEntities.AuditCompanyApplication20221005", b =>
+ {
+ b.Property("AuditV1Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid")
+ .HasColumnName("audit_v1id");
+
+ b.Property("ApplicationStatusId")
+ .HasColumnType("integer")
+ .HasColumnName("application_status_id");
+
+ b.Property("AuditV1DateLastChanged")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("audit_v1date_last_changed");
+
+ b.Property("AuditV1LastEditorId")
+ .HasColumnType("uuid")
+ .HasColumnName("audit_v1last_editor_id");
+
+ b.Property("AuditV1OperationId")
+ .HasColumnType("integer")
+ .HasColumnName("audit_v1operation_id");
+
+ b.Property("CompanyId")
+ .HasColumnType("uuid")
+ .HasColumnName("company_id");
+
+ b.Property("DateCreated")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("date_created");
+
+ b.Property("DateLastChanged")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("date_last_changed");
+
+ b.Property("Id")
+ .HasColumnType("uuid")
+ .HasColumnName("id");
+
+ b.Property("LastEditorId")
+ .HasColumnType("uuid")
+ .HasColumnName("last_editor_id");
+
+ b.HasKey("AuditV1Id")
+ .HasName("pk_audit_company_application20221005");
+
+ b.ToTable("audit_company_application20221005", "portal");
+ });
+
+ modelBuilder.Entity("Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.AuditEntities.AuditCompanyApplication20230214", b =>
+ {
+ b.Property("AuditV1Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid")
+ .HasColumnName("audit_v1id");
+
+ b.Property("ApplicationStatusId")
+ .HasColumnType("integer")
+ .HasColumnName("application_status_id");
+
+ b.Property("AuditV1DateLastChanged")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("audit_v1date_last_changed");
+
+ b.Property("AuditV1LastEditorId")
+ .HasColumnType("uuid")
+ .HasColumnName("audit_v1last_editor_id");
+
+ b.Property("AuditV1OperationId")
+ .HasColumnType("integer")
+ .HasColumnName("audit_v1operation_id");
+
+ b.Property("ChecklistProcessId")
+ .HasColumnType("uuid")
+ .HasColumnName("checklist_process_id");
+
+ b.Property("CompanyId")
+ .HasColumnType("uuid")
+ .HasColumnName("company_id");
+
+ b.Property("DateCreated")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("date_created");
+
+ b.Property("DateLastChanged")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("date_last_changed");
+
+ b.Property("Id")
+ .HasColumnType("uuid")
+ .HasColumnName("id");
+
+ b.Property("LastEditorId")
+ .HasColumnType("uuid")
+ .HasColumnName("last_editor_id");
+
+ b.HasKey("AuditV1Id")
+ .HasName("pk_audit_company_application20230214");
+
+ b.ToTable("audit_company_application20230214", "portal");
+ });
+
+ modelBuilder.Entity("Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.AuditEntities.AuditCompanyApplication20230824", b =>
+ {
+ b.Property("AuditV1Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid")
+ .HasColumnName("audit_v1id");
+
+ b.Property("ApplicationStatusId")
+ .HasColumnType("integer")
+ .HasColumnName("application_status_id");
+
+ b.Property("AuditV1DateLastChanged")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("audit_v1date_last_changed");
+
+ b.Property("AuditV1LastEditorId")
+ .HasColumnType("uuid")
+ .HasColumnName("audit_v1last_editor_id");
+
+ b.Property("AuditV1OperationId")
+ .HasColumnType("integer")
+ .HasColumnName("audit_v1operation_id");
+
+ b.Property("ChecklistProcessId")
+ .HasColumnType("uuid")
+ .HasColumnName("checklist_process_id");
+
+ b.Property("CompanyApplicationTypeId")
+ .HasColumnType("integer")
+ .HasColumnName("company_application_type_id");
+
+ b.Property("CompanyId")
+ .HasColumnType("uuid")
+ .HasColumnName("company_id");
+
+ b.Property("DateCreated")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("date_created");
+
+ b.Property("DateLastChanged")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("date_last_changed");
+
+ b.Property("Id")
+ .HasColumnType("uuid")
+ .HasColumnName("id");
+
+ b.Property("LastEditorId")
+ .HasColumnType("uuid")
+ .HasColumnName("last_editor_id");
+
+ b.Property("OnboardingServiceProviderId")
+ .HasColumnType("uuid")
+ .HasColumnName("onboarding_service_provider_id");
+
+ b.HasKey("AuditV1Id")
+ .HasName("pk_audit_company_application20230824");
+
+ b.ToTable("audit_company_application20230824", "portal");
+ });
+
+ modelBuilder.Entity("Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.AuditEntities.AuditCompanyApplication20231115", b =>
+ {
+ b.Property("AuditV1Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid")
+ .HasColumnName("audit_v1id");
+
+ b.Property("ApplicationStatusId")
+ .HasColumnType("integer")
+ .HasColumnName("application_status_id");
+
+ b.Property("AuditV1DateLastChanged")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("audit_v1date_last_changed");
+
+ b.Property("AuditV1LastEditorId")
+ .HasColumnType("uuid")
+ .HasColumnName("audit_v1last_editor_id");
+
+ b.Property("AuditV1OperationId")
+ .HasColumnType("integer")
+ .HasColumnName("audit_v1operation_id");
+
+ b.Property("ChecklistProcessId")
+ .HasColumnType("uuid")
+ .HasColumnName("checklist_process_id");
+
+ b.Property("CompanyApplicationTypeId")
+ .HasColumnType("integer")
+ .HasColumnName("company_application_type_id");
+
+ b.Property("CompanyId")
+ .HasColumnType("uuid")
+ .HasColumnName("company_id");
+
+ b.Property("DateCreated")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("date_created");
+
+ b.Property("DateLastChanged")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("date_last_changed");
+
+ b.Property("Id")
+ .HasColumnType("uuid")
+ .HasColumnName("id");
+
+ b.Property("LastEditorId")
+ .HasColumnType("uuid")
+ .HasColumnName("last_editor_id");
+
+ b.Property("OnboardingServiceProviderId")
+ .HasColumnType("uuid")
+ .HasColumnName("onboarding_service_provider_id");
+
+ b.HasKey("AuditV1Id")
+ .HasName("pk_audit_company_application20231115");
+
+ b.ToTable("audit_company_application20231115", "portal");
+ });
+
+ modelBuilder.Entity("Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.AuditEntities.AuditCompanyAssignedRole2023316", b =>
+ {
+ b.Property("AuditV1Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid")
+ .HasColumnName("audit_v1id");
+
+ b.Property("AuditV1DateLastChanged")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("audit_v1date_last_changed");
+
+ b.Property("AuditV1LastEditorId")
+ .HasColumnType("uuid")
+ .HasColumnName("audit_v1last_editor_id");
+
+ b.Property("AuditV1OperationId")
+ .HasColumnType("integer")
+ .HasColumnName("audit_v1operation_id");
+
+ b.Property("CompanyId")
+ .HasColumnType("uuid")
+ .HasColumnName("company_id");
+
+ b.Property("CompanyRoleId")
+ .HasColumnType("integer")
+ .HasColumnName("company_role_id");
+
+ b.Property("DateLastChanged")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("date_last_changed");
+
+ b.Property("LastEditorId")
+ .HasColumnType("uuid")
+ .HasColumnName("last_editor_id");
+
+ b.HasKey("AuditV1Id")
+ .HasName("pk_audit_company_assigned_role2023316");
+
+ b.ToTable("audit_company_assigned_role2023316", "portal");
+ });
+
+ modelBuilder.Entity("Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.AuditEntities.AuditCompanySsiDetail20230621", b =>
+ {
+ b.Property("AuditV1Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid")
+ .HasColumnName("audit_v1id");
+
+ b.Property("AuditV1DateLastChanged")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("audit_v1date_last_changed");
+
+ b.Property("AuditV1LastEditorId")
+ .HasColumnType("uuid")
+ .HasColumnName("audit_v1last_editor_id");
+
+ b.Property("AuditV1OperationId")
+ .HasColumnType("integer")
+ .HasColumnName("audit_v1operation_id");
+
+ b.Property("CompanyId")
+ .HasColumnType("uuid")
+ .HasColumnName("company_id");
+
+ b.Property("CompanySsiDetailStatusId")
+ .HasColumnType("integer")
+ .HasColumnName("company_ssi_detail_status_id");
+
+ b.Property("CreatorUserId")
+ .HasColumnType("uuid")
+ .HasColumnName("creator_user_id");
+
+ b.Property("DateCreated")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("date_created");
+
+ b.Property("DateLastChanged")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("date_last_changed");
+
+ b.Property("DocumentId")
+ .HasColumnType("uuid")
+ .HasColumnName("document_id");
+
+ b.Property("ExpiryDate")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("expiry_date");
+
+ b.Property("Id")
+ .HasColumnType("uuid")
+ .HasColumnName("id");
+
+ b.Property("LastEditorId")
+ .HasColumnType("uuid")
+ .HasColumnName("last_editor_id");
+
+ b.Property("VerifiedCredentialExternalTypeUseCaseDetailId")
+ .HasColumnType("uuid")
+ .HasColumnName("verified_credential_external_type_use_case_detail_id");
+
+ b.Property("VerifiedCredentialTypeId")
+ .HasColumnType("integer")
+ .HasColumnName("verified_credential_type_id");
+
+ b.HasKey("AuditV1Id")
+ .HasName("pk_audit_company_ssi_detail20230621");
+
+ b.ToTable("audit_company_ssi_detail20230621", "portal");
+ });
+
+ modelBuilder.Entity("Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.AuditEntities.AuditCompanySsiDetail20231115", b =>
+ {
+ b.Property("AuditV1Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid")
+ .HasColumnName("audit_v1id");
+
+ b.Property("AuditV1DateLastChanged")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("audit_v1date_last_changed");
+
+ b.Property("AuditV1LastEditorId")
+ .HasColumnType("uuid")
+ .HasColumnName("audit_v1last_editor_id");
+
+ b.Property("AuditV1OperationId")
+ .HasColumnType("integer")
+ .HasColumnName("audit_v1operation_id");
+
+ b.Property("CompanyId")
+ .HasColumnType("uuid")
+ .HasColumnName("company_id");
+
+ b.Property("CompanySsiDetailStatusId")
+ .HasColumnType("integer")
+ .HasColumnName("company_ssi_detail_status_id");
+
+ b.Property("CreatorUserId")
+ .HasColumnType("uuid")
+ .HasColumnName("creator_user_id");
+
+ b.Property("DateCreated")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("date_created");
+
+ b.Property("DateLastChanged")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("date_last_changed");
+
+ b.Property("DocumentId")
+ .HasColumnType("uuid")
+ .HasColumnName("document_id");
+
+ b.Property("ExpiryDate")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("expiry_date");
+
+ b.Property("Id")
+ .HasColumnType("uuid")
+ .HasColumnName("id");
+
+ b.Property("LastEditorId")
+ .HasColumnType("uuid")
+ .HasColumnName("last_editor_id");
+
+ b.Property("VerifiedCredentialExternalTypeUseCaseDetailId")
+ .HasColumnType("uuid")
+ .HasColumnName("verified_credential_external_type_use_case_detail_id");
+
+ b.Property("VerifiedCredentialTypeId")
+ .HasColumnType("integer")
+ .HasColumnName("verified_credential_type_id");
+
+ b.HasKey("AuditV1Id")
+ .HasName("pk_audit_company_ssi_detail20231115");
+
+ b.ToTable("audit_company_ssi_detail20231115", "portal");
+ });
+
+ modelBuilder.Entity("Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.AuditEntities.AuditCompanyUser20221005", b =>
+ {
+ b.Property("AuditV1Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid")
+ .HasColumnName("audit_v1id");
+
+ b.Property("AuditV1DateLastChanged")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("audit_v1date_last_changed");
+
+ b.Property("AuditV1LastEditorId")
+ .HasColumnType("uuid")
+ .HasColumnName("audit_v1last_editor_id");
+
+ b.Property("AuditV1OperationId")
+ .HasColumnType("integer")
+ .HasColumnName("audit_v1operation_id");
+
+ b.Property("CompanyId")
+ .HasColumnType("uuid")
+ .HasColumnName("company_id");
+
+ b.Property("CompanyUserStatusId")
+ .HasColumnType("integer")
+ .HasColumnName("company_user_status_id");
+
+ b.Property("DateCreated")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("date_created");
+
+ b.Property