using GB5Shared.DaprCache; using GB5Shared.DTO.Framework.Login; using GB5Shared.Resource.Response; using GB5Shared.Telemetry; using GB5Shared.Validation; using Microsoft.Extensions.Logging; using OKRBLL.Interfaces; using OKRDAL.DTOs; using OKRDAL.Interfaces; using System.Text.Json; using static GB5Shared.GB5Constant.Constant; namespace OKRBLL.Implementations; public class OKRTemplateBLL : IOKRTemplateBLL { private readonly IOKRTemplateDAL _dal; private readonly IValidation _validation; private readonly KeyInvalidate _keyInvalidate; private readonly ILogger _logger; public OKRTemplateBLL( IOKRTemplateDAL dal, IValidation validation, KeyInvalidate keyInvalidate, ILogger logger) { _dal = dal; _validation = validation; _keyInvalidate = keyInvalidate; _logger = logger; } public async Task GetTemplatesAsync(int perspectiveId, LoginDTO login, CancellationToken ct) { try { GB5Trace.Step("get-okr-templates", new { perspectiveId }); var list = await _dal.GetTemplatesAsync(perspectiveId, login, ct).ConfigureAwait(false); return JsonSerializer.Serialize(list); } catch (Exception ex) { GB5Trace.MarkFailed("get-okr-templates-failed", ex); _logger.LogError(ex, "GetTemplates failed for PerspectiveId {PerspectiveId}", perspectiveId); throw; } } public async Task GetGoalTemplatesAsync(int templateId, LoginDTO login, CancellationToken ct) { try { GB5Trace.Step("get-goal-templates", new { templateId }); var list = await _dal.GetGoalTemplatesAsync(templateId, login, ct).ConfigureAwait(false); return JsonSerializer.Serialize(list); } catch (Exception ex) { GB5Trace.MarkFailed("get-goal-templates-failed", ex); _logger.LogError(ex, "GetGoalTemplates failed for TemplateId {TemplateId}", templateId); throw; } } public async Task SaveTemplateAsync(OKRTemplateDTO dto, LoginDTO login, CancellationToken ct) { try { GB5Trace.Step("validate-okr-template", new { dto.TemplateId }); await _validation.NotEmpty(dto.Name, nameof(dto.Name)).ConfigureAwait(false); bool isNew = dto.TemplateId == 0; GB5Trace.Step("save-okr-template", new { dto.TemplateId, isNew }); int templateId = await _dal.SaveTemplateAsync(dto, login, ct).ConfigureAwait(false); var cacheKey = new CacheKeyGeneration().KeyGeneration(templateId, EntityConstant.OBJECTOKRCYCLE, CacheKeyLevel.CLIENT_LEVEL, login); await _keyInvalidate.AllInvalidateCache(cacheKey).ConfigureAwait(false); return isNew ? $"{SuccessResponse.SaveSuccessMessage} {templateId}" : SuccessResponse.UpdateSuccess; } catch (Exception ex) { GB5Trace.MarkFailed("save-okr-template-failed", ex); _logger.LogError(ex, "SaveTemplate failed for Name {Name}", dto.Name); throw; } } }