using System.Data; using System.Data.SqlClient; using System.Text.Json; using Bit.Core.Entities; using Bit.Core.Models.Data; using Bit.Core.Repositories; using Bit.Core.Settings; using Dapper; namespace Bit.Infrastructure.Dapper.Repositories; public class GroupRepository : Repository, IGroupRepository { public GroupRepository(GlobalSettings globalSettings) : this(globalSettings.SqlServer.ConnectionString, globalSettings.SqlServer.ReadOnlyConnectionString) { } public GroupRepository(string connectionString, string readOnlyConnectionString) : base(connectionString, readOnlyConnectionString) { } public async Task>> GetByIdWithCollectionsAsync(Guid id) { using (var connection = new SqlConnection(ConnectionString)) { var results = await connection.QueryMultipleAsync( $"[{Schema}].[Group_ReadWithCollectionsById]", new { Id = id }, commandType: CommandType.StoredProcedure); var group = await results.ReadFirstOrDefaultAsync(); var colletions = (await results.ReadAsync()).ToList(); return new Tuple>(group, colletions); } } public async Task> GetManyByOrganizationIdAsync(Guid organizationId) { using (var connection = new SqlConnection(ConnectionString)) { var results = await connection.QueryAsync( $"[{Schema}].[Group_ReadByOrganizationId]", new { OrganizationId = organizationId }, commandType: CommandType.StoredProcedure); return results.ToList(); } } public async Task> GetManyIdsByUserIdAsync(Guid organizationUserId) { using (var connection = new SqlConnection(ConnectionString)) { var results = await connection.QueryAsync( $"[{Schema}].[GroupUser_ReadGroupIdsByOrganizationUserId]", new { OrganizationUserId = organizationUserId }, commandType: CommandType.StoredProcedure); return results.ToList(); } } public async Task> GetManyUserIdsByIdAsync(Guid id) { using (var connection = new SqlConnection(ConnectionString)) { var results = await connection.QueryAsync( $"[{Schema}].[GroupUser_ReadOrganizationUserIdsByGroupId]", new { GroupId = id }, commandType: CommandType.StoredProcedure); return results.ToList(); } } public async Task> GetManyGroupUsersByOrganizationIdAsync(Guid organizationId) { using (var connection = new SqlConnection(ConnectionString)) { var results = await connection.QueryAsync( $"[{Schema}].[GroupUser_ReadByOrganizationId]", new { OrganizationId = organizationId }, commandType: CommandType.StoredProcedure); return results.ToList(); } } public async Task CreateAsync(Group obj, IEnumerable collections) { obj.SetNewId(); var objWithCollections = JsonSerializer.Deserialize(JsonSerializer.Serialize(obj)); objWithCollections.Collections = collections.ToArrayTVP(); using (var connection = new SqlConnection(ConnectionString)) { var results = await connection.ExecuteAsync( $"[{Schema}].[Group_CreateWithCollections]", objWithCollections, commandType: CommandType.StoredProcedure); } } public async Task ReplaceAsync(Group obj, IEnumerable collections) { var objWithCollections = JsonSerializer.Deserialize(JsonSerializer.Serialize(obj)); objWithCollections.Collections = collections.ToArrayTVP(); using (var connection = new SqlConnection(ConnectionString)) { var results = await connection.ExecuteAsync( $"[{Schema}].[Group_UpdateWithCollections]", objWithCollections, commandType: CommandType.StoredProcedure); } } public async Task DeleteUserAsync(Guid groupId, Guid organizationUserId) { using (var connection = new SqlConnection(ConnectionString)) { var results = await connection.ExecuteAsync( $"[{Schema}].[GroupUser_Delete]", new { GroupId = groupId, OrganizationUserId = organizationUserId }, commandType: CommandType.StoredProcedure); } } public async Task UpdateUsersAsync(Guid groupId, IEnumerable organizationUserIds) { using (var connection = new SqlConnection(ConnectionString)) { var results = await connection.ExecuteAsync( "[dbo].[GroupUser_UpdateUsers]", new { GroupId = groupId, OrganizationUserIds = organizationUserIds.ToGuidIdArrayTVP() }, commandType: CommandType.StoredProcedure); } } }