diff --git a/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Projects/Commands/ChangeTaskPriority/ChangeTaskPriorityCommand.cs b/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Projects/Commands/ChangeTaskPriority/ChangeTaskPriorityCommand.cs index 23d23830..a1886b56 100644 --- a/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Projects/Commands/ChangeTaskPriority/ChangeTaskPriorityCommand.cs +++ b/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Projects/Commands/ChangeTaskPriority/ChangeTaskPriorityCommand.cs @@ -6,35 +6,103 @@ using GozareshgirProgramManager.Domain.ProjectAgg.Repositories; namespace GozareshgirProgramManager.Application.Modules.Projects.Commands.ChangeTaskPriority; -/// -/// Command to change a task priority. -/// -public record ChangeTaskPriorityCommand(Guid TaskId, TaskPriority Priority) : IBaseCommand; +public record ChangeTaskPriorityCommand( + Guid Id, + ProjectHierarchyLevel Level, + TaskPriority Priority +) : IBaseCommand; public class ChangeTaskPriorityCommandHandler : IBaseCommandHandler { private readonly IProjectTaskRepository _taskRepository; + private readonly IProjectPhaseRepository _phaseRepository; + private readonly IProjectRepository _projectRepository; private readonly IUnitOfWork _unitOfWork; - public ChangeTaskPriorityCommandHandler(IProjectTaskRepository taskRepository, IUnitOfWork unitOfWork) + public ChangeTaskPriorityCommandHandler( + IProjectTaskRepository taskRepository, + IProjectPhaseRepository phaseRepository, + IProjectRepository projectRepository, + IUnitOfWork unitOfWork) { _taskRepository = taskRepository; + _phaseRepository = phaseRepository; + _projectRepository = projectRepository; _unitOfWork = unitOfWork; } public async Task Handle(ChangeTaskPriorityCommand request, CancellationToken cancellationToken) { - var task = await _taskRepository.GetByIdAsync(request.TaskId, cancellationToken); + switch (request.Level) + { + case ProjectHierarchyLevel.Task: + return await HandleTaskLevelAsync(request.Id, request.Priority, cancellationToken); + case ProjectHierarchyLevel.Phase: + return await HandlePhaseLevelAsync(request.Id, request.Priority, cancellationToken); + case ProjectHierarchyLevel.Project: + return await HandleProjectLevelAsync(request.Id, request.Priority, cancellationToken); + default: + return OperationResult.Failure("سطح نامعتبر است"); + } + } + + // Task-level priority update + private async Task HandleTaskLevelAsync(Guid taskId, TaskPriority priority, CancellationToken ct) + { + var task = await _taskRepository.GetByIdAsync(taskId, ct); if (task is null) return OperationResult.NotFound("تسک یافت نشد"); - // Idempotent: if already same priority, skip extra work - if (task.Priority != request.Priority) + if (task.Priority != priority) { - task.SetPriority(request.Priority); + task.SetPriority(priority); } - await _unitOfWork.SaveChangesAsync(cancellationToken); + await _unitOfWork.SaveChangesAsync(ct); + return OperationResult.Success(); + } + + // Phase-level bulk priority update + private async Task HandlePhaseLevelAsync(Guid phaseId, TaskPriority priority, CancellationToken ct) + { + var phase = await _phaseRepository.GetWithTasksAsync(phaseId); + if (phase is null) + return OperationResult.NotFound("فاز یافت نشد"); + + var tasks = phase.Tasks?.ToList() ?? new List(); + foreach (var t in tasks) + { + if (t.Priority != priority) + { + t.SetPriority(priority); + } + } + + await _unitOfWork.SaveChangesAsync(ct); + return OperationResult.Success(); + } + + // Project-level bulk priority update across all phases + private async Task HandleProjectLevelAsync(Guid projectId, TaskPriority priority, CancellationToken ct) + { + var project = await _projectRepository.GetWithFullHierarchyAsync(projectId); + if (project is null) + return OperationResult.NotFound("پروژه یافت نشد"); + + var phases = project.Phases?.ToList() ?? new List(); + foreach (var phase in phases) + { + var tasks = phase.Tasks?.ToList() ?? new List(); + foreach (var t in tasks) + { + if (t.Priority != priority) + { + t.SetPriority(priority); + } + } + } + + await _unitOfWork.SaveChangesAsync(ct); return OperationResult.Success(); } }