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 SubscriptionDAL : ISubscriptionDAL { private readonly IQueryExecutor _QueryExecutor; public SubscriptionDAL(IQueryExecutor queryExecutor) => _QueryExecutor = queryExecutor; public async Task GetByIdAsync(int subscriptionId, LoginDTO login, CancellationToken ct) => await _QueryExecutor.QuerySingleAsync( login, SubscriptionQB.GET_BY_ID, new { SubscriptionId = subscriptionId }, cancellationToken: ct).ConfigureAwait(false); public async Task GetByClientAsync(int clientId, LoginDTO login, CancellationToken ct) => await _QueryExecutor.QuerySingleAsync( login, SubscriptionQB.GET_BY_CLIENT, new { ClientId = clientId }, cancellationToken: ct).ConfigureAwait(false); public async Task GetByEngagementRefAsync(string idmsEngagementRef, LoginDTO login, CancellationToken ct) => await _QueryExecutor.QuerySingleAsync( login, SubscriptionQB.GET_BY_ENGAGEMENT_REF, new { IdmsEngagementRef = idmsEngagementRef }, cancellationToken: ct).ConfigureAwait(false); public async Task GetByPayOrderIdAsync(int payOrderId, LoginDTO login, CancellationToken ct) => await _QueryExecutor.QuerySingleAsync( login, SubscriptionQB.GET_BY_PAYORDERID, new { PayOrderId = payOrderId }, cancellationToken: ct).ConfigureAwait(false); public async Task> GetListPagedAsync( int subscriptionStatus, int planId, int clientId, int offset, int pageSize, LoginDTO login, CancellationToken ct) => await _QueryExecutor.QueryPagedAsync( login, SubscriptionQB.GET_LIST_PAGED, new { SubscriptionStatus = subscriptionStatus, PlanId = planId, ClientId = clientId, Offset = offset, PageSize = pageSize }) .ConfigureAwait(false); public async Task SaveAsync(SubscriptionDTO dto, LoginDTO login, DbTransaction tx, CancellationToken ct) => await _QueryExecutor.ExecuteAsync(login, SubscriptionQB.INSERT, dto, tx, cancellationToken: ct).ConfigureAwait(false); public async Task UpdateAsync(SubscriptionDTO dto, LoginDTO login, DbTransaction tx, CancellationToken ct) => await _QueryExecutor.ExecuteAsync(login, SubscriptionQB.UPDATE, dto, tx, cancellationToken: ct).ConfigureAwait(false); public async Task UpdatePlanAsync(int subscriptionId, int planId, LoginDTO login, DbTransaction tx, CancellationToken ct) => await _QueryExecutor.ExecuteAsync(login, SubscriptionQB.UPDATE_PLAN, new { SubscriptionId = subscriptionId, PlanId = planId, ModifiedById = login.UserId, ModifiedOn = DateTime.UtcNow }, tx, cancellationToken: ct).ConfigureAwait(false); public async Task UpdateRenewalAsync(int subscriptionId, DateTime newValidTill, LoginDTO login, DbTransaction tx, CancellationToken ct) => await _QueryExecutor.ExecuteAsync(login, SubscriptionQB.UPDATE_RENEWAL, new { SubscriptionId = subscriptionId, LicenseValidTill = newValidTill, ModifiedById = login.UserId, ModifiedOn = DateTime.UtcNow }, tx, cancellationToken: ct).ConfigureAwait(false); public async Task UpdateStatusAsync(int subscriptionId, byte status, LoginDTO login, DbTransaction tx, CancellationToken ct) => await _QueryExecutor.ExecuteAsync(login, SubscriptionQB.UPDATE_STATUS, new { SubscriptionId = subscriptionId, SubscriptionStatus = status, ModifiedById = login.UserId, ModifiedOn = DateTime.UtcNow }, tx, cancellationToken: ct).ConfigureAwait(false); public async Task UpdateClientSubscriptionStatusAsync(int clientId, byte status, LoginDTO login, DbTransaction tx, CancellationToken ct) => await _QueryExecutor.ExecuteAsync(login, SubscriptionQB.UPDATE_CLIENT_SUBSCRIPTION_STATUS, new { ClientId = clientId, SubscriptionStatus = status }, tx, cancellationToken: ct).ConfigureAwait(false); public async Task UpdatePayOrderIdAsync(int subscriptionId, int? payOrderId, LoginDTO login, CancellationToken ct) => await _QueryExecutor.ExecuteAsync(login, SubscriptionQB.UPDATE_PAYORDER, new { SubscriptionId = subscriptionId, PayOrderId = payOrderId, ModifiedById = login.UserId, ModifiedOn = DateTime.UtcNow }, cancellationToken: ct).ConfigureAwait(false); public async Task> GetPendingWithPayOrderAsync(LoginDTO login, CancellationToken ct) => await _QueryExecutor.QueryAsync( login, SubscriptionQB.GET_PENDING_WITH_PAYORDER, cancellationToken: ct).ConfigureAwait(false); }