using GB5Shared.DTO.Framework.Login; using GB5Shared.QueryExecutor; using TMSDAL.DTO.TmsFeedback; using TMSDAL.Query.TmsFeedback; namespace TMSDAL.CustomCode.TmsFeedback; public class TmsFeedbackDAL : ITmsFeedbackDAL { private readonly IQueryExecutor _qe; public TmsFeedbackDAL(IQueryExecutor queryExecutor) => _qe = queryExecutor; public async Task<(int FlsRegistrationId, int TokenExpiryHours)?> ResolveRegistrationAsync( int instrumentConfigId, LoginDTO login, CancellationToken ct) { var row = await _qe.QueryAsync( login, TmsFeedbackQB.RESOLVE_REGISTRATION_FROM_INSTRUMENT, new { InstrumentConfigId = instrumentConfigId, TenantId = login.ClientId }, cancellationToken: ct).ConfigureAwait(false); var first = row.FirstOrDefault(); return first is null ? null : (first.FlsRegistrationId, first.TokenExpiryHours); } public async Task IsAlreadyDispatchedAsync( int instanceId, int flsRegistrationId, LoginDTO login, CancellationToken ct) { int count = await _qe.ExecuteScalarAsync( login, TmsFeedbackQB.CHECK_DUPLICATE_DISPATCH, new { InstanceId = instanceId, FlsRegistrationId = flsRegistrationId, TenantId = login.ClientId }, cancellationToken: ct).ConfigureAwait(false); return count > 0; } public async Task> GetEnrollmentsForDispatchAsync( List enrollmentIds, LoginDTO login, CancellationToken ct) { var rows = await _qe.QueryAsync( login, TmsFeedbackQB.GET_INSTANCE_AND_ENROLLMENTS_FOR_DISPATCH, new { EnrollmentIds = enrollmentIds, TenantId = login.ClientId }, cancellationToken: ct).ConfigureAwait(false); return rows.ToList(); } public async Task> GetBatchFeedbackStatusAsync( int instanceId, LoginDTO login, CancellationToken ct) { var rows = await _qe.QueryAsync( login, TmsFeedbackQB.GET_BATCH_FEEDBACK_STATUS, new { InstanceId = instanceId, TenantId = login.ClientId }, cancellationToken: ct).ConfigureAwait(false); return rows.ToList(); } public async Task GetTrainerFeedbackAsync( int trainerId, int periodId, LoginDTO login, CancellationToken ct) { var rows = await _qe.QueryAsync( login, TmsFeedbackQB.GET_TRAINER_FEEDBACK, new { TrainerId = trainerId, PeriodId = periodId, TenantId = login.ClientId }, cancellationToken: ct).ConfigureAwait(false); return rows.FirstOrDefault(); } public async Task> GetNudgePendingRespondentIdsAsync( int instanceId, LoginDTO login, CancellationToken ct) { var rows = await _qe.QueryAsync( login, TmsFeedbackQB.GET_NUDGE_PENDING_RESPONDENTS, new { InstanceId = instanceId, TenantId = login.ClientId }, cancellationToken: ct).ConfigureAwait(false); return rows.ToList(); } public async Task> GetSelectListInstrumentConfigAsync( LoginDTO login, CancellationToken ct) { var rows = await _qe.QueryAsync( login, TmsFeedbackQB.GET_SELECTLIST_INSTRUMENTCONFIG, new { TenantId = login.ClientId }, cancellationToken: ct).ConfigureAwait(false); return rows.ToList(); } private sealed class RegistrationRow { public int FlsRegistrationId { get; set; } public int TokenExpiryHours { get; set; } } }