using AdminDAL.CustomCode.Subscription; using AdminDAL.DTO.Subscription; using GB5Shared.DTO.Framework.Login; using GB5Shared.Resource.Response; using GB5Shared.Validation; using Microsoft.Extensions.Logging; using System.Text.Json; namespace AdminBLL.Subscription; public class SubscriptionBLL : ISubscriptionBLL { private readonly ISubscriptionDAL _dal; private readonly IValidation _validation; private readonly ILogger _logger; private static readonly JsonSerializerOptions JsonOpts = new() { PropertyNamingPolicy = JsonNamingPolicy.CamelCase }; public SubscriptionBLL( ISubscriptionDAL dal, IValidation validation, ILogger logger) { _dal = dal; _validation = validation; _logger = logger; } public async Task GetSubscriptionsAsync( int objectTypeId, int objectId, LoginDTO login, CancellationToken ct) { GB5Shared.Telemetry.GB5Trace.Step("get-subscriptions", new { objectTypeId, objectId }); var result = await _dal.GetSubscriptionsAsync(objectTypeId, objectId, login, ct) .ConfigureAwait(false); return JsonSerializer.Serialize(result, JsonOpts); } public async Task GetSubscriptionAsync( int subscriptionId, LoginDTO login, CancellationToken ct) { var result = await _dal.GetSubscriptionAsync(subscriptionId, login, ct) .ConfigureAwait(false); return JsonSerializer.Serialize(result, JsonOpts); } public async Task SaveSubscriptionAsync( SubscriptionDTO dto, LoginDTO login, CancellationToken ct) { GB5Shared.Telemetry.GB5Trace.Step("validate-subscription", new { dto.SubscriptionId }); _validation.NotEmpty(dto.SubscriptionParticulars, nameof(dto.SubscriptionParticulars)); _validation.NotEmpty(dto.SubscriptionUserIds, nameof(dto.SubscriptionUserIds)); var isNew = dto.SubscriptionId <= 0; GB5Shared.Telemetry.GB5Trace.Step("save-subscription", new { dto.SubscriptionId, isNew }); try { dto.SubscriptionCreatedById = login.UserId; dto.SubscriptionCreatedOn = DateTime.UtcNow; dto.SubscriptionModifiedById = login.UserId; dto.SubscriptionModifiedOn = DateTime.UtcNow; if (isNew) { var savedId = await _dal.SaveSubscriptionAsync(dto, login, ct).ConfigureAwait(false); return $"{SuccessResponse.SaveSuccessMessage} {savedId}"; } await _dal.UpdateSubscriptionAsync(dto, login, ct).ConfigureAwait(false); return SuccessResponse.UpdateSuccess; } catch (Exception ex) { GB5Shared.Telemetry.GB5Trace.MarkFailed("save-subscription-failed", ex); _logger.LogError(ex, "SaveSubscription failed for SubscriptionId {Id}", dto.SubscriptionId); throw; } } public async Task DeleteSubscriptionAsync( int subscriptionId, LoginDTO login, CancellationToken ct) { GB5Shared.Telemetry.GB5Trace.Step("delete-subscription", new { subscriptionId }); try { await _dal.DeleteSubscriptionAsync(subscriptionId, login, ct).ConfigureAwait(false); return SuccessResponse.DeleteSuccessMessage; } catch (Exception ex) { GB5Shared.Telemetry.GB5Trace.MarkFailed("delete-subscription-failed", ex); _logger.LogError(ex, "DeleteSubscription failed for SubscriptionId {Id}", subscriptionId); throw; } } }