Skip to content

Commit 8427367

Browse files
committed
Use guid array instead of json
1 parent 415182a commit 8427367

File tree

4 files changed

+34
-33
lines changed

4 files changed

+34
-33
lines changed

src/Infrastructure.Dapper/Repositories/CollectionRepository.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -373,14 +373,13 @@ public async Task CreateDefaultCollectionsAsync(Guid organizationId, IEnumerable
373373

374374
try
375375
{
376-
var organizationUserIdsJson = JsonSerializer.Serialize(organizationUserIds);
377376
await connection.ExecuteAsync(
378377
"[dbo].[Collection_CreateDefaultCollections]",
379378
new
380379
{
381380
OrganizationId = organizationId,
382381
DefaultCollectionName = defaultCollectionName,
383-
OrganizationUserIdsJson = organizationUserIdsJson
382+
OrganizationUserIds = organizationUserIds.ToGuidIdArrayTVP()
384383
},
385384
commandType: CommandType.StoredProcedure);
386385
}

src/Sql/dbo/AdminConsole/Stored Procedures/Collection_CreateDefaultCollections.sql

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,32 @@
11
-- Creates default user collections for organization users
22
-- Uses semaphore table to prevent duplicate default collections at database level
3-
-- Cascade behavior: Organization -> OrganizationUser (CASCADE) -> DefaultCollectionSemaphore (CASCADE)
4-
-- Organization FK uses NoAction to avoid competing cascade paths
53
CREATE PROCEDURE [dbo].[Collection_CreateDefaultCollections]
64
@OrganizationId UNIQUEIDENTIFIER,
75
@DefaultCollectionName VARCHAR(MAX),
8-
@OrganizationUserIdsJson NVARCHAR(MAX)
6+
@OrganizationUserIds AS [dbo].[GuidIdArray] READONLY
97
AS
108
BEGIN
119
SET NOCOUNT ON
1210

13-
-- Parse JSON once into table variable with pre-generated collection IDs
14-
DECLARE @OrganizationUserIds TABLE
15-
(
16-
[OrganizationUserId] UNIQUEIDENTIFIER,
17-
[CollectionId] UNIQUEIDENTIFIER
18-
);
11+
DECLARE @Now DATETIME2(7) = GETUTCDATE()
12+
13+
-- Create temporary table to allocate collection IDs to each organizationUser
14+
DECLARE @CollectionsToInsert TABLE
15+
(
16+
[OrganizationUserId] UNIQUEIDENTIFIER,
17+
[CollectionId] UNIQUEIDENTIFIER
18+
);
1919

20-
INSERT INTO @OrganizationUserIds
20+
INSERT INTO @CollectionsToInsert
2121
(
2222
[OrganizationUserId],
2323
[CollectionId]
2424
)
2525
SELECT
26-
CAST([value] AS UNIQUEIDENTIFIER),
26+
ou.Id,
2727
NEWID()
2828
FROM
29-
OPENJSON(@OrganizationUserIdsJson);
29+
@OrganizationUserIds ou
3030

3131
BEGIN TRANSACTION;
3232

@@ -40,9 +40,9 @@ BEGIN
4040
)
4141
SELECT
4242
ou.[OrganizationUserId],
43-
GETUTCDATE()
43+
@Now
4444
FROM
45-
@OrganizationUserIds ou;
45+
@CollectionsToInsert ou;
4646

4747
-- Insert collections for users who obtained semaphore entries
4848
INSERT INTO [dbo].[Collection]
@@ -60,13 +60,13 @@ BEGIN
6060
ou.[CollectionId],
6161
@OrganizationId,
6262
@DefaultCollectionName,
63-
GETUTCDATE(),
64-
GETUTCDATE(),
63+
@Now,
64+
@Now,
6565
1, -- CollectionType.DefaultUserCollection
6666
NULL,
6767
NULL
6868
FROM
69-
@OrganizationUserIds ou;
69+
@CollectionsToInsert ou;
7070

7171
-- Insert collection user mappings
7272
INSERT INTO [dbo].[CollectionUser]
@@ -84,7 +84,7 @@ BEGIN
8484
0, -- HidePasswords = false
8585
1 -- Manage = true
8686
FROM
87-
@OrganizationUserIds ou;
87+
@CollectionsToInsert ou;
8888

8989
COMMIT TRANSACTION;
9090
END TRY

test/Infrastructure.IntegrationTest/AdminConsole/Repositories/CollectionRepository/CreateDefaultCollectionsTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ await collectionRepository.CreateDefaultCollectionsAsync(
7171
/// Test that calling CreateDefaultCollectionsAsync multiple times does NOT create duplicates
7272
/// </summary>
7373
[Theory, DatabaseData]
74-
public async Task CreateDefaultCollectionsAsync_CalledMultipleTimes_DoesNotCreateDuplicates(
74+
public async Task CreateDefaultCollectionsAsync_CalledMultipleTimesForSameOrganizationUser_Throws(
7575
IUserRepository userRepository,
7676
IOrganizationRepository organizationRepository,
7777
ICollectionRepository collectionRepository,

util/Migrator/DbScripts/2025-12-30_01_Collection_CreateDefaultCollections.sql

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,30 @@
11
CREATE OR ALTER PROCEDURE [dbo].[Collection_CreateDefaultCollections]
22
@OrganizationId UNIQUEIDENTIFIER,
33
@DefaultCollectionName VARCHAR(MAX),
4-
@OrganizationUserIdsJson NVARCHAR(MAX)
4+
@OrganizationUserIds AS [dbo].[GuidIdArray] READONLY
55
AS
66
BEGIN
77
SET NOCOUNT ON
88

9-
-- Parse JSON once into table variable with pre-generated collection IDs
10-
DECLARE @OrganizationUserIds TABLE
9+
DECLARE @Now DATETIME2(7) = GETUTCDATE()
10+
11+
-- Create temporary table to allocate collection IDs to each organizationUser
12+
DECLARE @CollectionsToInsert TABLE
1113
(
1214
[OrganizationUserId] UNIQUEIDENTIFIER,
1315
[CollectionId] UNIQUEIDENTIFIER
1416
);
1517

16-
INSERT INTO @OrganizationUserIds
18+
INSERT INTO @CollectionsToInsert
1719
(
1820
[OrganizationUserId],
1921
[CollectionId]
2022
)
2123
SELECT
22-
CAST([value] AS UNIQUEIDENTIFIER),
24+
ou.Id,
2325
NEWID()
2426
FROM
25-
OPENJSON(@OrganizationUserIdsJson);
27+
@OrganizationUserIds ou
2628

2729
BEGIN TRANSACTION;
2830

@@ -36,9 +38,9 @@ BEGIN
3638
)
3739
SELECT
3840
ou.[OrganizationUserId],
39-
GETUTCDATE()
41+
@Now
4042
FROM
41-
@OrganizationUserIds ou;
43+
@CollectionsToInsert ou;
4244

4345
-- Insert collections for users who obtained semaphore entries
4446
INSERT INTO [dbo].[Collection]
@@ -56,13 +58,13 @@ BEGIN
5658
ou.[CollectionId],
5759
@OrganizationId,
5860
@DefaultCollectionName,
59-
GETUTCDATE(),
60-
GETUTCDATE(),
61+
@Now,
62+
@Now,
6163
1, -- CollectionType.DefaultUserCollection
6264
NULL,
6365
NULL
6466
FROM
65-
@OrganizationUserIds ou;
67+
@CollectionsToInsert ou;
6668

6769
-- Insert collection user mappings
6870
INSERT INTO [dbo].[CollectionUser]
@@ -80,7 +82,7 @@ BEGIN
8082
0, -- HidePasswords = false
8183
1 -- Manage = true
8284
FROM
83-
@OrganizationUserIds ou;
85+
@CollectionsToInsert ou;
8486

8587
COMMIT TRANSACTION;
8688
END TRY

0 commit comments

Comments
 (0)