using System.Data.Common; using GB5Shared.DTO.Framework.Login; using GB5Shared.QueryExecutor; using GB5Shared.ResponseStandard; using PIEDAL.DTO.Outcome; using PIEDAL.Query.Outcome; namespace PIEDAL.CustomCode.Outcome; public class PIEOutcomeDAL : IPIEOutcomeDAL { private readonly IQueryExecutor _QueryExecutor; public PIEOutcomeDAL(IQueryExecutor queryExecutor) { _QueryExecutor = queryExecutor; } // ── Reads ───────────────────────────────────────────────────────────────── public async Task GetPIEOutcomeAsync( Guid outcomeId, LoginDTO login, CancellationToken ct) => await _QueryExecutor.QuerySingleAsync( login, PIEOutcomeQB.GET_BY_ID, new { OutcomeId = outcomeId }, cancellationToken: ct).ConfigureAwait(false); public async Task> GetOutcomesForSignalAnalysisAsync( Guid profileId, DateTime fromDate, LoginDTO login, CancellationToken ct) { var param = new { ProfileId = profileId, FromDate = fromDate }; return await _QueryExecutor.QueryAsync( login, PIEOutcomeQB.GET_OUTCOMES_FOR_SIGNAL_ANALYSIS, param, cancellationToken: ct).ConfigureAwait(false) ?? Enumerable.Empty(); } // ── Writes (insert-only — outcomes are the historical record) ───────────── public async Task> InsertPIEOutcomeAsync( PIEOutcomeDTO dto, LoginDTO login, DbTransaction tx, CancellationToken ct) { dto.RecordedAt = DateTime.UtcNow; int rows = await _QueryExecutor.ExecuteAsync( login, PIEOutcomeQB.INSERT, dto, tx, cancellationToken: ct).ConfigureAwait(false); return rows > 0 ? Result.Success("PIE outcome recorded.") : Result.Failure("Failed to record PIE outcome."); } }