using System; using System.ComponentModel.DataAnnotations; using System.Threading; using System.Threading.Tasks; using FrameworkDAL.CustomCode.Entitlement; using FrameworkDAL.DTO.Entitlement; using GB5Shared.DaprCache; using GB5Shared.DTO.Framework.AutoNumber; using GB5Shared.DTO.Framework.Login; using GB5Shared.GenerateAutoNumber; using GB5Shared.Resource.Response; using GB5Shared.Validation; namespace FrameworkBLL.Entitlement { public class FeatureDashboardMapBLL : IFeatureDashboardMapBLL { private readonly IFeatureDashboardMapDAL _FeatureDashboardMapDAL; private readonly AutoNumber _AutoNumber; private readonly IValidation _Validation; private readonly KeyInvalidate _KeyInvalidate; public FeatureDashboardMapBLL(IFeatureDashboardMapDAL FeatureDashboardMapDAL, AutoNumber AutoNumber, IValidation Validation, KeyInvalidate KeyInvalidate) { _FeatureDashboardMapDAL = FeatureDashboardMapDAL; _AutoNumber = AutoNumber; _Validation = Validation; _KeyInvalidate = KeyInvalidate; } public async Task GetFeatureDashboardMap(int DashboardId, LoginDTO LoginDTO, CancellationToken ct = default) { try { return await _FeatureDashboardMapDAL.GetFeatureDashboardMap(DashboardId, LoginDTO, ct); } catch (Exception) { throw; } } public async Task SaveFeatureDashboardMap(FeatureDashboardMapDTO FeatureDashboardMapDTO, LoginDTO LoginDTO, CancellationToken ct = default) { if (FeatureDashboardMapDTO == null) throw new ArgumentNullException(nameof(FeatureDashboardMapDTO)); AutoNumberDTO? autoNumberDTO = null; try { await _Validation.NotEmpty(FeatureDashboardMapDTO.FeatureCode, nameof(FeatureDashboardMapDTO.FeatureCode)); if (FeatureDashboardMapDTO.DashboardId == 0) throw new ArgumentException("DashboardId is required."); string result; if (FeatureDashboardMapDTO.FeatureDashboardMapId == 0) { autoNumberDTO = await _AutoNumber.GetAutoNumber(1, "FEATUREDASHBOARDMAP", LoginDTO); FeatureDashboardMapDTO.FeatureDashboardMapId = autoNumberDTO.StartNumber; await _FeatureDashboardMapDAL.SaveFeatureDashboardMap(FeatureDashboardMapDTO, LoginDTO, ct); result = $"{SuccessResponse.SaveSuccessMessage} {FeatureDashboardMapDTO.FeatureDashboardMapId}"; } else { await _FeatureDashboardMapDAL.UpdateFeatureDashboardMap(FeatureDashboardMapDTO, LoginDTO, ct); result = $"{SuccessResponse.UpdateSuccessMessage} {FeatureDashboardMapDTO.FeatureDashboardMapId}"; } // Changes what GetDashboardListForUser's entitlement-gating filter excludes — // affects potentially many users, same broad-impact reasoning as DashboardBLL's // own admin-driven writes. Full flush; this is a rare admin write. await _KeyInvalidate.AllInvalidateCache("-1").ConfigureAwait(false); return result; } catch (ValidationException vex) { throw new Exception(vex.Message); } catch (Exception) { if (autoNumberDTO != null && FeatureDashboardMapDTO.FeatureDashboardMapId > 0) await _AutoNumber.RollbackAutoNumber("FEATUREDASHBOARDMAP", FeatureDashboardMapDTO.FeatureDashboardMapId, LoginDTO); throw; } } public async Task DeleteFeatureDashboardMap(int FeatureDashboardMapId, LoginDTO LoginDTO, CancellationToken ct = default) { try { var result = await _FeatureDashboardMapDAL.DeleteFeatureDashboardMap(FeatureDashboardMapId, LoginDTO, ct); await _KeyInvalidate.AllInvalidateCache("-1").ConfigureAwait(false); return result; } catch (Exception) { throw; } } } }