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 OneOnOneNoteBLL : IOneOnOneNoteBLL { private readonly IOneOnOneNoteDAL _dal; private readonly IValidation _validation; private readonly KeyInvalidate _keyInvalidate; private readonly EventLogPublish _eventLog; private readonly ILogger _logger; public OneOnOneNoteBLL(IOneOnOneNoteDAL dal, IValidation validation, KeyInvalidate keyInvalidate, EventLogPublish eventLog, ILogger logger) { _dal = dal; _validation = validation; _keyInvalidate = keyInvalidate; _eventLog = eventLog; _logger = logger; } public async Task GetOneOnOneNoteAsync(int tononoteId, LoginDTO login, CancellationToken ct) { var dto = await _dal.GetNoteAsync(tononoteId, login, ct).ConfigureAwait(false); return JsonSerializer.Serialize(dto); } public async Task GetOneOnOneListAsync(int employeeId, int managerId, short status, int page, int pageSize, LoginDTO login, CancellationToken ct) { var list = await _dal.GetNoteListAsync(employeeId, managerId, status, page, pageSize, login, ct).ConfigureAwait(false); return JsonSerializer.Serialize(list); } public async Task SaveOneOnOneNoteAsync(OneOnOneNoteDTO dto, LoginDTO login, CancellationToken ct) { try { GB5Trace.Step("validate-tononote", new { dto.TONONoteId }); await _validation.NotEmpty(dto.AgendaJson, nameof(dto.AgendaJson)).ConfigureAwait(false); bool isNew = dto.TONONoteId == 0; GB5Trace.Step("save-tononote", new { dto.TONONoteId, isNew }); var savedId = await _dal.SaveNoteAsync(dto, login, ct).ConfigureAwait(false); GB5Trace.Step("event-publish", new { EventTypeId = EventTypeConstant.SAVEFBCKTONONOTEEVENTTYPEID }); await _eventLog.PublishEventLogAsync("1:1 Note Saved", nameof(OneOnOneNoteDTO), EventTypeConstant.SAVEFBCKTONONOTEEVENTTYPEID, savedId, login, ct: ct).ConfigureAwait(false); var cacheKey = new CacheKeyGeneration().KeyGeneration(0, EntityConstant.OBJECTONONOTE, CacheKeyLevel.USER_LEVEL, login); await _keyInvalidate.AllInvalidateCache(cacheKey).ConfigureAwait(false); return isNew ? $"{SuccessResponse.SaveSuccessMessage} {savedId}" : SuccessResponse.UpdateSuccess; } catch (Exception ex) { GB5Trace.MarkFailed("tononote-save-failed", ex); _logger.LogError(ex, "SaveOneOnOneNote failed for NoteId {NoteId}", dto.TONONoteId); throw; } } public async Task CompleteOneOnOneAsync(int tononoteId, LoginDTO login, CancellationToken ct) { try { GB5Trace.Step("validate-tononote-complete", new { tononoteId }); GB5Trace.Step("complete-tononote", new { tononoteId }); await _dal.CompleteNoteAsync(tononoteId, login, ct).ConfigureAwait(false); GB5Trace.Step("event-publish", new { EventTypeId = EventTypeConstant.COMPLETEFBCKTONONOTEEVENTTYPEID }); await _eventLog.PublishEventLogAsync("1:1 Note Completed", nameof(OneOnOneNoteDTO), EventTypeConstant.COMPLETEFBCKTONONOTEEVENTTYPEID, tononoteId, login, ct: ct).ConfigureAwait(false); var cacheKey = new CacheKeyGeneration().KeyGeneration(0, EntityConstant.OBJECTONONOTE, CacheKeyLevel.USER_LEVEL, login); await _keyInvalidate.AllInvalidateCache(cacheKey).ConfigureAwait(false); return SuccessResponse.UpdateSuccess; } catch (Exception ex) { GB5Trace.MarkFailed("tononote-complete-failed", ex); _logger.LogError(ex, "CompleteOneOnOne failed for NoteId {NoteId}", tononoteId); throw; } } }