using GB5Shared.DTO.Framework.Login; using GB5Shared.QueryExecutor; using TCMSDAL.DTO; using TCMSDAL.Interfaces; using TCMSDAL.QueryBuilders; namespace TCMSDAL.Implementations; public class TCMSTraceabilityDAL : ITCMSTraceabilityDAL { private readonly IQueryExecutor _Qe; public TCMSTraceabilityDAL(IQueryExecutor queryExecutor) => _Qe = queryExecutor; // ── Screen links ────────────────────────────────────────────────────────── public async Task InsertScreenLinkAsync( TCMSSaveLinkDTO dto, LoginDTO login, CancellationToken ct) => await _Qe.ExecuteScalarAsync( login, TCMSTraceabilityQB.INSERT_SCREEN_LINK, new { dto.TestCaseId, dto.ScreenRoute, dto.ScreenTitle, dto.ModuleName, CreatedById = login.UserId, }, cancellationToken: ct).ConfigureAwait(false); public async Task DeleteScreenLinkAsync( int screenLinkId, LoginDTO login, CancellationToken ct) => await _Qe.ExecuteAsync( login, TCMSTraceabilityQB.DELETE_SCREEN_LINK, new { ScreenLinkId = screenLinkId }, cancellationToken: ct).ConfigureAwait(false); public async Task> GetScreenLinksForTestCaseAsync( int testCaseId, LoginDTO login, CancellationToken ct) => await _Qe.QueryAsync( login, TCMSTraceabilityQB.GET_SCREEN_LINKS_FOR_TESTCASE, new { TestCaseId = testCaseId }, cancellationToken: ct).ConfigureAwait(false) ?? Enumerable.Empty(); // ── API links ───────────────────────────────────────────────────────────── public async Task InsertApiLinkAsync( TCMSSaveApiLinkDTO dto, LoginDTO login, CancellationToken ct) => await _Qe.ExecuteScalarAsync( login, TCMSTraceabilityQB.INSERT_API_LINK, new { dto.TestCaseId, dto.ApiOperationId, dto.ApiPath, dto.HttpMethod, CreatedById = login.UserId, }, cancellationToken: ct).ConfigureAwait(false); public async Task DeleteApiLinkAsync( int apiLinkId, LoginDTO login, CancellationToken ct) => await _Qe.ExecuteAsync( login, TCMSTraceabilityQB.DELETE_API_LINK, new { ApiLinkId = apiLinkId }, cancellationToken: ct).ConfigureAwait(false); public async Task> GetApiLinksForTestCaseAsync( int testCaseId, LoginDTO login, CancellationToken ct) => await _Qe.QueryAsync( login, TCMSTraceabilityQB.GET_API_LINKS_FOR_TESTCASE, new { TestCaseId = testCaseId }, cancellationToken: ct).ConfigureAwait(false) ?? Enumerable.Empty(); // ── Read queries ────────────────────────────────────────────────────────── public async Task> GetTestCasesByScreenAsync( string screenRoute, LoginDTO login, CancellationToken ct) => await _Qe.QueryAsync( login, TCMSTraceabilityQB.GET_TESTCASES_BY_SCREEN, new { ScreenRoute = screenRoute }, cancellationToken: ct).ConfigureAwait(false) ?? Enumerable.Empty(); public async Task> GetTestCasesByApiOperationAsync( long apiOperationId, LoginDTO login, CancellationToken ct) => await _Qe.QueryAsync( login, TCMSTraceabilityQB.GET_TESTCASES_BY_API_OPERATION, new { ApiOperationId = apiOperationId }, cancellationToken: ct).ConfigureAwait(false) ?? Enumerable.Empty(); public async Task> GetStepsForCasesAsync( IEnumerable caseIds, LoginDTO login, CancellationToken ct) { var csv = string.Join(',', caseIds); if (string.IsNullOrEmpty(csv)) return Enumerable.Empty(); return await _Qe.QueryAsync( login, TCMSTraceabilityQB.GET_STEPS_FOR_CASES, new { CaseIdsCsv = csv }, cancellationToken: ct).ConfigureAwait(false) ?? Enumerable.Empty(); } public async Task GetScreenSummaryAsync( string screenRoute, LoginDTO login, CancellationToken ct) { var rows = await _Qe.QueryAsync( login, TCMSTraceabilityQB.GET_SCREEN_SUMMARY, new { ScreenRoute = screenRoute }, cancellationToken: ct).ConfigureAwait(false); return rows?.FirstOrDefault(); } public async Task> GetScreenTreeAsync( LoginDTO login, CancellationToken ct) => await _Qe.QueryAsync( login, TCMSTraceabilityQB.GET_SCREEN_TREE, cancellationToken: ct).ConfigureAwait(false) ?? Enumerable.Empty(); // ── Gap detection ───────────────────────────────────────────────────────── public async Task> GetScreenGapsAsync( LoginDTO login, CancellationToken ct) => await _Qe.QueryAsync( login, TCMSTraceabilityQB.GET_SCREEN_GAPS, cancellationToken: ct).ConfigureAwait(false) ?? Enumerable.Empty(); public async Task> GetApiGapsAsync( LoginDTO login, CancellationToken ct) => await _Qe.QueryAsync( login, TCMSTraceabilityQB.GET_API_GAPS, cancellationToken: ct).ConfigureAwait(false) ?? Enumerable.Empty(); }