using System.Data.Common; using GB5Shared.DTO.Framework.Login; using GB5Shared.QueryExecutor; using GB5Shared.ResponseStandard; using IDMSDAL.DTOs; using IDMSDAL.Interfaces; using IDMSDAL.QueryBuilders; namespace IDMSDAL.Implementations; public class ClientContactDAL : IClientContactDAL { private readonly IQueryExecutor _QueryExecutor; public ClientContactDAL(IQueryExecutor queryExecutor) { _QueryExecutor = queryExecutor; } public async Task GetContactAsync( int contactId, LoginDTO login, CancellationToken ct) { return await _QueryExecutor.QuerySingleAsync( login, ClientContactQB.GET_BY_ID, new { ContactId = contactId }).ConfigureAwait(false); } public async Task> GetContactsByEngagementAsync( int engagementId, LoginDTO login, CancellationToken ct) { return await _QueryExecutor.QueryAsync( login, ClientContactQB.GET_BY_ENGAGEMENT, new { EngagementId = engagementId }, cancellationToken: ct).ConfigureAwait(false) ?? Enumerable.Empty(); } public async Task> SaveContactAsync( ClientContactDTO dto, LoginDTO login, DbTransaction tx, CancellationToken ct) { try { dto.ClientContactCreatedById = login.UserId; dto.ClientContactCreatedOn = DateTime.UtcNow; dto.ClientContactModifiedById = login.UserId; dto.ClientContactModifiedOn = DateTime.UtcNow; int rows = await _QueryExecutor.ExecuteAsync( login, ClientContactQB.INSERT, dto, tx, cancellationToken: ct).ConfigureAwait(false); return rows > 0 ? Result.Success("Contact saved.") : Result.Failure("Failed to save contact."); } catch (Exception) { throw; } } public async Task> UpdateContactAsync( ClientContactDTO dto, LoginDTO login, DbTransaction tx, CancellationToken ct) { try { dto.ClientContactModifiedById = login.UserId; dto.ClientContactModifiedOn = DateTime.UtcNow; int rows = await _QueryExecutor.ExecuteAsync( login, ClientContactQB.UPDATE, dto, tx, cancellationToken: ct).ConfigureAwait(false); return rows > 0 ? Result.Success("Contact updated.") : Result.Failure("Contact not found."); } catch (Exception) { throw; } } // Soft delete — STATUS = 2 (matches ClientContactQB.DELETE). public async Task> DeactivateContactAsync( int contactId, LoginDTO login, DbTransaction tx, CancellationToken ct) { try { var param = new { ContactId = contactId, ClientContactModifiedById = login.UserId, ClientContactModifiedOn = DateTime.UtcNow }; int rows = await _QueryExecutor.ExecuteAsync( login, ClientContactQB.DELETE, param, tx, cancellationToken: ct).ConfigureAwait(false); return rows > 0 ? Result.Success("Contact deactivated.") : Result.Failure("Contact not found."); } catch (Exception) { throw; } } }