Add BuildCreateDefaultCollectionAction method to ICollectionRepository and implementations in CollectionRepository classes

- Introduced a new method in ICollectionRepository to build an action for creating a default collection with user access.
- Implemented the method in both Dapper and Entity Framework CollectionRepository classes to handle collection creation and user access assignments.
- Enhanced the functionality to support transaction execution for database operations.
This commit is contained in:
Rui Tome
2026-01-29 17:01:45 +00:00
parent f2dba98f67
commit 23034681cc
3 changed files with 54 additions and 0 deletions

View File

@@ -1,5 +1,6 @@
using Bit.Core.Entities;
using Bit.Core.Models.Data;
using Bit.Core.OrganizationFeatures.OrganizationUsers.Interfaces;
#nullable enable
@@ -82,4 +83,11 @@ public interface ICollectionRepository : IRepository<Collection, Guid>
/// <param name="defaultCollectionName">The encrypted string to use as the default collection name.</param>
Task CreateDefaultCollectionsBulkAsync(Guid organizationId, IEnumerable<Guid> organizationUserIds, string defaultCollectionName);
/// <summary>
/// Builds an action that creates a default collection with user access.
/// </summary>
/// <param name="collection">The collection entity to create</param>
/// <param name="users">Collection access selections for users</param>
/// <returns>An action that can be executed within a transaction</returns>
OrganizationInitializationUpdateAction BuildCreateDefaultCollectionAction(Collection collection, IEnumerable<CollectionAccessSelection> users);
}

View File

@@ -5,6 +5,7 @@ using Bit.Core.AdminConsole.OrganizationFeatures.Collections;
using Bit.Core.Entities;
using Bit.Core.Enums;
using Bit.Core.Models.Data;
using Bit.Core.OrganizationFeatures.OrganizationUsers.Interfaces;
using Bit.Core.Repositories;
using Bit.Core.Settings;
using Bit.Core.Utilities;
@@ -529,4 +530,21 @@ public class CollectionRepository : Repository<Collection, Guid>, ICollectionRep
[DisallowNull]
public DataTable? Users { get; set; }
}
public OrganizationInitializationUpdateAction BuildCreateDefaultCollectionAction(Collection collection, IEnumerable<CollectionAccessSelection> users)
{
return async (SqlConnection? connection, SqlTransaction? transaction, object? context) =>
{
var collectionWithAccess = new CollectionWithGroupsAndUsers(
collection,
Enumerable.Empty<CollectionAccessSelection>(),
users);
await connection!.ExecuteAsync(
"[dbo].[Collection_CreateWithGroupsAndUsers]",
collectionWithAccess,
commandType: CommandType.StoredProcedure,
transaction: transaction);
};
}
}

View File

@@ -2,9 +2,11 @@
using Bit.Core.AdminConsole.OrganizationFeatures.Collections;
using Bit.Core.Enums;
using Bit.Core.Models.Data;
using Bit.Core.OrganizationFeatures.OrganizationUsers.Interfaces;
using Bit.Core.Repositories;
using Bit.Infrastructure.EntityFramework.Models;
using Bit.Infrastructure.EntityFramework.Repositories.Queries;
using Microsoft.Data.SqlClient;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
@@ -846,4 +848,30 @@ public class CollectionRepository : Repository<Core.Entities.Collection, Collect
public Task CreateDefaultCollectionsBulkAsync(Guid organizationId, IEnumerable<Guid> organizationUserIds,
string defaultCollectionName) =>
CreateDefaultCollectionsAsync(organizationId, organizationUserIds, defaultCollectionName);
public OrganizationInitializationUpdateAction BuildCreateDefaultCollectionAction(Core.Entities.Collection collection, IEnumerable<CollectionAccessSelection> users)
{
return async (SqlConnection? _, SqlTransaction? _, object? context) =>
{
var dbContext = (DatabaseContext)context!;
var efCollection = Mapper.Map<Collection>(collection);
await dbContext.Collections.AddAsync(efCollection);
foreach (var user in users)
{
var collectionUser = new CollectionUser
{
CollectionId = collection.Id,
OrganizationUserId = user.Id,
HidePasswords = user.HidePasswords,
ReadOnly = user.ReadOnly,
Manage = user.Manage
};
await dbContext.CollectionUsers.AddAsync(collectionUser);
}
await dbContext.SaveChangesAsync();
};
}
}