using GB5Shared.DTO.Framework.Criteria; using GB5Shared.DTO.Framework.Login; using GB5Shared.QueryExecutor; using GB5Shared.Resource.Response; using GB5Shared.Validation; using Newtonsoft.Json; using System; using System.Threading; using System.Threading.Tasks; using TMSDAL.DTO.AssessmentQuestion; using TMSDAL.Query.AssesmentQuestion; using TMSDAL.Query.Assessment; namespace TMSDAL.CustomCode.AssesmentQuestion { public class AssessmentQuestionDAL : IAssessmentQuestionDAL { private readonly IQueryExecutor _QueryExecutor; private readonly IValidation _Validation; public AssessmentQuestionDAL(IQueryExecutor queryExecutor, IValidation validation) { _QueryExecutor = queryExecutor; _Validation = validation; } // ── GET single ──────────────────────────────────────────────────────── public async Task GetAssesmentQuestion(int assessmentQuestionId, LoginDTO loginDTO) { try { var parameters = new { AssessmentQuestionId = assessmentQuestionId }; var result = await _QueryExecutor.QuerySingleAsync( loginDTO, AssessmentQuestionQB.GET_ASSESSMENT_QUESTION, parameters); return JsonConvert.SerializeObject(result); } catch (Exception) { throw; } } // ── SAVE (INSERT) ───────────────────────────────────────────────────── public async Task SaveAssesmentQuestion(AssessmentQuestionDTO dto, LoginDTO loginDTO) { // No standard audit fields on MASSESSMENTQUESTION (confirmed from table DDL). // VERSION / STATUS / SOURCETYPE are NOT on this table either. // Only the 8 business columns + PK + FK are inserted. await _QueryExecutor.ExecuteAsync( loginDTO, AssessmentQuestionQB.SAVE_ASSESSMENT_QUESTION, new { dto.AssessmentQuestionId, dto.AssessmentId, dto.SlNo, dto.QuestionText, dto.QuestionType, dto.OptionsJson, // nullable — null sent for TrueFalse / ShortAnswer dto.CorrectAnswer, dto.Marks, dto.Explanation // nullable — null when no explanation provided }); } // ── UPDATE ──────────────────────────────────────────────────────────── public async Task UpdateAssesmentQuestion(AssessmentQuestionDTO dto, LoginDTO loginDTO) { // AssessmentQuestionId and AssessmentId not updated — PK and parent FK are immutable. // SlNo is updatable (user may reorder questions). await _QueryExecutor.ExecuteAsync( loginDTO, AssessmentQuestionQB.UPDATE_ASSESSMENT_QUESTION, new { dto.AssessmentQuestionId, // WHERE clause dto.SlNo, dto.QuestionText, dto.QuestionType, dto.OptionsJson, // nullable dto.CorrectAnswer, dto.Marks, dto.Explanation // nullable }); } // ── SELECT LIST (criteria-based) ────────────────────────────────────── public async Task GetSelectList(CriteriaDTO criteriaDTO, LoginDTO loginDTO, CancellationToken ct) { var result = await _QueryExecutor.QueryWithCriteriaAsync( loginDTO, AssessmentQuestionQB.GET_SELECTLIST_ASSESSMENT_QUESTION, new { TenantId = loginDTO.ClientId }, criteriaDTO, ct); return JsonConvert.SerializeObject(result); } // ── DELETE (soft delete) ────────────────────────────────────────────── public async Task DeleteAssesmentQuestion(int assessmentQuestionId, LoginDTO loginDTO) { try { var parameters = new { AssessmentQuestionId = assessmentQuestionId }; int result = await _QueryExecutor.ExecuteAsync( loginDTO, AssessmentQuestionQB.DELETE_ASSESSMENT_QUESTION, parameters); return result > 0 ? SuccessResponse.DeleteSuccessMessage : ErrorResponse.DeleteNotFoundMessage; } catch (Exception ex) { // Preserve stack trace via innerException string error = await _Validation.HandleException(ex, ErrorResponse.DeleteErrorMessage); throw new Exception(error, ex); } } // ── GET full list (for picklist / dropdown) ─────────────────────────── public async Task GetSelectListAssesmentQuestion(LoginDTO loginDTO) { try { var result = await _QueryExecutor.QueryAsync( loginDTO, AssessmentQuestionQB.GET_ASSESSMENT_QUESTION_LIST, null); return JsonConvert.SerializeObject(result); } catch (Exception) { throw; } } } }