From 11f1955860777a303bdda6e85e1fe66c65d218d4 Mon Sep 17 00:00:00 2001 From: Norbert Truchsess Date: Tue, 8 Oct 2024 20:09:13 +0200 Subject: [PATCH] fix review findings --- .../CompanyServiceAccountDetailedData.cs | 2 - ...mpanyServiceAccountWithRoleDataClientId.cs | 1 - .../Repositories/AppInstanceRepository.cs | 10 +- .../Repositories/ServiceAccountRepository.cs | 10 +- ...es_navigationproperties_latest.Designer.cs | 131 ++- ..._properties_navigationproperties_latest.cs | 869 ++++++++++++------ .../PortalDbContextModelSnapshot.cs | 131 ++- .../Seeder/BatchInsertSeeder.cs | 2 +- .../Seeder/Data/technical_users.json | 20 +- .../AuditEntities/AuditConnector20240814.cs | 2 +- .../AuditEntities/AuditConnector20241008.cs | 69 ++ .../Entities/AppInstance.cs | 4 +- ...cs => AppInstanceAssignedTechnicalUser.cs} | 7 +- .../Entities/Connector.cs | 2 +- ...iceAccount.cs => ExternalTechnicalUser.cs} | 0 ...panyServiceAccount.cs => TechnicalUser.cs} | 6 +- ...iceAccountKind.cs => TechnicalUserKind.cs} | 0 ...iceAccountType.cs => TechnicalUserType.cs} | 0 .../PortalDbContext.cs | 27 +- ...unt.cs => CompaniesLinkedTechnicalUser.cs} | 3 +- .../Service/OfferSetupServiceTests.cs | 6 +- .../AppInstanceRepositoryTests.cs | 2 +- ...ce_assigned_technical_users.unittest.json} | 2 +- .../Seeder/Data/connectors.unittest.json | 4 +- 24 files changed, 922 insertions(+), 388 deletions(-) create mode 100644 src/portalbackend/PortalBackend.PortalEntities/AuditEntities/AuditConnector20241008.cs rename src/portalbackend/PortalBackend.PortalEntities/Entities/{AppInstanceAssignedCompanyServiceAccount.cs => AppInstanceAssignedTechnicalUser.cs} (84%) rename src/portalbackend/PortalBackend.PortalEntities/Entities/{DimCompanyServiceAccount.cs => ExternalTechnicalUser.cs} (100%) rename src/portalbackend/PortalBackend.PortalEntities/Entities/{CompanyServiceAccount.cs => TechnicalUser.cs} (89%) rename src/portalbackend/PortalBackend.PortalEntities/Entities/{CompanyServiceAccountKind.cs => TechnicalUserKind.cs} (100%) rename src/portalbackend/PortalBackend.PortalEntities/Entities/{CompanyServiceAccountType.cs => TechnicalUserType.cs} (100%) rename src/portalbackend/PortalBackend.PortalEntities/Views/{CompaniesLinkedServiceAccount.cs => CompaniesLinkedTechnicalUser.cs} (94%) rename tests/portalbackend/PortalBackend.DBAccess.Tests/Seeder/Data/{app_instance_assigned_company_service_accounts.unittest.json => app_instance_assigned_technical_users.unittest.json} (51%) diff --git a/src/portalbackend/PortalBackend.DBAccess/Models/CompanyServiceAccountDetailedData.cs b/src/portalbackend/PortalBackend.DBAccess/Models/CompanyServiceAccountDetailedData.cs index 8ed6d0d79f..05e5b7a9d2 100644 --- a/src/portalbackend/PortalBackend.DBAccess/Models/CompanyServiceAccountDetailedData.cs +++ b/src/portalbackend/PortalBackend.DBAccess/Models/CompanyServiceAccountDetailedData.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 @@ -18,7 +17,6 @@ * SPDX-License-Identifier: Apache-2.0 ********************************************************************************/ -using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Entities; using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Enums; namespace Org.Eclipse.TractusX.Portal.Backend.PortalBackend.DBAccess.Models; diff --git a/src/portalbackend/PortalBackend.DBAccess/Models/CompanyServiceAccountWithRoleDataClientId.cs b/src/portalbackend/PortalBackend.DBAccess/Models/CompanyServiceAccountWithRoleDataClientId.cs index 9b8b732ef2..f85e37f823 100644 --- a/src/portalbackend/PortalBackend.DBAccess/Models/CompanyServiceAccountWithRoleDataClientId.cs +++ b/src/portalbackend/PortalBackend.DBAccess/Models/CompanyServiceAccountWithRoleDataClientId.cs @@ -17,7 +17,6 @@ * SPDX-License-Identifier: Apache-2.0 ********************************************************************************/ -using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Entities; using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Enums; namespace Org.Eclipse.TractusX.Portal.Backend.PortalBackend.DBAccess.Models; diff --git a/src/portalbackend/PortalBackend.DBAccess/Repositories/AppInstanceRepository.cs b/src/portalbackend/PortalBackend.DBAccess/Repositories/AppInstanceRepository.cs index d086743db0..297e4bca80 100644 --- a/src/portalbackend/PortalBackend.DBAccess/Repositories/AppInstanceRepository.cs +++ b/src/portalbackend/PortalBackend.DBAccess/Repositories/AppInstanceRepository.cs @@ -48,8 +48,8 @@ public void RemoveAppInstance(Guid appInstanceId) => /// public void CreateAppInstanceAssignedServiceAccounts( IEnumerable<(Guid AppInstanceId, Guid CompanyServiceAccountId)> instanceAccounts) => - _portalDbContext.AppInstanceAssignedServiceAccounts.AddRange(instanceAccounts - .Select(x => new AppInstanceAssignedCompanyServiceAccount( + _portalDbContext.AppInstanceAssignedTechnicalUsers.AddRange(instanceAccounts + .Select(x => new AppInstanceAssignedTechnicalUser( x.AppInstanceId, x.CompanyServiceAccountId))); @@ -59,7 +59,7 @@ public Task CheckInstanceExistsForOffer(Guid offerId) => /// public IAsyncEnumerable GetAssignedServiceAccounts(Guid appInstanceId) => - _portalDbContext.AppInstanceAssignedServiceAccounts + _portalDbContext.AppInstanceAssignedTechnicalUsers .Where(x => x.AppInstanceId == appInstanceId) .Select(x => x.TechnicalUserId) .ToAsyncEnumerable(); @@ -72,6 +72,6 @@ public Task CheckInstanceHasAssignedSubscriptions(Guid appInstanceId) => /// public void RemoveAppInstanceAssignedServiceAccounts(Guid appInstanceId, IEnumerable serviceAccountIds) => - _portalDbContext.AppInstanceAssignedServiceAccounts - .RemoveRange(serviceAccountIds.Select(x => new AppInstanceAssignedCompanyServiceAccount(appInstanceId, x))); + _portalDbContext.AppInstanceAssignedTechnicalUsers + .RemoveRange(serviceAccountIds.Select(x => new AppInstanceAssignedTechnicalUser(appInstanceId, x))); } diff --git a/src/portalbackend/PortalBackend.DBAccess/Repositories/ServiceAccountRepository.cs b/src/portalbackend/PortalBackend.DBAccess/Repositories/ServiceAccountRepository.cs index 2e06dacc56..749d0d26df 100644 --- a/src/portalbackend/PortalBackend.DBAccess/Repositories/ServiceAccountRepository.cs +++ b/src/portalbackend/PortalBackend.DBAccess/Repositories/ServiceAccountRepository.cs @@ -102,7 +102,7 @@ public void AttachAndModifyCompanyServiceAccount( sa.Identity!.IdentityAssignedRoles.Select(r => r.UserRoleId), sa.Id, sa.Identity!.UserStatusId, - sa.CompaniesLinkedServiceAccount!.Owners == companyId || sa.CompaniesLinkedServiceAccount!.Provider == companyId, + sa.CompaniesLinkedTechnicalUser!.Owners == companyId || sa.CompaniesLinkedTechnicalUser!.Provider == companyId, sa.Version, sa.Connector!.Id, sa.ClientClientId, @@ -127,12 +127,12 @@ public void AttachAndModifyCompanyServiceAccount( serviceAccount.OfferSubscription, serviceAccount.Identity!.LastEditor, serviceAccount.ExternalTechnicalUser, - serviceAccount.CompaniesLinkedServiceAccount + serviceAccount.CompaniesLinkedTechnicalUser }) .Where(x => x.ServiceAccount.Id == serviceAccountId && x.Identity!.UserStatusId != UserStatusId.DELETED && - (x.CompaniesLinkedServiceAccount!.Owners == companyId || x.CompaniesLinkedServiceAccount!.Provider == companyId)) + (x.CompaniesLinkedTechnicalUser!.Owners == companyId || x.CompaniesLinkedTechnicalUser!.Provider == companyId)) .Select(x => new CompanyServiceAccountDetailedData( x.ServiceAccount.Id, x.ServiceAccount.ClientClientId, @@ -184,8 +184,8 @@ public void AttachAndModifyCompanyServiceAccount( .Select(serviceAccount => new { ServiceAccount = serviceAccount, - IsOwner = serviceAccount.CompaniesLinkedServiceAccount!.Owners == userCompanyId, - IsProvider = serviceAccount.CompaniesLinkedServiceAccount!.Provider == userCompanyId + IsOwner = serviceAccount.CompaniesLinkedTechnicalUser!.Owners == userCompanyId, + IsProvider = serviceAccount.CompaniesLinkedTechnicalUser!.Provider == userCompanyId }) .Where(x => (isOwner.HasValue diff --git a/src/portalbackend/PortalBackend.Migrations/Migrations/20241007103241_adjust_table_with_properties_navigationproperties_latest.Designer.cs b/src/portalbackend/PortalBackend.Migrations/Migrations/20241007103241_adjust_table_with_properties_navigationproperties_latest.Designer.cs index 5d5877af19..f334648f26 100644 --- a/src/portalbackend/PortalBackend.Migrations/Migrations/20241007103241_adjust_table_with_properties_navigationproperties_latest.Designer.cs +++ b/src/portalbackend/PortalBackend.Migrations/Migrations/20241007103241_adjust_table_with_properties_navigationproperties_latest.Designer.cs @@ -1,4 +1,4 @@ -/******************************************************************************** +/******************************************************************************** * Copyright (c) 2024 Contributors to the Eclipse Foundation * * See the NOTICE file(s) distributed with this work for additional @@ -964,6 +964,87 @@ protected override void BuildTargetModel(ModelBuilder modelBuilder) }); modelBuilder.Entity("Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.AuditEntities.AuditConnector20240814", 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("CompanyServiceAccountId") + .HasColumnType("uuid") + .HasColumnName("company_service_account_id"); + + b.Property("ConnectorUrl") + .HasColumnType("text") + .HasColumnName("connector_url"); + + b.Property("DateLastChanged") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_last_changed"); + + b.Property("HostId") + .HasColumnType("uuid") + .HasColumnName("host_id"); + + b.Property("Id") + .HasColumnType("uuid") + .HasColumnName("id"); + + b.Property("LastEditorId") + .HasColumnType("uuid") + .HasColumnName("last_editor_id"); + + b.Property("LocationId") + .HasColumnType("text") + .HasColumnName("location_id"); + + b.Property("Name") + .HasColumnType("text") + .HasColumnName("name"); + + b.Property("ProviderId") + .HasColumnType("uuid") + .HasColumnName("provider_id"); + + b.Property("SdCreationProcessId") + .HasColumnType("uuid") + .HasColumnName("sd_creation_process_id"); + + b.Property("SelfDescriptionDocumentId") + .HasColumnType("uuid") + .HasColumnName("self_description_document_id"); + + b.Property("SelfDescriptionMessage") + .HasColumnType("text") + .HasColumnName("self_description_message"); + + b.Property("StatusId") + .HasColumnType("integer") + .HasColumnName("status_id"); + + b.Property("TypeId") + .HasColumnType("integer") + .HasColumnName("type_id"); + + b.HasKey("AuditV1Id") + .HasName("pk_audit_connector20240814"); + + b.ToTable("audit_connector20240814", "portal"); + }); + + modelBuilder.Entity("Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.AuditEntities.AuditConnector20241008", b => { b.Property("AuditV1Id") .ValueGeneratedOnAdd() @@ -1039,9 +1120,9 @@ protected override void BuildTargetModel(ModelBuilder modelBuilder) .HasColumnName("type_id"); b.HasKey("AuditV1Id") - .HasName("pk_audit_connector20240814"); + .HasName("pk_audit_connector20241008"); - b.ToTable("audit_connector20240814", "portal"); + b.ToTable("audit_connector20241008", "portal"); }); modelBuilder.Entity("Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.AuditEntities.AuditConsent20230412", b => @@ -2553,7 +2634,7 @@ protected override void BuildTargetModel(ModelBuilder modelBuilder) b.ToTable("app_instances", "portal"); }); - modelBuilder.Entity("Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Entities.AppInstanceAssignedCompanyServiceAccount", b => + modelBuilder.Entity("Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Entities.AppInstanceAssignedTechnicalUser", b => { b.Property("AppInstanceId") .HasColumnType("uuid") @@ -2564,12 +2645,12 @@ protected override void BuildTargetModel(ModelBuilder modelBuilder) .HasColumnName("technical_user_id"); b.HasKey("AppInstanceId", "TechnicalUserId") - .HasName("pk_app_instance_assigned_service_accounts"); + .HasName("pk_app_instance_assigned_technical_users"); b.HasIndex("TechnicalUserId") - .HasDatabaseName("ix_app_instance_assigned_service_accounts_technical_user_id"); + .HasDatabaseName("ix_app_instance_assigned_technical_users_technical_user_id"); - b.ToTable("app_instance_assigned_service_accounts", "portal"); + b.ToTable("app_instance_assigned_technical_users", "portal"); }); modelBuilder.Entity("Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Entities.AppInstanceSetup", b => @@ -4110,8 +4191,8 @@ protected override void BuildTargetModel(ModelBuilder modelBuilder) }); b - .HasAnnotation("LC_TRIGGER_AFTER_INSERT_CONNECTOR", "CREATE FUNCTION \"portal\".\"LC_TRIGGER_AFTER_INSERT_CONNECTOR\"() RETURNS trigger as $LC_TRIGGER_AFTER_INSERT_CONNECTOR$\r\nBEGIN\r\n INSERT INTO \"portal\".\"audit_connector20240814\" (\"id\", \"name\", \"connector_url\", \"type_id\", \"status_id\", \"provider_id\", \"host_id\", \"self_description_document_id\", \"location_id\", \"self_description_message\", \"date_last_changed\", \"technical_user_id\", \"sd_creation_process_id\", \"last_editor_id\", \"audit_v1id\", \"audit_v1operation_id\", \"audit_v1date_last_changed\", \"audit_v1last_editor_id\") SELECT NEW.\"id\", \r\n NEW.\"name\", \r\n NEW.\"connector_url\", \r\n NEW.\"type_id\", \r\n NEW.\"status_id\", \r\n NEW.\"provider_id\", \r\n NEW.\"host_id\", \r\n NEW.\"self_description_document_id\", \r\n NEW.\"location_id\", \r\n NEW.\"self_description_message\", \r\n NEW.\"date_last_changed\", \r\n NEW.\"technical_user_id\", \r\n NEW.\"sd_creation_process_id\", \r\n NEW.\"last_editor_id\", \r\n gen_random_uuid(), \r\n 1, \r\n CURRENT_TIMESTAMP, \r\n NEW.\"last_editor_id\";\r\nRETURN NEW;\r\nEND;\r\n$LC_TRIGGER_AFTER_INSERT_CONNECTOR$ LANGUAGE plpgsql;\r\nCREATE TRIGGER LC_TRIGGER_AFTER_INSERT_CONNECTOR AFTER INSERT\r\nON \"portal\".\"connectors\"\r\nFOR EACH ROW EXECUTE PROCEDURE \"portal\".\"LC_TRIGGER_AFTER_INSERT_CONNECTOR\"();") - .HasAnnotation("LC_TRIGGER_AFTER_UPDATE_CONNECTOR", "CREATE FUNCTION \"portal\".\"LC_TRIGGER_AFTER_UPDATE_CONNECTOR\"() RETURNS trigger as $LC_TRIGGER_AFTER_UPDATE_CONNECTOR$\r\nBEGIN\r\n INSERT INTO \"portal\".\"audit_connector20240814\" (\"id\", \"name\", \"connector_url\", \"type_id\", \"status_id\", \"provider_id\", \"host_id\", \"self_description_document_id\", \"location_id\", \"self_description_message\", \"date_last_changed\", \"technical_user_id\", \"sd_creation_process_id\", \"last_editor_id\", \"audit_v1id\", \"audit_v1operation_id\", \"audit_v1date_last_changed\", \"audit_v1last_editor_id\") SELECT NEW.\"id\", \r\n NEW.\"name\", \r\n NEW.\"connector_url\", \r\n NEW.\"type_id\", \r\n NEW.\"status_id\", \r\n NEW.\"provider_id\", \r\n NEW.\"host_id\", \r\n NEW.\"self_description_document_id\", \r\n NEW.\"location_id\", \r\n NEW.\"self_description_message\", \r\n NEW.\"date_last_changed\", \r\n NEW.\"technical_user_id\", \r\n NEW.\"sd_creation_process_id\", \r\n NEW.\"last_editor_id\", \r\n gen_random_uuid(), \r\n 2, \r\n CURRENT_TIMESTAMP, \r\n NEW.\"last_editor_id\";\r\nRETURN NEW;\r\nEND;\r\n$LC_TRIGGER_AFTER_UPDATE_CONNECTOR$ LANGUAGE plpgsql;\r\nCREATE TRIGGER LC_TRIGGER_AFTER_UPDATE_CONNECTOR AFTER UPDATE\r\nON \"portal\".\"connectors\"\r\nFOR EACH ROW EXECUTE PROCEDURE \"portal\".\"LC_TRIGGER_AFTER_UPDATE_CONNECTOR\"();"); + .HasAnnotation("LC_TRIGGER_AFTER_INSERT_CONNECTOR", "CREATE FUNCTION \"portal\".\"LC_TRIGGER_AFTER_INSERT_CONNECTOR\"() RETURNS trigger as $LC_TRIGGER_AFTER_INSERT_CONNECTOR$\r\nBEGIN\r\n INSERT INTO \"portal\".\"audit_connector20241008\" (\"id\", \"name\", \"connector_url\", \"type_id\", \"status_id\", \"provider_id\", \"host_id\", \"self_description_document_id\", \"location_id\", \"self_description_message\", \"date_last_changed\", \"technical_user_id\", \"sd_creation_process_id\", \"last_editor_id\", \"audit_v1id\", \"audit_v1operation_id\", \"audit_v1date_last_changed\", \"audit_v1last_editor_id\") SELECT NEW.\"id\", \r\n NEW.\"name\", \r\n NEW.\"connector_url\", \r\n NEW.\"type_id\", \r\n NEW.\"status_id\", \r\n NEW.\"provider_id\", \r\n NEW.\"host_id\", \r\n NEW.\"self_description_document_id\", \r\n NEW.\"location_id\", \r\n NEW.\"self_description_message\", \r\n NEW.\"date_last_changed\", \r\n NEW.\"technical_user_id\", \r\n NEW.\"sd_creation_process_id\", \r\n NEW.\"last_editor_id\", \r\n gen_random_uuid(), \r\n 1, \r\n CURRENT_TIMESTAMP, \r\n NEW.\"last_editor_id\";\r\nRETURN NEW;\r\nEND;\r\n$LC_TRIGGER_AFTER_INSERT_CONNECTOR$ LANGUAGE plpgsql;\r\nCREATE TRIGGER LC_TRIGGER_AFTER_INSERT_CONNECTOR AFTER INSERT\r\nON \"portal\".\"connectors\"\r\nFOR EACH ROW EXECUTE PROCEDURE \"portal\".\"LC_TRIGGER_AFTER_INSERT_CONNECTOR\"();") + .HasAnnotation("LC_TRIGGER_AFTER_UPDATE_CONNECTOR", "CREATE FUNCTION \"portal\".\"LC_TRIGGER_AFTER_UPDATE_CONNECTOR\"() RETURNS trigger as $LC_TRIGGER_AFTER_UPDATE_CONNECTOR$\r\nBEGIN\r\n INSERT INTO \"portal\".\"audit_connector20241008\" (\"id\", \"name\", \"connector_url\", \"type_id\", \"status_id\", \"provider_id\", \"host_id\", \"self_description_document_id\", \"location_id\", \"self_description_message\", \"date_last_changed\", \"technical_user_id\", \"sd_creation_process_id\", \"last_editor_id\", \"audit_v1id\", \"audit_v1operation_id\", \"audit_v1date_last_changed\", \"audit_v1last_editor_id\") SELECT NEW.\"id\", \r\n NEW.\"name\", \r\n NEW.\"connector_url\", \r\n NEW.\"type_id\", \r\n NEW.\"status_id\", \r\n NEW.\"provider_id\", \r\n NEW.\"host_id\", \r\n NEW.\"self_description_document_id\", \r\n NEW.\"location_id\", \r\n NEW.\"self_description_message\", \r\n NEW.\"date_last_changed\", \r\n NEW.\"technical_user_id\", \r\n NEW.\"sd_creation_process_id\", \r\n NEW.\"last_editor_id\", \r\n gen_random_uuid(), \r\n 2, \r\n CURRENT_TIMESTAMP, \r\n NEW.\"last_editor_id\";\r\nRETURN NEW;\r\nEND;\r\n$LC_TRIGGER_AFTER_UPDATE_CONNECTOR$ LANGUAGE plpgsql;\r\nCREATE TRIGGER LC_TRIGGER_AFTER_UPDATE_CONNECTOR AFTER UPDATE\r\nON \"portal\".\"connectors\"\r\nFOR EACH ROW EXECUTE PROCEDURE \"portal\".\"LC_TRIGGER_AFTER_UPDATE_CONNECTOR\"();"); }); modelBuilder.Entity("Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Entities.ConnectorAssignedOfferSubscription", b => @@ -7042,7 +7123,7 @@ protected override void BuildTargetModel(ModelBuilder modelBuilder) b.HasIndex("ClientClientId") .HasDatabaseName("ix_technical_users_client_client_id") - .HasFilter("client_client_id is not null AND company_service_account_kind_id = 1"); + .HasFilter("client_client_id is not null AND technical_user_kind_id = 1"); b.HasIndex("OfferSubscriptionId") .HasDatabaseName("ix_technical_users_offer_subscription_id"); @@ -7412,7 +7493,7 @@ protected override void BuildTargetModel(ModelBuilder modelBuilder) b.ToView("agreement_view", "portal"); }); - modelBuilder.Entity("Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Views.CompaniesLinkedServiceAccount", b => + modelBuilder.Entity("Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Views.CompaniesLinkedTechnicalUser", b => { b.Property("TechnicalUserId") .HasColumnType("uuid") @@ -7430,7 +7511,7 @@ protected override void BuildTargetModel(ModelBuilder modelBuilder) b.ToTable((string)null); - b.ToView("company_linked_service_accounts", "portal"); + b.ToView("company_linked_technical_users", "portal"); }); modelBuilder.Entity("Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Views.CompanyConnectorView", b => @@ -7711,19 +7792,19 @@ protected override void BuildTargetModel(ModelBuilder modelBuilder) b.Navigation("IamClient"); }); - modelBuilder.Entity("Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Entities.AppInstanceAssignedCompanyServiceAccount", b => + modelBuilder.Entity("Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Entities.AppInstanceAssignedTechnicalUser", b => { b.HasOne("Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Entities.AppInstance", "AppInstance") - .WithMany("ServiceAccounts") + .WithMany("AppInstanceAssignedTechnicalUsers") .HasForeignKey("AppInstanceId") .IsRequired() - .HasConstraintName("fk_app_instance_assigned_service_accounts_app_instances_app_in"); + .HasConstraintName("fk_app_instance_assigned_technical_users_app_instances_app_ins"); b.HasOne("Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Entities.TechnicalUser", "TechnicalUser") - .WithMany("AppInstances") + .WithMany("AppInstanceAssignedTechnicalUsers") .HasForeignKey("TechnicalUserId") .IsRequired() - .HasConstraintName("fk_app_instance_assigned_service_accounts_technical_users_tech"); + .HasConstraintName("fk_app_instance_assigned_technical_users_technical_users_techn"); b.Navigation("AppInstance"); @@ -9262,14 +9343,14 @@ protected override void BuildTargetModel(ModelBuilder modelBuilder) b.Navigation("UserRole"); }); - modelBuilder.Entity("Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Views.CompaniesLinkedServiceAccount", b => + modelBuilder.Entity("Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Views.CompaniesLinkedTechnicalUser", b => { b.HasOne("Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Entities.TechnicalUser", "TechnicalUser") - .WithOne("CompaniesLinkedServiceAccount") - .HasForeignKey("Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Views.CompaniesLinkedServiceAccount", "TechnicalUserId") + .WithOne("CompaniesLinkedTechnicalUser") + .HasForeignKey("Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Views.CompaniesLinkedTechnicalUser", "TechnicalUserId") .OnDelete(DeleteBehavior.Cascade) .IsRequired() - .HasConstraintName("fk_company_linked_service_accounts_technical_users_technical_u"); + .HasConstraintName("fk_company_linked_technical_users_technical_users_technical_us"); b.Navigation("TechnicalUser"); }); @@ -9302,9 +9383,9 @@ protected override void BuildTargetModel(ModelBuilder modelBuilder) modelBuilder.Entity("Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Entities.AppInstance", b => { - b.Navigation("AppSubscriptionDetails"); + b.Navigation("AppInstanceAssignedTechnicalUsers"); - b.Navigation("ServiceAccounts"); + b.Navigation("AppSubscriptionDetails"); }); modelBuilder.Entity("Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Entities.ApplicationChecklistEntryStatus", b => @@ -9713,9 +9794,9 @@ protected override void BuildTargetModel(ModelBuilder modelBuilder) modelBuilder.Entity("Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Entities.TechnicalUser", b => { - b.Navigation("AppInstances"); + b.Navigation("AppInstanceAssignedTechnicalUsers"); - b.Navigation("CompaniesLinkedServiceAccount"); + b.Navigation("CompaniesLinkedTechnicalUser"); b.Navigation("Connector"); diff --git a/src/portalbackend/PortalBackend.Migrations/Migrations/20241007103241_adjust_table_with_properties_navigationproperties_latest.cs b/src/portalbackend/PortalBackend.Migrations/Migrations/20241007103241_adjust_table_with_properties_navigationproperties_latest.cs index e1eba1e4a3..8f12abe403 100644 --- a/src/portalbackend/PortalBackend.Migrations/Migrations/20241007103241_adjust_table_with_properties_navigationproperties_latest.cs +++ b/src/portalbackend/PortalBackend.Migrations/Migrations/20241007103241_adjust_table_with_properties_navigationproperties_latest.cs @@ -35,150 +35,181 @@ protected override void Up(MigrationBuilder migrationBuilder) migrationBuilder.Sql("DROP FUNCTION \"portal\".\"LC_TRIGGER_AFTER_UPDATE_CONNECTOR\"() CASCADE;"); + // drop foreign keys AppInstanceAssignedCompanyServiceAccount + + migrationBuilder.DropForeignKey( + name: "fk_app_instance_assigned_service_accounts_app_instances_app_in", + schema: "portal", + table: "app_instance_assigned_service_accounts"); + migrationBuilder.DropForeignKey( name: "fk_app_instance_assigned_service_accounts_company_service_acco", schema: "portal", table: "app_instance_assigned_service_accounts"); + // drop foreign keys CompanyServiceAccount + migrationBuilder.DropForeignKey( - name: "fk_connectors_company_service_accounts_company_service_account", + name: "fk_company_service_accounts_company_service_account_kindes_com", schema: "portal", - table: "connectors"); + table: "company_service_accounts"); migrationBuilder.DropForeignKey( - name: "fk_dim_user_creation_data_company_service_accounts_service_acc", + name: "fk_company_service_accounts_company_service_account_types_comp", schema: "portal", - table: "dim_user_creation_data"); + table: "company_service_accounts"); - //external_technical_user table creation starts + migrationBuilder.DropForeignKey( + name: "fk_company_service_accounts_identities_id", + schema: "portal", + table: "company_service_accounts"); + + migrationBuilder.DropForeignKey( + name: "fk_company_service_accounts_offer_subscriptions_offer_subscrip", + schema: "portal", + table: "company_service_accounts"); + + // drop foreign keys Connector + + migrationBuilder.DropForeignKey( + name: "fk_connectors_company_service_accounts_company_service_account", + schema: "portal", + table: "connectors"); + + // drop foreign keys DimCompanyServiceAccount migrationBuilder.DropForeignKey( name: "fk_dim_company_service_accounts_company_service_accounts_id", schema: "portal", table: "dim_company_service_accounts"); - migrationBuilder.DropPrimaryKey( - name: "pk_dim_company_service_accounts", - table: "dim_company_service_accounts", - schema: "portal"); + // drop foreign keys DimUserCreationData - migrationBuilder.RenameTable( - name: "dim_company_service_accounts", + migrationBuilder.DropForeignKey( + name: "fk_dim_user_creation_data_company_service_accounts_service_acc", schema: "portal", - newName: "external_technical_users" - ); + table: "dim_user_creation_data"); - migrationBuilder.AddPrimaryKey( - name: "pk_external_technical_users", - table: "external_technical_users", - column: "id"); + // as company_linked_technical_users is a view the autocreated constraint ain't work + // the respective navigational property nevertheless works without. + // the autocreated statement is left here for documentation purpose. - //end external_technical_user table creation + // migrationBuilder.DropForeignKey( + // name: "fk_company_linked_service_accounts_company_service_accounts_co", + // schema: "portal", + // table: "company_linked_service_accounts"); - // technical_users creation starts + // AppInstanceAssignedCompanyServiceAccount -> AppInstanceAssignedTechnicalUser - migrationBuilder.DropForeignKey( - name: "fk_company_service_accounts_company_service_account_kindes_com", + migrationBuilder.DropPrimaryKey( + name: "pk_app_instance_assigned_service_accounts", + table: "app_instance_assigned_service_accounts", + schema: "portal"); + + migrationBuilder.DropIndex( + name: "ix_app_instance_assigned_service_accounts_company_service_acco", + table: "app_instance_assigned_service_accounts", + schema: "portal"); + + migrationBuilder.RenameColumn( + name: "company_service_account_id", + table: "app_instance_assigned_service_accounts", schema: "portal", - table: "company_service_accounts"); + newName: "technical_user_id"); - migrationBuilder.DropForeignKey( - name: "fk_company_service_accounts_company_service_account_types_comp", + migrationBuilder.RenameTable( + name: "app_instance_assigned_service_accounts", schema: "portal", - table: "company_service_accounts"); + newName: "app_instance_assigned_technical_users"); - migrationBuilder.DropForeignKey( - name: "fk_company_service_accounts_identities_id", + migrationBuilder.AddPrimaryKey( + name: "pk_app_instance_assigned_technical_users", + table: "app_instance_assigned_technical_users", schema: "portal", - table: "company_service_accounts"); + columns: ["app_instance_id", "technical_user_id"]); - migrationBuilder.DropForeignKey( - name: "fk_company_service_accounts_offer_subscriptions_offer_subscrip", + migrationBuilder.CreateIndex( + name: "ix_app_instance_assigned_technical_users_technical_user_id", + table: "app_instance_assigned_technical_users", schema: "portal", - table: "company_service_accounts"); + column: "technical_user_id"); + + // CompanyServiceAccount -> TechnicalUser migrationBuilder.DropPrimaryKey( name: "pk_company_service_accounts", table: "company_service_accounts", schema: "portal"); - migrationBuilder.RenameTable( - name: "company_service_accounts", - schema: "portal", - newName: "technical_users"); + migrationBuilder.DropIndex( + name: "ix_company_service_accounts_client_client_id", + table: "company_service_accounts", + schema: "portal"); + + migrationBuilder.DropIndex( + name: "ix_company_service_accounts_company_service_account_kind_id", + table: "company_service_accounts", + schema: "portal"); + + migrationBuilder.DropIndex( + name: "ix_company_service_accounts_company_service_account_type_id", + table: "company_service_accounts", + schema: "portal"); + + migrationBuilder.DropIndex( + name: "ix_company_service_accounts_offer_subscription_id", + table: "company_service_accounts", + schema: "portal"); migrationBuilder.RenameColumn( name: "company_service_account_kind_id", - table: "technical_users", + table: "company_service_accounts", + schema: "portal", newName: "technical_user_kind_id"); migrationBuilder.RenameColumn( name: "company_service_account_type_id", - table: "technical_users", - newName: "technical_user_type_id"); - - migrationBuilder.RenameIndex( - name: "ix_company_service_accounts_client_client_id", - newName: "ix_technical_users_client_client_id", - schema: "portal", - table: "technical_users"); - - migrationBuilder.RenameIndex( - name: "ix_company_service_accounts_company_service_account_kind_id", - newName: "ix_technical_users_company_service_account_kind_id", - schema: "portal", - table: "technical_users"); - - migrationBuilder.RenameIndex( - name: "ix_company_service_accounts_company_service_account_type_id", - newName: "ix_technical_users_company_service_account_type_id", + table: "company_service_accounts", schema: "portal", - table: "technical_users"); + newName: "technical_user_type_id"); - migrationBuilder.RenameIndex( - name: "ix_company_service_accounts_offer_subscription_id", - newName: "ix_technical_users_offer_subscription_id", + migrationBuilder.RenameTable( + name: "company_service_accounts", schema: "portal", - table: "technical_users"); + newName: "technical_users"); migrationBuilder.AddPrimaryKey( name: "pk_technical_users", table: "technical_users", - column: "id" - ); + schema: "portal", + column: "id"); - migrationBuilder.AddForeignKey( - name: "fk_technical_users_identities_id", + migrationBuilder.CreateIndex( + name: "ix_technical_users_client_client_id", table: "technical_users", - column: "id", schema: "portal", - principalSchema: "portal", - principalTable: "identities", - principalColumn: "id", - onDelete: ReferentialAction.Cascade); + column: "client_client_id", + filter: "client_client_id is not null AND technical_user_kind_id = 1"); - migrationBuilder.AddForeignKey( - name: "fk_technical_users_offer_subscriptions_offer_subscription_id", + migrationBuilder.CreateIndex( + name: "ix_technical_users_offer_subscription_id", table: "technical_users", - column: "offer_subscription_id", schema: "portal", - principalSchema: "portal", - principalTable: "offer_subscriptions", - principalColumn: "id"); + column: "offer_subscription_id"); - migrationBuilder.AddForeignKey( - name: "fk_external_technical_users_external_technical_users_id", - table: "external_technical_users", - column: "id", - schema: "portal", - principalSchema: "portal", - principalTable: "technical_users", - principalColumn: "id", - onDelete: ReferentialAction.Cascade); + migrationBuilder.CreateIndex( + name: "ix_technical_users_technical_user_kind_id", + table: "technical_users", + schema: "portal", + column: "technical_user_kind_id"); - //end technical_users creation + migrationBuilder.CreateIndex( + name: "ix_technical_users_technical_user_type_id", + table: "technical_users", + schema: "portal", + column: "technical_user_type_id"); - //rename company_service_account_kindes to technical_user_kinds starts + // CompanyServiceAccountKind -> TechnicalUserKind migrationBuilder.DropPrimaryKey( name: "pk_company_service_account_kindes", @@ -193,22 +224,10 @@ protected override void Up(MigrationBuilder migrationBuilder) migrationBuilder.AddPrimaryKey( name: "pk_technical_user_kinds", table: "technical_user_kinds", - column: "id" - ); - - migrationBuilder.AddForeignKey( - name: "fk_technical_users_technical_user_kinds_technical_user_kind_id", - table: "technical_users", - column: "technical_user_kind_id", - schema: "portal", - principalSchema: "portal", - principalTable: "technical_user_kinds", - principalColumn: "id", - onDelete: ReferentialAction.Cascade); - - //end rename company_service_account_kindes to technical_user_kinds + schema: "portal", + column: "id"); - //rename company_service_account_types to technical_user_types starts + // CompanyServiceAccountType -> TechnicalUserType migrationBuilder.DropPrimaryKey( name: "pk_company_service_account_types", @@ -223,32 +242,15 @@ protected override void Up(MigrationBuilder migrationBuilder) migrationBuilder.AddPrimaryKey( name: "pk_technical_user_types", table: "technical_user_types", - column: "id" - ); - - migrationBuilder.AddForeignKey( - name: "fk_technical_users_technical_user_types_technical_user_type_id", - table: "technical_users", - column: "technical_user_type_id", schema: "portal", - principalSchema: "portal", - principalTable: "technical_user_types", - principalColumn: "id", - onDelete: ReferentialAction.Cascade); - - //end rename company_service_account_types to technical_user_types starts + column: "id"); - migrationBuilder.RenameColumn( - name: "service_account_id", - schema: "portal", - table: "dim_user_creation_data", - newName: "technical_user_id"); + // Connector - migrationBuilder.RenameIndex( - name: "ix_dim_user_creation_data_service_account_id", - schema: "portal", - table: "dim_user_creation_data", - newName: "ix_dim_user_creation_data_technical_user_id"); + migrationBuilder.DropIndex( + name: "ix_connectors_company_service_account_id", + table: "connectors", + schema: "portal"); migrationBuilder.RenameColumn( name: "company_service_account_id", @@ -256,39 +258,142 @@ protected override void Up(MigrationBuilder migrationBuilder) table: "connectors", newName: "technical_user_id"); - migrationBuilder.RenameIndex( - name: "ix_connectors_company_service_account_id", - schema: "portal", + migrationBuilder.CreateIndex( + name: "ix_connectors_technical_user_id", table: "connectors", - newName: "ix_connectors_technical_user_id"); + schema: "portal", + column: "technical_user_id"); - migrationBuilder.RenameColumn( - name: "company_service_account_id", + // DimCompanyServiceAccount -> ExternalTechnicalUser + + migrationBuilder.DropPrimaryKey( + name: "pk_dim_company_service_accounts", + table: "dim_company_service_accounts", + schema: "portal"); + + migrationBuilder.RenameTable( + name: "dim_company_service_accounts", schema: "portal", - table: "audit_connector20240814", - newName: "technical_user_id"); + newName: "external_technical_users" + ); + + migrationBuilder.AddPrimaryKey( + name: "pk_external_technical_users", + table: "external_technical_users", + schema: "portal", + column: "id"); + + // DimUserCreationData + + migrationBuilder.DropIndex( + name: "ix_dim_user_creation_data_service_account_id", + table: "dim_user_creation_data", + schema: "portal"); migrationBuilder.RenameColumn( - name: "company_service_account_id", + name: "service_account_id", + table: "dim_user_creation_data", schema: "portal", - table: "app_instance_assigned_service_accounts", newName: "technical_user_id"); - migrationBuilder.RenameIndex( - name: "ix_app_instance_assigned_service_accounts_company_service_acco", + migrationBuilder.CreateIndex( + name: "ix_dim_user_creation_data_technical_user_id", + table: "dim_user_creation_data", schema: "portal", - table: "app_instance_assigned_service_accounts", - newName: "ix_app_instance_assigned_service_accounts_technical_user_id"); + column: "technical_user_id"); + + // CompaniesLinkedServiceAccount -> CompaniesLinkedTechnicalUser + + migrationBuilder.Sql(@"DROP VIEW IF EXISTS portal.company_linked_service_accounts"); + + migrationBuilder.Sql(@"CREATE OR REPLACE VIEW portal.company_linked_technical_users AS + SELECT + tu.id AS technical_user_id, + i.company_id AS owners, + CASE + WHEN tu.offer_subscription_id IS NOT NULL THEN o.provider_company_id + WHEN EXISTS (SELECT 1 FROM portal.connectors cs WHERE cs.technical_user_id = tu.id) THEN c.host_id + END AS provider + FROM portal.technical_users tu + JOIN portal.identities i ON tu.id = i.id + LEFT JOIN portal.offer_subscriptions os ON tu.offer_subscription_id = os.id + LEFT JOIN portal.offers o ON os.offer_id = o.id + LEFT JOIN portal.connectors c ON tu.id = c.technical_user_id + WHERE tu.technical_user_type_id = 1 AND i.identity_type_id = 2 + UNION + SELECT + tu.id AS technical_user_id, + i.company_id AS owners, + null AS provider + FROM + portal.technical_users tu + JOIN portal.identities i ON tu.id = i.id + WHERE tu.technical_user_type_id = 2 + "); + + // re-add foreign keys AppInstanceAssignedTechnicalUser (AppInstanceAssignedCompanyServiceAccount) migrationBuilder.AddForeignKey( - name: "fk_app_instance_assigned_service_accounts_technical_users_tech", + name: "fk_app_instance_assigned_technical_users_app_instances_app_ins", + table: "app_instance_assigned_technical_users", + column: "app_instance_id", schema: "portal", - table: "app_instance_assigned_service_accounts", + principalSchema: "portal", + principalTable: "app_instances", + principalColumn: "id"); + + migrationBuilder.AddForeignKey( + name: "fk_app_instance_assigned_technical_users_technical_users_techn", + table: "app_instance_assigned_technical_users", column: "technical_user_id", + schema: "portal", principalSchema: "portal", principalTable: "technical_users", principalColumn: "id"); + // re-add foreign keys TechnicalUser (CompanyServiceAccount) + + migrationBuilder.AddForeignKey( + name: "fk_technical_users_identities_id", + table: "technical_users", + column: "id", + schema: "portal", + principalSchema: "portal", + principalTable: "identities", + principalColumn: "id", + onDelete: ReferentialAction.Cascade); + + migrationBuilder.AddForeignKey( + name: "fk_technical_users_offer_subscriptions_offer_subscription_id", + table: "technical_users", + column: "offer_subscription_id", + schema: "portal", + principalSchema: "portal", + principalTable: "offer_subscriptions", + principalColumn: "id"); + + migrationBuilder.AddForeignKey( + name: "fk_technical_users_technical_user_kinds_technical_user_kind_id", + table: "technical_users", + column: "technical_user_kind_id", + schema: "portal", + principalSchema: "portal", + principalTable: "technical_user_kinds", + principalColumn: "id", + onDelete: ReferentialAction.Cascade); + + migrationBuilder.AddForeignKey( + name: "fk_technical_users_technical_user_types_technical_user_type_id", + table: "technical_users", + column: "technical_user_type_id", + schema: "portal", + principalSchema: "portal", + principalTable: "technical_user_types", + principalColumn: "id", + onDelete: ReferentialAction.Cascade); + + // re-add foreign keys Connector + migrationBuilder.AddForeignKey( name: "fk_connectors_technical_users_technical_user_id", schema: "portal", @@ -298,18 +403,77 @@ protected override void Up(MigrationBuilder migrationBuilder) principalTable: "technical_users", principalColumn: "id"); + // re-add foreign keys ExternalTechnicalUser (DimCompanyServiceAccount) + + migrationBuilder.AddForeignKey( + name: "fk_external_technical_users_external_technical_users_id", + table: "external_technical_users", + column: "id", + schema: "portal", + principalSchema: "portal", + principalTable: "technical_users", + principalColumn: "id", + onDelete: ReferentialAction.Cascade); + + // re-add foreign keys DimUserCreationData + migrationBuilder.AddForeignKey( name: "fk_dim_user_creation_data_technical_users_technical_user_id", - schema: "portal", table: "dim_user_creation_data", column: "technical_user_id", + schema: "portal", principalSchema: "portal", principalTable: "technical_users", principalColumn: "id"); - migrationBuilder.Sql("CREATE FUNCTION \"portal\".\"LC_TRIGGER_AFTER_INSERT_CONNECTOR\"() RETURNS trigger as $LC_TRIGGER_AFTER_INSERT_CONNECTOR$\r\nBEGIN\r\n INSERT INTO \"portal\".\"audit_connector20240814\" (\"id\", \"name\", \"connector_url\", \"type_id\", \"status_id\", \"provider_id\", \"host_id\", \"self_description_document_id\", \"location_id\", \"self_description_message\", \"date_last_changed\", \"technical_user_id\", \"sd_creation_process_id\", \"last_editor_id\", \"audit_v1id\", \"audit_v1operation_id\", \"audit_v1date_last_changed\", \"audit_v1last_editor_id\") SELECT NEW.\"id\", \r\n NEW.\"name\", \r\n NEW.\"connector_url\", \r\n NEW.\"type_id\", \r\n NEW.\"status_id\", \r\n NEW.\"provider_id\", \r\n NEW.\"host_id\", \r\n NEW.\"self_description_document_id\", \r\n NEW.\"location_id\", \r\n NEW.\"self_description_message\", \r\n NEW.\"date_last_changed\", \r\n NEW.\"technical_user_id\", \r\n NEW.\"sd_creation_process_id\", \r\n NEW.\"last_editor_id\", \r\n gen_random_uuid(), \r\n 1, \r\n CURRENT_TIMESTAMP, \r\n NEW.\"last_editor_id\";\r\nRETURN NEW;\r\nEND;\r\n$LC_TRIGGER_AFTER_INSERT_CONNECTOR$ LANGUAGE plpgsql;\r\nCREATE TRIGGER LC_TRIGGER_AFTER_INSERT_CONNECTOR AFTER INSERT\r\nON \"portal\".\"connectors\"\r\nFOR EACH ROW EXECUTE PROCEDURE \"portal\".\"LC_TRIGGER_AFTER_INSERT_CONNECTOR\"();"); - - migrationBuilder.Sql("CREATE FUNCTION \"portal\".\"LC_TRIGGER_AFTER_UPDATE_CONNECTOR\"() RETURNS trigger as $LC_TRIGGER_AFTER_UPDATE_CONNECTOR$\r\nBEGIN\r\n INSERT INTO \"portal\".\"audit_connector20240814\" (\"id\", \"name\", \"connector_url\", \"type_id\", \"status_id\", \"provider_id\", \"host_id\", \"self_description_document_id\", \"location_id\", \"self_description_message\", \"date_last_changed\", \"technical_user_id\", \"sd_creation_process_id\", \"last_editor_id\", \"audit_v1id\", \"audit_v1operation_id\", \"audit_v1date_last_changed\", \"audit_v1last_editor_id\") SELECT NEW.\"id\", \r\n NEW.\"name\", \r\n NEW.\"connector_url\", \r\n NEW.\"type_id\", \r\n NEW.\"status_id\", \r\n NEW.\"provider_id\", \r\n NEW.\"host_id\", \r\n NEW.\"self_description_document_id\", \r\n NEW.\"location_id\", \r\n NEW.\"self_description_message\", \r\n NEW.\"date_last_changed\", \r\n NEW.\"technical_user_id\", \r\n NEW.\"sd_creation_process_id\", \r\n NEW.\"last_editor_id\", \r\n gen_random_uuid(), \r\n 2, \r\n CURRENT_TIMESTAMP, \r\n NEW.\"last_editor_id\";\r\nRETURN NEW;\r\nEND;\r\n$LC_TRIGGER_AFTER_UPDATE_CONNECTOR$ LANGUAGE plpgsql;\r\nCREATE TRIGGER LC_TRIGGER_AFTER_UPDATE_CONNECTOR AFTER UPDATE\r\nON \"portal\".\"connectors\"\r\nFOR EACH ROW EXECUTE PROCEDURE \"portal\".\"LC_TRIGGER_AFTER_UPDATE_CONNECTOR\"();"); + // as company_linked_technical_users is a view the autocreated constraint ain't work + // the respective navigational property nevertheless works without. + // the autocreated statement is left here for documentation purpose. + + // migrationBuilder.AddForeignKey( + // name: "fk_company_linked_technical_users_technical_users_technical_us", + // table: "company_linked_technical_users", + // column: "technical_user_id", + // schema: "portal", + // principalSchema: "portal", + // principalTable: "technical_users", + // principalColumn: "id", + // onDelete: ReferentialAction.Cascade); + + // AuditConnector20241008 + + migrationBuilder.CreateTable( + name: "audit_connector20241008", + schema: "portal", + columns: table => new + { + audit_v1id = table.Column(type: "uuid", nullable: false), + id = table.Column(type: "uuid", nullable: false), + name = table.Column(type: "text", nullable: true), + connector_url = table.Column(type: "text", nullable: true), + type_id = table.Column(type: "integer", nullable: true), + status_id = table.Column(type: "integer", nullable: true), + provider_id = table.Column(type: "uuid", nullable: true), + host_id = table.Column(type: "uuid", nullable: true), + self_description_document_id = table.Column(type: "uuid", nullable: true), + location_id = table.Column(type: "text", nullable: true), + self_description_message = table.Column(type: "text", nullable: true), + date_last_changed = table.Column(type: "timestamp with time zone", nullable: true), + technical_user_id = table.Column(type: "uuid", nullable: true), + sd_creation_process_id = table.Column(type: "uuid", nullable: true), + last_editor_id = table.Column(type: "uuid", nullable: true), + audit_v1date_last_changed = table.Column(type: "timestamp with time zone", nullable: false), + audit_v1last_editor_id = table.Column(type: "uuid", nullable: true), + audit_v1operation_id = table.Column(type: "integer", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("pk_audit_connector20241008", x => x.audit_v1id); + }); + + migrationBuilder.Sql("CREATE FUNCTION \"portal\".\"LC_TRIGGER_AFTER_INSERT_CONNECTOR\"() RETURNS trigger as $LC_TRIGGER_AFTER_INSERT_CONNECTOR$\r\nBEGIN\r\n INSERT INTO \"portal\".\"audit_connector20241008\" (\"id\", \"name\", \"connector_url\", \"type_id\", \"status_id\", \"provider_id\", \"host_id\", \"self_description_document_id\", \"location_id\", \"self_description_message\", \"date_last_changed\", \"technical_user_id\", \"sd_creation_process_id\", \"last_editor_id\", \"audit_v1id\", \"audit_v1operation_id\", \"audit_v1date_last_changed\", \"audit_v1last_editor_id\") SELECT NEW.\"id\", \r\n NEW.\"name\", \r\n NEW.\"connector_url\", \r\n NEW.\"type_id\", \r\n NEW.\"status_id\", \r\n NEW.\"provider_id\", \r\n NEW.\"host_id\", \r\n NEW.\"self_description_document_id\", \r\n NEW.\"location_id\", \r\n NEW.\"self_description_message\", \r\n NEW.\"date_last_changed\", \r\n NEW.\"technical_user_id\", \r\n NEW.\"sd_creation_process_id\", \r\n NEW.\"last_editor_id\", \r\n gen_random_uuid(), \r\n 1, \r\n CURRENT_TIMESTAMP, \r\n NEW.\"last_editor_id\";\r\nRETURN NEW;\r\nEND;\r\n$LC_TRIGGER_AFTER_INSERT_CONNECTOR$ LANGUAGE plpgsql;\r\nCREATE TRIGGER LC_TRIGGER_AFTER_INSERT_CONNECTOR AFTER INSERT\r\nON \"portal\".\"connectors\"\r\nFOR EACH ROW EXECUTE PROCEDURE \"portal\".\"LC_TRIGGER_AFTER_INSERT_CONNECTOR\"();"); + + migrationBuilder.Sql("CREATE FUNCTION \"portal\".\"LC_TRIGGER_AFTER_UPDATE_CONNECTOR\"() RETURNS trigger as $LC_TRIGGER_AFTER_UPDATE_CONNECTOR$\r\nBEGIN\r\n INSERT INTO \"portal\".\"audit_connector20241008\" (\"id\", \"name\", \"connector_url\", \"type_id\", \"status_id\", \"provider_id\", \"host_id\", \"self_description_document_id\", \"location_id\", \"self_description_message\", \"date_last_changed\", \"technical_user_id\", \"sd_creation_process_id\", \"last_editor_id\", \"audit_v1id\", \"audit_v1operation_id\", \"audit_v1date_last_changed\", \"audit_v1last_editor_id\") SELECT NEW.\"id\", \r\n NEW.\"name\", \r\n NEW.\"connector_url\", \r\n NEW.\"type_id\", \r\n NEW.\"status_id\", \r\n NEW.\"provider_id\", \r\n NEW.\"host_id\", \r\n NEW.\"self_description_document_id\", \r\n NEW.\"location_id\", \r\n NEW.\"self_description_message\", \r\n NEW.\"date_last_changed\", \r\n NEW.\"technical_user_id\", \r\n NEW.\"sd_creation_process_id\", \r\n NEW.\"last_editor_id\", \r\n gen_random_uuid(), \r\n 2, \r\n CURRENT_TIMESTAMP, \r\n NEW.\"last_editor_id\";\r\nRETURN NEW;\r\nEND;\r\n$LC_TRIGGER_AFTER_UPDATE_CONNECTOR$ LANGUAGE plpgsql;\r\nCREATE TRIGGER LC_TRIGGER_AFTER_UPDATE_CONNECTOR AFTER UPDATE\r\nON \"portal\".\"connectors\"\r\nFOR EACH ROW EXECUTE PROCEDURE \"portal\".\"LC_TRIGGER_AFTER_UPDATE_CONNECTOR\"();"); } /// @@ -317,152 +481,187 @@ protected override void Down(MigrationBuilder migrationBuilder) { migrationBuilder.Sql("DROP FUNCTION \"portal\".\"LC_TRIGGER_AFTER_INSERT_CONNECTOR\"() CASCADE;"); - migrationBuilder.Sql("DROP FUNCTION \"portal\".\"LC_TRIGGER_AFTER_UPDATE_CONNECTOR\"() CASCADE;"); + migrationBuilder.Sql("DROP FUNCTION \"portal\".\"LC_TRIGGER_AFTER_UPDATE_CONNECTOR\"() CASCADE;"); + + migrationBuilder.DropTable( + name: "audit_connector20241008", + schema: "portal"); + + // drop foreign keys AppInstanceAssignedTechnicalUser (AppInstanceAssignedCompanyServiceAccount) + + migrationBuilder.DropForeignKey( + name: "fk_app_instance_assigned_technical_users_app_instances_app_ins", + schema: "portal", + table: "app_instance_assigned_technical_users"); + + migrationBuilder.DropForeignKey( + name: "fk_app_instance_assigned_technical_users_technical_users_techn", + schema: "portal", + table: "app_instance_assigned_technical_users"); + + // drop foreign keys TechnicalUsers (CompanyServiceAccount) + + migrationBuilder.DropForeignKey( + name: "fk_technical_users_identities_id", + schema: "portal", + table: "technical_users"); + + migrationBuilder.DropForeignKey( + name: "fk_technical_users_offer_subscriptions_offer_subscription_id", + schema: "portal", + table: "technical_users"); migrationBuilder.DropForeignKey( - name: "fk_app_instance_assigned_service_accounts_technical_users_tech", + name: "fk_technical_users_technical_user_kinds_technical_user_kind_id", schema: "portal", - table: "app_instance_assigned_service_accounts"); + table: "technical_users"); migrationBuilder.DropForeignKey( - name: "fk_connectors_technical_users_technical_user_id", + name: "fk_technical_users_technical_user_types_technical_user_type_id", schema: "portal", - table: "connectors"); + table: "technical_users"); + + // drop foreign keys Connector migrationBuilder.DropForeignKey( - name: "fk_dim_user_creation_data_technical_users_technical_user_id", + name: "fk_connectors_technical_users_technical_user_id", schema: "portal", - table: "dim_user_creation_data"); + table: "connectors"); - //remane external_technical_user to dim_company_service_accounts table creation starts + // drop foreign keys ExternalTechnicalUser (DimCompanyServiceAccount) migrationBuilder.DropForeignKey( name: "fk_external_technical_users_external_technical_users_id", schema: "portal", table: "external_technical_users"); - migrationBuilder.DropPrimaryKey( - name: "pk_external_technical_users", - table: "external_technical_users", - schema: "portal"); + // drop foreign keys DimUserCreationData - migrationBuilder.RenameTable( - name: "external_technical_users", + migrationBuilder.DropForeignKey( + name: "fk_dim_user_creation_data_technical_users_technical_user_id", schema: "portal", - newName: "dim_company_service_accounts" - ); + table: "dim_user_creation_data"); - migrationBuilder.AddPrimaryKey( - name: "pk_dim_company_service_accounts", - table: "dim_company_service_accounts", - column: "id"); + // as company_linked_technical_users is a view the autocreated constraint ain't work + // the respective navigational property nevertheless works without. + // the autocreated statement is left here for documentation purpose. - //end remane external_technical_user to dim_company_service_accounts table creation + // migrationBuilder.DropForeignKey( + // name: "fk_company_linked_technical_users_technical_users_technical_us", + // schema: "portal", + // table: "company_linked_technical_users"); - // rename technical_users to company_service_accounts creation starts + // AppInstanceAssignedTechnicalUser -> AppInstanceAssignedCompanyServiceAccount - migrationBuilder.DropForeignKey( - name: "fk_technical_users_technical_user_kinds_technical_user_kind_id", + migrationBuilder.DropPrimaryKey( + name: "pk_app_instance_assigned_technical_users", + table: "app_instance_assigned_technical_users", + schema: "portal"); + + migrationBuilder.DropIndex( + name: "ix_app_instance_assigned_technical_users_technical_user_id", + table: "app_instance_assigned_technical_users", + schema: "portal"); + + migrationBuilder.RenameColumn( + name: "technical_user_id", + table: "app_instance_assigned_technical_users", schema: "portal", - table: "technical_users"); + newName: "company_service_account_id"); - migrationBuilder.DropForeignKey( - name: "fk_technical_users_technical_user_types_technical_user_type_id", + migrationBuilder.RenameTable( + name: "app_instance_assigned_technical_users", schema: "portal", - table: "technical_users"); + newName: "app_instance_assigned_service_accounts"); - migrationBuilder.DropForeignKey( - name: "fk_technical_users_identities_id", + migrationBuilder.AddPrimaryKey( + name: "pk_app_instance_assigned_service_accounts", + table: "app_instance_assigned_service_accounts", schema: "portal", - table: "technical_users"); + columns: ["app_instance_id", "company_service_account_id"]); - migrationBuilder.DropForeignKey( - name: "fk_technical_users_offer_subscriptions_offer_subscription_id", + migrationBuilder.CreateIndex( + name: "ix_app_instance_assigned_service_accounts_company_service_acco", + table: "app_instance_assigned_service_accounts", schema: "portal", - table: "technical_users"); + column: "company_service_account_id"); + + // TechnicalUser -> CompanyServiceAccount migrationBuilder.DropPrimaryKey( name: "pk_technical_users", table: "technical_users", schema: "portal"); - migrationBuilder.RenameTable( - name: "technical_users", - schema: "portal", - newName: "company_service_accounts"); + migrationBuilder.DropIndex( + name: "ix_technical_users_client_client_id", + table: "technical_users", + schema: "portal"); + + migrationBuilder.DropIndex( + name: "ix_technical_users_technical_user_kind_id", + table: "technical_users", + schema: "portal"); + + migrationBuilder.DropIndex( + name: "ix_technical_users_technical_user_type_id", + table: "technical_users", + schema: "portal"); + + migrationBuilder.DropIndex( + name: "ix_technical_users_offer_subscription_id", + table: "technical_users", + schema: "portal"); migrationBuilder.RenameColumn( name: "technical_user_kind_id", - table: "company_service_accounts", + table: "technical_users", + schema: "portal", newName: "company_service_account_kind_id"); migrationBuilder.RenameColumn( name: "technical_user_type_id", - table: "company_service_accounts", - newName: "company_service_account_type_id"); - - migrationBuilder.RenameIndex( - name: "ix_technical_users_client_client_id", - newName: "ix_company_service_accounts_client_client_id", - schema: "portal", - table: "company_service_accounts"); - - migrationBuilder.RenameIndex( - name: "ix_technical_users_company_service_account_kind_id", - newName: "ix_company_service_accounts_company_service_account_kind_id", - schema: "portal", - table: "company_service_accounts"); - - migrationBuilder.RenameIndex( - name: "ix_technical_users_company_service_account_type_id", - newName: "ix_company_service_accounts_company_service_account_type_id", + table: "technical_users", schema: "portal", - table: "company_service_accounts"); + newName: "company_service_account_type_id"); - migrationBuilder.RenameIndex( - name: "ix_technical_users_offer_subscription_id", - newName: "ix_company_service_accounts_offer_subscription_id", + migrationBuilder.RenameTable( + name: "technical_users", schema: "portal", - table: "company_service_accounts"); + newName: "company_service_accounts"); migrationBuilder.AddPrimaryKey( name: "pk_company_service_accounts", table: "company_service_accounts", - column: "id" - ); + schema: "portal", + column: "id"); - migrationBuilder.AddForeignKey( - name: "fk_company_service_accounts_identities_id", + migrationBuilder.CreateIndex( + name: "ix_company_service_accounts_client_client_id", table: "company_service_accounts", - column: "id", schema: "portal", - principalSchema: "portal", - principalTable: "identities", - principalColumn: "id", - onDelete: ReferentialAction.Cascade); + column: "client_client_id", + filter: "client_client_id is not null AND company_service_account_kind_id = 1"); - migrationBuilder.AddForeignKey( - name: "fk_company_service_accounts_offer_subscriptions_offer_subscrip", + migrationBuilder.CreateIndex( + name: "ix_company_service_accounts_offer_subscription_id", table: "company_service_accounts", - column: "offer_subscription_id", schema: "portal", - principalSchema: "portal", - principalTable: "offer_subscriptions", - principalColumn: "id"); + column: "offer_subscription_id"); - migrationBuilder.AddForeignKey( - name: "fk_dim_company_service_accounts_company_service_accounts_id", - table: "dim_company_service_accounts", - column: "id", - schema: "portal", - principalSchema: "portal", - principalTable: "company_service_accounts", - principalColumn: "id", - onDelete: ReferentialAction.Cascade); + migrationBuilder.CreateIndex( + name: "ix_company_service_accounts_company_service_account_kind_id", + table: "company_service_accounts", + schema: "portal", + column: "company_service_account_kind_id"); - //end rename technical_users to company_service_accounts creation + migrationBuilder.CreateIndex( + name: "ix_company_service_accounts_company_service_account_type_id", + table: "company_service_accounts", + schema: "portal", + column: "company_service_account_type_id"); - //rename technical_user_kinds to company_service_account_kindes starts + // TechnicalUserKind -> CompanyServiceAccountKind migrationBuilder.DropPrimaryKey( name: "pk_technical_user_kinds", @@ -477,22 +676,10 @@ protected override void Down(MigrationBuilder migrationBuilder) migrationBuilder.AddPrimaryKey( name: "pk_company_service_account_kindes", table: "company_service_account_kindes", - column: "id" - ); - - migrationBuilder.AddForeignKey( - name: "fk_company_service_accounts_company_service_account_kindes_com", - table: "company_service_accounts", - column: "company_service_account_kind_id", - schema: "portal", - principalSchema: "portal", - principalTable: "company_service_account_kindes", - principalColumn: "id", - onDelete: ReferentialAction.Cascade); - - //end rename technical_user_kinds to company_service_account_kindes + schema: "portal", + column: "id"); - //rename technical_user_types to company_service_account_types starts + // TechnicalUserType -> CompanyServiceAccountType migrationBuilder.DropPrimaryKey( name: "pk_technical_user_types", @@ -507,62 +694,105 @@ protected override void Down(MigrationBuilder migrationBuilder) migrationBuilder.AddPrimaryKey( name: "pk_company_service_account_types", table: "company_service_account_types", - column: "id" - ); - - migrationBuilder.AddForeignKey( - name: "fk_company_service_accounts_company_service_account_types_comp", - table: "technical_users", - column: "company_service_account_type_id", schema: "portal", - principalSchema: "portal", - principalTable: "company_service_account_types", - principalColumn: "id", - onDelete: ReferentialAction.Cascade); + column: "id"); + + // Connector - //rename technical_user_types to company_service_account_types starts + migrationBuilder.DropIndex( + name: "ix_connectors_technical_user_id", + table: "connectors", + schema: "portal"); migrationBuilder.RenameColumn( name: "technical_user_id", schema: "portal", - table: "dim_user_creation_data", - newName: "service_account_id"); + table: "connectors", + newName: "company_service_account_id"); - migrationBuilder.RenameIndex( - name: "ix_dim_user_creation_data_technical_user_id", + migrationBuilder.CreateIndex( + name: "ix_connectors_company_service_account_id", + table: "connectors", schema: "portal", - table: "dim_user_creation_data", - newName: "ix_dim_user_creation_data_service_account_id"); + column: "company_service_account_id"); - migrationBuilder.RenameColumn( - name: "technical_user_id", + // ExternalTechnicalUser -> DimCompanyServiceAccount + + migrationBuilder.DropPrimaryKey( + name: "pk_external_technical_users", + table: "external_technical_users", + schema: "portal"); + + migrationBuilder.RenameTable( + name: "external_technical_users", schema: "portal", - table: "connectors", - newName: "company_service_account_id"); + newName: "dim_company_service_accounts" + ); - migrationBuilder.RenameIndex( - name: "ix_connectors_technical_user_id", + migrationBuilder.AddPrimaryKey( + name: "pk_dim_company_service_accounts", + table: "dim_company_service_accounts", schema: "portal", - table: "connectors", - newName: "ix_connectors_company_service_account_id"); + column: "id"); + + // DimUserCreationData + + migrationBuilder.DropIndex( + name: "ix_dim_user_creation_data_technical_user_id", + table: "dim_user_creation_data", + schema: "portal"); migrationBuilder.RenameColumn( name: "technical_user_id", schema: "portal", - table: "audit_connector20240814", - newName: "company_service_account_id"); + table: "dim_user_creation_data", + newName: "service_account_id"); - migrationBuilder.RenameColumn( - name: "technical_user_id", + migrationBuilder.CreateIndex( + name: "ix_dim_user_creation_data_service_account_id", + table: "dim_user_creation_data", schema: "portal", - table: "app_instance_assigned_service_accounts", - newName: "company_service_account_id"); + column: "service_account_id"); + + // CompaniesLinkedTechnicalUser -> CompaniesLinkedServiceAccount + + migrationBuilder.Sql(@"DROP VIEW IF EXISTS portal.company_linked_technical_users"); + + migrationBuilder.Sql(@"CREATE OR REPLACE VIEW portal.company_linked_service_accounts AS + SELECT + csa.id AS service_account_id, + i.company_id AS owners, + CASE + WHEN csa.offer_subscription_id IS NOT NULL THEN o.provider_company_id + WHEN EXISTS (SELECT 1 FROM portal.connectors cs WHERE cs.company_service_account_id = csa.id) THEN c.host_id + END AS provider + FROM portal.company_service_accounts csa + JOIN portal.identities i ON csa.id = i.id + LEFT JOIN portal.offer_subscriptions os ON csa.offer_subscription_id = os.id + LEFT JOIN portal.offers o ON os.offer_id = o.id + LEFT JOIN portal.connectors c ON csa.id = c.company_service_account_id + WHERE csa.company_service_account_type_id = 1 AND i.identity_type_id = 2 + UNION + SELECT + csa.id AS service_account_id, + i.company_id AS owners, + null AS provider + FROM + portal.company_service_accounts csa + JOIN portal.identities i ON csa.id = i.id + WHERE csa.company_service_account_type_id = 2 + "); + + // re-add foreign keys AppInstanceAssignedCompanyServiceAccount (AppInstanceAssignedTechnicalUser) - migrationBuilder.RenameIndex( - name: "ix_app_instance_assigned_service_accounts_technical_user_id", + migrationBuilder.AddForeignKey( + name: "fk_app_instance_assigned_service_accounts_app_instances_app_in", schema: "portal", table: "app_instance_assigned_service_accounts", - newName: "ix_app_instance_assigned_service_accounts_company_service_acco"); + column: "app_instance_id", + principalSchema: "portal", + principalTable: "app_instances", + principalColumn: "id"); migrationBuilder.AddForeignKey( name: "fk_app_instance_assigned_service_accounts_company_service_acco", @@ -573,24 +803,97 @@ protected override void Down(MigrationBuilder migrationBuilder) principalTable: "company_service_accounts", principalColumn: "id"); + // re-add foreign keys CompanyServiceAccount (TechnicalUser) + migrationBuilder.AddForeignKey( - name: "fk_connectors_company_service_accounts_company_service_account", + name: "fk_company_service_accounts_identities_id", + table: "company_service_accounts", + column: "id", + schema: "portal", + principalSchema: "portal", + principalTable: "identities", + principalColumn: "id", + onDelete: ReferentialAction.Cascade); + + migrationBuilder.AddForeignKey( + name: "fk_company_service_accounts_offer_subscriptions_offer_subscrip", + table: "company_service_accounts", + column: "offer_subscription_id", + schema: "portal", + principalSchema: "portal", + principalTable: "offer_subscriptions", + principalColumn: "id"); + + migrationBuilder.AddForeignKey( + name: "fk_company_service_accounts_company_service_account_kindes_com", + table: "company_service_accounts", + column: "company_service_account_kind_id", + schema: "portal", + principalSchema: "portal", + principalTable: "company_service_account_kindes", + principalColumn: "id", + onDelete: ReferentialAction.Cascade); + + migrationBuilder.AddForeignKey( + name: "fk_company_service_accounts_company_service_account_types_comp", + table: "company_service_accounts", + column: "company_service_account_type_id", schema: "portal", + principalSchema: "portal", + principalTable: "company_service_account_types", + principalColumn: "id", + onDelete: ReferentialAction.Cascade); + + // re-add foreign keys Connector + + migrationBuilder.AddForeignKey( + name: "fk_connectors_company_service_accounts_company_service_account", table: "connectors", column: "company_service_account_id", + schema: "portal", principalSchema: "portal", principalTable: "company_service_accounts", principalColumn: "id"); + // re-add foreign keys DimCompanyServiceAccount (ExternalTechnicalUser) + + migrationBuilder.AddForeignKey( + name: "fk_dim_company_service_accounts_company_service_accounts_id", + table: "dim_company_service_accounts", + column: "id", + schema: "portal", + principalSchema: "portal", + principalTable: "company_service_accounts", + principalColumn: "id", + onDelete: ReferentialAction.Cascade); + + // re-add foreign keys DimUserCreationData + migrationBuilder.AddForeignKey( name: "fk_dim_user_creation_data_company_service_accounts_service_acc", - schema: "portal", table: "dim_user_creation_data", column: "service_account_id", + schema: "portal", principalSchema: "portal", principalTable: "company_service_accounts", principalColumn: "id"); + // as company_linked_technical_users is a view the autocreated constraint ain't work + // the respective navigational property nevertheless works without. + // the autocreated statement is left here for documentation purpose. + + // migrationBuilder.AddForeignKey( + // name: "fk_company_linked_service_accounts_company_service_accounts_co", + // table: "company_linked_service_accounts", + // column: "company_service_account", + // schema: "portal", + // principalSchema: "portal", + // principalTable: "company_service_accounts", + // principalColumn: "id", + // onDelete: ReferentialAction.Cascade); + + // AuditConnector20240814 + migrationBuilder.Sql("CREATE FUNCTION \"portal\".\"LC_TRIGGER_AFTER_INSERT_CONNECTOR\"() RETURNS trigger as $LC_TRIGGER_AFTER_INSERT_CONNECTOR$\r\nBEGIN\r\n INSERT INTO \"portal\".\"audit_connector20240814\" (\"id\", \"name\", \"connector_url\", \"type_id\", \"status_id\", \"provider_id\", \"host_id\", \"self_description_document_id\", \"location_id\", \"self_description_message\", \"date_last_changed\", \"company_service_account_id\", \"sd_creation_process_id\", \"last_editor_id\", \"audit_v1id\", \"audit_v1operation_id\", \"audit_v1date_last_changed\", \"audit_v1last_editor_id\") SELECT NEW.\"id\", \r\n NEW.\"name\", \r\n NEW.\"connector_url\", \r\n NEW.\"type_id\", \r\n NEW.\"status_id\", \r\n NEW.\"provider_id\", \r\n NEW.\"host_id\", \r\n NEW.\"self_description_document_id\", \r\n NEW.\"location_id\", \r\n NEW.\"self_description_message\", \r\n NEW.\"date_last_changed\", \r\n NEW.\"company_service_account_id\", \r\n NEW.\"sd_creation_process_id\", \r\n NEW.\"last_editor_id\", \r\n gen_random_uuid(), \r\n 1, \r\n CURRENT_TIMESTAMP, \r\n NEW.\"last_editor_id\";\r\nRETURN NEW;\r\nEND;\r\n$LC_TRIGGER_AFTER_INSERT_CONNECTOR$ LANGUAGE plpgsql;\r\nCREATE TRIGGER LC_TRIGGER_AFTER_INSERT_CONNECTOR AFTER INSERT\r\nON \"portal\".\"connectors\"\r\nFOR EACH ROW EXECUTE PROCEDURE \"portal\".\"LC_TRIGGER_AFTER_INSERT_CONNECTOR\"();"); migrationBuilder.Sql("CREATE FUNCTION \"portal\".\"LC_TRIGGER_AFTER_UPDATE_CONNECTOR\"() RETURNS trigger as $LC_TRIGGER_AFTER_UPDATE_CONNECTOR$\r\nBEGIN\r\n INSERT INTO \"portal\".\"audit_connector20240814\" (\"id\", \"name\", \"connector_url\", \"type_id\", \"status_id\", \"provider_id\", \"host_id\", \"self_description_document_id\", \"location_id\", \"self_description_message\", \"date_last_changed\", \"company_service_account_id\", \"sd_creation_process_id\", \"last_editor_id\", \"audit_v1id\", \"audit_v1operation_id\", \"audit_v1date_last_changed\", \"audit_v1last_editor_id\") SELECT NEW.\"id\", \r\n NEW.\"name\", \r\n NEW.\"connector_url\", \r\n NEW.\"type_id\", \r\n NEW.\"status_id\", \r\n NEW.\"provider_id\", \r\n NEW.\"host_id\", \r\n NEW.\"self_description_document_id\", \r\n NEW.\"location_id\", \r\n NEW.\"self_description_message\", \r\n NEW.\"date_last_changed\", \r\n NEW.\"company_service_account_id\", \r\n NEW.\"sd_creation_process_id\", \r\n NEW.\"last_editor_id\", \r\n gen_random_uuid(), \r\n 2, \r\n CURRENT_TIMESTAMP, \r\n NEW.\"last_editor_id\";\r\nRETURN NEW;\r\nEND;\r\n$LC_TRIGGER_AFTER_UPDATE_CONNECTOR$ LANGUAGE plpgsql;\r\nCREATE TRIGGER LC_TRIGGER_AFTER_UPDATE_CONNECTOR AFTER UPDATE\r\nON \"portal\".\"connectors\"\r\nFOR EACH ROW EXECUTE PROCEDURE \"portal\".\"LC_TRIGGER_AFTER_UPDATE_CONNECTOR\"();"); diff --git a/src/portalbackend/PortalBackend.Migrations/Migrations/PortalDbContextModelSnapshot.cs b/src/portalbackend/PortalBackend.Migrations/Migrations/PortalDbContextModelSnapshot.cs index adb65172c8..c4cc15cb6e 100644 --- a/src/portalbackend/PortalBackend.Migrations/Migrations/PortalDbContextModelSnapshot.cs +++ b/src/portalbackend/PortalBackend.Migrations/Migrations/PortalDbContextModelSnapshot.cs @@ -1,4 +1,4 @@ -/******************************************************************************** +/******************************************************************************** * Copyright (c) 2024 Contributors to the Eclipse Foundation * * See the NOTICE file(s) distributed with this work for additional @@ -961,6 +961,87 @@ protected override void BuildModel(ModelBuilder modelBuilder) }); modelBuilder.Entity("Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.AuditEntities.AuditConnector20240814", 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("CompanyServiceAccountId") + .HasColumnType("uuid") + .HasColumnName("company_service_account_id"); + + b.Property("ConnectorUrl") + .HasColumnType("text") + .HasColumnName("connector_url"); + + b.Property("DateLastChanged") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_last_changed"); + + b.Property("HostId") + .HasColumnType("uuid") + .HasColumnName("host_id"); + + b.Property("Id") + .HasColumnType("uuid") + .HasColumnName("id"); + + b.Property("LastEditorId") + .HasColumnType("uuid") + .HasColumnName("last_editor_id"); + + b.Property("LocationId") + .HasColumnType("text") + .HasColumnName("location_id"); + + b.Property("Name") + .HasColumnType("text") + .HasColumnName("name"); + + b.Property("ProviderId") + .HasColumnType("uuid") + .HasColumnName("provider_id"); + + b.Property("SdCreationProcessId") + .HasColumnType("uuid") + .HasColumnName("sd_creation_process_id"); + + b.Property("SelfDescriptionDocumentId") + .HasColumnType("uuid") + .HasColumnName("self_description_document_id"); + + b.Property("SelfDescriptionMessage") + .HasColumnType("text") + .HasColumnName("self_description_message"); + + b.Property("StatusId") + .HasColumnType("integer") + .HasColumnName("status_id"); + + b.Property("TypeId") + .HasColumnType("integer") + .HasColumnName("type_id"); + + b.HasKey("AuditV1Id") + .HasName("pk_audit_connector20240814"); + + b.ToTable("audit_connector20240814", "portal"); + }); + + modelBuilder.Entity("Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.AuditEntities.AuditConnector20241008", b => { b.Property("AuditV1Id") .ValueGeneratedOnAdd() @@ -1036,9 +1117,9 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasColumnName("type_id"); b.HasKey("AuditV1Id") - .HasName("pk_audit_connector20240814"); + .HasName("pk_audit_connector20241008"); - b.ToTable("audit_connector20240814", "portal"); + b.ToTable("audit_connector20241008", "portal"); }); modelBuilder.Entity("Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.AuditEntities.AuditConsent20230412", b => @@ -2550,7 +2631,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.ToTable("app_instances", "portal"); }); - modelBuilder.Entity("Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Entities.AppInstanceAssignedCompanyServiceAccount", b => + modelBuilder.Entity("Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Entities.AppInstanceAssignedTechnicalUser", b => { b.Property("AppInstanceId") .HasColumnType("uuid") @@ -2561,12 +2642,12 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasColumnName("technical_user_id"); b.HasKey("AppInstanceId", "TechnicalUserId") - .HasName("pk_app_instance_assigned_service_accounts"); + .HasName("pk_app_instance_assigned_technical_users"); b.HasIndex("TechnicalUserId") - .HasDatabaseName("ix_app_instance_assigned_service_accounts_technical_user_id"); + .HasDatabaseName("ix_app_instance_assigned_technical_users_technical_user_id"); - b.ToTable("app_instance_assigned_service_accounts", "portal"); + b.ToTable("app_instance_assigned_technical_users", "portal"); }); modelBuilder.Entity("Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Entities.AppInstanceSetup", b => @@ -4107,8 +4188,8 @@ protected override void BuildModel(ModelBuilder modelBuilder) }); b - .HasAnnotation("LC_TRIGGER_AFTER_INSERT_CONNECTOR", "CREATE FUNCTION \"portal\".\"LC_TRIGGER_AFTER_INSERT_CONNECTOR\"() RETURNS trigger as $LC_TRIGGER_AFTER_INSERT_CONNECTOR$\r\nBEGIN\r\n INSERT INTO \"portal\".\"audit_connector20240814\" (\"id\", \"name\", \"connector_url\", \"type_id\", \"status_id\", \"provider_id\", \"host_id\", \"self_description_document_id\", \"location_id\", \"self_description_message\", \"date_last_changed\", \"technical_user_id\", \"sd_creation_process_id\", \"last_editor_id\", \"audit_v1id\", \"audit_v1operation_id\", \"audit_v1date_last_changed\", \"audit_v1last_editor_id\") SELECT NEW.\"id\", \r\n NEW.\"name\", \r\n NEW.\"connector_url\", \r\n NEW.\"type_id\", \r\n NEW.\"status_id\", \r\n NEW.\"provider_id\", \r\n NEW.\"host_id\", \r\n NEW.\"self_description_document_id\", \r\n NEW.\"location_id\", \r\n NEW.\"self_description_message\", \r\n NEW.\"date_last_changed\", \r\n NEW.\"technical_user_id\", \r\n NEW.\"sd_creation_process_id\", \r\n NEW.\"last_editor_id\", \r\n gen_random_uuid(), \r\n 1, \r\n CURRENT_TIMESTAMP, \r\n NEW.\"last_editor_id\";\r\nRETURN NEW;\r\nEND;\r\n$LC_TRIGGER_AFTER_INSERT_CONNECTOR$ LANGUAGE plpgsql;\r\nCREATE TRIGGER LC_TRIGGER_AFTER_INSERT_CONNECTOR AFTER INSERT\r\nON \"portal\".\"connectors\"\r\nFOR EACH ROW EXECUTE PROCEDURE \"portal\".\"LC_TRIGGER_AFTER_INSERT_CONNECTOR\"();") - .HasAnnotation("LC_TRIGGER_AFTER_UPDATE_CONNECTOR", "CREATE FUNCTION \"portal\".\"LC_TRIGGER_AFTER_UPDATE_CONNECTOR\"() RETURNS trigger as $LC_TRIGGER_AFTER_UPDATE_CONNECTOR$\r\nBEGIN\r\n INSERT INTO \"portal\".\"audit_connector20240814\" (\"id\", \"name\", \"connector_url\", \"type_id\", \"status_id\", \"provider_id\", \"host_id\", \"self_description_document_id\", \"location_id\", \"self_description_message\", \"date_last_changed\", \"technical_user_id\", \"sd_creation_process_id\", \"last_editor_id\", \"audit_v1id\", \"audit_v1operation_id\", \"audit_v1date_last_changed\", \"audit_v1last_editor_id\") SELECT NEW.\"id\", \r\n NEW.\"name\", \r\n NEW.\"connector_url\", \r\n NEW.\"type_id\", \r\n NEW.\"status_id\", \r\n NEW.\"provider_id\", \r\n NEW.\"host_id\", \r\n NEW.\"self_description_document_id\", \r\n NEW.\"location_id\", \r\n NEW.\"self_description_message\", \r\n NEW.\"date_last_changed\", \r\n NEW.\"technical_user_id\", \r\n NEW.\"sd_creation_process_id\", \r\n NEW.\"last_editor_id\", \r\n gen_random_uuid(), \r\n 2, \r\n CURRENT_TIMESTAMP, \r\n NEW.\"last_editor_id\";\r\nRETURN NEW;\r\nEND;\r\n$LC_TRIGGER_AFTER_UPDATE_CONNECTOR$ LANGUAGE plpgsql;\r\nCREATE TRIGGER LC_TRIGGER_AFTER_UPDATE_CONNECTOR AFTER UPDATE\r\nON \"portal\".\"connectors\"\r\nFOR EACH ROW EXECUTE PROCEDURE \"portal\".\"LC_TRIGGER_AFTER_UPDATE_CONNECTOR\"();"); + .HasAnnotation("LC_TRIGGER_AFTER_INSERT_CONNECTOR", "CREATE FUNCTION \"portal\".\"LC_TRIGGER_AFTER_INSERT_CONNECTOR\"() RETURNS trigger as $LC_TRIGGER_AFTER_INSERT_CONNECTOR$\r\nBEGIN\r\n INSERT INTO \"portal\".\"audit_connector20241008\" (\"id\", \"name\", \"connector_url\", \"type_id\", \"status_id\", \"provider_id\", \"host_id\", \"self_description_document_id\", \"location_id\", \"self_description_message\", \"date_last_changed\", \"technical_user_id\", \"sd_creation_process_id\", \"last_editor_id\", \"audit_v1id\", \"audit_v1operation_id\", \"audit_v1date_last_changed\", \"audit_v1last_editor_id\") SELECT NEW.\"id\", \r\n NEW.\"name\", \r\n NEW.\"connector_url\", \r\n NEW.\"type_id\", \r\n NEW.\"status_id\", \r\n NEW.\"provider_id\", \r\n NEW.\"host_id\", \r\n NEW.\"self_description_document_id\", \r\n NEW.\"location_id\", \r\n NEW.\"self_description_message\", \r\n NEW.\"date_last_changed\", \r\n NEW.\"technical_user_id\", \r\n NEW.\"sd_creation_process_id\", \r\n NEW.\"last_editor_id\", \r\n gen_random_uuid(), \r\n 1, \r\n CURRENT_TIMESTAMP, \r\n NEW.\"last_editor_id\";\r\nRETURN NEW;\r\nEND;\r\n$LC_TRIGGER_AFTER_INSERT_CONNECTOR$ LANGUAGE plpgsql;\r\nCREATE TRIGGER LC_TRIGGER_AFTER_INSERT_CONNECTOR AFTER INSERT\r\nON \"portal\".\"connectors\"\r\nFOR EACH ROW EXECUTE PROCEDURE \"portal\".\"LC_TRIGGER_AFTER_INSERT_CONNECTOR\"();") + .HasAnnotation("LC_TRIGGER_AFTER_UPDATE_CONNECTOR", "CREATE FUNCTION \"portal\".\"LC_TRIGGER_AFTER_UPDATE_CONNECTOR\"() RETURNS trigger as $LC_TRIGGER_AFTER_UPDATE_CONNECTOR$\r\nBEGIN\r\n INSERT INTO \"portal\".\"audit_connector20241008\" (\"id\", \"name\", \"connector_url\", \"type_id\", \"status_id\", \"provider_id\", \"host_id\", \"self_description_document_id\", \"location_id\", \"self_description_message\", \"date_last_changed\", \"technical_user_id\", \"sd_creation_process_id\", \"last_editor_id\", \"audit_v1id\", \"audit_v1operation_id\", \"audit_v1date_last_changed\", \"audit_v1last_editor_id\") SELECT NEW.\"id\", \r\n NEW.\"name\", \r\n NEW.\"connector_url\", \r\n NEW.\"type_id\", \r\n NEW.\"status_id\", \r\n NEW.\"provider_id\", \r\n NEW.\"host_id\", \r\n NEW.\"self_description_document_id\", \r\n NEW.\"location_id\", \r\n NEW.\"self_description_message\", \r\n NEW.\"date_last_changed\", \r\n NEW.\"technical_user_id\", \r\n NEW.\"sd_creation_process_id\", \r\n NEW.\"last_editor_id\", \r\n gen_random_uuid(), \r\n 2, \r\n CURRENT_TIMESTAMP, \r\n NEW.\"last_editor_id\";\r\nRETURN NEW;\r\nEND;\r\n$LC_TRIGGER_AFTER_UPDATE_CONNECTOR$ LANGUAGE plpgsql;\r\nCREATE TRIGGER LC_TRIGGER_AFTER_UPDATE_CONNECTOR AFTER UPDATE\r\nON \"portal\".\"connectors\"\r\nFOR EACH ROW EXECUTE PROCEDURE \"portal\".\"LC_TRIGGER_AFTER_UPDATE_CONNECTOR\"();"); }); modelBuilder.Entity("Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Entities.ConnectorAssignedOfferSubscription", b => @@ -7039,7 +7120,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasIndex("ClientClientId") .HasDatabaseName("ix_technical_users_client_client_id") - .HasFilter("client_client_id is not null AND company_service_account_kind_id = 1"); + .HasFilter("client_client_id is not null AND technical_user_kind_id = 1"); b.HasIndex("OfferSubscriptionId") .HasDatabaseName("ix_technical_users_offer_subscription_id"); @@ -7409,7 +7490,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.ToView("agreement_view", "portal"); }); - modelBuilder.Entity("Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Views.CompaniesLinkedServiceAccount", b => + modelBuilder.Entity("Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Views.CompaniesLinkedTechnicalUser", b => { b.Property("TechnicalUserId") .HasColumnType("uuid") @@ -7427,7 +7508,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.ToTable((string)null); - b.ToView("company_linked_service_accounts", "portal"); + b.ToView("company_linked_technical_users", "portal"); }); modelBuilder.Entity("Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Views.CompanyConnectorView", b => @@ -7708,19 +7789,19 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.Navigation("IamClient"); }); - modelBuilder.Entity("Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Entities.AppInstanceAssignedCompanyServiceAccount", b => + modelBuilder.Entity("Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Entities.AppInstanceAssignedTechnicalUser", b => { b.HasOne("Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Entities.AppInstance", "AppInstance") - .WithMany("ServiceAccounts") + .WithMany("AppInstanceAssignedTechnicalUsers") .HasForeignKey("AppInstanceId") .IsRequired() - .HasConstraintName("fk_app_instance_assigned_service_accounts_app_instances_app_in"); + .HasConstraintName("fk_app_instance_assigned_technical_users_app_instances_app_ins"); b.HasOne("Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Entities.TechnicalUser", "TechnicalUser") - .WithMany("AppInstances") + .WithMany("AppInstanceAssignedTechnicalUsers") .HasForeignKey("TechnicalUserId") .IsRequired() - .HasConstraintName("fk_app_instance_assigned_service_accounts_technical_users_tech"); + .HasConstraintName("fk_app_instance_assigned_technical_users_technical_users_techn"); b.Navigation("AppInstance"); @@ -9259,14 +9340,14 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.Navigation("UserRole"); }); - modelBuilder.Entity("Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Views.CompaniesLinkedServiceAccount", b => + modelBuilder.Entity("Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Views.CompaniesLinkedTechnicalUser", b => { b.HasOne("Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Entities.TechnicalUser", "TechnicalUser") - .WithOne("CompaniesLinkedServiceAccount") - .HasForeignKey("Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Views.CompaniesLinkedServiceAccount", "TechnicalUserId") + .WithOne("CompaniesLinkedTechnicalUser") + .HasForeignKey("Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Views.CompaniesLinkedTechnicalUser", "TechnicalUserId") .OnDelete(DeleteBehavior.Cascade) .IsRequired() - .HasConstraintName("fk_company_linked_service_accounts_technical_users_technical_u"); + .HasConstraintName("fk_company_linked_technical_users_technical_users_technical_us"); b.Navigation("TechnicalUser"); }); @@ -9299,9 +9380,9 @@ protected override void BuildModel(ModelBuilder modelBuilder) modelBuilder.Entity("Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Entities.AppInstance", b => { - b.Navigation("AppSubscriptionDetails"); + b.Navigation("AppInstanceAssignedTechnicalUsers"); - b.Navigation("ServiceAccounts"); + b.Navigation("AppSubscriptionDetails"); }); modelBuilder.Entity("Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Entities.ApplicationChecklistEntryStatus", b => @@ -9710,9 +9791,9 @@ protected override void BuildModel(ModelBuilder modelBuilder) modelBuilder.Entity("Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Entities.TechnicalUser", b => { - b.Navigation("AppInstances"); + b.Navigation("AppInstanceAssignedTechnicalUsers"); - b.Navigation("CompaniesLinkedServiceAccount"); + b.Navigation("CompaniesLinkedTechnicalUser"); b.Navigation("Connector"); diff --git a/src/portalbackend/PortalBackend.Migrations/Seeder/BatchInsertSeeder.cs b/src/portalbackend/PortalBackend.Migrations/Seeder/BatchInsertSeeder.cs index b90c97ddec..e3d26dffa5 100644 --- a/src/portalbackend/PortalBackend.Migrations/Seeder/BatchInsertSeeder.cs +++ b/src/portalbackend/PortalBackend.Migrations/Seeder/BatchInsertSeeder.cs @@ -103,7 +103,7 @@ public async Task ExecuteAsync(CancellationToken cancellationToken) await SeedTable("company_identifiers", x => new { x.CompanyId, x.UniqueIdentifierId }, cancellationToken).ConfigureAwait(ConfigureAwaitOptions.None); await SeedTable("country_assigned_identifiers", x => new { x.CountryAlpha2Code, x.UniqueIdentifierId }, cancellationToken).ConfigureAwait(ConfigureAwaitOptions.None); await SeedTable("offer_assigned_privacy_policies", x => new { x.OfferId, x.PrivacyPolicyId }, cancellationToken).ConfigureAwait(ConfigureAwaitOptions.None); - await SeedTable("app_instance_assigned_company_service_accounts", x => new { x.AppInstanceId, x.TechnicalUserId }, cancellationToken).ConfigureAwait(ConfigureAwaitOptions.None); + await SeedTable("app_instance_assigned_technical_users", x => new { x.AppInstanceId, x.TechnicalUserId }, cancellationToken).ConfigureAwait(ConfigureAwaitOptions.None); await SeedTable("technical_user_profile_assigned_user_roles", x => new { x.TechnicalUserProfileId, x.UserRoleId }, cancellationToken).ConfigureAwait(ConfigureAwaitOptions.None); await SeedTable("use_case_descriptions", x => new { x.UseCaseId, x.LanguageShortName }, cancellationToken).ConfigureAwait(ConfigureAwaitOptions.None); await SeedTable("company_user_assigned_identity_providers", e => new { e.CompanyUserId, e.IdentityProviderId }, cancellationToken).ConfigureAwait(ConfigureAwaitOptions.None); diff --git a/src/portalbackend/PortalBackend.Migrations/Seeder/Data/technical_users.json b/src/portalbackend/PortalBackend.Migrations/Seeder/Data/technical_users.json index 2b933c86f0..15197766a5 100644 --- a/src/portalbackend/PortalBackend.Migrations/Seeder/Data/technical_users.json +++ b/src/portalbackend/PortalBackend.Migrations/Seeder/Data/technical_users.json @@ -129,40 +129,40 @@ "id": "48fb21ad-4439-455b-92bb-8c54801e3eab", "name": "sa-cl7-cx-1", "description": "Technical User for the BPDM Portal Gate to consume golden record data from the Pool.", - "company_service_account_type_id": 2, - "company_service_account_kind_id": 1, + "technical_user_type_id": 2, + "technical_user_kind_id": 1, "client_client_id": "sa-cl7-cx-1" }, { "id": "724fda4d-e0c0-4b90-a36f-f11b75cc53cd", "name": "sa-cl7-cx-7", "description": "Technical User for BPDM services to communicate between each other to realize the golden record process: used by the Portal Gate, Pool and Cleaning Service.", - "company_service_account_type_id": 2, - "company_service_account_kind_id": 1, + "technical_user_type_id": 2, + "technical_user_kind_id": 1, "client_client_id": "sa-cl7-cx-7" }, { "id": "d33043a0-ed8f-46b7-9319-8f3f6f052c28", "name": "sa-cl25-cx-1", "description": "Technical User for the BPDM cleaning service dummy component to process golden record tasks from the Orchestrator.", - "company_service_account_type_id": 2, - "company_service_account_kind_id": 1, + "technical_user_type_id": 2, + "technical_user_kind_id": 1, "client_client_id": "sa-cl25-cx-1" }, { "id": "fc729705-adf0-499e-91c7-1e04d817bad8", "name": "sa-cl25-cx-2", "description": "Technical User for the BPDM Pool component to process golden record tasks from the Orchestrator.", - "company_service_account_type_id": 2, - "company_service_account_kind_id": 1, + "technical_user_type_id": 2, + "technical_user_kind_id": 1, "client_client_id": "sa-cl25-cx-2" }, { "id": "c8ab54ea-830e-4f8a-a540-336e0576a619", "name": "sa-cl25-cx-3", "description": "Technical User for the BPDM Portal Gate to create and monitor golden record tasks inside the Orchestrator.", - "company_service_account_type_id": 2, - "company_service_account_kind_id": 1, + "technical_user_type_id": 2, + "technical_user_kind_id": 1, "client_client_id": "sa-cl25-cx-3" } ] diff --git a/src/portalbackend/PortalBackend.PortalEntities/AuditEntities/AuditConnector20240814.cs b/src/portalbackend/PortalBackend.PortalEntities/AuditEntities/AuditConnector20240814.cs index 518eedcad1..a6729cbd2e 100644 --- a/src/portalbackend/PortalBackend.PortalEntities/AuditEntities/AuditConnector20240814.cs +++ b/src/portalbackend/PortalBackend.PortalEntities/AuditEntities/AuditConnector20240814.cs @@ -51,7 +51,7 @@ public class AuditConnector20240814 : IAuditEntityV1 public DateTimeOffset? DateLastChanged { get; private set; } - public Guid? TechnicalUserId { get; set; } + public Guid? CompanyServiceAccountId { get; set; } public Guid? SdCreationProcessId { get; set; } diff --git a/src/portalbackend/PortalBackend.PortalEntities/AuditEntities/AuditConnector20241008.cs b/src/portalbackend/PortalBackend.PortalEntities/AuditEntities/AuditConnector20241008.cs new file mode 100644 index 0000000000..9ef731f4c6 --- /dev/null +++ b/src/portalbackend/PortalBackend.PortalEntities/AuditEntities/AuditConnector20241008.cs @@ -0,0 +1,69 @@ +/******************************************************************************** + * Copyright (c) 202 Contributors to the Eclipse Foundation + * + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. + * + * This program and the accompanying materials are made available under the + * terms of the Apache License, Version 2.0 which is available at + * https://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * SPDX-License-Identifier: Apache-2.0 + ********************************************************************************/ + +using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Auditing; +using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Enums; +using System.ComponentModel.DataAnnotations; + +namespace Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.AuditEntities; + +public class AuditConnector20241008 : IAuditEntityV1 +{ + /// + [Key] + public Guid AuditV1Id { get; set; } + + public Guid Id { get; private set; } + + public string? Name { get; set; } + + public string? ConnectorUrl { get; set; } + + public ConnectorTypeId? TypeId { get; set; } + + public ConnectorStatusId? StatusId { get; set; } + + public Guid? ProviderId { get; set; } + + public Guid? HostId { get; set; } + + public Guid? SelfDescriptionDocumentId { get; set; } + + public string? LocationId { get; set; } + + public string? SelfDescriptionMessage { get; set; } + + public DateTimeOffset? DateLastChanged { get; private set; } + + public Guid? TechnicalUserId { get; set; } + + public Guid? SdCreationProcessId { get; set; } + + [LastEditorV1] + public Guid? LastEditorId { get; set; } + + /// + public DateTimeOffset AuditV1DateLastChanged { get; set; } + + /// + public Guid? AuditV1LastEditorId { get; set; } + + /// + public AuditOperationId AuditV1OperationId { get; set; } +} diff --git a/src/portalbackend/PortalBackend.PortalEntities/Entities/AppInstance.cs b/src/portalbackend/PortalBackend.PortalEntities/Entities/AppInstance.cs index e52974a432..9e329b38c1 100644 --- a/src/portalbackend/PortalBackend.PortalEntities/Entities/AppInstance.cs +++ b/src/portalbackend/PortalBackend.PortalEntities/Entities/AppInstance.cs @@ -27,7 +27,7 @@ public class AppInstance : IBaseEntity private AppInstance() { AppSubscriptionDetails = new HashSet(); - ServiceAccounts = new HashSet(); + AppInstanceAssignedTechnicalUsers = new HashSet(); } public AppInstance(Guid id, Guid appId, Guid iamClientId) : this() @@ -45,5 +45,5 @@ public AppInstance(Guid id, Guid appId, Guid iamClientId) : this() public virtual Offer? App { get; private set; } public virtual IamClient? IamClient { get; private set; } public virtual ICollection AppSubscriptionDetails { get; private set; } - public virtual ICollection ServiceAccounts { get; private set; } + public virtual ICollection AppInstanceAssignedTechnicalUsers { get; private set; } } diff --git a/src/portalbackend/PortalBackend.PortalEntities/Entities/AppInstanceAssignedCompanyServiceAccount.cs b/src/portalbackend/PortalBackend.PortalEntities/Entities/AppInstanceAssignedTechnicalUser.cs similarity index 84% rename from src/portalbackend/PortalBackend.PortalEntities/Entities/AppInstanceAssignedCompanyServiceAccount.cs rename to src/portalbackend/PortalBackend.PortalEntities/Entities/AppInstanceAssignedTechnicalUser.cs index f10502589e..c11991b148 100644 --- a/src/portalbackend/PortalBackend.PortalEntities/Entities/AppInstanceAssignedCompanyServiceAccount.cs +++ b/src/portalbackend/PortalBackend.PortalEntities/Entities/AppInstanceAssignedTechnicalUser.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 @@ -20,13 +19,13 @@ namespace Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Entities; -public class AppInstanceAssignedCompanyServiceAccount +public class AppInstanceAssignedTechnicalUser { - private AppInstanceAssignedCompanyServiceAccount() + private AppInstanceAssignedTechnicalUser() { } - public AppInstanceAssignedCompanyServiceAccount(Guid appInstanceId, Guid technicalUserId) + public AppInstanceAssignedTechnicalUser(Guid appInstanceId, Guid technicalUserId) : this() { AppInstanceId = appInstanceId; diff --git a/src/portalbackend/PortalBackend.PortalEntities/Entities/Connector.cs b/src/portalbackend/PortalBackend.PortalEntities/Entities/Connector.cs index 8a40aa1a98..d02501c95e 100644 --- a/src/portalbackend/PortalBackend.PortalEntities/Entities/Connector.cs +++ b/src/portalbackend/PortalBackend.PortalEntities/Entities/Connector.cs @@ -25,7 +25,7 @@ namespace Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Entities; -[AuditEntityV1(typeof(AuditConnector20240814))] +[AuditEntityV1(typeof(AuditConnector20241008))] public class Connector : IAuditableV1, IBaseEntity { public Connector(Guid id, string name, string locationId, string connectorUrl) diff --git a/src/portalbackend/PortalBackend.PortalEntities/Entities/DimCompanyServiceAccount.cs b/src/portalbackend/PortalBackend.PortalEntities/Entities/ExternalTechnicalUser.cs similarity index 100% rename from src/portalbackend/PortalBackend.PortalEntities/Entities/DimCompanyServiceAccount.cs rename to src/portalbackend/PortalBackend.PortalEntities/Entities/ExternalTechnicalUser.cs diff --git a/src/portalbackend/PortalBackend.PortalEntities/Entities/CompanyServiceAccount.cs b/src/portalbackend/PortalBackend.PortalEntities/Entities/TechnicalUser.cs similarity index 89% rename from src/portalbackend/PortalBackend.PortalEntities/Entities/CompanyServiceAccount.cs rename to src/portalbackend/PortalBackend.PortalEntities/Entities/TechnicalUser.cs index d20d42bd47..0c4212a21d 100644 --- a/src/portalbackend/PortalBackend.PortalEntities/Entities/CompanyServiceAccount.cs +++ b/src/portalbackend/PortalBackend.PortalEntities/Entities/TechnicalUser.cs @@ -35,7 +35,7 @@ public TechnicalUser(Guid id, Guid version, string name, string description, Tec TechnicalUserTypeId = technicalUserTypeId; TechnicalUserKindId = technicalUserKindId; Version = version; - AppInstances = new HashSet(); + AppInstanceAssignedTechnicalUsers = new HashSet(); } /// @@ -62,8 +62,8 @@ public TechnicalUser(Guid id, Guid version, string name, string description, Tec public virtual TechnicalUserKind? TechnicalUserKind { get; set; } public virtual OfferSubscription? OfferSubscription { get; set; } public virtual Connector? Connector { get; set; } - public virtual CompaniesLinkedServiceAccount? CompaniesLinkedServiceAccount { get; private set; } + public virtual CompaniesLinkedTechnicalUser? CompaniesLinkedTechnicalUser { get; private set; } public virtual ExternalTechnicalUser? ExternalTechnicalUser { get; private set; } public virtual DimUserCreationData? DimUserCreationData { get; set; } - public virtual ICollection AppInstances { get; private set; } + public virtual ICollection AppInstanceAssignedTechnicalUsers { get; private set; } } diff --git a/src/portalbackend/PortalBackend.PortalEntities/Entities/CompanyServiceAccountKind.cs b/src/portalbackend/PortalBackend.PortalEntities/Entities/TechnicalUserKind.cs similarity index 100% rename from src/portalbackend/PortalBackend.PortalEntities/Entities/CompanyServiceAccountKind.cs rename to src/portalbackend/PortalBackend.PortalEntities/Entities/TechnicalUserKind.cs diff --git a/src/portalbackend/PortalBackend.PortalEntities/Entities/CompanyServiceAccountType.cs b/src/portalbackend/PortalBackend.PortalEntities/Entities/TechnicalUserType.cs similarity index 100% rename from src/portalbackend/PortalBackend.PortalEntities/Entities/CompanyServiceAccountType.cs rename to src/portalbackend/PortalBackend.PortalEntities/Entities/TechnicalUserType.cs diff --git a/src/portalbackend/PortalBackend.PortalEntities/PortalDbContext.cs b/src/portalbackend/PortalBackend.PortalEntities/PortalDbContext.cs index c7a9d6c6aa..cd18b3ca77 100644 --- a/src/portalbackend/PortalBackend.PortalEntities/PortalDbContext.cs +++ b/src/portalbackend/PortalBackend.PortalEntities/PortalDbContext.cs @@ -56,7 +56,7 @@ public PortalDbContext(DbContextOptions options, IAuditHandler public virtual DbSet AgreementAssignedOfferTypes { get; set; } = default!; public virtual DbSet AgreementCategories { get; set; } = default!; public virtual DbSet AppInstances { get; set; } = default!; - public virtual DbSet AppInstanceAssignedServiceAccounts { get; set; } = default!; + public virtual DbSet AppInstanceAssignedTechnicalUsers { get; set; } = default!; public virtual DbSet AppInstanceSetups { get; set; } = default!; public virtual DbSet AppAssignedUseCases { get; set; } = default!; public virtual DbSet AppLanguages { get; set; } = default!; @@ -85,6 +85,7 @@ public PortalDbContext(DbContextOptions options, IAuditHandler public virtual DbSet AuditConnector20230803 { get; set; } = default!; public virtual DbSet AuditConnector20231115 { get; set; } = default!; public virtual DbSet AuditConnector20240814 { get; set; } = default!; + public virtual DbSet AuditConnector20241008 { get; set; } = default!; public virtual DbSet AuditIdentity20230526 { get; set; } = default!; public virtual DbSet AuditIdentity20231115 { get; set; } = default!; public virtual DbSet AuditUserRole20221017 { get; set; } = default!; @@ -196,7 +197,7 @@ public PortalDbContext(DbContextOptions options, IAuditHandler public virtual DbSet UserRoleCollections { get; set; } = default!; public virtual DbSet UserRoleCollectionDescriptions { get; set; } = default!; public virtual DbSet UserRoleDescriptions { get; set; } = default!; - public virtual DbSet CompanyLinkedServiceAccounts { get; set; } = default!; + public virtual DbSet CompanyLinkedTechnicalUsers { get; set; } = default!; public virtual DbSet OfferSubscriptionView { get; set; } = default!; public virtual DbSet CompanyUsersView { get; set; } = default!; public virtual DbSet CompanyIdpView { get; set; } = default!; @@ -467,15 +468,15 @@ protected override void OnModelCreating(ModelBuilder modelBuilder) .OnDelete(DeleteBehavior.SetNull); }); - modelBuilder.Entity(entity => + modelBuilder.Entity(entity => { entity.HasKey(x => new { x.AppInstanceId, x.TechnicalUserId }); entity.HasOne(x => x.AppInstance) - .WithMany(x => x.ServiceAccounts) + .WithMany(x => x.AppInstanceAssignedTechnicalUsers) .HasForeignKey(x => x.AppInstanceId) .OnDelete(DeleteBehavior.ClientSetNull); entity.HasOne(x => x.TechnicalUser) - .WithMany(x => x.AppInstances) + .WithMany(x => x.AppInstanceAssignedTechnicalUsers) .HasForeignKey(x => x.TechnicalUserId) .OnDelete(DeleteBehavior.ClientSetNull); }); @@ -879,7 +880,7 @@ protected override void OnModelCreating(ModelBuilder modelBuilder) .OnDelete(DeleteBehavior.ClientSetNull); entity.HasIndex(x => x.ClientClientId) - .HasFilter("client_client_id is not null AND company_service_account_kind_id = 1"); + .HasFilter("client_client_id is not null AND technical_user_kind_id = 1"); entity.ToTable("technical_users"); }); @@ -1123,7 +1124,7 @@ protected override void OnModelCreating(ModelBuilder modelBuilder) .HasForeignKey(d => d.SdCreationProcessId) .OnDelete(DeleteBehavior.ClientSetNull); - entity.HasAuditV1Triggers(); + entity.HasAuditV1Triggers(); }); modelBuilder.Entity() @@ -1366,8 +1367,8 @@ protected override void OnModelCreating(ModelBuilder modelBuilder) .OnDelete(DeleteBehavior.ClientSetNull); }); - modelBuilder.Entity() - .ToView("company_linked_service_accounts", "portal") + modelBuilder.Entity() + .ToView("company_linked_technical_users", "portal") .HasKey(x => x.TechnicalUserId); modelBuilder.Entity(entity => @@ -1402,9 +1403,13 @@ protected override void OnModelCreating(ModelBuilder modelBuilder) .HasNoKey(); modelBuilder.Entity(entity => { - entity.HasOne(x => x.CompaniesLinkedServiceAccount) + // the relationship to view company_linked_technical_users is defined to use the respective navigational property in LINQ. + // when executing 'dotnet ef migrations add' ef will autocreate a fk-constraint. As this ain't work with views + // the creation of this fk-constraint must be manually removed from the respective migration. + // The navigational property will nevertheless work as it does not depend on the contraint. + entity.HasOne(x => x.CompaniesLinkedTechnicalUser) .WithOne(x => x.TechnicalUser) - .HasForeignKey(x => x.TechnicalUserId); + .HasForeignKey(x => x.TechnicalUserId); }); modelBuilder.Entity() diff --git a/src/portalbackend/PortalBackend.PortalEntities/Views/CompaniesLinkedServiceAccount.cs b/src/portalbackend/PortalBackend.PortalEntities/Views/CompaniesLinkedTechnicalUser.cs similarity index 94% rename from src/portalbackend/PortalBackend.PortalEntities/Views/CompaniesLinkedServiceAccount.cs rename to src/portalbackend/PortalBackend.PortalEntities/Views/CompaniesLinkedTechnicalUser.cs index 9070d13e2c..d9b1edd15c 100644 --- a/src/portalbackend/PortalBackend.PortalEntities/Views/CompaniesLinkedServiceAccount.cs +++ b/src/portalbackend/PortalBackend.PortalEntities/Views/CompaniesLinkedTechnicalUser.cs @@ -1,5 +1,4 @@ /******************************************************************************** - * Copyright (c) 2023 BMW Group AG * Copyright (c) 2023 Contributors to the Eclipse Foundation * * See the NOTICE file(s) distributed with this work for additional @@ -22,7 +21,7 @@ namespace Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Views; -public class CompaniesLinkedServiceAccount +public class CompaniesLinkedTechnicalUser { public Guid TechnicalUserId { get; private set; } public Guid Owners { get; private set; } diff --git a/tests/marketplace/Offers.Library.Tests/Service/OfferSetupServiceTests.cs b/tests/marketplace/Offers.Library.Tests/Service/OfferSetupServiceTests.cs index bc24501d0c..6beb983321 100644 --- a/tests/marketplace/Offers.Library.Tests/Service/OfferSetupServiceTests.cs +++ b/tests/marketplace/Offers.Library.Tests/Service/OfferSetupServiceTests.cs @@ -431,7 +431,7 @@ public async Task ActivateSingleInstanceAppAsync_WithValidData_ReturnsExpected() // Assert result.Should().NotBeNull(); - appInstance.ServiceAccounts.Should().HaveCount(1); + appInstance.AppInstanceAssignedTechnicalUsers.Should().HaveCount(1); A.CallTo(() => _provisioningManager.EnableClient(A._)) .MustHaveHappenedOnceExactly(); A.CallTo(() => enumerator.MoveNext()) @@ -1566,10 +1566,10 @@ private void SetupCreateSingleInstance(AppInstance? appInstance = null) .Invokes((IEnumerable<(Guid AppInstanceId, Guid CompanyServiceAccountId)> instanceAccounts) => { foreach (var i in instanceAccounts.Select(x => - new AppInstanceAssignedCompanyServiceAccount(x.AppInstanceId, + new AppInstanceAssignedTechnicalUser(x.AppInstanceId, x.CompanyServiceAccountId))) { - appInstance.ServiceAccounts.Add(i); + appInstance.AppInstanceAssignedTechnicalUsers.Add(i); } }); } diff --git a/tests/portalbackend/PortalBackend.DBAccess.Tests/AppInstanceRepositoryTests.cs b/tests/portalbackend/PortalBackend.DBAccess.Tests/AppInstanceRepositoryTests.cs index e87212e4ba..db5be368e9 100644 --- a/tests/portalbackend/PortalBackend.DBAccess.Tests/AppInstanceRepositoryTests.cs +++ b/tests/portalbackend/PortalBackend.DBAccess.Tests/AppInstanceRepositoryTests.cs @@ -176,7 +176,7 @@ public async Task RemoveAppInstanceAssignedServiceAccounts_Success() changedEntries.Should().NotBeEmpty(); changedEntries.Should().HaveCount(1); var entry = changedEntries.Single(); - entry.Entity.Should().BeOfType(); + entry.Entity.Should().BeOfType(); entry.State.Should().Be(EntityState.Deleted); } diff --git a/tests/portalbackend/PortalBackend.DBAccess.Tests/Seeder/Data/app_instance_assigned_company_service_accounts.unittest.json b/tests/portalbackend/PortalBackend.DBAccess.Tests/Seeder/Data/app_instance_assigned_technical_users.unittest.json similarity index 51% rename from tests/portalbackend/PortalBackend.DBAccess.Tests/Seeder/Data/app_instance_assigned_company_service_accounts.unittest.json rename to tests/portalbackend/PortalBackend.DBAccess.Tests/Seeder/Data/app_instance_assigned_technical_users.unittest.json index 497c332bd9..8c5d919582 100644 --- a/tests/portalbackend/PortalBackend.DBAccess.Tests/Seeder/Data/app_instance_assigned_company_service_accounts.unittest.json +++ b/tests/portalbackend/PortalBackend.DBAccess.Tests/Seeder/Data/app_instance_assigned_technical_users.unittest.json @@ -1,6 +1,6 @@ [ { "app_instance_id": "ab25c218-9ab3-4f1a-b6f4-6394fbc33c5a", - "company_service_account_id": "7e85a0b8-0001-ab67-10d1-0ef508201007" + "technical_user_id": "7e85a0b8-0001-ab67-10d1-0ef508201007" } ] \ No newline at end of file diff --git a/tests/portalbackend/PortalBackend.DBAccess.Tests/Seeder/Data/connectors.unittest.json b/tests/portalbackend/PortalBackend.DBAccess.Tests/Seeder/Data/connectors.unittest.json index 98d03efe94..0f53546dce 100644 --- a/tests/portalbackend/PortalBackend.DBAccess.Tests/Seeder/Data/connectors.unittest.json +++ b/tests/portalbackend/PortalBackend.DBAccess.Tests/Seeder/Data/connectors.unittest.json @@ -20,7 +20,7 @@ "host_id": "2dc4249f-b5ca-4d42-bef1-7a7a950a4f87", "location_id": "DE", "self_description_document_id": null, - "company_service_account_id": "cd436931-8399-4c1d-bd81-7dffb298c7ca" + "technical_user_id": "cd436931-8399-4c1d-bd81-7dffb298c7ca" }, { "id": "727365d6-5599-4598-a888-58733fa138e7", @@ -76,7 +76,7 @@ "host_id": "2dc4249f-b5ca-4d42-bef1-7a7a950a4f87", "location_id": "DE", "self_description_document_id": null, - "company_service_account_id": "d0c8ae19-d4f3-49cc-9cb4-6c766d4680f4" + "technical_user_id": "d0c8ae19-d4f3-49cc-9cb4-6c766d4680f4" }, { "id": "4618c650-709c-4580-956a-85b76eecd4b8",