using System.Text.Json; using FBCKBLL.Interfaces; using FBCKDAL.DTOs; using FBCKDAL.Interfaces; using GB5Shared.DaprCache; using GB5Shared.DTO.Framework.Login; using GB5Shared.EventLogPublish; using static GB5Shared.GB5Constant.Constant; using GB5Shared.Resource.Response; using GB5Shared.Telemetry; using GB5Shared.Validation; using Microsoft.Extensions.Logging; namespace FBCKBLL.Implementations; public class ActionItemBLL : IActionItemBLL { private readonly IActionItemDAL _dal; private readonly IValidation _validation; private readonly KeyInvalidate _keyInvalidate; private readonly EventLogPublish _eventLog; private readonly ILogger _logger; public ActionItemBLL(IActionItemDAL dal, IValidation validation, KeyInvalidate keyInvalidate, EventLogPublish eventLog, ILogger logger) { _dal = dal; _validation = validation; _keyInvalidate = keyInvalidate; _eventLog = eventLog; _logger = logger; } public async Task GetActionItemsAsync(int employeeId, short contextType, int contextId, short status, LoginDTO login, CancellationToken ct) { var list = await _dal.GetActionItemsAsync(employeeId, contextType, contextId, status, login, ct).ConfigureAwait(false); return JsonSerializer.Serialize(list); } public async Task SaveActionItemAsync(ActionItemDTO dto, LoginDTO login, CancellationToken ct) { try { GB5Trace.Step("validate-actionitem", new { dto.ActionItemId }); await _validation.NotEmpty(dto.ActionText, nameof(dto.ActionText)).ConfigureAwait(false); bool isNew = dto.ActionItemId == 0; GB5Trace.Step("save-actionitem", new { dto.ActionItemId, isNew }); var savedId = await _dal.SaveActionItemAsync(dto, login, ct).ConfigureAwait(false); GB5Trace.Step("event-publish", new { EventTypeId = EventTypeConstant.SAVEFBCKACTIONITEMEVENTTYPEID }); await _eventLog.PublishEventLogAsync("Action Item Saved", nameof(ActionItemDTO), EventTypeConstant.SAVEFBCKACTIONITEMEVENTTYPEID, savedId, login, ct: ct).ConfigureAwait(false); var cacheKey = new CacheKeyGeneration().KeyGeneration(0, EntityConstant.OBJECTACTIONITEM, CacheKeyLevel.USER_LEVEL, login); await _keyInvalidate.AllInvalidateCache(cacheKey).ConfigureAwait(false); return isNew ? $"{SuccessResponse.SaveSuccessMessage} {savedId}" : SuccessResponse.UpdateSuccess; } catch (Exception ex) { GB5Trace.MarkFailed("actionitem-save-failed", ex); _logger.LogError(ex, "SaveActionItem failed for ActionItemId {ActionItemId}", dto.ActionItemId); throw; } } public async Task CompleteActionItemAsync(int actionItemId, string completionRemarks, LoginDTO login, CancellationToken ct) { try { GB5Trace.Step("validate-actionitem-complete", new { actionItemId }); await _validation.NotEmpty(completionRemarks, nameof(completionRemarks)).ConfigureAwait(false); GB5Trace.Step("complete-actionitem", new { actionItemId }); await _dal.CompleteActionItemAsync(actionItemId, completionRemarks, login, ct).ConfigureAwait(false); GB5Trace.Step("event-publish", new { EventTypeId = EventTypeConstant.COMPLETEFBCKACTIONITEMEVENTTYPEID }); await _eventLog.PublishEventLogAsync("Action Item Completed", nameof(ActionItemDTO), EventTypeConstant.COMPLETEFBCKACTIONITEMEVENTTYPEID, actionItemId, login, ct: ct).ConfigureAwait(false); var cacheKey = new CacheKeyGeneration().KeyGeneration(0, EntityConstant.OBJECTACTIONITEM, CacheKeyLevel.USER_LEVEL, login); await _keyInvalidate.AllInvalidateCache(cacheKey).ConfigureAwait(false); return SuccessResponse.UpdateSuccess; } catch (Exception ex) { GB5Trace.MarkFailed("actionitem-complete-failed", ex); _logger.LogError(ex, "CompleteActionItem failed for ActionItemId {ActionItemId}", actionItemId); throw; } } }