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.GrowthPlay; using MarketingDAL.DTO.GrowthPlay; using Microsoft.Extensions.Logging; using static GB5Shared.GB5Constant.Constant; namespace MarketingBLL.GrowthPlay; public class GrowthPlayBLL : IGrowthPlayBLL { private readonly IGrowthPlayDAL _GrowthPlayDAL; private readonly AutoNumber _AutoNumber; private readonly IValidation _Validation; private readonly KeyInvalidate _KeyInvalidate; private readonly BaseEntityAppService _BaseEntityAppService; private readonly ILogger _Logger; public GrowthPlayBLL( IGrowthPlayDAL growthPlayDAL, AutoNumber autoNumber, IValidation validation, KeyInvalidate keyInvalidate, BaseEntityAppService baseEntityAppService, ILogger logger) { _GrowthPlayDAL = growthPlayDAL; _AutoNumber = autoNumber; _Validation = validation; _KeyInvalidate = keyInvalidate; _BaseEntityAppService = baseEntityAppService; _Logger = logger; } public async Task GetGrowthPlay(int growthPlayId, LoginDTO loginDTO, CancellationToken ct) { try { return await _GrowthPlayDAL.GetGrowthPlay(growthPlayId, loginDTO, ct).ConfigureAwait(false); } catch (Exception ex) { GB5Trace.MarkFailed("get-growthplay-failed", ex); _Logger.LogError(ex, "GetGrowthPlay failed for GrowthPlayId {GrowthPlayId}", growthPlayId); throw; } } public async Task SaveGrowthPlay(GrowthPlayDTO growthPlayDTO, LoginDTO loginDTO, CancellationToken ct) { if (growthPlayDTO == null) throw new ArgumentNullException(nameof(growthPlayDTO)); AutoNumberDTO? autoNumberDTO = null; try { GB5Trace.Step("validate-growthplay", new { growthPlayDTO.GrowthPlayId }); await _Validation.NotEmpty(growthPlayDTO.GrowthPlayCode, nameof(growthPlayDTO.GrowthPlayCode)); await _Validation.NotEmpty(growthPlayDTO.GrowthPlayName, nameof(growthPlayDTO.GrowthPlayName)); await _Validation.NotEmpty(growthPlayDTO.HypothesisText, nameof(growthPlayDTO.HypothesisText)); await _Validation.Range((byte)1, (byte)4, growthPlayDTO.GrowthPlayStatus, nameof(growthPlayDTO.GrowthPlayStatus)); if (growthPlayDTO.SegmentId == 0) growthPlayDTO.SegmentId = -1; growthPlayDTO.ModifiedById = loginDTO.UserId; growthPlayDTO.ModifiedOn = DateTime.UtcNow; bool isNew = growthPlayDTO.GrowthPlayId == 0; if (isNew) { autoNumberDTO = await _AutoNumber.GetNumberAsync(1, "GROWTHPLAY", loginDTO).ConfigureAwait(false); growthPlayDTO.GrowthPlayId = autoNumberDTO.StartNumber; growthPlayDTO.CreatedById = loginDTO.UserId; growthPlayDTO.CreatedOn = DateTime.UtcNow; } GB5Trace.Step("save-growthplay", new { growthPlayDTO.GrowthPlayId, isNew }); await _BaseEntityAppService.ExecuteSaveAsync( EntityConstant.OBJECTMARKETINGGROWTHPLAY, isNew ? EventTypeConstant.SAVEMARKETINGGROWTHPLAYEVENTTYPEID : EventTypeConstant.UPDATEMARKETINGGROWTHPLAYEVENTTYPEID, growthPlayDTO, loginDTO, async tx => { _ = isNew ? await _GrowthPlayDAL.SaveGrowthPlay(growthPlayDTO, loginDTO, tx, ct).ConfigureAwait(false) : await _GrowthPlayDAL.UpdateGrowthPlay(growthPlayDTO, loginDTO, tx, ct).ConfigureAwait(false); return growthPlayDTO.GrowthPlayId; }, null, -1, -1, null, isNew).ConfigureAwait(false); GB5Trace.Step("event-publish", new { EventTypeId = isNew ? EventTypeConstant.SAVEMARKETINGGROWTHPLAYEVENTTYPEID : EventTypeConstant.UPDATEMARKETINGGROWTHPLAYEVENTTYPEID }); var cacheKey = new CacheKeyGeneration().KeyGeneration( growthPlayDTO.GrowthPlayId, EntityConstant.OBJECTMARKETINGGROWTHPLAY, CacheKeyLevel.CLIENT_LEVEL, loginDTO); await _KeyInvalidate.AllInvalidateCache(cacheKey).ConfigureAwait(false); _Logger.LogInformation("GrowthPlay {GrowthPlayId} {Action} by user {UserId}", growthPlayDTO.GrowthPlayId, isNew ? "saved" : "updated", loginDTO.UserId); return isNew ? $"{SuccessResponse.SaveSuccessMessage} {growthPlayDTO.GrowthPlayId}" : $"{SuccessResponse.UpdateSuccessMessage} {growthPlayDTO.GrowthPlayId}"; } catch (ValidationException vex) { GB5Trace.MarkFailed("save-growthplay-failed", vex); if (autoNumberDTO != null && growthPlayDTO.GrowthPlayId > 0) await _AutoNumber.RollbackAutoNumber("GROWTHPLAY", growthPlayDTO.GrowthPlayId, loginDTO).ConfigureAwait(false); throw new Exception(vex.Message); } catch (Exception ex) { GB5Trace.MarkFailed("save-growthplay-failed", ex); _Logger.LogError(ex, "SaveGrowthPlay failed for GrowthPlayId {GrowthPlayId}", growthPlayDTO.GrowthPlayId); if (autoNumberDTO != null && growthPlayDTO.GrowthPlayId > 0) await _AutoNumber.RollbackAutoNumber("GROWTHPLAY", growthPlayDTO.GrowthPlayId, loginDTO).ConfigureAwait(false); throw; } } public async Task GetSelectListGrowthPlay(CriteriaDTO criteriaDTO, LoginDTO loginDTO, CancellationToken ct) { try { return await _GrowthPlayDAL.GetSelectListGrowthPlay(criteriaDTO, loginDTO, ct).ConfigureAwait(false); } catch (Exception ex) { GB5Trace.MarkFailed("get-selectlist-growthplay-failed", ex); _Logger.LogError(ex, "GetSelectListGrowthPlay failed"); throw; } } public async Task DeleteGrowthPlay(int growthPlayId, LoginDTO loginDTO, CancellationToken ct) { try { GB5Trace.Step("delete-growthplay", new { growthPlayId }); var result = await _GrowthPlayDAL.DeleteGrowthPlay(growthPlayId, loginDTO, ct).ConfigureAwait(false); var cacheKey = new CacheKeyGeneration().KeyGeneration( growthPlayId, EntityConstant.OBJECTMARKETINGGROWTHPLAY, CacheKeyLevel.CLIENT_LEVEL, loginDTO); await _KeyInvalidate.AllInvalidateCache(cacheKey).ConfigureAwait(false); _Logger.LogInformation("GrowthPlay {GrowthPlayId} deleted by user {UserId}", growthPlayId, loginDTO.UserId); return result; } catch (Exception ex) { GB5Trace.MarkFailed("delete-growthplay-failed", ex); _Logger.LogError(ex, "DeleteGrowthPlay failed for GrowthPlayId {GrowthPlayId}", growthPlayId); throw; } } }