1
0
mirror of https://github.com/bitwarden/server synced 2026-01-28 15:23:38 +00:00

Use guid array instead of json

This commit is contained in:
Thomas Rittson
2026-01-02 08:36:12 +10:00
parent 415182a9b8
commit 8427367c76
4 changed files with 34 additions and 33 deletions

View File

@@ -373,14 +373,13 @@ public class CollectionRepository : Repository<Collection, Guid>, ICollectionRep
try
{
var organizationUserIdsJson = JsonSerializer.Serialize(organizationUserIds);
await connection.ExecuteAsync(
"[dbo].[Collection_CreateDefaultCollections]",
new
{
OrganizationId = organizationId,
DefaultCollectionName = defaultCollectionName,
OrganizationUserIdsJson = organizationUserIdsJson
OrganizationUserIds = organizationUserIds.ToGuidIdArrayTVP()
},
commandType: CommandType.StoredProcedure);
}

View File

@@ -1,32 +1,32 @@
-- Creates default user collections for organization users
-- Uses semaphore table to prevent duplicate default collections at database level
-- Cascade behavior: Organization -> OrganizationUser (CASCADE) -> DefaultCollectionSemaphore (CASCADE)
-- Organization FK uses NoAction to avoid competing cascade paths
CREATE PROCEDURE [dbo].[Collection_CreateDefaultCollections]
@OrganizationId UNIQUEIDENTIFIER,
@DefaultCollectionName VARCHAR(MAX),
@OrganizationUserIdsJson NVARCHAR(MAX)
@OrganizationUserIds AS [dbo].[GuidIdArray] READONLY
AS
BEGIN
SET NOCOUNT ON
-- Parse JSON once into table variable with pre-generated collection IDs
DECLARE @OrganizationUserIds TABLE
(
[OrganizationUserId] UNIQUEIDENTIFIER,
[CollectionId] UNIQUEIDENTIFIER
);
DECLARE @Now DATETIME2(7) = GETUTCDATE()
INSERT INTO @OrganizationUserIds
-- Create temporary table to allocate collection IDs to each organizationUser
DECLARE @CollectionsToInsert TABLE
(
[OrganizationUserId] UNIQUEIDENTIFIER,
[CollectionId] UNIQUEIDENTIFIER
);
INSERT INTO @CollectionsToInsert
(
[OrganizationUserId],
[CollectionId]
)
SELECT
CAST([value] AS UNIQUEIDENTIFIER),
ou.Id,
NEWID()
FROM
OPENJSON(@OrganizationUserIdsJson);
@OrganizationUserIds ou
BEGIN TRANSACTION;
@@ -40,9 +40,9 @@ BEGIN
)
SELECT
ou.[OrganizationUserId],
GETUTCDATE()
@Now
FROM
@OrganizationUserIds ou;
@CollectionsToInsert ou;
-- Insert collections for users who obtained semaphore entries
INSERT INTO [dbo].[Collection]
@@ -60,13 +60,13 @@ BEGIN
ou.[CollectionId],
@OrganizationId,
@DefaultCollectionName,
GETUTCDATE(),
GETUTCDATE(),
@Now,
@Now,
1, -- CollectionType.DefaultUserCollection
NULL,
NULL
FROM
@OrganizationUserIds ou;
@CollectionsToInsert ou;
-- Insert collection user mappings
INSERT INTO [dbo].[CollectionUser]
@@ -84,7 +84,7 @@ BEGIN
0, -- HidePasswords = false
1 -- Manage = true
FROM
@OrganizationUserIds ou;
@CollectionsToInsert ou;
COMMIT TRANSACTION;
END TRY

View File

@@ -71,7 +71,7 @@ public class CreateDefaultCollectionsTests
/// Test that calling CreateDefaultCollectionsAsync multiple times does NOT create duplicates
/// </summary>
[Theory, DatabaseData]
public async Task CreateDefaultCollectionsAsync_CalledMultipleTimes_DoesNotCreateDuplicates(
public async Task CreateDefaultCollectionsAsync_CalledMultipleTimesForSameOrganizationUser_Throws(
IUserRepository userRepository,
IOrganizationRepository organizationRepository,
ICollectionRepository collectionRepository,

View File

@@ -1,28 +1,30 @@
CREATE OR ALTER PROCEDURE [dbo].[Collection_CreateDefaultCollections]
@OrganizationId UNIQUEIDENTIFIER,
@DefaultCollectionName VARCHAR(MAX),
@OrganizationUserIdsJson NVARCHAR(MAX)
@OrganizationUserIds AS [dbo].[GuidIdArray] READONLY
AS
BEGIN
SET NOCOUNT ON
-- Parse JSON once into table variable with pre-generated collection IDs
DECLARE @OrganizationUserIds TABLE
DECLARE @Now DATETIME2(7) = GETUTCDATE()
-- Create temporary table to allocate collection IDs to each organizationUser
DECLARE @CollectionsToInsert TABLE
(
[OrganizationUserId] UNIQUEIDENTIFIER,
[CollectionId] UNIQUEIDENTIFIER
);
INSERT INTO @OrganizationUserIds
INSERT INTO @CollectionsToInsert
(
[OrganizationUserId],
[CollectionId]
)
SELECT
CAST([value] AS UNIQUEIDENTIFIER),
ou.Id,
NEWID()
FROM
OPENJSON(@OrganizationUserIdsJson);
@OrganizationUserIds ou
BEGIN TRANSACTION;
@@ -36,9 +38,9 @@ BEGIN
)
SELECT
ou.[OrganizationUserId],
GETUTCDATE()
@Now
FROM
@OrganizationUserIds ou;
@CollectionsToInsert ou;
-- Insert collections for users who obtained semaphore entries
INSERT INTO [dbo].[Collection]
@@ -56,13 +58,13 @@ BEGIN
ou.[CollectionId],
@OrganizationId,
@DefaultCollectionName,
GETUTCDATE(),
GETUTCDATE(),
@Now,
@Now,
1, -- CollectionType.DefaultUserCollection
NULL,
NULL
FROM
@OrganizationUserIds ou;
@CollectionsToInsert ou;
-- Insert collection user mappings
INSERT INTO [dbo].[CollectionUser]
@@ -80,7 +82,7 @@ BEGIN
0, -- HidePasswords = false
1 -- Manage = true
FROM
@OrganizationUserIds ou;
@CollectionsToInsert ou;
COMMIT TRANSACTION;
END TRY