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:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user