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();
}
}