using GB5Shared.DaprCache; using GB5Shared.DTO.Framework.Login; using GB5Shared.EventLogPublish; using GB5Shared.GenerateAutoNumber; using GB5Shared.Resource.Response; using GoodBooks.PAY.PAYDAL.CustomCode.Cashback; using GoodBooks.PAY.PAYDAL.DTO.Cashback; using Microsoft.Extensions.Logging; using static GB5Shared.GB5Constant.Constant; namespace GoodBooks.PAY.PAYBLL.Cashback { // ───────────────────────────────────────────────────────────────────────── // CashbackRuleBLL // // MCASHBACKRULE is tenant-scoped (TenantId filter on all DAL queries). // Cache level: CLIENT_LEVEL. // EntityConstant.OBJECTMCASHBACKRULE = 5009 // ───────────────────────────────────────────────────────────────────────── public class CashbackRuleBLL : ICashbackRuleBLL { private readonly ICashbackRuleDAL _dal; private readonly AutoNumber _autoNumber; private readonly KeyInvalidate _keyInvalidate; private readonly EventLogPublish _eventLogPublish; private readonly ILogger _logger; public CashbackRuleBLL( ICashbackRuleDAL dal, AutoNumber autoNumber, KeyInvalidate keyInvalidate, EventLogPublish eventLogPublish, ILogger logger) { _dal = dal; _autoNumber = autoNumber; _keyInvalidate = keyInvalidate; _eventLogPublish = eventLogPublish; _logger = logger; } // ── GetCashbackRule ──────────────────────────────────────────────────── public async Task GetCashbackRule(int cashbackRuleId, LoginDTO login, CancellationToken ct) { try { return await _dal.GetCashbackRule(cashbackRuleId, login).ConfigureAwait(false); } catch (Exception ex) { _logger.LogError(ex, "GetCashbackRule failed for CashbackRuleId {CashbackRuleId}", cashbackRuleId); throw; } } // ── SaveCashbackRule ─────────────────────────────────────────────────── public async Task SaveCashbackRule(CashbackRuleDTO dto, LoginDTO login, CancellationToken ct) { if (dto is null) throw new ArgumentNullException(nameof(dto)); try { bool isNew = dto.CashbackRuleId == 0; if (isNew) { var autoNum = await _autoNumber.GetAutoNumber(1, "CASHBACKRULE", login) .ConfigureAwait(false); dto.CashbackRuleId = autoNum.StartNumber; dto.CreatedById = login.UserId; dto.CreatedOn = DateTime.UtcNow; dto.TenantId = login.ClientId; } dto.ModifiedById = login.UserId; dto.ModifiedOn = DateTime.UtcNow; if (isNew) await _dal.SaveCashbackRule(dto, login).ConfigureAwait(false); else await _dal.UpdateCashbackRule(dto, login).ConfigureAwait(false); // Cache invalidation string cacheKey = new CacheKeyGeneration().KeyGeneration( dto.CashbackRuleId.ToString(), EntityConstant.OBJECTMCASHBACKRULE, CacheKeyLevel.CLIENT_LEVEL, login); _keyInvalidate.AllInvalidateCache(cacheKey); // Event log — fire-and-forget try { await _eventLogPublish.PublishEventLogAsync( isNew ? "Cashback Rule Created" : "Cashback Rule Updated", new { dto.CashbackRuleId, dto.CashbackRuleName }, isNew ? EventTypeConstant.SAVECASHBACKRULEEVENTTYPEID : EventTypeConstant.UPDATECASHBACKRULEEVENTTYPEID, 0, login).ConfigureAwait(false); } catch (Exception ex) { _logger.LogWarning(ex, "Event log failed for CashbackRule {CashbackRuleId}", dto.CashbackRuleId); } return isNew ? $"{SuccessResponse.SaveSuccessMessage} {dto.CashbackRuleId}" : SuccessResponse.UpdateSuccess; } catch (Exception ex) { _logger.LogError(ex, "SaveCashbackRule failed for CashbackRuleId {CashbackRuleId}", dto.CashbackRuleId); throw; } } } }