From 87b6606bc2cb31dba45edb52d078c06979484333 Mon Sep 17 00:00:00 2001
From: Alex Morask <144709477+amorask-bitwarden@users.noreply.github.com>
Date: Mon, 9 Jun 2025 09:30:26 -0500
Subject: [PATCH 1/6] Append EUVAT to Spanish NIF tax ID types (#5843)
---
.../Services/ProviderBillingService.cs | 9 +++++++
src/Core/Billing/Constants/StripeConstants.cs | 6 +++++
.../OrganizationBillingService.cs | 11 ++++++++
.../Implementations/SubscriberService.cs | 6 +++++
.../Tax/Commands/PreviewTaxAmountCommand.cs | 9 +++++++
.../Implementations/StripePaymentService.cs | 26 ++++++++++++++++++-
6 files changed, 66 insertions(+), 1 deletion(-)
diff --git a/bitwarden_license/src/Commercial.Core/Billing/Providers/Services/ProviderBillingService.cs b/bitwarden_license/src/Commercial.Core/Billing/Providers/Services/ProviderBillingService.cs
index 8c90d778bc..2b337fb4bb 100644
--- a/bitwarden_license/src/Commercial.Core/Billing/Providers/Services/ProviderBillingService.cs
+++ b/bitwarden_license/src/Commercial.Core/Billing/Providers/Services/ProviderBillingService.cs
@@ -550,6 +550,15 @@ public class ProviderBillingService(
[
new CustomerTaxIdDataOptions { Type = taxIdType, Value = taxInfo.TaxIdNumber }
];
+
+ if (taxIdType == StripeConstants.TaxIdType.SpanishNIF)
+ {
+ options.TaxIdData.Add(new CustomerTaxIdDataOptions
+ {
+ Type = StripeConstants.TaxIdType.EUVAT,
+ Value = $"ES{taxInfo.TaxIdNumber}"
+ });
+ }
}
if (!string.IsNullOrEmpty(provider.DiscountId))
diff --git a/src/Core/Billing/Constants/StripeConstants.cs b/src/Core/Billing/Constants/StripeConstants.cs
index 28f4dea4b2..0cffad72d3 100644
--- a/src/Core/Billing/Constants/StripeConstants.cs
+++ b/src/Core/Billing/Constants/StripeConstants.cs
@@ -96,6 +96,12 @@ public static class StripeConstants
public const string Reverse = "reverse";
}
+ public static class TaxIdType
+ {
+ public const string EUVAT = "eu_vat";
+ public const string SpanishNIF = "es_cif";
+ }
+
public static class ValidateTaxLocationTiming
{
public const string Deferred = "deferred";
diff --git a/src/Core/Billing/Services/Implementations/OrganizationBillingService.cs b/src/Core/Billing/Services/Implementations/OrganizationBillingService.cs
index 0fd997fd10..5e59d0d108 100644
--- a/src/Core/Billing/Services/Implementations/OrganizationBillingService.cs
+++ b/src/Core/Billing/Services/Implementations/OrganizationBillingService.cs
@@ -247,12 +247,23 @@ public class OrganizationBillingService(
organization.Id,
customerSetup.TaxInformation.Country,
customerSetup.TaxInformation.TaxId);
+
+ throw new BadRequestException("billingTaxIdTypeInferenceError");
}
customerCreateOptions.TaxIdData =
[
new() { Type = taxIdType, Value = customerSetup.TaxInformation.TaxId }
];
+
+ if (taxIdType == StripeConstants.TaxIdType.SpanishNIF)
+ {
+ customerCreateOptions.TaxIdData.Add(new CustomerTaxIdDataOptions
+ {
+ Type = StripeConstants.TaxIdType.EUVAT,
+ Value = $"ES{customerSetup.TaxInformation.TaxId}"
+ });
+ }
}
var (paymentMethodType, paymentMethodToken) = customerSetup.TokenizedPaymentSource;
diff --git a/src/Core/Billing/Services/Implementations/SubscriberService.cs b/src/Core/Billing/Services/Implementations/SubscriberService.cs
index 75a1bf76ec..796f700e9f 100644
--- a/src/Core/Billing/Services/Implementations/SubscriberService.cs
+++ b/src/Core/Billing/Services/Implementations/SubscriberService.cs
@@ -648,6 +648,12 @@ public class SubscriberService(
{
await stripeAdapter.TaxIdCreateAsync(customer.Id,
new TaxIdCreateOptions { Type = taxIdType, Value = taxInformation.TaxId });
+
+ if (taxIdType == StripeConstants.TaxIdType.SpanishNIF)
+ {
+ await stripeAdapter.TaxIdCreateAsync(customer.Id,
+ new TaxIdCreateOptions { Type = StripeConstants.TaxIdType.EUVAT, Value = $"ES{taxInformation.TaxId}" });
+ }
}
catch (StripeException e)
{
diff --git a/src/Core/Billing/Tax/Commands/PreviewTaxAmountCommand.cs b/src/Core/Billing/Tax/Commands/PreviewTaxAmountCommand.cs
index 304abbaae0..c777d0c0d1 100644
--- a/src/Core/Billing/Tax/Commands/PreviewTaxAmountCommand.cs
+++ b/src/Core/Billing/Tax/Commands/PreviewTaxAmountCommand.cs
@@ -80,6 +80,15 @@ public class PreviewTaxAmountCommand(
Value = taxInformation.TaxId
}
];
+
+ if (taxIdType == StripeConstants.TaxIdType.SpanishNIF)
+ {
+ options.CustomerDetails.TaxIds.Add(new InvoiceCustomerDetailsTaxIdOptions
+ {
+ Type = StripeConstants.TaxIdType.EUVAT,
+ Value = $"ES{parameters.TaxInformation.TaxId}"
+ });
+ }
}
if (planType.GetProductTier() == ProductTierType.Families)
diff --git a/src/Core/Services/Implementations/StripePaymentService.cs b/src/Core/Services/Implementations/StripePaymentService.cs
index 23d06bed2b..bdd558df52 100644
--- a/src/Core/Services/Implementations/StripePaymentService.cs
+++ b/src/Core/Services/Implementations/StripePaymentService.cs
@@ -842,7 +842,13 @@ public class StripePaymentService : IPaymentService
try
{
await _stripeAdapter.TaxIdCreateAsync(customer.Id,
- new TaxIdCreateOptions { Type = taxInfo.TaxIdType, Value = taxInfo.TaxIdNumber, });
+ new TaxIdCreateOptions { Type = taxInfo.TaxIdType, Value = taxInfo.TaxIdNumber });
+
+ if (taxInfo.TaxIdType == StripeConstants.TaxIdType.SpanishNIF)
+ {
+ await _stripeAdapter.TaxIdCreateAsync(customer.Id,
+ new TaxIdCreateOptions { Type = StripeConstants.TaxIdType.EUVAT, Value = $"ES{taxInfo.TaxIdNumber}" });
+ }
}
catch (StripeException e)
{
@@ -1000,6 +1006,15 @@ public class StripePaymentService : IPaymentService
Value = parameters.TaxInformation.TaxId
}
];
+
+ if (taxIdType == StripeConstants.TaxIdType.SpanishNIF)
+ {
+ options.CustomerDetails.TaxIds.Add(new InvoiceCustomerDetailsTaxIdOptions
+ {
+ Type = StripeConstants.TaxIdType.EUVAT,
+ Value = $"ES{parameters.TaxInformation.TaxId}"
+ });
+ }
}
if (!string.IsNullOrWhiteSpace(gatewayCustomerId))
@@ -1154,6 +1169,15 @@ public class StripePaymentService : IPaymentService
Value = parameters.TaxInformation.TaxId
}
];
+
+ if (taxIdType == StripeConstants.TaxIdType.SpanishNIF)
+ {
+ options.CustomerDetails.TaxIds.Add(new InvoiceCustomerDetailsTaxIdOptions
+ {
+ Type = StripeConstants.TaxIdType.EUVAT,
+ Value = $"ES{parameters.TaxInformation.TaxId}"
+ });
+ }
}
Customer gatewayCustomer = null;
From 88ffc91b99341fb1562f2a80602cb26b93d47948 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Mon, 9 Jun 2025 10:49:41 -0500
Subject: [PATCH 2/6] [deps] Billing: Update coverlet.collector to 6.0.4
(#5720)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
test/Core.IntegrationTest/Core.IntegrationTest.csproj | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/test/Core.IntegrationTest/Core.IntegrationTest.csproj b/test/Core.IntegrationTest/Core.IntegrationTest.csproj
index 6094209f23..21b746c2fb 100644
--- a/test/Core.IntegrationTest/Core.IntegrationTest.csproj
+++ b/test/Core.IntegrationTest/Core.IntegrationTest.csproj
@@ -10,7 +10,7 @@
-
+
From 52c392d66887cc3612b81ee53de4a84256bd97ea Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Mon, 9 Jun 2025 10:53:17 -0500
Subject: [PATCH 3/6] [deps] Billing: Update swashbuckle-aspnetcore monorepo to
7.3.2 (#5731)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
.config/dotnet-tools.json | 2 +-
src/Api/Api.csproj | 2 +-
src/Billing/Billing.csproj | 2 +-
src/SharedWeb/SharedWeb.csproj | 2 +-
4 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/.config/dotnet-tools.json b/.config/dotnet-tools.json
index f42f226153..d7814849c6 100644
--- a/.config/dotnet-tools.json
+++ b/.config/dotnet-tools.json
@@ -3,7 +3,7 @@
"isRoot": true,
"tools": {
"swashbuckle.aspnetcore.cli": {
- "version": "7.2.0",
+ "version": "7.3.2",
"commands": ["swagger"]
},
"dotnet-ef": {
diff --git a/src/Api/Api.csproj b/src/Api/Api.csproj
index c490e90150..11af4d5e0a 100644
--- a/src/Api/Api.csproj
+++ b/src/Api/Api.csproj
@@ -34,7 +34,7 @@
-
+
diff --git a/src/Billing/Billing.csproj b/src/Billing/Billing.csproj
index 01a8bbdd9b..116efdb68c 100644
--- a/src/Billing/Billing.csproj
+++ b/src/Billing/Billing.csproj
@@ -10,7 +10,7 @@
-
+
diff --git a/src/SharedWeb/SharedWeb.csproj b/src/SharedWeb/SharedWeb.csproj
index 6df65b2310..1951e4d509 100644
--- a/src/SharedWeb/SharedWeb.csproj
+++ b/src/SharedWeb/SharedWeb.csproj
@@ -7,7 +7,7 @@
-
+
From 84e5ea12652275694c7e83bae0fe568371637234 Mon Sep 17 00:00:00 2001
From: Jared McCannon
Date: Mon, 9 Jun 2025 14:50:15 -0400
Subject: [PATCH 4/6] [PM-22097] Add Columns to Collections for Org User
Default Collection (#5908)
* Adding columns and database migrations for organization DefaultUserCollection.
---
src/Core/Entities/Collection.cs | 3 +
src/Core/Enums/CollectionType.cs | 7 +
.../Stored Procedures/Collection_Create.sql | 12 +-
.../Collection_CreateWithGroupsAndUsers.sql | 6 +-
.../Collection_ReadByUserId.sql | 8 +-
.../Stored Procedures/Collection_Update.sql | 10 +-
.../Collection_UpdateWithGroupsAndUsers.sql | 6 +-
src/Sql/dbo/Tables/Collection.sql | 14 +-
.../Collection_ReadByIdWithPermissions.sql | 4 +-
...on_ReadByOrganizationIdWithPermissions.sql | 4 +-
...5-06-02_00_AddOrgUserDefaultCollection.sql | 55 +
...5-06-02_01_AddOrgUserDefaultCollection.sql | 456 +++
...13_AddOrgUserDefaultCollection.Designer.cs | 3125 ++++++++++++++++
...50603133713_AddOrgUserDefaultCollection.cs | 39 +
.../DatabaseContextModelSnapshot.cs | 6 +
...04_AddOrgUserDefaultCollection.Designer.cs | 3131 +++++++++++++++++
...50603133704_AddOrgUserDefaultCollection.cs | 38 +
.../DatabaseContextModelSnapshot.cs | 6 +
...08_AddOrgUserDefaultCollection.Designer.cs | 3114 ++++++++++++++++
...50603133708_AddOrgUserDefaultCollection.cs | 38 +
.../DatabaseContextModelSnapshot.cs | 6 +
21 files changed, 10068 insertions(+), 20 deletions(-)
create mode 100644 src/Core/Enums/CollectionType.cs
create mode 100644 util/Migrator/DbScripts/2025-06-02_00_AddOrgUserDefaultCollection.sql
create mode 100644 util/Migrator/DbScripts/2025-06-02_01_AddOrgUserDefaultCollection.sql
create mode 100644 util/MySqlMigrations/Migrations/20250603133713_AddOrgUserDefaultCollection.Designer.cs
create mode 100644 util/MySqlMigrations/Migrations/20250603133713_AddOrgUserDefaultCollection.cs
create mode 100644 util/PostgresMigrations/Migrations/20250603133704_AddOrgUserDefaultCollection.Designer.cs
create mode 100644 util/PostgresMigrations/Migrations/20250603133704_AddOrgUserDefaultCollection.cs
create mode 100644 util/SqliteMigrations/Migrations/20250603133708_AddOrgUserDefaultCollection.Designer.cs
create mode 100644 util/SqliteMigrations/Migrations/20250603133708_AddOrgUserDefaultCollection.cs
diff --git a/src/Core/Entities/Collection.cs b/src/Core/Entities/Collection.cs
index 8babe10e4c..275cd80d2f 100644
--- a/src/Core/Entities/Collection.cs
+++ b/src/Core/Entities/Collection.cs
@@ -1,4 +1,5 @@
using System.ComponentModel.DataAnnotations;
+using Bit.Core.Enums;
using Bit.Core.Utilities;
#nullable enable
@@ -14,6 +15,8 @@ public class Collection : ITableObject
public string? ExternalId { get; set; }
public DateTime CreationDate { get; set; } = DateTime.UtcNow;
public DateTime RevisionDate { get; set; } = DateTime.UtcNow;
+ public CollectionType Type { get; set; } = CollectionType.SharedCollection;
+ public string? DefaultUserCollectionEmail { get; set; }
public void SetNewId()
{
diff --git a/src/Core/Enums/CollectionType.cs b/src/Core/Enums/CollectionType.cs
new file mode 100644
index 0000000000..9bc4fcc9c2
--- /dev/null
+++ b/src/Core/Enums/CollectionType.cs
@@ -0,0 +1,7 @@
+namespace Bit.Core.Enums;
+
+public enum CollectionType
+{
+ SharedCollection = 0,
+ DefaultUserCollection = 1,
+}
diff --git a/src/Sql/dbo/Stored Procedures/Collection_Create.sql b/src/Sql/dbo/Stored Procedures/Collection_Create.sql
index 2e442c6a28..2b3b14fd6b 100644
--- a/src/Sql/dbo/Stored Procedures/Collection_Create.sql
+++ b/src/Sql/dbo/Stored Procedures/Collection_Create.sql
@@ -4,7 +4,9 @@
@Name VARCHAR(MAX),
@ExternalId NVARCHAR(300),
@CreationDate DATETIME2(7),
- @RevisionDate DATETIME2(7)
+ @RevisionDate DATETIME2(7),
+ @DefaultUserCollectionEmail NVARCHAR(256) = NULL,
+ @Type TINYINT = 0
AS
BEGIN
SET NOCOUNT ON
@@ -16,7 +18,9 @@ BEGIN
[Name],
[ExternalId],
[CreationDate],
- [RevisionDate]
+ [RevisionDate],
+ [DefaultUserCollectionEmail],
+ [Type]
)
VALUES
(
@@ -25,7 +29,9 @@ BEGIN
@Name,
@ExternalId,
@CreationDate,
- @RevisionDate
+ @RevisionDate,
+ @DefaultUserCollectionEmail,
+ @Type
)
EXEC [dbo].[User_BumpAccountRevisionDateByCollectionId] @Id, @OrganizationId
diff --git a/src/Sql/dbo/Stored Procedures/Collection_CreateWithGroupsAndUsers.sql b/src/Sql/dbo/Stored Procedures/Collection_CreateWithGroupsAndUsers.sql
index 87bac3b385..92ffd366e6 100644
--- a/src/Sql/dbo/Stored Procedures/Collection_CreateWithGroupsAndUsers.sql
+++ b/src/Sql/dbo/Stored Procedures/Collection_CreateWithGroupsAndUsers.sql
@@ -6,12 +6,14 @@ CREATE PROCEDURE [dbo].[Collection_CreateWithGroupsAndUsers]
@CreationDate DATETIME2(7),
@RevisionDate DATETIME2(7),
@Groups AS [dbo].[CollectionAccessSelectionType] READONLY,
- @Users AS [dbo].[CollectionAccessSelectionType] READONLY
+ @Users AS [dbo].[CollectionAccessSelectionType] READONLY,
+ @DefaultUserCollectionEmail NVARCHAR(256) = NULL,
+ @Type TINYINT = 0
AS
BEGIN
SET NOCOUNT ON
- EXEC [dbo].[Collection_Create] @Id, @OrganizationId, @Name, @ExternalId, @CreationDate, @RevisionDate
+ EXEC [dbo].[Collection_Create] @Id, @OrganizationId, @Name, @ExternalId, @CreationDate, @RevisionDate, @DefaultUserCollectionEmail, @Type
-- Groups
;WITH [AvailableGroupsCTE] AS(
diff --git a/src/Sql/dbo/Stored Procedures/Collection_ReadByUserId.sql b/src/Sql/dbo/Stored Procedures/Collection_ReadByUserId.sql
index f0eab509ac..4180dc6909 100644
--- a/src/Sql/dbo/Stored Procedures/Collection_ReadByUserId.sql
+++ b/src/Sql/dbo/Stored Procedures/Collection_ReadByUserId.sql
@@ -13,7 +13,9 @@ BEGIN
ExternalId,
MIN([ReadOnly]) AS [ReadOnly],
MIN([HidePasswords]) AS [HidePasswords],
- MAX([Manage]) AS [Manage]
+ MAX([Manage]) AS [Manage],
+ [DefaultUserCollectionEmail],
+ [Type]
FROM
[dbo].[UserCollectionDetails](@UserId)
GROUP BY
@@ -22,5 +24,7 @@ BEGIN
[Name],
CreationDate,
RevisionDate,
- ExternalId
+ ExternalId,
+ [DefaultUserCollectionEmail],
+ [Type]
END
diff --git a/src/Sql/dbo/Stored Procedures/Collection_Update.sql b/src/Sql/dbo/Stored Procedures/Collection_Update.sql
index e75f088d7d..69a009e27a 100644
--- a/src/Sql/dbo/Stored Procedures/Collection_Update.sql
+++ b/src/Sql/dbo/Stored Procedures/Collection_Update.sql
@@ -4,7 +4,9 @@
@Name VARCHAR(MAX),
@ExternalId NVARCHAR(300),
@CreationDate DATETIME2(7),
- @RevisionDate DATETIME2(7)
+ @RevisionDate DATETIME2(7),
+ @DefaultUserCollectionEmail NVARCHAR(256) = NULL,
+ @Type TINYINT = 0
AS
BEGIN
SET NOCOUNT ON
@@ -16,9 +18,11 @@ BEGIN
[Name] = @Name,
[ExternalId] = @ExternalId,
[CreationDate] = @CreationDate,
- [RevisionDate] = @RevisionDate
+ [RevisionDate] = @RevisionDate,
+ [DefaultUserCollectionEmail] = @DefaultUserCollectionEmail,
+ [Type] = @Type
WHERE
[Id] = @Id
EXEC [dbo].[User_BumpAccountRevisionDateByCollectionId] @Id, @OrganizationId
-END
\ No newline at end of file
+END
diff --git a/src/Sql/dbo/Stored Procedures/Collection_UpdateWithGroupsAndUsers.sql b/src/Sql/dbo/Stored Procedures/Collection_UpdateWithGroupsAndUsers.sql
index 4a66b20d86..29894f984b 100644
--- a/src/Sql/dbo/Stored Procedures/Collection_UpdateWithGroupsAndUsers.sql
+++ b/src/Sql/dbo/Stored Procedures/Collection_UpdateWithGroupsAndUsers.sql
@@ -6,12 +6,14 @@
@CreationDate DATETIME2(7),
@RevisionDate DATETIME2(7),
@Groups AS [dbo].[CollectionAccessSelectionType] READONLY,
- @Users AS [dbo].[CollectionAccessSelectionType] READONLY
+ @Users AS [dbo].[CollectionAccessSelectionType] READONLY,
+ @DefaultUserCollectionEmail NVARCHAR(256) = NULL,
+ @Type TINYINT = 0
AS
BEGIN
SET NOCOUNT ON
- EXEC [dbo].[Collection_Update] @Id, @OrganizationId, @Name, @ExternalId, @CreationDate, @RevisionDate
+ EXEC [dbo].[Collection_Update] @Id, @OrganizationId, @Name, @ExternalId, @CreationDate, @RevisionDate, @DefaultUserCollectionEmail, @Type
-- Groups
-- Delete groups that are no longer in source
diff --git a/src/Sql/dbo/Tables/Collection.sql b/src/Sql/dbo/Tables/Collection.sql
index 0106f341df..03064fd978 100644
--- a/src/Sql/dbo/Tables/Collection.sql
+++ b/src/Sql/dbo/Tables/Collection.sql
@@ -1,10 +1,12 @@
CREATE TABLE [dbo].[Collection] (
- [Id] UNIQUEIDENTIFIER NOT NULL,
- [OrganizationId] UNIQUEIDENTIFIER NOT NULL,
- [Name] VARCHAR (MAX) NOT NULL,
- [ExternalId] NVARCHAR (300) NULL,
- [CreationDate] DATETIME2 (7) NOT NULL,
- [RevisionDate] DATETIME2 (7) NOT NULL,
+ [Id] UNIQUEIDENTIFIER NOT NULL,
+ [OrganizationId] UNIQUEIDENTIFIER NOT NULL,
+ [Name] VARCHAR (MAX) NOT NULL,
+ [ExternalId] NVARCHAR (300) NULL,
+ [CreationDate] DATETIME2 (7) NOT NULL,
+ [RevisionDate] DATETIME2 (7) NOT NULL,
+ [DefaultUserCollectionEmail] NVARCHAR(256) NULL,
+ [Type] TINYINT NOT NULL DEFAULT(0),
CONSTRAINT [PK_Collection] PRIMARY KEY CLUSTERED ([Id] ASC),
CONSTRAINT [FK_Collection_Organization] FOREIGN KEY ([OrganizationId]) REFERENCES [dbo].[Organization] ([Id]) ON DELETE CASCADE
);
diff --git a/src/Sql/dbo/Vault/Stored Procedures/Collections/Collection_ReadByIdWithPermissions.sql b/src/Sql/dbo/Vault/Stored Procedures/Collections/Collection_ReadByIdWithPermissions.sql
index 3bb50a51cf..9f2caeb87f 100644
--- a/src/Sql/dbo/Vault/Stored Procedures/Collections/Collection_ReadByIdWithPermissions.sql
+++ b/src/Sql/dbo/Vault/Stored Procedures/Collections/Collection_ReadByIdWithPermissions.sql
@@ -73,7 +73,9 @@ BEGIN
C.[Name],
C.[CreationDate],
C.[RevisionDate],
- C.[ExternalId]
+ C.[ExternalId],
+ C.[DefaultUserCollectionEmail],
+ C.[Type]
IF (@IncludeAccessRelationships = 1)
BEGIN
diff --git a/src/Sql/dbo/Vault/Stored Procedures/Collections/Collection_ReadByOrganizationIdWithPermissions.sql b/src/Sql/dbo/Vault/Stored Procedures/Collections/Collection_ReadByOrganizationIdWithPermissions.sql
index 2c99282eef..267024f56c 100644
--- a/src/Sql/dbo/Vault/Stored Procedures/Collections/Collection_ReadByOrganizationIdWithPermissions.sql
+++ b/src/Sql/dbo/Vault/Stored Procedures/Collections/Collection_ReadByOrganizationIdWithPermissions.sql
@@ -73,7 +73,9 @@ BEGIN
C.[Name],
C.[CreationDate],
C.[RevisionDate],
- C.[ExternalId]
+ C.[ExternalId],
+ C.[DefaultUserCollectionEmail],
+ C.[Type]
IF (@IncludeAccessRelationships = 1)
BEGIN
diff --git a/util/Migrator/DbScripts/2025-06-02_00_AddOrgUserDefaultCollection.sql b/util/Migrator/DbScripts/2025-06-02_00_AddOrgUserDefaultCollection.sql
new file mode 100644
index 0000000000..72ef987cc1
--- /dev/null
+++ b/util/Migrator/DbScripts/2025-06-02_00_AddOrgUserDefaultCollection.sql
@@ -0,0 +1,55 @@
+IF NOT EXISTS (
+ SELECT *
+ FROM INFORMATION_SCHEMA.COLUMNS
+ WHERE TABLE_SCHEMA = 'dbo'
+ AND TABLE_NAME = 'Collection'
+ AND COLUMN_NAME = 'DefaultUserCollectionEmail'
+)
+ BEGIN
+ ALTER TABLE [dbo].[Collection]
+ ADD [DefaultUserCollectionEmail] NVARCHAR(256) NULL
+ END
+GO
+
+IF NOT EXISTS (
+ SELECT *
+ FROM INFORMATION_SCHEMA.COLUMNS
+ WHERE TABLE_SCHEMA = 'dbo'
+ AND TABLE_NAME = 'Collection'
+ AND COLUMN_NAME = 'Type'
+)
+ BEGIN
+ ALTER TABLE [dbo].[Collection]
+ ADD [Type] TINYINT NOT NULL DEFAULT (0)
+ END
+GO
+
+IF OBJECT_ID('[dbo].[CollectionView]') IS NOT NULL
+ BEGIN
+ EXECUTE sp_refreshsqlmodule N'[dbo].[CollectionView]';
+ END
+GO
+
+IF OBJECT_ID('[dbo].[Collection_ReadById]') IS NOT NULL
+ BEGIN
+ EXECUTE sp_refreshsqlmodule N'[dbo].[Collection_ReadById]';
+ END
+GO
+
+IF OBJECT_ID('[dbo].[Collection_ReadByIds]') IS NOT NULL
+ BEGIN
+ EXECUTE sp_refreshsqlmodule N'[dbo].[Collection_ReadByIds]';
+ END
+GO
+
+IF OBJECT_ID('[dbo].[Collection_ReadByOrganizationId]') IS NOT NULL
+ BEGIN
+ EXECUTE sp_refreshsqlmodule N'[dbo].[Collection_ReadByOrganizationId]';
+ END
+GO
+
+IF OBJECT_ID('[dbo].[UserCollectionDetails]') IS NOT NULL
+ BEGIN
+ EXECUTE sp_refreshsqlmodule N'[dbo].[UserCollectionDetails]';
+ END
+GO
diff --git a/util/Migrator/DbScripts/2025-06-02_01_AddOrgUserDefaultCollection.sql b/util/Migrator/DbScripts/2025-06-02_01_AddOrgUserDefaultCollection.sql
new file mode 100644
index 0000000000..ea8b60970c
--- /dev/null
+++ b/util/Migrator/DbScripts/2025-06-02_01_AddOrgUserDefaultCollection.sql
@@ -0,0 +1,456 @@
+CREATE OR ALTER PROCEDURE [dbo].[Collection_Create]
+ @Id UNIQUEIDENTIFIER OUTPUT,
+ @OrganizationId UNIQUEIDENTIFIER,
+ @Name VARCHAR(MAX),
+ @ExternalId NVARCHAR(300),
+ @CreationDate DATETIME2(7),
+ @RevisionDate DATETIME2(7),
+ @DefaultUserCollectionEmail NVARCHAR(256) = NULL,
+ @Type TINYINT = 0
+AS
+BEGIN
+ SET NOCOUNT ON
+
+ INSERT INTO [dbo].[Collection]
+ (
+ [Id],
+ [OrganizationId],
+ [Name],
+ [ExternalId],
+ [CreationDate],
+ [RevisionDate],
+ [DefaultUserCollectionEmail],
+ [Type]
+ )
+ VALUES
+ (
+ @Id,
+ @OrganizationId,
+ @Name,
+ @ExternalId,
+ @CreationDate,
+ @RevisionDate,
+ @DefaultUserCollectionEmail,
+ @Type
+ )
+
+ EXEC [dbo].[User_BumpAccountRevisionDateByCollectionId] @Id, @OrganizationId
+END
+GO
+
+CREATE OR ALTER PROCEDURE [dbo].[Collection_ReadByUserId]
+@UserId UNIQUEIDENTIFIER
+AS
+BEGIN
+ SET NOCOUNT ON
+
+ SELECT
+ [Id],
+ [OrganizationId],
+ [Name],
+ [CreationDate],
+ [RevisionDate],
+ [ExternalId],
+ MIN([ReadOnly]) AS [ReadOnly],
+ MIN([HidePasswords]) AS [HidePasswords],
+ MAX([Manage]) AS [Manage],
+ [DefaultUserCollectionEmail],
+ [Type]
+ FROM
+ [dbo].[UserCollectionDetails](@UserId)
+ GROUP BY
+ [Id],
+ [OrganizationId],
+ [Name],
+ [CreationDate],
+ [RevisionDate],
+ [ExternalId],
+ [DefaultUserCollectionEmail],
+ [Type]
+END
+GO
+
+CREATE OR ALTER PROCEDURE [dbo].[Collection_Update]
+ @Id UNIQUEIDENTIFIER,
+ @OrganizationId UNIQUEIDENTIFIER,
+ @Name VARCHAR(MAX),
+ @ExternalId NVARCHAR(300),
+ @CreationDate DATETIME2(7),
+ @RevisionDate DATETIME2(7),
+ @DefaultUserCollectionEmail NVARCHAR(256) = NULL,
+ @Type TINYINT = 0
+AS
+BEGIN
+ SET NOCOUNT ON
+
+ UPDATE
+ [dbo].[Collection]
+ SET
+ [OrganizationId] = @OrganizationId,
+ [Name] = @Name,
+ [ExternalId] = @ExternalId,
+ [CreationDate] = @CreationDate,
+ [RevisionDate] = @RevisionDate,
+ [DefaultUserCollectionEmail] = @DefaultUserCollectionEmail,
+ [Type] = @Type
+ WHERE
+ [Id] = @Id
+
+ EXEC [dbo].[User_BumpAccountRevisionDateByCollectionId] @Id, @OrganizationId
+END
+GO
+
+CREATE OR ALTER PROCEDURE [dbo].[Collection_UpdateWithGroupsAndUsers]
+ @Id UNIQUEIDENTIFIER,
+ @OrganizationId UNIQUEIDENTIFIER,
+ @Name VARCHAR(MAX),
+ @ExternalId NVARCHAR(300),
+ @CreationDate DATETIME2(7),
+ @RevisionDate DATETIME2(7),
+ @Groups AS [dbo].[CollectionAccessSelectionType] READONLY,
+ @Users AS [dbo].[CollectionAccessSelectionType] READONLY,
+ @DefaultUserCollectionEmail NVARCHAR(256) = NULL,
+ @Type TINYINT = 0
+AS
+BEGIN
+ SET NOCOUNT ON
+
+ EXEC [dbo].[Collection_Update] @Id, @OrganizationId, @Name, @ExternalId, @CreationDate, @RevisionDate, @DefaultUserCollectionEmail, @Type
+
+ -- Groups
+ -- Delete groups that are no longer in source
+ DELETE cg
+ FROM [dbo].[CollectionGroup] cg
+ LEFT JOIN @Groups g ON cg.GroupId = g.Id
+ WHERE cg.CollectionId = @Id
+ AND g.Id IS NULL;
+
+ -- Update existing groups
+ UPDATE cg
+ SET cg.ReadOnly = g.ReadOnly,
+ cg.HidePasswords = g.HidePasswords,
+ cg.Manage = g.Manage
+ FROM [dbo].[CollectionGroup] cg
+ INNER JOIN @Groups g ON cg.GroupId = g.Id
+ WHERE cg.CollectionId = @Id
+ AND (cg.ReadOnly != g.ReadOnly
+ OR cg.HidePasswords != g.HidePasswords
+ OR cg.Manage != g.Manage);
+
+ -- Insert new groups
+ INSERT INTO [dbo].[CollectionGroup]
+ (
+ [CollectionId],
+ [GroupId],
+ [ReadOnly],
+ [HidePasswords],
+ [Manage]
+ )
+ SELECT
+ @Id,
+ g.Id,
+ g.ReadOnly,
+ g.HidePasswords,
+ g.Manage
+ FROM @Groups g
+ INNER JOIN [dbo].[Group] grp ON grp.Id = g.Id
+ LEFT JOIN [dbo].[CollectionGroup] cg
+ ON cg.CollectionId = @Id AND cg.GroupId = g.Id
+ WHERE grp.OrganizationId = @OrganizationId
+ AND cg.CollectionId IS NULL;
+
+ -- Users
+ -- Delete users that are no longer in source
+ DELETE cu
+ FROM [dbo].[CollectionUser] cu
+ LEFT JOIN @Users u ON cu.OrganizationUserId = u.Id
+ WHERE cu.CollectionId = @Id
+ AND u.Id IS NULL;
+
+ -- Update existing users
+ UPDATE cu
+ SET cu.ReadOnly = u.ReadOnly,
+ cu.HidePasswords = u.HidePasswords,
+ cu.Manage = u.Manage
+ FROM [dbo].[CollectionUser] cu
+ INNER JOIN @Users u ON cu.OrganizationUserId = u.Id
+ WHERE cu.CollectionId = @Id
+ AND (cu.ReadOnly != u.ReadOnly
+ OR cu.HidePasswords != u.HidePasswords
+ OR cu.Manage != u.Manage);
+
+ -- Insert new users
+ INSERT INTO [dbo].[CollectionUser]
+ (
+ [CollectionId],
+ [OrganizationUserId],
+ [ReadOnly],
+ [HidePasswords],
+ [Manage]
+ )
+ SELECT
+ @Id,
+ u.Id,
+ u.ReadOnly,
+ u.HidePasswords,
+ u.Manage
+ FROM @Users u
+ INNER JOIN [dbo].[OrganizationUser] ou ON ou.Id = u.Id
+ LEFT JOIN [dbo].[CollectionUser] cu
+ ON cu.CollectionId = @Id AND cu.OrganizationUserId = u.Id
+ WHERE ou.OrganizationId = @OrganizationId
+ AND cu.CollectionId IS NULL;
+
+ EXEC [dbo].[User_BumpAccountRevisionDateByCollectionId] @Id, @OrganizationId
+END
+GO
+
+CREATE OR ALTER PROCEDURE [dbo].[Collection_ReadByOrganizationIdWithPermissions]
+ @OrganizationId UNIQUEIDENTIFIER,
+ @UserId UNIQUEIDENTIFIER,
+ @IncludeAccessRelationships BIT
+AS
+BEGIN
+ SET NOCOUNT ON
+
+ SELECT
+ C.*,
+ MIN(CASE
+ WHEN
+ COALESCE(CU.[ReadOnly], CG.[ReadOnly], 0) = 0
+ THEN 0
+ ELSE 1
+ END) AS [ReadOnly],
+ MIN(CASE
+ WHEN
+ COALESCE(CU.[HidePasswords], CG.[HidePasswords], 0) = 0
+ THEN 0
+ ELSE 1
+ END) AS [HidePasswords],
+ MAX(CASE
+ WHEN
+ COALESCE(CU.[Manage], CG.[Manage], 0) = 0
+ THEN 0
+ ELSE 1
+ END) AS [Manage],
+ MAX(CASE
+ WHEN
+ CU.[CollectionId] IS NULL AND CG.[CollectionId] IS NULL
+ THEN 0
+ ELSE 1
+ END) AS [Assigned],
+ CASE
+ WHEN
+ -- No user or group has manage rights
+ NOT EXISTS(
+ SELECT 1
+ FROM [dbo].[CollectionUser] CU2
+ JOIN [dbo].[OrganizationUser] OU2 ON CU2.[OrganizationUserId] = OU2.[Id]
+ WHERE
+ CU2.[CollectionId] = C.[Id] AND
+ CU2.[Manage] = 1
+ )
+ AND NOT EXISTS (
+ SELECT 1
+ FROM [dbo].[CollectionGroup] CG2
+ WHERE
+ CG2.[CollectionId] = C.[Id] AND
+ CG2.[Manage] = 1
+ )
+ THEN 1
+ ELSE 0
+ END AS [Unmanaged]
+ FROM
+ [dbo].[CollectionView] C
+ LEFT JOIN
+ [dbo].[OrganizationUser] OU ON C.[OrganizationId] = OU.[OrganizationId] AND OU.[UserId] = @UserId
+ LEFT JOIN
+ [dbo].[CollectionUser] CU ON CU.[CollectionId] = C.[Id] AND CU.[OrganizationUserId] = [OU].[Id]
+ LEFT JOIN
+ [dbo].[GroupUser] GU ON CU.[CollectionId] IS NULL AND GU.[OrganizationUserId] = OU.[Id]
+ LEFT JOIN
+ [dbo].[Group] G ON G.[Id] = GU.[GroupId]
+ LEFT JOIN
+ [dbo].[CollectionGroup] CG ON CG.[CollectionId] = C.[Id] AND CG.[GroupId] = GU.[GroupId]
+ WHERE
+ C.[OrganizationId] = @OrganizationId
+ GROUP BY
+ C.[Id],
+ C.[OrganizationId],
+ C.[Name],
+ C.[CreationDate],
+ C.[RevisionDate],
+ C.[ExternalId],
+ C.[DefaultUserCollectionEmail],
+ C.[Type]
+
+ IF (@IncludeAccessRelationships = 1)
+ BEGIN
+ EXEC [dbo].[CollectionGroup_ReadByOrganizationId] @OrganizationId
+ EXEC [dbo].[CollectionUser_ReadByOrganizationId] @OrganizationId
+ END
+END
+GO
+
+CREATE OR ALTER PROCEDURE [dbo].[Collection_CreateWithGroupsAndUsers]
+ @Id UNIQUEIDENTIFIER,
+ @OrganizationId UNIQUEIDENTIFIER,
+ @Name VARCHAR(MAX),
+ @ExternalId NVARCHAR(300),
+ @CreationDate DATETIME2(7),
+ @RevisionDate DATETIME2(7),
+ @Groups AS [dbo].[CollectionAccessSelectionType] READONLY,
+ @Users AS [dbo].[CollectionAccessSelectionType] READONLY,
+ @DefaultUserCollectionEmail NVARCHAR(256) = NULL,
+ @Type TINYINT = 0
+AS
+BEGIN
+ SET NOCOUNT ON
+
+ EXEC [dbo].[Collection_Create] @Id, @OrganizationId, @Name, @ExternalId, @CreationDate, @RevisionDate, @DefaultUserCollectionEmail, @Type
+
+ -- Groups
+ ;WITH [AvailableGroupsCTE] AS(
+ SELECT
+ [Id]
+ FROM
+ [dbo].[Group]
+ WHERE
+ [OrganizationId] = @OrganizationId
+ )
+ INSERT INTO [dbo].[CollectionGroup]
+ (
+ [CollectionId],
+ [GroupId],
+ [ReadOnly],
+ [HidePasswords],
+ [Manage]
+ )
+ SELECT
+ @Id,
+ [Id],
+ [ReadOnly],
+ [HidePasswords],
+ [Manage]
+ FROM
+ @Groups
+ WHERE
+ [Id] IN (SELECT [Id] FROM [AvailableGroupsCTE])
+
+ -- Users
+ ;WITH [AvailableUsersCTE] AS(
+ SELECT
+ [Id]
+ FROM
+ [dbo].[OrganizationUser]
+ WHERE
+ [OrganizationId] = @OrganizationId
+ )
+ INSERT INTO [dbo].[CollectionUser]
+ (
+ [CollectionId],
+ [OrganizationUserId],
+ [ReadOnly],
+ [HidePasswords],
+ [Manage]
+ )
+ SELECT
+ @Id,
+ [Id],
+ [ReadOnly],
+ [HidePasswords],
+ [Manage]
+ FROM
+ @Users
+ WHERE
+ [Id] IN (SELECT [Id] FROM [AvailableUsersCTE])
+
+ EXEC [dbo].[User_BumpAccountRevisionDateByOrganizationId] @OrganizationId
+END
+GO
+
+CREATE OR ALTER PROCEDURE [dbo].[Collection_ReadByIdWithPermissions]
+ @CollectionId UNIQUEIDENTIFIER,
+ @UserId UNIQUEIDENTIFIER,
+ @IncludeAccessRelationships BIT
+AS
+BEGIN
+ SET NOCOUNT ON
+
+ SELECT
+ C.*,
+ MIN(CASE
+ WHEN
+ COALESCE(CU.[ReadOnly], CG.[ReadOnly], 0) = 0
+ THEN 0
+ ELSE 1
+ END) AS [ReadOnly],
+ MIN (CASE
+ WHEN
+ COALESCE(CU.[HidePasswords], CG.[HidePasswords], 0) = 0
+ THEN 0
+ ELSE 1
+ END) AS [HidePasswords],
+ MAX(CASE
+ WHEN
+ COALESCE(CU.[Manage], CG.[Manage], 0) = 0
+ THEN 0
+ ELSE 1
+ END) AS [Manage],
+ MAX(CASE
+ WHEN
+ CU.[CollectionId] IS NULL AND CG.[CollectionId] IS NULL
+ THEN 0
+ ELSE 1
+ END) AS [Assigned],
+ CASE
+ WHEN
+ -- No user or group has manage rights
+ NOT EXISTS(
+ SELECT 1
+ FROM [dbo].[CollectionUser] CU2
+ JOIN [dbo].[OrganizationUser] OU2 ON CU2.[OrganizationUserId] = OU2.[Id]
+ WHERE
+ CU2.[CollectionId] = C.[Id] AND
+ CU2.[Manage] = 1
+ )
+ AND NOT EXISTS (
+ SELECT 1
+ FROM [dbo].[CollectionGroup] CG2
+ WHERE
+ CG2.[CollectionId] = C.[Id] AND
+ CG2.[Manage] = 1
+ )
+ THEN 1
+ ELSE 0
+ END AS [Unmanaged]
+ FROM
+ [dbo].[CollectionView] C
+ LEFT JOIN
+ [dbo].[OrganizationUser] OU ON C.[OrganizationId] = OU.[OrganizationId] AND OU.[UserId] = @UserId
+ LEFT JOIN
+ [dbo].[CollectionUser] CU ON CU.[CollectionId] = C.[Id] AND CU.[OrganizationUserId] = [OU].[Id]
+ LEFT JOIN
+ [dbo].[GroupUser] GU ON CU.[CollectionId] IS NULL AND GU.[OrganizationUserId] = OU.[Id]
+ LEFT JOIN
+ [dbo].[Group] G ON G.[Id] = GU.[GroupId]
+ LEFT JOIN
+ [dbo].[CollectionGroup] CG ON CG.[CollectionId] = C.[Id] AND CG.[GroupId] = GU.[GroupId]
+ WHERE
+ C.[Id] = @CollectionId
+ GROUP BY
+ C.[Id],
+ C.[OrganizationId],
+ C.[Name],
+ C.[CreationDate],
+ C.[RevisionDate],
+ C.[ExternalId],
+ C.[DefaultUserCollectionEmail],
+ C.[Type]
+
+ IF (@IncludeAccessRelationships = 1)
+ BEGIN
+ EXEC [dbo].[CollectionGroup_ReadByCollectionId] @CollectionId
+ EXEC [dbo].[CollectionUser_ReadByCollectionId] @CollectionId
+ END
+END
diff --git a/util/MySqlMigrations/Migrations/20250603133713_AddOrgUserDefaultCollection.Designer.cs b/util/MySqlMigrations/Migrations/20250603133713_AddOrgUserDefaultCollection.Designer.cs
new file mode 100644
index 0000000000..c937df9fe9
--- /dev/null
+++ b/util/MySqlMigrations/Migrations/20250603133713_AddOrgUserDefaultCollection.Designer.cs
@@ -0,0 +1,3125 @@
+//
+using System;
+using Bit.Infrastructure.EntityFramework.Repositories;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Metadata;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+
+#nullable disable
+
+namespace Bit.MySqlMigrations.Migrations
+{
+ [DbContext(typeof(DatabaseContext))]
+ [Migration("20250603133713_AddOrgUserDefaultCollection")]
+ partial class AddOrgUserDefaultCollection
+ {
+ ///
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("ProductVersion", "8.0.8")
+ .HasAnnotation("Relational:MaxIdentifierLength", 64);
+
+ MySqlModelBuilderExtensions.AutoIncrementColumns(modelBuilder);
+
+ modelBuilder.Entity("Bit.Infrastructure.EntityFramework.AdminConsole.Models.Organization", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("char(36)");
+
+ b.Property("AllowAdminAccessToAllCollectionItems")
+ .HasColumnType("tinyint(1)")
+ .HasDefaultValue(true);
+
+ b.Property("BillingEmail")
+ .IsRequired()
+ .HasMaxLength(256)
+ .HasColumnType("varchar(256)");
+
+ b.Property("BusinessAddress1")
+ .HasMaxLength(50)
+ .HasColumnType("varchar(50)");
+
+ b.Property("BusinessAddress2")
+ .HasMaxLength(50)
+ .HasColumnType("varchar(50)");
+
+ b.Property("BusinessAddress3")
+ .HasMaxLength(50)
+ .HasColumnType("varchar(50)");
+
+ b.Property("BusinessCountry")
+ .HasMaxLength(2)
+ .HasColumnType("varchar(2)");
+
+ b.Property("BusinessName")
+ .HasMaxLength(50)
+ .HasColumnType("varchar(50)");
+
+ b.Property("BusinessTaxNumber")
+ .HasMaxLength(30)
+ .HasColumnType("varchar(30)");
+
+ b.Property("CreationDate")
+ .HasColumnType("datetime(6)");
+
+ b.Property("Enabled")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("ExpirationDate")
+ .HasColumnType("datetime(6)");
+
+ b.Property("Gateway")
+ .HasColumnType("tinyint unsigned");
+
+ b.Property("GatewayCustomerId")
+ .HasMaxLength(50)
+ .HasColumnType("varchar(50)");
+
+ b.Property("GatewaySubscriptionId")
+ .HasMaxLength(50)
+ .HasColumnType("varchar(50)");
+
+ b.Property("Identifier")
+ .HasMaxLength(50)
+ .HasColumnType("varchar(50)");
+
+ b.Property("LicenseKey")
+ .HasMaxLength(100)
+ .HasColumnType("varchar(100)");
+
+ b.Property("LimitCollectionCreation")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("LimitCollectionDeletion")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("LimitItemDeletion")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("MaxAutoscaleSeats")
+ .HasColumnType("int");
+
+ b.Property("MaxAutoscaleSmSeats")
+ .HasColumnType("int");
+
+ b.Property("MaxAutoscaleSmServiceAccounts")
+ .HasColumnType("int");
+
+ b.Property("MaxCollections")
+ .HasColumnType("smallint");
+
+ b.Property("MaxStorageGb")
+ .HasColumnType("smallint");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasMaxLength(50)
+ .HasColumnType("varchar(50)");
+
+ b.Property("OwnersNotifiedOfAutoscaling")
+ .HasColumnType("datetime(6)");
+
+ b.Property("Plan")
+ .IsRequired()
+ .HasMaxLength(50)
+ .HasColumnType("varchar(50)");
+
+ b.Property("PlanType")
+ .HasColumnType("tinyint unsigned");
+
+ b.Property("PrivateKey")
+ .HasColumnType("longtext");
+
+ b.Property("PublicKey")
+ .HasColumnType("longtext");
+
+ b.Property("ReferenceData")
+ .HasColumnType("longtext");
+
+ b.Property("RevisionDate")
+ .HasColumnType("datetime(6)");
+
+ b.Property("Seats")
+ .HasColumnType("int");
+
+ b.Property("SelfHost")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("SmSeats")
+ .HasColumnType("int");
+
+ b.Property("SmServiceAccounts")
+ .HasColumnType("int");
+
+ b.Property("Status")
+ .HasColumnType("tinyint unsigned");
+
+ b.Property("Storage")
+ .HasColumnType("bigint");
+
+ b.Property("TwoFactorProviders")
+ .HasColumnType("longtext");
+
+ b.Property("Use2fa")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("UseAdminSponsoredFamilies")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("UseApi")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("UseCustomPermissions")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("UseDirectory")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("UseEvents")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("UseGroups")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("UseKeyConnector")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("UseOrganizationDomains")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("UsePasswordManager")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("UsePolicies")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("UseResetPassword")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("UseRiskInsights")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("UseScim")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("UseSecretsManager")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("UseSso")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("UseTotp")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("UsersGetPremium")
+ .HasColumnType("tinyint(1)");
+
+ b.HasKey("Id");
+
+ b.HasIndex("Id", "Enabled")
+ .HasAnnotation("Npgsql:IndexInclude", new[] { "UseTotp" });
+
+ b.ToTable("Organization", (string)null);
+ });
+
+ modelBuilder.Entity("Bit.Infrastructure.EntityFramework.AdminConsole.Models.OrganizationIntegration", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("char(36)");
+
+ b.Property("Configuration")
+ .HasColumnType("longtext");
+
+ b.Property("CreationDate")
+ .HasColumnType("datetime(6)");
+
+ b.Property("OrganizationId")
+ .HasColumnType("char(36)");
+
+ b.Property("RevisionDate")
+ .HasColumnType("datetime(6)");
+
+ b.Property("Type")
+ .HasColumnType("int");
+
+ 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("char(36)");
+
+ b.Property("Configuration")
+ .HasColumnType("longtext");
+
+ b.Property("CreationDate")
+ .HasColumnType("datetime(6)");
+
+ b.Property("EventType")
+ .HasColumnType("int");
+
+ b.Property("OrganizationIntegrationId")
+ .HasColumnType("char(36)");
+
+ b.Property("RevisionDate")
+ .HasColumnType("datetime(6)");
+
+ b.Property("Template")
+ .HasColumnType("longtext");
+
+ b.HasKey("Id");
+
+ b.HasIndex("OrganizationIntegrationId");
+
+ b.ToTable("OrganizationIntegrationConfiguration", (string)null);
+ });
+
+ modelBuilder.Entity("Bit.Infrastructure.EntityFramework.AdminConsole.Models.Policy", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("char(36)");
+
+ b.Property("CreationDate")
+ .HasColumnType("datetime(6)");
+
+ b.Property("Data")
+ .HasColumnType("longtext");
+
+ b.Property("Enabled")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("OrganizationId")
+ .HasColumnType("char(36)");
+
+ b.Property("RevisionDate")
+ .HasColumnType("datetime(6)");
+
+ b.Property("Type")
+ .HasColumnType("tinyint unsigned");
+
+ 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("char(36)");
+
+ b.Property("BillingEmail")
+ .HasColumnType("longtext");
+
+ b.Property("BillingPhone")
+ .HasColumnType("longtext");
+
+ b.Property("BusinessAddress1")
+ .HasColumnType("longtext");
+
+ b.Property("BusinessAddress2")
+ .HasColumnType("longtext");
+
+ b.Property("BusinessAddress3")
+ .HasColumnType("longtext");
+
+ b.Property("BusinessCountry")
+ .HasColumnType("longtext");
+
+ b.Property("BusinessName")
+ .HasColumnType("longtext");
+
+ b.Property("BusinessTaxNumber")
+ .HasColumnType("longtext");
+
+ b.Property("CreationDate")
+ .HasColumnType("datetime(6)");
+
+ b.Property("DiscountId")
+ .HasColumnType("longtext");
+
+ b.Property("Enabled")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("Gateway")
+ .HasColumnType("tinyint unsigned");
+
+ b.Property("GatewayCustomerId")
+ .HasColumnType("longtext");
+
+ b.Property("GatewaySubscriptionId")
+ .HasColumnType("longtext");
+
+ b.Property("Name")
+ .HasColumnType("longtext");
+
+ b.Property("RevisionDate")
+ .HasColumnType("datetime(6)");
+
+ b.Property("Status")
+ .HasColumnType("tinyint unsigned");
+
+ b.Property("Type")
+ .HasColumnType("tinyint unsigned");
+
+ b.Property("UseEvents")
+ .HasColumnType("tinyint(1)");
+
+ b.HasKey("Id");
+
+ b.ToTable("Provider", (string)null);
+ });
+
+ modelBuilder.Entity("Bit.Infrastructure.EntityFramework.AdminConsole.Models.Provider.ProviderOrganization", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("char(36)");
+
+ b.Property("CreationDate")
+ .HasColumnType("datetime(6)");
+
+ b.Property("Key")
+ .HasColumnType("longtext");
+
+ b.Property("OrganizationId")
+ .HasColumnType("char(36)");
+
+ b.Property("ProviderId")
+ .HasColumnType("char(36)");
+
+ b.Property("RevisionDate")
+ .HasColumnType("datetime(6)");
+
+ b.Property("Settings")
+ .HasColumnType("longtext");
+
+ 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("char(36)");
+
+ b.Property("CreationDate")
+ .HasColumnType("datetime(6)");
+
+ b.Property("Email")
+ .HasColumnType("longtext");
+
+ b.Property("Key")
+ .HasColumnType("longtext");
+
+ b.Property("Permissions")
+ .HasColumnType("longtext");
+
+ b.Property("ProviderId")
+ .HasColumnType("char(36)");
+
+ b.Property("RevisionDate")
+ .HasColumnType("datetime(6)");
+
+ b.Property("Status")
+ .HasColumnType("tinyint unsigned");
+
+ b.Property("Type")
+ .HasColumnType("tinyint unsigned");
+
+ b.Property("UserId")
+ .HasColumnType("char(36)");
+
+ 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("char(36)");
+
+ b.Property("AccessCode")
+ .HasMaxLength(25)
+ .HasColumnType("varchar(25)");
+
+ b.Property("Approved")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("AuthenticationDate")
+ .HasColumnType("datetime(6)");
+
+ b.Property("CreationDate")
+ .HasColumnType("datetime(6)");
+
+ b.Property("Key")
+ .HasColumnType("longtext");
+
+ b.Property("MasterPasswordHash")
+ .HasColumnType("longtext");
+
+ b.Property("OrganizationId")
+ .HasColumnType("char(36)");
+
+ b.Property("PublicKey")
+ .HasColumnType("longtext");
+
+ b.Property("RequestCountryName")
+ .HasMaxLength(200)
+ .HasColumnType("varchar(200)");
+
+ b.Property("RequestDeviceIdentifier")
+ .HasMaxLength(50)
+ .HasColumnType("varchar(50)");
+
+ b.Property("RequestDeviceType")
+ .HasColumnType("tinyint unsigned");
+
+ b.Property("RequestIpAddress")
+ .HasMaxLength(50)
+ .HasColumnType("varchar(50)");
+
+ b.Property("ResponseDate")
+ .HasColumnType("datetime(6)");
+
+ b.Property("ResponseDeviceId")
+ .HasColumnType("char(36)");
+
+ b.Property("Type")
+ .HasColumnType("tinyint unsigned");
+
+ b.Property("UserId")
+ .HasColumnType("char(36)");
+
+ 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("char(36)");
+
+ b.Property("CreationDate")
+ .HasColumnType("datetime(6)");
+
+ b.Property("Email")
+ .HasMaxLength(256)
+ .HasColumnType("varchar(256)");
+
+ b.Property("GranteeId")
+ .HasColumnType("char(36)");
+
+ b.Property("GrantorId")
+ .HasColumnType("char(36)");
+
+ b.Property("KeyEncrypted")
+ .HasColumnType("longtext");
+
+ b.Property("LastNotificationDate")
+ .HasColumnType("datetime(6)");
+
+ b.Property("RecoveryInitiatedDate")
+ .HasColumnType("datetime(6)");
+
+ b.Property("RevisionDate")
+ .HasColumnType("datetime(6)");
+
+ b.Property("Status")
+ .HasColumnType("tinyint unsigned");
+
+ b.Property("Type")
+ .HasColumnType("tinyint unsigned");
+
+ b.Property("WaitTimeDays")
+ .HasColumnType("int");
+
+ 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("int");
+
+ MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id"));
+
+ b.Property("ClientId")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("varchar(200)");
+
+ b.Property("ConsumedDate")
+ .HasColumnType("datetime(6)");
+
+ b.Property("CreationDate")
+ .HasColumnType("datetime(6)");
+
+ b.Property("Data")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("Description")
+ .HasMaxLength(200)
+ .HasColumnType("varchar(200)");
+
+ b.Property("ExpirationDate")
+ .HasColumnType("datetime(6)");
+
+ b.Property("Key")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("varchar(200)");
+
+ b.Property("SessionId")
+ .HasMaxLength(100)
+ .HasColumnType("varchar(100)");
+
+ b.Property("SubjectId")
+ .HasMaxLength(200)
+ .HasColumnType("varchar(200)");
+
+ b.Property("Type")
+ .IsRequired()
+ .HasMaxLength(50)
+ .HasColumnType("varchar(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");
+
+ MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id"));
+
+ b.Property("CreationDate")
+ .HasColumnType("datetime(6)");
+
+ b.Property("Data")
+ .HasColumnType("longtext");
+
+ b.Property("Enabled")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("OrganizationId")
+ .HasColumnType("char(36)");
+
+ b.Property("RevisionDate")
+ .HasColumnType("datetime(6)");
+
+ 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");
+
+ MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id"));
+
+ b.Property("CreationDate")
+ .HasColumnType("datetime(6)");
+
+ b.Property("ExternalId")
+ .HasMaxLength(300)
+ .HasColumnType("varchar(300)");
+
+ b.Property("OrganizationId")
+ .HasColumnType("char(36)");
+
+ b.Property("UserId")
+ .HasColumnType("char(36)");
+
+ b.HasKey("Id");
+
+ b.HasIndex("OrganizationId")
+ .HasAnnotation("SqlServer:Clustered", false);
+
+ b.HasIndex("UserId");
+
+ b.HasIndex("OrganizationId", "ExternalId")
+ .IsUnique()
+ .HasAnnotation("Npgsql:IndexInclude", new[] { "UserId" })
+ .HasAnnotation("SqlServer:Clustered", false);
+
+ 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("char(36)");
+
+ b.Property("AaGuid")
+ .HasColumnType("char(36)");
+
+ b.Property("Counter")
+ .HasColumnType("int");
+
+ b.Property("CreationDate")
+ .HasColumnType("datetime(6)");
+
+ b.Property("CredentialId")
+ .HasMaxLength(256)
+ .HasColumnType("varchar(256)");
+
+ b.Property("EncryptedPrivateKey")
+ .HasMaxLength(2000)
+ .HasColumnType("varchar(2000)");
+
+ b.Property("EncryptedPublicKey")
+ .HasMaxLength(2000)
+ .HasColumnType("varchar(2000)");
+
+ b.Property("EncryptedUserKey")
+ .HasMaxLength(2000)
+ .HasColumnType("varchar(2000)");
+
+ b.Property("Name")
+ .HasMaxLength(50)
+ .HasColumnType("varchar(50)");
+
+ b.Property("PublicKey")
+ .HasMaxLength(256)
+ .HasColumnType("varchar(256)");
+
+ b.Property("RevisionDate")
+ .HasColumnType("datetime(6)");
+
+ b.Property("SupportsPrf")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("Type")
+ .HasMaxLength(20)
+ .HasColumnType("varchar(20)");
+
+ b.Property("UserId")
+ .HasColumnType("char(36)");
+
+ b.HasKey("Id");
+
+ b.HasIndex("UserId");
+
+ b.ToTable("WebAuthnCredential", (string)null);
+ });
+
+ modelBuilder.Entity("Bit.Infrastructure.EntityFramework.Billing.Models.ClientOrganizationMigrationRecord", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("char(36)");
+
+ b.Property("ExpirationDate")
+ .HasColumnType("datetime(6)");
+
+ b.Property("GatewayCustomerId")
+ .IsRequired()
+ .HasMaxLength(50)
+ .HasColumnType("varchar(50)");
+
+ b.Property("GatewaySubscriptionId")
+ .IsRequired()
+ .HasMaxLength(50)
+ .HasColumnType("varchar(50)");
+
+ b.Property("MaxAutoscaleSeats")
+ .HasColumnType("int");
+
+ b.Property("MaxStorageGb")
+ .HasColumnType("smallint");
+
+ b.Property("OrganizationId")
+ .HasColumnType("char(36)");
+
+ b.Property("PlanType")
+ .HasColumnType("tinyint unsigned");
+
+ b.Property("ProviderId")
+ .HasColumnType("char(36)");
+
+ b.Property("Seats")
+ .HasColumnType("int");
+
+ b.Property("Status")
+ .HasColumnType("tinyint unsigned");
+
+ 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("char(36)");
+
+ b.Property("CreationDate")
+ .HasColumnType("datetime(6)");
+
+ b.Property("InstallationId")
+ .HasColumnType("char(36)");
+
+ b.Property("OrganizationId")
+ .HasColumnType("char(36)");
+
+ b.Property("RevisionDate")
+ .HasColumnType("datetime(6)");
+
+ 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("char(36)");
+
+ b.Property("AssignedSeats")
+ .HasColumnType("int");
+
+ b.Property("ClientId")
+ .HasColumnType("char(36)");
+
+ b.Property("ClientName")
+ .IsRequired()
+ .HasMaxLength(50)
+ .HasColumnType("varchar(50)");
+
+ b.Property("Created")
+ .HasColumnType("datetime(6)");
+
+ b.Property("InvoiceId")
+ .IsRequired()
+ .HasMaxLength(50)
+ .HasColumnType("varchar(50)");
+
+ b.Property("InvoiceNumber")
+ .HasMaxLength(50)
+ .HasColumnType("varchar(50)");
+
+ b.Property("PlanName")
+ .IsRequired()
+ .HasMaxLength(50)
+ .HasColumnType("varchar(50)");
+
+ b.Property("ProviderId")
+ .HasColumnType("char(36)");
+
+ b.Property("Total")
+ .HasColumnType("decimal(65,30)");
+
+ b.Property("UsedSeats")
+ .HasColumnType("int");
+
+ b.HasKey("Id");
+
+ b.HasIndex("ProviderId");
+
+ b.ToTable("ProviderInvoiceItem", (string)null);
+ });
+
+ modelBuilder.Entity("Bit.Infrastructure.EntityFramework.Billing.Models.ProviderPlan", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("char(36)");
+
+ b.Property("AllocatedSeats")
+ .HasColumnType("int");
+
+ b.Property("PlanType")
+ .HasColumnType("tinyint unsigned");
+
+ b.Property("ProviderId")
+ .HasColumnType("char(36)");
+
+ b.Property("PurchasedSeats")
+ .HasColumnType("int");
+
+ b.Property("SeatMinimum")
+ .HasColumnType("int");
+
+ b.HasKey("Id");
+
+ b.HasIndex("ProviderId");
+
+ b.HasIndex("Id", "PlanType")
+ .IsUnique();
+
+ b.ToTable("ProviderPlan", (string)null);
+ });
+
+ modelBuilder.Entity("Bit.Infrastructure.EntityFramework.Models.Cache", b =>
+ {
+ b.Property("Id")
+ .HasMaxLength(449)
+ .HasColumnType("varchar(449)");
+
+ b.Property("AbsoluteExpiration")
+ .HasColumnType("datetime(6)");
+
+ b.Property("ExpiresAtTime")
+ .HasColumnType("datetime(6)");
+
+ b.Property("SlidingExpirationInSeconds")
+ .HasColumnType("bigint");
+
+ b.Property("Value")
+ .IsRequired()
+ .HasColumnType("longblob");
+
+ 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("char(36)");
+
+ b.Property("CreationDate")
+ .HasColumnType("datetime(6)");
+
+ b.Property("DefaultUserCollectionEmail")
+ .HasColumnType("longtext");
+
+ b.Property("ExternalId")
+ .HasMaxLength(300)
+ .HasColumnType("varchar(300)");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("OrganizationId")
+ .HasColumnType("char(36)");
+
+ b.Property("RevisionDate")
+ .HasColumnType("datetime(6)");
+
+ b.Property("Type")
+ .HasColumnType("int");
+
+ b.HasKey("Id");
+
+ b.HasIndex("OrganizationId");
+
+ b.ToTable("Collection", (string)null);
+ });
+
+ modelBuilder.Entity("Bit.Infrastructure.EntityFramework.Models.CollectionCipher", b =>
+ {
+ b.Property("CollectionId")
+ .HasColumnType("char(36)");
+
+ b.Property("CipherId")
+ .HasColumnType("char(36)");
+
+ b.HasKey("CollectionId", "CipherId");
+
+ b.HasIndex("CipherId");
+
+ b.ToTable("CollectionCipher", (string)null);
+ });
+
+ modelBuilder.Entity("Bit.Infrastructure.EntityFramework.Models.CollectionGroup", b =>
+ {
+ b.Property("CollectionId")
+ .HasColumnType("char(36)");
+
+ b.Property("GroupId")
+ .HasColumnType("char(36)");
+
+ b.Property("HidePasswords")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("Manage")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("ReadOnly")
+ .HasColumnType("tinyint(1)");
+
+ b.HasKey("CollectionId", "GroupId");
+
+ b.HasIndex("GroupId");
+
+ b.ToTable("CollectionGroups");
+ });
+
+ modelBuilder.Entity("Bit.Infrastructure.EntityFramework.Models.CollectionUser", b =>
+ {
+ b.Property("CollectionId")
+ .HasColumnType("char(36)");
+
+ b.Property("OrganizationUserId")
+ .HasColumnType("char(36)");
+
+ b.Property("HidePasswords")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("Manage")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("ReadOnly")
+ .HasColumnType("tinyint(1)");
+
+ b.HasKey("CollectionId", "OrganizationUserId");
+
+ b.HasIndex("OrganizationUserId");
+
+ b.ToTable("CollectionUsers");
+ });
+
+ modelBuilder.Entity("Bit.Infrastructure.EntityFramework.Models.Device", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("char(36)");
+
+ b.Property("Active")
+ .HasColumnType("tinyint(1)")
+ .HasDefaultValue(true);
+
+ b.Property("CreationDate")
+ .HasColumnType("datetime(6)");
+
+ b.Property("EncryptedPrivateKey")
+ .HasColumnType("longtext");
+
+ b.Property("EncryptedPublicKey")
+ .HasColumnType("longtext");
+
+ b.Property("EncryptedUserKey")
+ .HasColumnType("longtext");
+
+ b.Property("Identifier")
+ .IsRequired()
+ .HasMaxLength(50)
+ .HasColumnType("varchar(50)");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasMaxLength(50)
+ .HasColumnType("varchar(50)");
+
+ b.Property("PushToken")
+ .HasMaxLength(255)
+ .HasColumnType("varchar(255)");
+
+ b.Property("RevisionDate")
+ .HasColumnType("datetime(6)");
+
+ b.Property("Type")
+ .HasColumnType("tinyint unsigned");
+
+ b.Property