diff --git a/src/Infrastructure.EntityFramework/Dirt/Configurations/OrganizationApplicationEntityTypeConfiguration.cs b/src/Infrastructure.EntityFramework/Dirt/Configurations/OrganizationApplicationEntityTypeConfiguration.cs
index 82007ff98e..bf0d7d011a 100644
--- a/src/Infrastructure.EntityFramework/Dirt/Configurations/OrganizationApplicationEntityTypeConfiguration.cs
+++ b/src/Infrastructure.EntityFramework/Dirt/Configurations/OrganizationApplicationEntityTypeConfiguration.cs
@@ -19,6 +19,12 @@ public class OrganizationApplicationEntityTypeConfiguration : IEntityTypeConfigu
.HasIndex(s => s.OrganizationId)
.IsClustered(false);
+ builder
+ .HasOne(s => s.Organization)
+ .WithMany()
+ .HasForeignKey(s => s.OrganizationId)
+ .OnDelete(DeleteBehavior.Cascade);
+
builder.ToTable(nameof(OrganizationApplication));
}
}
diff --git a/src/Infrastructure.EntityFramework/Dirt/Configurations/OrganizationReportEntityTypeConfiguration.cs b/src/Infrastructure.EntityFramework/Dirt/Configurations/OrganizationReportEntityTypeConfiguration.cs
index 1fc281d61e..99794d11a2 100644
--- a/src/Infrastructure.EntityFramework/Dirt/Configurations/OrganizationReportEntityTypeConfiguration.cs
+++ b/src/Infrastructure.EntityFramework/Dirt/Configurations/OrganizationReportEntityTypeConfiguration.cs
@@ -19,6 +19,12 @@ public class OrganizationReportEntityTypeConfiguration : IEntityTypeConfiguratio
.HasIndex(s => s.OrganizationId)
.IsClustered(false);
+ builder
+ .HasOne(s => s.Organization)
+ .WithMany()
+ .HasForeignKey(s => s.OrganizationId)
+ .OnDelete(DeleteBehavior.Cascade);
+
builder.ToTable(nameof(OrganizationReport));
}
}
diff --git a/src/Sql/dbo/Stored Procedures/Organization_DeleteById.sql b/src/Sql/dbo/Stored Procedures/Organization_DeleteById.sql
index 2daa12209f..007c6fc432 100644
--- a/src/Sql/dbo/Stored Procedures/Organization_DeleteById.sql
+++ b/src/Sql/dbo/Stored Procedures/Organization_DeleteById.sql
@@ -137,6 +137,20 @@ BEGIN
WHERE
[OrganizationId] = @Id
+ -- Delete Organization Application
+ DELETE
+ FROM
+ [dbo].[OrganizationApplication]
+ WHERE
+ [Id] = @Id
+
+ -- Delete Organization Report
+ DELETE
+ FROM
+ [dbo].[OrganizationReport]
+ WHERE
+ [Id] = @Id
+
DELETE
FROM
[dbo].[Organization]
diff --git a/util/Migrator/DbScripts/2025-06-10_02_UpdateOrgDeleteByIdProc.sql b/util/Migrator/DbScripts/2025-06-10_02_UpdateOrgDeleteByIdProc.sql
index e69de29bb2..493cc1c0ac 100644
--- a/util/Migrator/DbScripts/2025-06-10_02_UpdateOrgDeleteByIdProc.sql
+++ b/util/Migrator/DbScripts/2025-06-10_02_UpdateOrgDeleteByIdProc.sql
@@ -0,0 +1,161 @@
+CREATE OR ALTER PROCEDURE [dbo].[dbo].[Organization_DeleteById]
+ @OrganizationId UNIQUEIDENTIFIER
+WITH RECOMPILE
+AS
+BEGIN
+ SET NOCOUNT ON
+
+ EXEC [dbo].[User_BumpAccountRevisionDateByOrganizationId] @Id
+
+ DECLARE @BatchSize INT = 100
+ WHILE @BatchSize > 0
+BEGIN
+BEGIN TRANSACTION Organization_DeleteById_Ciphers
+
+ DELETE TOP(@BatchSize)
+ FROM
+ [dbo].[Cipher]
+ WHERE
+ [UserId] IS NULL
+ AND [OrganizationId] = @Id
+
+ SET @BatchSize = @@ROWCOUNT
+
+ COMMIT TRANSACTION Organization_DeleteById_Ciphers
+END
+
+BEGIN TRANSACTION Organization_DeleteById
+
+DELETE
+FROM
+ [dbo].[AuthRequest]
+WHERE
+ [OrganizationId] = @Id
+
+DELETE
+FROM
+ [dbo].[SsoUser]
+WHERE
+ [OrganizationId] = @Id
+
+DELETE
+FROM
+ [dbo].[SsoConfig]
+WHERE
+ [OrganizationId] = @Id
+
+DELETE CU
+ FROM
+ [dbo].[CollectionUser] CU
+ INNER JOIN
+ [dbo].[OrganizationUser] OU ON [CU].[OrganizationUserId] = [OU].[Id]
+ WHERE
+ [OU].[OrganizationId] = @Id
+
+ DELETE AP
+ FROM
+ [dbo].[AccessPolicy] AP
+ INNER JOIN
+ [dbo].[OrganizationUser] OU ON [AP].[OrganizationUserId] = [OU].[Id]
+ WHERE
+ [OU].[OrganizationId] = @Id
+
+ DELETE GU
+ FROM
+ [dbo].[GroupUser] GU
+ INNER JOIN
+ [dbo].[OrganizationUser] OU ON [GU].[OrganizationUserId] = [OU].[Id]
+ WHERE
+ [OU].[OrganizationId] = @Id
+
+DELETE
+FROM
+ [dbo].[OrganizationUser]
+WHERE
+ [OrganizationId] = @Id
+
+DELETE
+FROM
+ [dbo].[ProviderOrganization]
+WHERE
+ [OrganizationId] = @Id
+
+ EXEC [dbo].[OrganizationApiKey_OrganizationDeleted] @Id
+ EXEC [dbo].[OrganizationConnection_OrganizationDeleted] @Id
+ EXEC [dbo].[OrganizationSponsorship_OrganizationDeleted] @Id
+ EXEC [dbo].[OrganizationDomain_OrganizationDeleted] @Id
+ EXEC [dbo].[OrganizationIntegration_OrganizationDeleted] @Id
+
+DELETE
+FROM
+ [dbo].[Project]
+WHERE
+ [OrganizationId] = @Id
+
+DELETE
+FROM
+ [dbo].[Secret]
+WHERE
+ [OrganizationId] = @Id
+
+DELETE AK
+ FROM
+ [dbo].[ApiKey] AK
+ INNER JOIN
+ [dbo].[ServiceAccount] SA ON [AK].[ServiceAccountId] = [SA].[Id]
+ WHERE
+ [SA].[OrganizationId] = @Id
+
+ DELETE AP
+ FROM
+ [dbo].[AccessPolicy] AP
+ INNER JOIN
+ [dbo].[ServiceAccount] SA ON [AP].[GrantedServiceAccountId] = [SA].[Id]
+ WHERE
+ [SA].[OrganizationId] = @Id
+
+DELETE
+FROM
+ [dbo].[ServiceAccount]
+WHERE
+ [OrganizationId] = @Id
+
+-- Delete Notification Status
+DELETE
+NS
+ FROM
+ [dbo].[NotificationStatus] NS
+ INNER JOIN
+ [dbo].[Notification] N ON N.[Id] = NS.[NotificationId]
+ WHERE
+ N.[OrganizationId] = @Id
+
+ -- Delete Notification
+DELETE
+FROM
+ [dbo].[Notification]
+WHERE
+ [OrganizationId] = @Id
+
+-- Delete Organization Application
+DELETE
+FROM
+ [dbo].[OrganizationApplication]
+WHERE
+ [Id] = @Id
+
+-- Delete Organization Report
+DELETE
+FROM
+ [dbo].[OrganizationReport]
+WHERE
+ [Id] = @Id
+
+DELETE
+FROM
+ [dbo].[Organization]
+WHERE
+ [Id] = @Id
+
+ COMMIT TRANSACTION Organization_DeleteById
+END
diff --git a/util/PostgresMigrations/Migrations/20250610164247_2025-06-10-00_OrganizationReport.sql.Designer.cs b/util/PostgresMigrations/Migrations/20250610164247_2025-06-10-00_OrganizationReport.sql.Designer.cs
new file mode 100644
index 0000000000..1ee3373bf8
--- /dev/null
+++ b/util/PostgresMigrations/Migrations/20250610164247_2025-06-10-00_OrganizationReport.sql.Designer.cs
@@ -0,0 +1,3204 @@
+//
+using System;
+using Bit.Infrastructure.EntityFramework.Repositories;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
+
+#nullable disable
+
+namespace Bit.PostgresMigrations.Migrations
+{
+ [DbContext(typeof(DatabaseContext))]
+ [Migration("20250610164247_2025-06-10-00_OrganizationReport.sql")]
+ partial class _2025061000_OrganizationReportsql
+ {
+ ///
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("Npgsql:CollationDefinition:postgresIndetermanisticCollation", "en-u-ks-primary,en-u-ks-primary,icu,False")
+ .HasAnnotation("ProductVersion", "8.0.8")
+ .HasAnnotation("Relational:MaxIdentifierLength", 63);
+
+ NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
+
+ modelBuilder.Entity("Bit.Infrastructure.EntityFramework.AdminConsole.Models.Organization", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uuid");
+
+ b.Property("AllowAdminAccessToAllCollectionItems")
+ .HasColumnType("boolean")
+ .HasDefaultValue(true);
+
+ b.Property("BillingEmail")
+ .IsRequired()
+ .HasMaxLength(256)
+ .HasColumnType("character varying(256)");
+
+ b.Property("BusinessAddress1")
+ .HasMaxLength(50)
+ .HasColumnType("character varying(50)");
+
+ b.Property("BusinessAddress2")
+ .HasMaxLength(50)
+ .HasColumnType("character varying(50)");
+
+ b.Property("BusinessAddress3")
+ .HasMaxLength(50)
+ .HasColumnType("character varying(50)");
+
+ b.Property("BusinessCountry")
+ .HasMaxLength(2)
+ .HasColumnType("character varying(2)");
+
+ b.Property("BusinessName")
+ .HasMaxLength(50)
+ .HasColumnType("character varying(50)");
+
+ b.Property("BusinessTaxNumber")
+ .HasMaxLength(30)
+ .HasColumnType("character varying(30)");
+
+ b.Property("CreationDate")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("Enabled")
+ .HasColumnType("boolean");
+
+ b.Property("ExpirationDate")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("Gateway")
+ .HasColumnType("smallint");
+
+ b.Property("GatewayCustomerId")
+ .HasMaxLength(50)
+ .HasColumnType("character varying(50)");
+
+ b.Property("GatewaySubscriptionId")
+ .HasMaxLength(50)
+ .HasColumnType("character varying(50)");
+
+ b.Property("Identifier")
+ .HasMaxLength(50)
+ .HasColumnType("character varying(50)")
+ .UseCollation("postgresIndetermanisticCollation");
+
+ b.Property("LicenseKey")
+ .HasMaxLength(100)
+ .HasColumnType("character varying(100)");
+
+ b.Property("LimitCollectionCreation")
+ .HasColumnType("boolean");
+
+ b.Property("LimitCollectionDeletion")
+ .HasColumnType("boolean");
+
+ b.Property("LimitItemDeletion")
+ .HasColumnType("boolean");
+
+ b.Property("MaxAutoscaleSeats")
+ .HasColumnType("integer");
+
+ b.Property("MaxAutoscaleSmSeats")
+ .HasColumnType("integer");
+
+ b.Property("MaxAutoscaleSmServiceAccounts")
+ .HasColumnType("integer");
+
+ b.Property("MaxCollections")
+ .HasColumnType("smallint");
+
+ b.Property("MaxStorageGb")
+ .HasColumnType("smallint");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasMaxLength(50)
+ .HasColumnType("character varying(50)");
+
+ b.Property("OwnersNotifiedOfAutoscaling")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("Plan")
+ .IsRequired()
+ .HasMaxLength(50)
+ .HasColumnType("character varying(50)");
+
+ b.Property("PlanType")
+ .HasColumnType("smallint");
+
+ b.Property("PrivateKey")
+ .HasColumnType("text");
+
+ b.Property("PublicKey")
+ .HasColumnType("text");
+
+ b.Property("ReferenceData")
+ .HasColumnType("text");
+
+ b.Property("RevisionDate")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("Seats")
+ .HasColumnType("integer");
+
+ b.Property("SelfHost")
+ .HasColumnType("boolean");
+
+ b.Property("SmSeats")
+ .HasColumnType("integer");
+
+ b.Property("SmServiceAccounts")
+ .HasColumnType("integer");
+
+ b.Property("Status")
+ .HasColumnType("smallint");
+
+ b.Property("Storage")
+ .HasColumnType("bigint");
+
+ b.Property("TwoFactorProviders")
+ .HasColumnType("text");
+
+ b.Property("Use2fa")
+ .HasColumnType("boolean");
+
+ b.Property("UseAdminSponsoredFamilies")
+ .HasColumnType("boolean");
+
+ b.Property("UseApi")
+ .HasColumnType("boolean");
+
+ b.Property("UseCustomPermissions")
+ .HasColumnType("boolean");
+
+ b.Property("UseDirectory")
+ .HasColumnType("boolean");
+
+ b.Property("UseEvents")
+ .HasColumnType("boolean");
+
+ b.Property("UseGroups")
+ .HasColumnType("boolean");
+
+ b.Property("UseKeyConnector")
+ .HasColumnType("boolean");
+
+ b.Property("UseOrganizationDomains")
+ .HasColumnType("boolean");
+
+ b.Property("UsePasswordManager")
+ .HasColumnType("boolean");
+
+ b.Property("UsePolicies")
+ .HasColumnType("boolean");
+
+ b.Property("UseResetPassword")
+ .HasColumnType("boolean");
+
+ b.Property("UseRiskInsights")
+ .HasColumnType("boolean");
+
+ b.Property("UseScim")
+ .HasColumnType("boolean");
+
+ b.Property("UseSecretsManager")
+ .HasColumnType("boolean");
+
+ b.Property("UseSso")
+ .HasColumnType("boolean");
+
+ b.Property("UseTotp")
+ .HasColumnType("boolean");
+
+ b.Property("UsersGetPremium")
+ .HasColumnType("boolean");
+
+ b.HasKey("Id");
+
+ b.HasIndex("Id", "Enabled");
+
+ NpgsqlIndexBuilderExtensions.IncludeProperties(b.HasIndex("Id", "Enabled"), new[] { "UseTotp" });
+
+ b.ToTable("Organization", (string)null);
+ });
+
+ modelBuilder.Entity("Bit.Infrastructure.EntityFramework.AdminConsole.Models.OrganizationIntegration", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uuid");
+
+ b.Property("Configuration")
+ .HasColumnType("text");
+
+ b.Property("CreationDate")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("OrganizationId")
+ .HasColumnType("uuid");
+
+ b.Property("RevisionDate")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("Type")
+ .HasColumnType("integer");
+
+ b.HasKey("Id");
+
+ b.HasIndex("OrganizationId")
+ .HasAnnotation("SqlServer:Clustered", false);
+
+ b.HasIndex("OrganizationId", "Type")
+ .IsUnique()
+ .HasAnnotation("SqlServer:Clustered", false);
+
+ b.ToTable("OrganizationIntegration", (string)null);
+ });
+
+ modelBuilder.Entity("Bit.Infrastructure.EntityFramework.AdminConsole.Models.OrganizationIntegrationConfiguration", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uuid");
+
+ b.Property("Configuration")
+ .HasColumnType("text");
+
+ b.Property("CreationDate")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("EventType")
+ .HasColumnType("integer");
+
+ b.Property("OrganizationIntegrationId")
+ .HasColumnType("uuid");
+
+ b.Property("RevisionDate")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("Template")
+ .HasColumnType("text");
+
+ b.HasKey("Id");
+
+ b.HasIndex("OrganizationIntegrationId");
+
+ b.ToTable("OrganizationIntegrationConfiguration", (string)null);
+ });
+
+ modelBuilder.Entity("Bit.Infrastructure.EntityFramework.AdminConsole.Models.Policy", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uuid");
+
+ b.Property("CreationDate")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("Data")
+ .HasColumnType("text");
+
+ b.Property("Enabled")
+ .HasColumnType("boolean");
+
+ b.Property("OrganizationId")
+ .HasColumnType("uuid");
+
+ b.Property("RevisionDate")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("Type")
+ .HasColumnType("smallint");
+
+ b.HasKey("Id");
+
+ b.HasIndex("OrganizationId")
+ .HasAnnotation("SqlServer:Clustered", false);
+
+ b.HasIndex("OrganizationId", "Type")
+ .IsUnique()
+ .HasAnnotation("SqlServer:Clustered", false);
+
+ b.ToTable("Policy", (string)null);
+ });
+
+ modelBuilder.Entity("Bit.Infrastructure.EntityFramework.AdminConsole.Models.Provider.Provider", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uuid");
+
+ b.Property("BillingEmail")
+ .HasColumnType("text");
+
+ b.Property("BillingPhone")
+ .HasColumnType("text");
+
+ b.Property("BusinessAddress1")
+ .HasColumnType("text");
+
+ b.Property("BusinessAddress2")
+ .HasColumnType("text");
+
+ b.Property("BusinessAddress3")
+ .HasColumnType("text");
+
+ b.Property("BusinessCountry")
+ .HasColumnType("text");
+
+ b.Property("BusinessName")
+ .HasColumnType("text");
+
+ b.Property("BusinessTaxNumber")
+ .HasColumnType("text");
+
+ b.Property("CreationDate")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("DiscountId")
+ .HasColumnType("text");
+
+ b.Property("Enabled")
+ .HasColumnType("boolean");
+
+ b.Property("Gateway")
+ .HasColumnType("smallint");
+
+ b.Property("GatewayCustomerId")
+ .HasColumnType("text");
+
+ b.Property("GatewaySubscriptionId")
+ .HasColumnType("text");
+
+ b.Property("Name")
+ .HasColumnType("text");
+
+ b.Property("RevisionDate")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("Status")
+ .HasColumnType("smallint");
+
+ b.Property("Type")
+ .HasColumnType("smallint");
+
+ b.Property("UseEvents")
+ .HasColumnType("boolean");
+
+ b.HasKey("Id");
+
+ b.ToTable("Provider", (string)null);
+ });
+
+ modelBuilder.Entity("Bit.Infrastructure.EntityFramework.AdminConsole.Models.Provider.ProviderOrganization", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uuid");
+
+ b.Property("CreationDate")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("Key")
+ .HasColumnType("text");
+
+ b.Property("OrganizationId")
+ .HasColumnType("uuid");
+
+ b.Property("ProviderId")
+ .HasColumnType("uuid");
+
+ b.Property("RevisionDate")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("Settings")
+ .HasColumnType("text");
+
+ b.HasKey("Id");
+
+ b.HasIndex("OrganizationId");
+
+ b.HasIndex("ProviderId");
+
+ b.ToTable("ProviderOrganization", (string)null);
+ });
+
+ modelBuilder.Entity("Bit.Infrastructure.EntityFramework.AdminConsole.Models.Provider.ProviderUser", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uuid");
+
+ b.Property("CreationDate")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("Email")
+ .HasColumnType("text");
+
+ b.Property("Key")
+ .HasColumnType("text");
+
+ b.Property("Permissions")
+ .HasColumnType("text");
+
+ b.Property("ProviderId")
+ .HasColumnType("uuid");
+
+ b.Property("RevisionDate")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("Status")
+ .HasColumnType("smallint");
+
+ b.Property("Type")
+ .HasColumnType("smallint");
+
+ b.Property("UserId")
+ .HasColumnType("uuid");
+
+ b.HasKey("Id");
+
+ b.HasIndex("ProviderId");
+
+ b.HasIndex("UserId");
+
+ b.ToTable("ProviderUser", (string)null);
+ });
+
+ modelBuilder.Entity("Bit.Infrastructure.EntityFramework.Auth.Models.AuthRequest", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uuid");
+
+ b.Property("AccessCode")
+ .HasMaxLength(25)
+ .HasColumnType("character varying(25)");
+
+ b.Property("Approved")
+ .HasColumnType("boolean");
+
+ b.Property("AuthenticationDate")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("CreationDate")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("Key")
+ .HasColumnType("text");
+
+ b.Property("MasterPasswordHash")
+ .HasColumnType("text");
+
+ b.Property("OrganizationId")
+ .HasColumnType("uuid");
+
+ b.Property("PublicKey")
+ .HasColumnType("text");
+
+ b.Property("RequestCountryName")
+ .HasMaxLength(200)
+ .HasColumnType("character varying(200)");
+
+ b.Property("RequestDeviceIdentifier")
+ .HasMaxLength(50)
+ .HasColumnType("character varying(50)");
+
+ b.Property("RequestDeviceType")
+ .HasColumnType("smallint");
+
+ b.Property("RequestIpAddress")
+ .HasMaxLength(50)
+ .HasColumnType("character varying(50)");
+
+ b.Property("ResponseDate")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("ResponseDeviceId")
+ .HasColumnType("uuid");
+
+ b.Property("Type")
+ .HasColumnType("smallint");
+
+ b.Property("UserId")
+ .HasColumnType("uuid");
+
+ b.HasKey("Id");
+
+ b.HasIndex("OrganizationId");
+
+ b.HasIndex("ResponseDeviceId");
+
+ b.HasIndex("UserId");
+
+ b.ToTable("AuthRequest", (string)null);
+ });
+
+ modelBuilder.Entity("Bit.Infrastructure.EntityFramework.Auth.Models.EmergencyAccess", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uuid");
+
+ b.Property("CreationDate")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("Email")
+ .HasMaxLength(256)
+ .HasColumnType("character varying(256)");
+
+ b.Property("GranteeId")
+ .HasColumnType("uuid");
+
+ b.Property("GrantorId")
+ .HasColumnType("uuid");
+
+ b.Property("KeyEncrypted")
+ .HasColumnType("text");
+
+ b.Property("LastNotificationDate")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("RecoveryInitiatedDate")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("RevisionDate")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("Status")
+ .HasColumnType("smallint");
+
+ b.Property("Type")
+ .HasColumnType("smallint");
+
+ b.Property("WaitTimeDays")
+ .HasColumnType("integer");
+
+ b.HasKey("Id");
+
+ b.HasIndex("GranteeId");
+
+ b.HasIndex("GrantorId");
+
+ b.ToTable("EmergencyAccess", (string)null);
+ });
+
+ modelBuilder.Entity("Bit.Infrastructure.EntityFramework.Auth.Models.Grant", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("ClientId")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("character varying(200)");
+
+ b.Property("ConsumedDate")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("CreationDate")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("Data")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("Description")
+ .HasMaxLength(200)
+ .HasColumnType("character varying(200)");
+
+ b.Property("ExpirationDate")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("Key")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("character varying(200)");
+
+ b.Property("SessionId")
+ .HasMaxLength(100)
+ .HasColumnType("character varying(100)");
+
+ b.Property("SubjectId")
+ .HasMaxLength(200)
+ .HasColumnType("character varying(200)");
+
+ b.Property("Type")
+ .IsRequired()
+ .HasMaxLength(50)
+ .HasColumnType("character varying(50)");
+
+ b.HasKey("Id")
+ .HasName("PK_Grant")
+ .HasAnnotation("SqlServer:Clustered", true);
+
+ b.HasIndex("ExpirationDate")
+ .HasAnnotation("SqlServer:Clustered", false);
+
+ b.HasIndex("Key")
+ .IsUnique();
+
+ b.ToTable("Grant", (string)null);
+ });
+
+ modelBuilder.Entity("Bit.Infrastructure.EntityFramework.Auth.Models.SsoConfig", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("bigint");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("CreationDate")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("Data")
+ .HasColumnType("text");
+
+ b.Property("Enabled")
+ .HasColumnType("boolean");
+
+ b.Property("OrganizationId")
+ .HasColumnType("uuid");
+
+ b.Property("RevisionDate")
+ .HasColumnType("timestamp with time zone");
+
+ b.HasKey("Id");
+
+ b.HasIndex("OrganizationId");
+
+ b.ToTable("SsoConfig", (string)null);
+ });
+
+ modelBuilder.Entity("Bit.Infrastructure.EntityFramework.Auth.Models.SsoUser", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("bigint");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("CreationDate")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("ExternalId")
+ .HasMaxLength(50)
+ .HasColumnType("character varying(50)")
+ .UseCollation("postgresIndetermanisticCollation");
+
+ b.Property("OrganizationId")
+ .HasColumnType("uuid");
+
+ b.Property("UserId")
+ .HasColumnType("uuid");
+
+ b.HasKey("Id");
+
+ b.HasIndex("OrganizationId")
+ .HasAnnotation("SqlServer:Clustered", false);
+
+ b.HasIndex("UserId");
+
+ b.HasIndex("OrganizationId", "ExternalId")
+ .IsUnique()
+ .HasAnnotation("SqlServer:Clustered", false);
+
+ NpgsqlIndexBuilderExtensions.IncludeProperties(b.HasIndex("OrganizationId", "ExternalId"), new[] { "UserId" });
+
+ b.HasIndex("OrganizationId", "UserId")
+ .IsUnique()
+ .HasAnnotation("SqlServer:Clustered", false);
+
+ b.ToTable("SsoUser", (string)null);
+ });
+
+ modelBuilder.Entity("Bit.Infrastructure.EntityFramework.Auth.Models.WebAuthnCredential", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uuid");
+
+ b.Property("AaGuid")
+ .HasColumnType("uuid");
+
+ b.Property("Counter")
+ .HasColumnType("integer");
+
+ b.Property("CreationDate")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("CredentialId")
+ .HasMaxLength(256)
+ .HasColumnType("character varying(256)");
+
+ b.Property("EncryptedPrivateKey")
+ .HasMaxLength(2000)
+ .HasColumnType("character varying(2000)");
+
+ b.Property("EncryptedPublicKey")
+ .HasMaxLength(2000)
+ .HasColumnType("character varying(2000)");
+
+ b.Property("EncryptedUserKey")
+ .HasMaxLength(2000)
+ .HasColumnType("character varying(2000)");
+
+ b.Property("Name")
+ .HasMaxLength(50)
+ .HasColumnType("character varying(50)");
+
+ b.Property("PublicKey")
+ .HasMaxLength(256)
+ .HasColumnType("character varying(256)");
+
+ b.Property("RevisionDate")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("SupportsPrf")
+ .HasColumnType("boolean");
+
+ b.Property("Type")
+ .HasMaxLength(20)
+ .HasColumnType("character varying(20)");
+
+ b.Property("UserId")
+ .HasColumnType("uuid");
+
+ b.HasKey("Id");
+
+ b.HasIndex("UserId");
+
+ b.ToTable("WebAuthnCredential", (string)null);
+ });
+
+ modelBuilder.Entity("Bit.Infrastructure.EntityFramework.Billing.Models.ClientOrganizationMigrationRecord", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uuid");
+
+ b.Property("ExpirationDate")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("GatewayCustomerId")
+ .IsRequired()
+ .HasMaxLength(50)
+ .HasColumnType("character varying(50)");
+
+ b.Property("GatewaySubscriptionId")
+ .IsRequired()
+ .HasMaxLength(50)
+ .HasColumnType("character varying(50)");
+
+ b.Property("MaxAutoscaleSeats")
+ .HasColumnType("integer");
+
+ b.Property("MaxStorageGb")
+ .HasColumnType("smallint");
+
+ b.Property("OrganizationId")
+ .HasColumnType("uuid");
+
+ b.Property("PlanType")
+ .HasColumnType("smallint");
+
+ b.Property("ProviderId")
+ .HasColumnType("uuid");
+
+ b.Property("Seats")
+ .HasColumnType("integer");
+
+ b.Property("Status")
+ .HasColumnType("smallint");
+
+ b.HasKey("Id");
+
+ b.HasIndex("ProviderId", "OrganizationId")
+ .IsUnique();
+
+ b.ToTable("ClientOrganizationMigrationRecord", (string)null);
+ });
+
+ modelBuilder.Entity("Bit.Infrastructure.EntityFramework.Billing.Models.OrganizationInstallation", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uuid");
+
+ b.Property("CreationDate")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("InstallationId")
+ .HasColumnType("uuid");
+
+ b.Property("OrganizationId")
+ .HasColumnType("uuid");
+
+ b.Property("RevisionDate")
+ .HasColumnType("timestamp with time zone");
+
+ b.HasKey("Id")
+ .HasAnnotation("SqlServer:Clustered", true);
+
+ b.HasIndex("InstallationId")
+ .HasAnnotation("SqlServer:Clustered", false);
+
+ b.HasIndex("OrganizationId")
+ .HasAnnotation("SqlServer:Clustered", false);
+
+ b.ToTable("OrganizationInstallation", (string)null);
+ });
+
+ modelBuilder.Entity("Bit.Infrastructure.EntityFramework.Billing.Models.ProviderInvoiceItem", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uuid");
+
+ b.Property("AssignedSeats")
+ .HasColumnType("integer");
+
+ b.Property("ClientId")
+ .HasColumnType("uuid");
+
+ b.Property("ClientName")
+ .IsRequired()
+ .HasMaxLength(50)
+ .HasColumnType("character varying(50)");
+
+ b.Property("Created")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("InvoiceId")
+ .IsRequired()
+ .HasMaxLength(50)
+ .HasColumnType("character varying(50)");
+
+ b.Property("InvoiceNumber")
+ .HasMaxLength(50)
+ .HasColumnType("character varying(50)");
+
+ b.Property("PlanName")
+ .IsRequired()
+ .HasMaxLength(50)
+ .HasColumnType("character varying(50)");
+
+ b.Property("ProviderId")
+ .HasColumnType("uuid");
+
+ b.Property("Total")
+ .HasColumnType("numeric");
+
+ b.Property("UsedSeats")
+ .HasColumnType("integer");
+
+ b.HasKey("Id");
+
+ b.HasIndex("ProviderId");
+
+ b.ToTable("ProviderInvoiceItem", (string)null);
+ });
+
+ modelBuilder.Entity("Bit.Infrastructure.EntityFramework.Billing.Models.ProviderPlan", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uuid");
+
+ b.Property("AllocatedSeats")
+ .HasColumnType("integer");
+
+ b.Property("PlanType")
+ .HasColumnType("smallint");
+
+ b.Property("ProviderId")
+ .HasColumnType("uuid");
+
+ b.Property("PurchasedSeats")
+ .HasColumnType("integer");
+
+ b.Property("SeatMinimum")
+ .HasColumnType("integer");
+
+ b.HasKey("Id");
+
+ b.HasIndex("ProviderId");
+
+ b.HasIndex("Id", "PlanType")
+ .IsUnique();
+
+ b.ToTable("ProviderPlan", (string)null);
+ });
+
+ modelBuilder.Entity("Bit.Infrastructure.EntityFramework.Dirt.Models.OrganizationApplication", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uuid");
+
+ b.Property("Applications")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("CreationDate")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("OrganizationId")
+ .HasColumnType("uuid");
+
+ b.Property("RevisionDate")
+ .HasColumnType("timestamp with time zone");
+
+ b.HasKey("Id");
+
+ b.HasIndex("Id")
+ .HasAnnotation("SqlServer:Clustered", true);
+
+ b.HasIndex("OrganizationId")
+ .HasAnnotation("SqlServer:Clustered", false);
+
+ b.ToTable("OrganizationApplication", (string)null);
+ });
+
+ modelBuilder.Entity("Bit.Infrastructure.EntityFramework.Dirt.Models.OrganizationReport", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uuid");
+
+ b.Property("CreationDate")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("Date")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("OrganizationId")
+ .HasColumnType("uuid");
+
+ b.Property("ReportData")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("RevisionDate")
+ .HasColumnType("timestamp with time zone");
+
+ b.HasKey("Id");
+
+ b.HasIndex("Id")
+ .HasAnnotation("SqlServer:Clustered", true);
+
+ b.HasIndex("OrganizationId")
+ .HasAnnotation("SqlServer:Clustered", false);
+
+ b.ToTable("OrganizationReport", (string)null);
+ });
+
+ modelBuilder.Entity("Bit.Infrastructure.EntityFramework.Dirt.Models.PasswordHealthReportApplication", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uuid");
+
+ b.Property("CreationDate")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("OrganizationId")
+ .HasColumnType("uuid");
+
+ b.Property("RevisionDate")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("Uri")
+ .HasColumnType("text");
+
+ b.HasKey("Id");
+
+ b.HasIndex("Id")
+ .HasAnnotation("SqlServer:Clustered", true);
+
+ b.HasIndex("OrganizationId")
+ .HasAnnotation("SqlServer:Clustered", false);
+
+ b.ToTable("PasswordHealthReportApplication", (string)null);
+ });
+
+ modelBuilder.Entity("Bit.Infrastructure.EntityFramework.Models.Cache", b =>
+ {
+ b.Property("Id")
+ .HasMaxLength(449)
+ .HasColumnType("character varying(449)");
+
+ b.Property("AbsoluteExpiration")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("ExpiresAtTime")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("SlidingExpirationInSeconds")
+ .HasColumnType("bigint");
+
+ b.Property("Value")
+ .IsRequired()
+ .HasColumnType("bytea");
+
+ b.HasKey("Id")
+ .HasAnnotation("SqlServer:Clustered", true);
+
+ b.HasIndex("ExpiresAtTime")
+ .HasAnnotation("SqlServer:Clustered", false);
+
+ b.ToTable("Cache", (string)null);
+ });
+
+ modelBuilder.Entity("Bit.Infrastructure.EntityFramework.Models.Collection", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uuid");
+
+ b.Property("CreationDate")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("ExternalId")
+ .HasMaxLength(300)
+ .HasColumnType("character varying(300)");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("OrganizationId")
+ .HasColumnType("uuid");
+
+ b.Property("RevisionDate")
+ .HasColumnType("timestamp with time zone");
+
+ b.HasKey("Id");
+
+ b.HasIndex("OrganizationId");
+
+ b.ToTable("Collection", (string)null);
+ });
+
+ modelBuilder.Entity("Bit.Infrastructure.EntityFramework.Models.CollectionCipher", b =>
+ {
+ b.Property("CollectionId")
+ .HasColumnType("uuid");
+
+ b.Property("CipherId")
+ .HasColumnType("uuid");
+
+ b.HasKey("CollectionId", "CipherId");
+
+ b.HasIndex("CipherId");
+
+ b.ToTable("CollectionCipher", (string)null);
+ });
+
+ modelBuilder.Entity("Bit.Infrastructure.EntityFramework.Models.CollectionGroup", b =>
+ {
+ b.Property("CollectionId")
+ .HasColumnType("uuid");
+
+ b.Property("GroupId")
+ .HasColumnType("uuid");
+
+ b.Property("HidePasswords")
+ .HasColumnType("boolean");
+
+ b.Property("Manage")
+ .HasColumnType("boolean");
+
+ b.Property("ReadOnly")
+ .HasColumnType("boolean");
+
+ b.HasKey("CollectionId", "GroupId");
+
+ b.HasIndex("GroupId");
+
+ b.ToTable("CollectionGroups");
+ });
+
+ modelBuilder.Entity("Bit.Infrastructure.EntityFramework.Models.CollectionUser", b =>
+ {
+ b.Property("CollectionId")
+ .HasColumnType("uuid");
+
+ b.Property("OrganizationUserId")
+ .HasColumnType("uuid");
+
+ b.Property("HidePasswords")
+ .HasColumnType("boolean");
+
+ b.Property("Manage")
+ .HasColumnType("boolean");
+
+ b.Property