using System.Data.Common; using EntitlementDAL.DTOs; using EntitlementDAL.Interfaces; using EntitlementDAL.QueryBuilders; using GB5Shared.DTO.Framework.Login; using GB5Shared.QueryExecutor; namespace EntitlementDAL.Implementations; public class FeatureFlagDAL : IFeatureFlagDAL { private readonly IQueryExecutor _QueryExecutor; public FeatureFlagDAL(IQueryExecutor queryExecutor) => _QueryExecutor = queryExecutor; public async Task GetByIdAsync(int featureFlagId, LoginDTO login, CancellationToken ct) => await _QueryExecutor.QuerySingleAsync( login, FeatureFlagQB.GET_BY_ID, new { FeatureFlagId = featureFlagId }, cancellationToken: ct).ConfigureAwait(false); public async Task GetByFeatureIdAsync(int featureId, LoginDTO login, CancellationToken ct) => await _QueryExecutor.QuerySingleAsync( login, FeatureFlagQB.GET_BY_FEATURE_ID, new { FeatureId = featureId }, cancellationToken: ct).ConfigureAwait(false); public async Task GetByFeatureCodeAsync(string featureCode, LoginDTO login, CancellationToken ct) => await _QueryExecutor.QuerySingleAsync( login, FeatureFlagQB.GET_BY_FEATURE_CODE, new { FeatureCode = featureCode }, cancellationToken: ct).ConfigureAwait(false); public async Task> GetListAsync(LoginDTO login, CancellationToken ct) => await _QueryExecutor.QueryAsync( login, FeatureFlagQB.GET_LIST, cancellationToken: ct).ConfigureAwait(false) ?? Enumerable.Empty(); public async Task SaveAsync(FeatureFlagDTO dto, LoginDTO login, DbTransaction tx, CancellationToken ct) => await _QueryExecutor.ExecuteAsync(login, FeatureFlagQB.INSERT, dto, tx, cancellationToken: ct).ConfigureAwait(false); public async Task UpdateAsync(FeatureFlagDTO dto, LoginDTO login, DbTransaction tx, CancellationToken ct) => await _QueryExecutor.ExecuteAsync(login, FeatureFlagQB.UPDATE, dto, tx, cancellationToken: ct).ConfigureAwait(false); public async Task UpdateFlagStatusAsync(int featureFlagId, byte flagStatus, string? killSwitchReason, LoginDTO login, DbTransaction tx, CancellationToken ct) => await _QueryExecutor.ExecuteAsync(login, FeatureFlagQB.UPDATE_FLAG_STATUS, new { FeatureFlagId = featureFlagId, FlagStatus = flagStatus, KillSwitchReason = killSwitchReason, ModifiedById = login.UserId, ModifiedOn = DateTime.UtcNow }, tx, cancellationToken: ct).ConfigureAwait(false); public async Task UpdateRolloutAsync(int featureFlagId, byte rolloutType, byte rolloutPercent, LoginDTO login, DbTransaction tx, CancellationToken ct) => await _QueryExecutor.ExecuteAsync(login, FeatureFlagQB.UPDATE_ROLLOUT, new { FeatureFlagId = featureFlagId, RolloutType = rolloutType, RolloutPercent = rolloutPercent, ModifiedById = login.UserId, ModifiedOn = DateTime.UtcNow }, tx, cancellationToken: ct).ConfigureAwait(false); public async Task> GetStaleKillSwitchesAsync(DateTime cutoffDate, LoginDTO login, CancellationToken ct) => await _QueryExecutor.QueryAsync( login, FeatureFlagQB.GET_STALE_KILL_SWITCHES, new { CutoffDate = cutoffDate }, cancellationToken: ct).ConfigureAwait(false) ?? Enumerable.Empty(); public async Task> GetDueScheduledTransitionsAsync(DateTime now, LoginDTO login, CancellationToken ct) => await _QueryExecutor.QueryAsync( login, FeatureFlagQB.GET_DUE_SCHEDULED_TRANSITIONS, new { Now = now }, cancellationToken: ct).ConfigureAwait(false) ?? Enumerable.Empty(); public async Task ClearScheduledOnAsync(int featureFlagId, DateTime modifiedOn, LoginDTO login, DbTransaction tx, CancellationToken ct) => await _QueryExecutor.ExecuteAsync(login, FeatureFlagQB.CLEAR_SCHEDULED_ON, new { FeatureFlagId = featureFlagId, ModifiedOn = modifiedOn }, tx, cancellationToken: ct).ConfigureAwait(false); public async Task ClearScheduledOffAsync(int featureFlagId, DateTime modifiedOn, LoginDTO login, DbTransaction tx, CancellationToken ct) => await _QueryExecutor.ExecuteAsync(login, FeatureFlagQB.CLEAR_SCHEDULED_OFF, new { FeatureFlagId = featureFlagId, ModifiedOn = modifiedOn }, tx, cancellationToken: ct).ConfigureAwait(false); // ── MENTITLEMENTFEATUREFLAGTARGET ──────────────────────────────────────── public async Task> GetTargetsByFlagAsync(int featureFlagId, LoginDTO login, CancellationToken ct) => await _QueryExecutor.QueryAsync( login, FeatureFlagQB.GET_TARGETS_BY_FLAG, new { FeatureFlagId = featureFlagId }, cancellationToken: ct).ConfigureAwait(false) ?? Enumerable.Empty(); public async Task GetUserTargetAsync(int featureFlagId, int userId, LoginDTO login, CancellationToken ct) => await _QueryExecutor.QuerySingleAsync( login, FeatureFlagQB.GET_USER_TARGET, new { FeatureFlagId = featureFlagId, UserId = userId }, cancellationToken: ct).ConfigureAwait(false); public async Task GetClientTargetAsync(int featureFlagId, int clientId, LoginDTO login, CancellationToken ct) => await _QueryExecutor.QuerySingleAsync( login, FeatureFlagQB.GET_CLIENT_TARGET, new { FeatureFlagId = featureFlagId, ClientId = clientId }, cancellationToken: ct).ConfigureAwait(false); public async Task GetTargetByIdAsync(int flagTargetId, LoginDTO login, CancellationToken ct) => await _QueryExecutor.QuerySingleAsync( login, FeatureFlagQB.GET_TARGET_BY_ID, new { FlagTargetId = flagTargetId }, cancellationToken: ct).ConfigureAwait(false); public async Task SaveTargetAsync(FeatureFlagTargetDTO dto, LoginDTO login, DbTransaction tx, CancellationToken ct) => await _QueryExecutor.ExecuteAsync(login, FeatureFlagQB.INSERT_TARGET, dto, tx, cancellationToken: ct).ConfigureAwait(false); public async Task UpdateTargetAsync(FeatureFlagTargetDTO dto, LoginDTO login, DbTransaction tx, CancellationToken ct) => await _QueryExecutor.ExecuteAsync(login, FeatureFlagQB.UPDATE_TARGET, dto, tx, cancellationToken: ct).ConfigureAwait(false); public async Task DeleteTargetAsync(int flagTargetId, LoginDTO login, DbTransaction tx, CancellationToken ct) => await _QueryExecutor.ExecuteAsync(login, FeatureFlagQB.DELETE_TARGET, new { FlagTargetId = flagTargetId }, tx, cancellationToken: ct).ConfigureAwait(false); }