using GB5Shared.DTO.Framework.Login; using GB5Shared.GenerateAutoNumber; using GB5Shared.QueryExecutor; using OKRDAL.DTOs; using OKRDAL.Interfaces; using OKRDAL.QueryBuilders; namespace OKRDAL.Implementations; public class OKRTemplateDAL : IOKRTemplateDAL { private readonly IQueryExecutor _qe; private readonly AutoNumber _autoNumber; public OKRTemplateDAL(IQueryExecutor qe, AutoNumber autoNumber) { _qe = qe; _autoNumber = autoNumber; } public async Task> GetTemplatesAsync(int perspectiveId, LoginDTO login, CancellationToken ct) => await _qe.QueryAsync(login, OKRTemplateQB.GET_TEMPLATES, new { PerspectiveId = perspectiveId, TenantId = login.ClientId }, cancellationToken: ct).ConfigureAwait(false) ?? Enumerable.Empty(); public async Task> GetGoalTemplatesAsync(int templateId, LoginDTO login, CancellationToken ct) => await _qe.QueryAsync(login, OKRTemplateQB.GET_GOAL_TEMPLATES, new { TemplateId = templateId, TenantId = login.ClientId }, cancellationToken: ct).ConfigureAwait(false) ?? Enumerable.Empty(); public async Task SaveTemplateAsync(OKRTemplateDTO dto, LoginDTO login, CancellationToken ct) { int templateId; if (dto.TemplateId == 0) { var auto = await _autoNumber.GetAutoNumber(1, "OKRTEMPLATE", login).ConfigureAwait(false); dto.TemplateId = auto.StartNumber; dto.TenantId = login.ClientId; await _qe.ExecuteAsync(login, OKRTemplateQB.INSERT_TEMPLATE, dto, cancellationToken: ct).ConfigureAwait(false); templateId = dto.TemplateId; } else { await _qe.ExecuteAsync(login, OKRTemplateQB.UPDATE_TEMPLATE, dto, cancellationToken: ct).ConfigureAwait(false); templateId = dto.TemplateId; } // Replace goal templates await _qe.ExecuteAsync(login, OKRTemplateQB.DELETE_GOAL_TEMPLATES, new { TemplateId = templateId, TenantId = login.ClientId }, cancellationToken: ct).ConfigureAwait(false); int sortOrder = 1; foreach (var gt in dto.GoalTemplates) { var gtAuto = await _autoNumber.GetAutoNumber(1, "OKRGOALTEMPLATE", login).ConfigureAwait(false); gt.GoalTemplateId = gtAuto.StartNumber; gt.TemplateId = templateId; gt.TenantId = login.ClientId; gt.SortOrder = sortOrder++; await _qe.ExecuteAsync(login, OKRTemplateQB.INSERT_GOAL_TEMPLATE, gt, cancellationToken: ct).ConfigureAwait(false); } return templateId; } }