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 ObjectiveDAL : IObjectiveDAL { private readonly IQueryExecutor _qe; private readonly AutoNumber _autoNumber; public ObjectiveDAL(IQueryExecutor qe, AutoNumber autoNumber) { _qe = qe; _autoNumber = autoNumber; } public async Task GetObjectiveAsync(int objectiveId, LoginDTO login, CancellationToken ct) => await _qe.QuerySingleAsync(login, ObjectiveQB.GET_OBJECTIVE, new { ObjectiveId = objectiveId }).ConfigureAwait(false); public async Task> GetObjectiveListAsync( int okrCycleId, int objectiveType, int ownerId, int forLevel, int forObjectId, int page, int pageSize, LoginDTO login, CancellationToken ct) => await _qe.QueryAsync(login, ObjectiveQB.GET_OBJECTIVE_LIST, new { OKRCycleId = okrCycleId, ObjectiveType = objectiveType, OwnerId = ownerId, ForLevel = forLevel, ForObjectId = forObjectId, Offset = (page - 1) * pageSize, PageSize = pageSize }, cancellationToken: ct).ConfigureAwait(false) ?? Enumerable.Empty(); public async Task GetObjectiveListCountAsync( int okrCycleId, int objectiveType, int ownerId, int forLevel, int forObjectId, LoginDTO login, CancellationToken ct) => await _qe.ExecuteScalarAsync(login, ObjectiveQB.GET_OBJECTIVE_LIST_COUNT, new { OKRCycleId = okrCycleId, ObjectiveType = objectiveType, OwnerId = ownerId, ForLevel = forLevel, ForObjectId = forObjectId }, cancellationToken: ct).ConfigureAwait(false); public async Task> GetObjectiveTreeAsync(int okrCycleId, LoginDTO login, CancellationToken ct) => await _qe.QueryAsync(login, ObjectiveQB.GET_OBJECTIVE_TREE, new { OKRCycleId = okrCycleId }, cancellationToken: ct).ConfigureAwait(false) ?? Enumerable.Empty(); public async Task> GetAlignmentViewAsync(int okrCycleId, LoginDTO login, CancellationToken ct) => await _qe.QueryAsync(login, ObjectiveQB.GET_ALIGNMENT_VIEW, new { OKRCycleId = okrCycleId, TenantId = login.ClientId }, cancellationToken: ct).ConfigureAwait(false) ?? Enumerable.Empty(); public async Task SaveObjectiveAsync(ObjectiveDTO dto, LoginDTO login, CancellationToken ct) { if (dto.ObjectiveId == 0) { var auto = await _autoNumber.GetAutoNumber(1, "OBJECTIVE", login).ConfigureAwait(false); dto.ObjectiveId = auto.StartNumber; dto.CreatedById = login.UserId; await _qe.ExecuteAsync(login, ObjectiveQB.INSERT_OBJECTIVE, dto, cancellationToken: ct).ConfigureAwait(false); return dto.ObjectiveId; } dto.ModifiedById = login.UserId; await _qe.ExecuteAsync(login, ObjectiveQB.UPDATE_OBJECTIVE, dto, cancellationToken: ct).ConfigureAwait(false); return dto.ObjectiveId; } public async Task DeleteObjectiveAsync(int objectiveId, LoginDTO login, CancellationToken ct) => await _qe.ExecuteAsync(login, ObjectiveQB.DELETE_OBJECTIVE, new { ObjectiveId = objectiveId, ModifiedById = login.UserId }, cancellationToken: ct).ConfigureAwait(false); public async Task SaveAlignmentAsync(OKRAlignmentDTO dto, LoginDTO login, CancellationToken ct) { var auto = await _autoNumber.GetAutoNumber(1, "OKRALIGNMENT", login).ConfigureAwait(false); dto.AlignmentId = auto.StartNumber; dto.TenantId = login.ClientId; await _qe.ExecuteAsync(login, ObjectiveQB.INSERT_ALIGNMENT, dto, cancellationToken: ct).ConfigureAwait(false); return dto.AlignmentId; } public async Task DeleteAlignmentAsync(int alignmentId, LoginDTO login, CancellationToken ct) => await _qe.ExecuteAsync(login, ObjectiveQB.DELETE_ALIGNMENT, new { AlignmentId = alignmentId, TenantId = login.ClientId }, cancellationToken: ct).ConfigureAwait(false); public async Task UpdateOverallProgressAsync(int objectiveId, decimal progress, short status, LoginDTO login, CancellationToken ct) => await _qe.ExecuteAsync(login, ObjectiveQB.UPDATE_OVERALL_PROGRESS, new { ObjectiveId = objectiveId, OverallProgress = progress, Status = status, ModifiedById = login.UserId }, cancellationToken: ct).ConfigureAwait(false); public async Task GetWeightedProgressAsync(int objectiveId, LoginDTO login, CancellationToken ct) => await _qe.ExecuteScalarAsync(login, ObjectiveQB.GET_WEIGHTED_PROGRESS, new { ObjectiveId = objectiveId, TenantId = login.ClientId }, cancellationToken: ct).ConfigureAwait(false); }