using System.Data; using System.Data.SqlClient; using Bit.Core.Entities.Provider; using Bit.Core.Enums.Provider; using Bit.Core.Models.Data; using Bit.Core.Repositories; using Bit.Core.Settings; using Dapper; namespace Bit.Infrastructure.Dapper.Repositories; public class ProviderUserRepository : Repository, IProviderUserRepository { public ProviderUserRepository(GlobalSettings globalSettings) : this(globalSettings.SqlServer.ConnectionString, globalSettings.SqlServer.ReadOnlyConnectionString) { } public ProviderUserRepository(string connectionString, string readOnlyConnectionString) : base(connectionString, readOnlyConnectionString) { } public async Task GetCountByProviderAsync(Guid providerId, string email, bool onlyRegisteredUsers) { using (var connection = new SqlConnection(ConnectionString)) { var result = await connection.ExecuteScalarAsync( "[dbo].[ProviderUser_ReadCountByProviderIdEmail]", new { ProviderId = providerId, Email = email, OnlyUsers = onlyRegisteredUsers }, commandType: CommandType.StoredProcedure); return result; } } public async Task> GetManyAsync(IEnumerable ids) { using (var connection = new SqlConnection(ConnectionString)) { var results = await connection.QueryAsync( "[dbo].[ProviderUser_ReadByIds]", new { Ids = ids.ToGuidIdArrayTVP() }, commandType: CommandType.StoredProcedure); return results.ToList(); } } public async Task> GetManyByUserAsync(Guid userId) { using (var connection = new SqlConnection(ConnectionString)) { var results = await connection.QueryAsync( "[dbo].[ProviderUser_ReadByUserId]", new { UserId = userId }, commandType: CommandType.StoredProcedure); return results.ToList(); } } public async Task GetByProviderUserAsync(Guid providerId, Guid userId) { using (var connection = new SqlConnection(ConnectionString)) { var results = await connection.QueryAsync( "[dbo].[ProviderUser_ReadByProviderIdUserId]", new { ProviderId = providerId, UserId = userId }, commandType: CommandType.StoredProcedure); return results.SingleOrDefault(); } } public async Task> GetManyByProviderAsync(Guid providerId, ProviderUserType? type) { using (var connection = new SqlConnection(ConnectionString)) { var results = await connection.QueryAsync( "[dbo].[ProviderUser_ReadByProviderId]", new { ProviderId = providerId, Type = type }, commandType: CommandType.StoredProcedure); return results.ToList(); } } public async Task> GetManyDetailsByProviderAsync(Guid providerId) { using (var connection = new SqlConnection(ConnectionString)) { var results = await connection.QueryAsync( "[dbo].[ProviderUserUserDetails_ReadByProviderId]", new { ProviderId = providerId }, commandType: CommandType.StoredProcedure); return results.ToList(); } } public async Task> GetManyDetailsByUserAsync(Guid userId, ProviderUserStatusType? status = null) { using (var connection = new SqlConnection(ConnectionString)) { var results = await connection.QueryAsync( "[dbo].[ProviderUserProviderDetails_ReadByUserIdStatus]", new { UserId = userId, Status = status }, commandType: CommandType.StoredProcedure); return results.ToList(); } } public async Task> GetManyOrganizationDetailsByUserAsync(Guid userId, ProviderUserStatusType? status = null) { using (var connection = new SqlConnection(ConnectionString)) { var results = await connection.QueryAsync( "[dbo].[ProviderUserProviderOrganizationDetails_ReadByUserIdStatus]", new { UserId = userId, Status = status }, commandType: CommandType.StoredProcedure); return results.ToList(); } } public async Task DeleteManyAsync(IEnumerable providerUserIds) { using (var connection = new SqlConnection(ConnectionString)) { await connection.ExecuteAsync("[dbo].[ProviderUser_DeleteByIds]", new { Ids = providerUserIds.ToGuidIdArrayTVP() }, commandType: CommandType.StoredProcedure); } } public async Task> GetManyPublicKeysByProviderUserAsync( Guid providerId, IEnumerable Ids) { using (var connection = new SqlConnection(ConnectionString)) { var results = await connection.QueryAsync( "[dbo].[User_ReadPublicKeysByProviderUserIds]", new { ProviderId = providerId, ProviderUserIds = Ids.ToGuidIdArrayTVP() }, commandType: CommandType.StoredProcedure); return results.ToList(); } } public async Task GetCountByOnlyOwnerAsync(Guid userId) { using (var connection = new SqlConnection(ConnectionString)) { var results = await connection.ExecuteScalarAsync( "[dbo].[ProviderUser_ReadCountByOnlyOwner]", new { UserId = userId }, commandType: CommandType.StoredProcedure); return results; } } }