84 lines
3.3 KiB
C#
84 lines
3.3 KiB
C#
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<CreateProjectCommand>
|
|
{
|
|
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<OperationResult> 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);
|
|
}
|
|
} |