Files
Backend-Api/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Projects/Commands/CreateProject/CreateProjectCommandHandler.cs

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