diff --git a/src/Core/AdminConsole/OrganizationFeatures/Collections/CollectionUtils.cs b/src/Core/AdminConsole/OrganizationFeatures/Collections/CollectionUtils.cs
new file mode 100644
index 0000000000..e540c75555
--- /dev/null
+++ b/src/Core/AdminConsole/OrganizationFeatures/Collections/CollectionUtils.cs
@@ -0,0 +1,51 @@
+using Bit.Core.Entities;
+using Bit.Core.Enums;
+using Bit.Core.Utilities;
+
+namespace Bit.Core.AdminConsole.OrganizationFeatures.Collections;
+
+public static class CollectionUtils
+{
+ ///
+ /// Arranges Collection and CollectionUser objects to create default user collections.
+ ///
+ /// The organization ID.
+ /// The IDs for organization users who need default collections.
+ /// The encrypted string to use as the default collection name.
+ ///
+ public static (IEnumerable collection, IEnumerable collectionUsers)
+ BuildDefaultUserCollections(Guid organizationId, IEnumerable organizationUserIds,
+ string defaultCollectionName)
+ {
+ var collectionUsers = new List();
+ var collections = new List();
+
+ foreach (var orgUserId in organizationUserIds)
+ {
+ var collectionId = CoreHelpers.GenerateComb();
+
+ collections.Add(new Collection
+ {
+ Id = collectionId,
+ OrganizationId = organizationId,
+ Name = defaultCollectionName,
+ CreationDate = DateTime.UtcNow,
+ RevisionDate = DateTime.UtcNow,
+ Type = CollectionType.DefaultUserCollection,
+ DefaultUserCollectionEmail = null
+
+ });
+
+ collectionUsers.Add(new CollectionUser
+ {
+ CollectionId = collectionId,
+ OrganizationUserId = orgUserId,
+ ReadOnly = false,
+ HidePasswords = false,
+ Manage = true,
+ });
+ }
+
+ return (collections, collectionUsers);
+ }
+}
diff --git a/src/Infrastructure.Dapper/Repositories/CollectionRepository.cs b/src/Infrastructure.Dapper/Repositories/CollectionRepository.cs
index ac289eafb9..70f2de9d71 100644
--- a/src/Infrastructure.Dapper/Repositories/CollectionRepository.cs
+++ b/src/Infrastructure.Dapper/Repositories/CollectionRepository.cs
@@ -1,6 +1,7 @@
using System.Data;
using System.Diagnostics.CodeAnalysis;
using System.Text.Json;
+using Bit.Core.AdminConsole.OrganizationFeatures.Collections;
using Bit.Core.Entities;
using Bit.Core.Enums;
using Bit.Core.Models.Data;
@@ -391,7 +392,8 @@ public class CollectionRepository : Repository, ICollectionRep
return;
}
- var (collectionUsers, collections) = BuildDefaultCollectionForUsers(organizationId, organizationUserIds, defaultCollectionName);
+ var (collections, collectionUsers) =
+ CollectionUtils.BuildDefaultUserCollections(organizationId, organizationUserIds, defaultCollectionName);
await using var connection = new SqlConnection(ConnectionString);
connection.Open();
@@ -434,40 +436,6 @@ public class CollectionRepository : Repository, ICollectionRep
return results.ToHashSet();
}
- private (List collectionUser, List collection) BuildDefaultCollectionForUsers(Guid organizationId, IEnumerable missingDefaultCollectionUserIds, string defaultCollectionName)
- {
- var collectionUsers = new List();
- var collections = new List();
-
- foreach (var orgUserId in missingDefaultCollectionUserIds)
- {
- var collectionId = CoreHelpers.GenerateComb();
-
- collections.Add(new Collection
- {
- Id = collectionId,
- OrganizationId = organizationId,
- Name = defaultCollectionName,
- CreationDate = DateTime.UtcNow,
- RevisionDate = DateTime.UtcNow,
- Type = CollectionType.DefaultUserCollection,
- DefaultUserCollectionEmail = null
-
- });
-
- collectionUsers.Add(new CollectionUser
- {
- CollectionId = collectionId,
- OrganizationUserId = orgUserId,
- ReadOnly = false,
- HidePasswords = false,
- Manage = true,
- });
- }
-
- return (collectionUsers, collections);
- }
-
private async Task BulkInsertDefaultCollectionSemaphoresAsync(SqlConnection connection, SqlTransaction transaction, List semaphores)
{
if (!semaphores.Any())
diff --git a/src/Infrastructure.EntityFramework/Repositories/CollectionRepository.cs b/src/Infrastructure.EntityFramework/Repositories/CollectionRepository.cs
index 1fb387f48a..09ec901aba 100644
--- a/src/Infrastructure.EntityFramework/Repositories/CollectionRepository.cs
+++ b/src/Infrastructure.EntityFramework/Repositories/CollectionRepository.cs
@@ -1,4 +1,5 @@
using AutoMapper;
+using Bit.Core.AdminConsole.OrganizationFeatures.Collections;
using Bit.Core.Enums;
using Bit.Core.Models.Data;
using Bit.Core.Repositories;
@@ -803,7 +804,8 @@ public class CollectionRepository : Repository>(collections));
+ await dbContext.BulkCopyAsync(Mapper.Map>(collectionUsers));
await dbContext.SaveChangesAsync();
}
@@ -844,38 +846,4 @@ public class CollectionRepository : Repository collectionUser, List collection) BuildDefaultCollectionForUsers(Guid organizationId, IEnumerable missingDefaultCollectionUserIds, string defaultCollectionName)
- {
- var collectionUsers = new List();
- var collections = new List();
-
- foreach (var orgUserId in missingDefaultCollectionUserIds)
- {
- var collectionId = CoreHelpers.GenerateComb();
-
- collections.Add(new Collection
- {
- Id = collectionId,
- OrganizationId = organizationId,
- Name = defaultCollectionName,
- CreationDate = DateTime.UtcNow,
- RevisionDate = DateTime.UtcNow,
- Type = CollectionType.DefaultUserCollection,
- DefaultUserCollectionEmail = null
-
- });
-
- collectionUsers.Add(new CollectionUser
- {
- CollectionId = collectionId,
- OrganizationUserId = orgUserId,
- ReadOnly = false,
- HidePasswords = false,
- Manage = true,
- });
- }
-
- return (collectionUsers, collections);
- }
}