using System.Data; using System.Text.Json; using Bit.Core.Auth.Entities; using Bit.Core.Auth.Models.Data; using Bit.Core.Repositories; using Bit.Core.Settings; using Bit.Infrastructure.Dapper.Repositories; using Dapper; using Microsoft.Data.SqlClient; namespace Bit.Infrastructure.Dapper.Auth.Repositories; public class AuthRequestRepository : Repository, IAuthRequestRepository { public AuthRequestRepository(GlobalSettings globalSettings) : this(globalSettings.SqlServer.ConnectionString, globalSettings.SqlServer.ReadOnlyConnectionString) { } public AuthRequestRepository(string connectionString, string readOnlyConnectionString) : base(connectionString, readOnlyConnectionString) { } public async Task DeleteExpiredAsync( TimeSpan userRequestExpiration, TimeSpan adminRequestExpiration, TimeSpan afterAdminApprovalExpiration) { using (var connection = new SqlConnection(ConnectionString)) { return await connection.ExecuteAsync( $"[{Schema}].[AuthRequest_DeleteIfExpired]", new { UserExpirationSeconds = (int)userRequestExpiration.TotalSeconds, AdminExpirationSeconds = (int)adminRequestExpiration.TotalSeconds, AdminApprovalExpirationSeconds = (int)afterAdminApprovalExpiration.TotalSeconds, }, commandType: CommandType.StoredProcedure); } } public async Task> GetManyByUserIdAsync(Guid userId) { using (var connection = new SqlConnection(ConnectionString)) { var results = await connection.QueryAsync( $"[{Schema}].[AuthRequest_ReadByUserId]", new { UserId = userId }, commandType: CommandType.StoredProcedure); return results.ToList(); } } public async Task> GetManyPendingByOrganizationIdAsync(Guid organizationId) { using (var connection = new SqlConnection(ConnectionString)) { var results = await connection.QueryAsync( $"[{Schema}].[AuthRequest_ReadPendingByOrganizationId]", new { OrganizationId = organizationId }, commandType: CommandType.StoredProcedure); return results.ToList(); } } public async Task> GetManyAdminApprovalRequestsByManyIdsAsync(Guid organizationId, IEnumerable ids) { using (var connection = new SqlConnection(ConnectionString)) { var results = await connection.QueryAsync( $"[{Schema}].[AuthRequest_ReadAdminApprovalsByIds]", new { OrganizationId = organizationId, Ids = ids.ToGuidIdArrayTVP() }, commandType: CommandType.StoredProcedure); return results.ToList(); } } public async Task UpdateManyAsync(IEnumerable authRequests) { if (!authRequests.Any()) { return; } using (var connection = new SqlConnection(ConnectionString)) { var results = await connection.ExecuteAsync( $"[dbo].[AuthRequest_UpdateMany]", new { jsonData = JsonSerializer.Serialize(authRequests) }, commandType: CommandType.StoredProcedure); } } }