using System.Data.Common; using EntitlementDAL.Constants; using EntitlementDAL.DTOs; using EntitlementDAL.Interfaces; using EntitlementDAL.QueryBuilders; using GB5Shared.DTO.Framework.Login; using GB5Shared.QueryExecutor; namespace EntitlementDAL.Implementations; public class ProvisioningJobDAL : IProvisioningJobDAL { private readonly IQueryExecutor _QueryExecutor; public ProvisioningJobDAL(IQueryExecutor queryExecutor) => _QueryExecutor = queryExecutor; public async Task GetByIdAsync(int provisioningJobId, LoginDTO login, CancellationToken ct) => await _QueryExecutor.QuerySingleAsync( login, ProvisioningJobQB.GET_BY_ID, new { ProvisioningJobId = provisioningJobId }, cancellationToken: ct).ConfigureAwait(false); public async Task GetByClientAsync(int clientId, LoginDTO login, CancellationToken ct) => await _QueryExecutor.QuerySingleAsync( login, ProvisioningJobQB.GET_BY_CLIENT, new { ClientId = clientId }, cancellationToken: ct).ConfigureAwait(false); public async Task GetByEngagementRefAsync(string idmsEngagementRef, LoginDTO login, CancellationToken ct) => await _QueryExecutor.QuerySingleAsync( login, ProvisioningJobQB.GET_BY_ENGAGEMENT_REF, new { IdmsEngagementRef = idmsEngagementRef }, cancellationToken: ct).ConfigureAwait(false); public async Task GetBySwChangeRequestIdAsync(int swChangeRequestId, LoginDTO login, CancellationToken ct) => await _QueryExecutor.QuerySingleAsync( login, ProvisioningJobQB.GET_BY_SW_CHANGE_REQUEST_ID, new { SwChangeRequestId = swChangeRequestId }, cancellationToken: ct).ConfigureAwait(false); public async Task> GetAwaitingDbProvisioningAsync(LoginDTO login, CancellationToken ct) => await _QueryExecutor.QueryAsync( login, ProvisioningJobQB.GET_AWAITING_DB_PROVISIONING, null, cancellationToken: ct).ConfigureAwait(false); public async Task SaveAsync(ProvisioningJobDTO dto, LoginDTO login, DbTransaction tx, CancellationToken ct) => await _QueryExecutor.ExecuteAsync(login, ProvisioningJobQB.INSERT, dto, tx, cancellationToken: ct).ConfigureAwait(false); public async Task SetSwLinkageAsync(int provisioningJobId, int swChangeRequestId, int swClientDatabaseId, string? pendingPackageChainJson, string completedStepsJson, LoginDTO login, DbTransaction tx, CancellationToken ct) => await _QueryExecutor.ExecuteAsync(login, ProvisioningJobQB.SET_SW_LINKAGE, new { ProvisioningJobId = provisioningJobId, SwChangeRequestId = swChangeRequestId, SwClientDatabaseId = swClientDatabaseId, PendingPackageChain = pendingPackageChainJson, JobStatus = (byte)EntitlementDAL.Enums.ProvisioningJobStatusEnum.Running, CurrentStep = ProvisioningStepNames.DbProvisioningCrSubmitted, CompletedSteps = completedStepsJson, ModifiedById = login.UserId, ModifiedOn = DateTime.UtcNow }, tx, cancellationToken: ct).ConfigureAwait(false); public async Task UpdateProgressAsync(int provisioningJobId, byte jobStatus, string currentStep, string completedStepsJson, LoginDTO login, DbTransaction tx, CancellationToken ct) => await _QueryExecutor.ExecuteAsync(login, ProvisioningJobQB.UPDATE_PROGRESS, new { ProvisioningJobId = provisioningJobId, JobStatus = jobStatus, CurrentStep = currentStep, CompletedSteps = completedStepsJson, ModifiedById = login.UserId, ModifiedOn = DateTime.UtcNow }, tx, cancellationToken: ct).ConfigureAwait(false); public async Task UpdateCompletedStepsAsync(int provisioningJobId, string completedStepsJson, LoginDTO login, DbTransaction tx, CancellationToken ct) => await _QueryExecutor.ExecuteAsync(login, ProvisioningJobQB.UPDATE_COMPLETED_STEPS, new { ProvisioningJobId = provisioningJobId, CompletedSteps = completedStepsJson, ModifiedById = login.UserId, ModifiedOn = DateTime.UtcNow }, tx, cancellationToken: ct).ConfigureAwait(false); public async Task MarkCompletedAsync(int provisioningJobId, string currentStep, string completedStepsJson, LoginDTO login, DbTransaction tx, CancellationToken ct) => await _QueryExecutor.ExecuteAsync(login, ProvisioningJobQB.MARK_COMPLETED, new { ProvisioningJobId = provisioningJobId, JobStatus = (byte)EntitlementDAL.Enums.ProvisioningJobStatusEnum.Completed, CurrentStep = currentStep, CompletedSteps = completedStepsJson, CompletedOn = DateTime.UtcNow, ModifiedById = login.UserId, ModifiedOn = DateTime.UtcNow }, tx, cancellationToken: ct).ConfigureAwait(false); public async Task MarkFailedAsync(int provisioningJobId, string lastError, LoginDTO login, DbTransaction tx, CancellationToken ct) => await _QueryExecutor.ExecuteAsync(login, ProvisioningJobQB.MARK_FAILED, new { ProvisioningJobId = provisioningJobId, JobStatus = (byte)EntitlementDAL.Enums.ProvisioningJobStatusEnum.Failed, LastError = lastError, ModifiedById = login.UserId, ModifiedOn = DateTime.UtcNow }, tx, cancellationToken: ct).ConfigureAwait(false); }