using GozareshgirProgramManager.Application._Common.Interfaces; using GozareshgirProgramManager.Application._Common.Models; using GozareshgirProgramManager.Domain._Common; using GozareshgirProgramManager.Domain._Common.Exceptions; using GozareshgirProgramManager.Domain.ProjectAgg.Entities; using GozareshgirProgramManager.Domain.ProjectAgg.Enums; using GozareshgirProgramManager.Domain.ProjectAgg.Repositories; namespace GozareshgirProgramManager.Application.Modules.Projects.Commands.CreateProject; public class CreateProjectCommandHandler : IBaseCommandHandler { private readonly IProjectRepository _projectRepository; private readonly IProjectPhaseRepository _projectPhaseRepository; private readonly IProjectTaskRepository _projectTaskRepository; private readonly IUnitOfWork _unitOfWork; public CreateProjectCommandHandler(IProjectRepository projectRepository, IUnitOfWork unitOfWork, IProjectTaskRepository projectTaskRepository, IProjectPhaseRepository projectPhaseRepository) { _projectRepository = projectRepository; _unitOfWork = unitOfWork; _projectTaskRepository = projectTaskRepository; _projectPhaseRepository = projectPhaseRepository; } public async Task Handle(CreateProjectCommand request, CancellationToken cancellationToken) { switch (request.Level) { case ProjectHierarchyLevel.Project: await CreateProject(request); break; case ProjectHierarchyLevel.Phase: await CreateProjectPhase(request); break; case ProjectHierarchyLevel.Task: await CreateProjectTask(request); break; default: return OperationResult.Failure("سطح پروژه نامعتبر است"); } await _unitOfWork.SaveChangesAsync(cancellationToken); return OperationResult.Success(); } private async Task CreateProject(CreateProjectCommand request) { var project = new Project(request.Name); await _projectRepository.CreateAsync(project); } private async Task CreateProjectPhase(CreateProjectCommand request) { if (!request.ParentId.HasValue) throw new BadRequestException("برای ایجاد فاز، شناسه پروژه الزامی است"); if (!_projectRepository.Exists(x => x.Id == request.ParentId.Value)) { throw new BadRequestException("والد پروژه یافت نشد"); } var projectPhase = new ProjectPhase(request.Name, request.ParentId.Value); await _projectPhaseRepository.CreateAsync(projectPhase); } private async Task CreateProjectTask(CreateProjectCommand request) { if (!request.ParentId.HasValue) throw new BadRequestException("برای ایجاد تسک، شناسه فاز الزامی است"); if (!_projectPhaseRepository.Exists(x => x.Id == request.ParentId.Value)) { throw new BadRequestException("والد پروژه یافت نشد"); } var priority = request.Priority ?? ProjectTaskPriority.Low; var projectTask = new ProjectTask(request.Name, request.ParentId.Value, priority); await _projectTaskRepository.CreateAsync(projectTask); } }