using System.ComponentModel.DataAnnotations; using GB5Shared.DaprCache; using GB5Shared.DTO.Framework.AutoNumber; using GB5Shared.DTO.Framework.Criteria; using GB5Shared.DTO.Framework.Login; using GB5Shared.EntityHandler; using GB5Shared.GenerateAutoNumber; using GB5Shared.Resource.Response; using GB5Shared.Telemetry; using GB5Shared.Validation; using MarketingDAL.CustomCode.LeadMagnet; using MarketingDAL.DTO.LeadMagnet; using Microsoft.Extensions.Logging; using static GB5Shared.GB5Constant.Constant; namespace MarketingBLL.LeadMagnet; public class LeadMagnetBLL : ILeadMagnetBLL { private readonly ILeadMagnetDAL _LeadMagnetDAL; private readonly AutoNumber _AutoNumber; private readonly IValidation _Validation; private readonly KeyInvalidate _KeyInvalidate; private readonly BaseEntityAppService _BaseEntityAppService; private readonly ILogger _Logger; public LeadMagnetBLL( ILeadMagnetDAL leadMagnetDAL, AutoNumber autoNumber, IValidation validation, KeyInvalidate keyInvalidate, BaseEntityAppService baseEntityAppService, ILogger logger) { _LeadMagnetDAL = leadMagnetDAL; _AutoNumber = autoNumber; _Validation = validation; _KeyInvalidate = keyInvalidate; _BaseEntityAppService = baseEntityAppService; _Logger = logger; } public async Task GetLeadMagnet(int leadMagnetId, LoginDTO loginDTO, CancellationToken ct) { try { return await _LeadMagnetDAL.GetLeadMagnet(leadMagnetId, loginDTO, ct).ConfigureAwait(false); } catch (Exception ex) { GB5Trace.MarkFailed("get-leadmagnet-failed", ex); _Logger.LogError(ex, "GetLeadMagnet failed for LeadMagnetId {LeadMagnetId}", leadMagnetId); throw; } } public async Task SaveLeadMagnet(LeadMagnetDTO leadMagnetDTO, LoginDTO loginDTO, CancellationToken ct) { if (leadMagnetDTO == null) throw new ArgumentNullException(nameof(leadMagnetDTO)); AutoNumberDTO? autoNumberDTO = null; try { GB5Trace.Step("validate-leadmagnet", new { leadMagnetDTO.LeadMagnetId }); await _Validation.NotEmpty(leadMagnetDTO.LeadMagnetCode, nameof(leadMagnetDTO.LeadMagnetCode)); await _Validation.NotEmpty(leadMagnetDTO.LeadMagnetName, nameof(leadMagnetDTO.LeadMagnetName)); await _Validation.NotEmpty(leadMagnetDTO.OfferType, nameof(leadMagnetDTO.OfferType)); if (leadMagnetDTO.CampaignId == 0) leadMagnetDTO.CampaignId = -1; leadMagnetDTO.ModifiedById = loginDTO.UserId; leadMagnetDTO.ModifiedOn = DateTime.UtcNow; bool isNew = leadMagnetDTO.LeadMagnetId == 0; if (isNew) { autoNumberDTO = await _AutoNumber.GetNumberAsync(1, "LEADMAGNET", loginDTO).ConfigureAwait(false); leadMagnetDTO.LeadMagnetId = autoNumberDTO.StartNumber; leadMagnetDTO.CreatedById = loginDTO.UserId; leadMagnetDTO.CreatedOn = DateTime.UtcNow; } GB5Trace.Step("save-leadmagnet", new { leadMagnetDTO.LeadMagnetId, isNew }); await _BaseEntityAppService.ExecuteSaveAsync( EntityConstant.OBJECTMARKETINGLEADMAGNET, isNew ? EventTypeConstant.SAVEMARKETINGLEADMAGNETEVENTTYPEID : EventTypeConstant.UPDATEMARKETINGLEADMAGNETEVENTTYPEID, leadMagnetDTO, loginDTO, async tx => { _ = isNew ? await _LeadMagnetDAL.SaveLeadMagnet(leadMagnetDTO, loginDTO, tx, ct).ConfigureAwait(false) : await _LeadMagnetDAL.UpdateLeadMagnet(leadMagnetDTO, loginDTO, tx, ct).ConfigureAwait(false); return leadMagnetDTO.LeadMagnetId; }, null, -1, -1, null, isNew).ConfigureAwait(false); GB5Trace.Step("event-publish", new { EventTypeId = isNew ? EventTypeConstant.SAVEMARKETINGLEADMAGNETEVENTTYPEID : EventTypeConstant.UPDATEMARKETINGLEADMAGNETEVENTTYPEID }); var cacheKey = new CacheKeyGeneration().KeyGeneration( leadMagnetDTO.LeadMagnetId, EntityConstant.OBJECTMARKETINGLEADMAGNET, CacheKeyLevel.CLIENT_LEVEL, loginDTO); await _KeyInvalidate.AllInvalidateCache(cacheKey).ConfigureAwait(false); _Logger.LogInformation("LeadMagnet {LeadMagnetId} {Action} by user {UserId}", leadMagnetDTO.LeadMagnetId, isNew ? "saved" : "updated", loginDTO.UserId); return isNew ? $"{SuccessResponse.SaveSuccessMessage} {leadMagnetDTO.LeadMagnetId}" : $"{SuccessResponse.UpdateSuccessMessage} {leadMagnetDTO.LeadMagnetId}"; } catch (ValidationException vex) { GB5Trace.MarkFailed("save-leadmagnet-failed", vex); if (autoNumberDTO != null && leadMagnetDTO.LeadMagnetId > 0) await _AutoNumber.RollbackAutoNumber("LEADMAGNET", leadMagnetDTO.LeadMagnetId, loginDTO).ConfigureAwait(false); throw new Exception(vex.Message); } catch (Exception ex) { GB5Trace.MarkFailed("save-leadmagnet-failed", ex); _Logger.LogError(ex, "SaveLeadMagnet failed for LeadMagnetId {LeadMagnetId}", leadMagnetDTO.LeadMagnetId); if (autoNumberDTO != null && leadMagnetDTO.LeadMagnetId > 0) await _AutoNumber.RollbackAutoNumber("LEADMAGNET", leadMagnetDTO.LeadMagnetId, loginDTO).ConfigureAwait(false); throw; } } public async Task GetSelectListLeadMagnet(CriteriaDTO criteriaDTO, LoginDTO loginDTO, CancellationToken ct) { try { return await _LeadMagnetDAL.GetSelectListLeadMagnet(criteriaDTO, loginDTO, ct).ConfigureAwait(false); } catch (Exception ex) { GB5Trace.MarkFailed("get-selectlist-leadmagnet-failed", ex); _Logger.LogError(ex, "GetSelectListLeadMagnet failed"); throw; } } public async Task DeleteLeadMagnet(int leadMagnetId, LoginDTO loginDTO, CancellationToken ct) { try { GB5Trace.Step("delete-leadmagnet", new { leadMagnetId }); var result = await _LeadMagnetDAL.DeleteLeadMagnet(leadMagnetId, loginDTO, ct).ConfigureAwait(false); var cacheKey = new CacheKeyGeneration().KeyGeneration( leadMagnetId, EntityConstant.OBJECTMARKETINGLEADMAGNET, CacheKeyLevel.CLIENT_LEVEL, loginDTO); await _KeyInvalidate.AllInvalidateCache(cacheKey).ConfigureAwait(false); _Logger.LogInformation("LeadMagnet {LeadMagnetId} deleted by user {UserId}", leadMagnetId, loginDTO.UserId); return result; } catch (Exception ex) { GB5Trace.MarkFailed("delete-leadmagnet-failed", ex); _Logger.LogError(ex, "DeleteLeadMagnet failed for LeadMagnetId {LeadMagnetId}", leadMagnetId); throw; } } }