using System.Data.Common; using GB5Shared.DTO.Framework.Login; using GB5Shared.QueryExecutor; using IDMSDAL.DTOs; using IDMSDAL.Interfaces; using IDMSDAL.QueryBuilders; namespace IDMSDAL.Implementations; public class SignOffDAL : ISignOffDAL { private readonly IQueryExecutor _QueryExecutor; public SignOffDAL(IQueryExecutor queryExecutor) { _QueryExecutor = queryExecutor; } public async Task GetSignOffAsync( int signOffId, LoginDTO login, CancellationToken ct) { return await _QueryExecutor.QuerySingleAsync( login, SignOffQB.GET_BY_ID, new { SignOffId = signOffId }).ConfigureAwait(false); } public async Task> GetSignOffsByEngagementAsync( int engagementId, LoginDTO login, CancellationToken ct) { return await _QueryExecutor.QueryAsync( login, SignOffQB.GET_BY_ENGAGEMENT, new { EngagementId = engagementId }, cancellationToken: ct).ConfigureAwait(false) ?? Enumerable.Empty(); } // INSERT-only — the SQL Server trigger prevents any UPDATE or DELETE at DB level. // Returns the new IDENTITY value. public async Task InsertSignOffAsync( SignOffDTO dto, LoginDTO login, DbTransaction tx, CancellationToken ct) { try { dto.SignedOn = DateTime.UtcNow; dto.CreatedById = login.UserId; dto.CreatedOn = DateTime.UtcNow; int newId = await _QueryExecutor.ExecuteIdentityAsync( login, SignOffQB.INSERT, dto, tx).ConfigureAwait(false); return newId; } catch (Exception) { throw; } } }