Completed
Pull Request — master (#143)
by Beñat
03:47 queued 46s
created

CreateTaskHandler   B

Complexity

Total Complexity 10

Size/Duplication

Total Lines 74
Duplicated Lines 0 %

Coupling/Cohesion

Components 0
Dependencies 17

Importance

Changes 0
Metric Value
wmc 10
lcom 0
cbo 17
dl 0
loc 74
rs 7.8571
c 0
b 0
f 0

2 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 9 1
B __invoke() 0 57 9
1
<?php
2
3
/*
4
 * This file is part of the Kreta package.
5
 *
6
 * (c) Beñat Espiña <[email protected]>
7
 * (c) Gorka Laucirica <[email protected]>
8
 *
9
 * For the full copyright and license information, please view the LICENSE
10
 * file that was distributed with this source code.
11
 */
12
13
declare(strict_types=1);
14
15
namespace Kreta\TaskManager\Application\Project\Task;
16
17
use Kreta\TaskManager\Domain\Model\Organization\MemberId;
18
use Kreta\TaskManager\Domain\Model\Organization\OrganizationRepository;
19
use Kreta\TaskManager\Domain\Model\Project\Project;
20
use Kreta\TaskManager\Domain\Model\Project\ProjectDoesNotExistException;
21
use Kreta\TaskManager\Domain\Model\Project\ProjectId;
22
use Kreta\TaskManager\Domain\Model\Project\ProjectRepository;
23
use Kreta\TaskManager\Domain\Model\Project\Task\Task;
24
use Kreta\TaskManager\Domain\Model\Project\Task\TaskAlreadyExistsException;
25
use Kreta\TaskManager\Domain\Model\Project\Task\TaskAndTaskParentCannotBeTheSameException;
26
use Kreta\TaskManager\Domain\Model\Project\Task\TaskCreationNotAllowedException;
27
use Kreta\TaskManager\Domain\Model\Project\Task\TaskId;
28
use Kreta\TaskManager\Domain\Model\Project\Task\TaskParentDoesNotExistException;
29
use Kreta\TaskManager\Domain\Model\Project\Task\TaskPriority;
30
use Kreta\TaskManager\Domain\Model\Project\Task\TaskRepository;
31
use Kreta\TaskManager\Domain\Model\Project\Task\TaskTitle;
32
use Kreta\TaskManager\Domain\Model\User\UserId;
33
34
class CreateTaskHandler
35
{
36
    private $repository;
37
    private $projectRepository;
38
    private $organizationRepository;
39
40
    public function __construct(
41
        TaskRepository $repository,
42
        ProjectRepository $projectRepository,
43
        OrganizationRepository $organizationRepository
44
    ) {
45
        $this->repository = $repository;
46
        $this->projectRepository = $projectRepository;
47
        $this->organizationRepository = $organizationRepository;
48
    }
49
50
    public function __invoke(CreateTaskCommand $command)
51
    {
52
        if (null !== $id = $command->taskId()) {
53
            $task = $this->repository->taskOfId(
54
                TaskId::generate(
55
                    $id
56
                )
57
            );
58
            if ($command->parentId() === $command->taskId()) {
59
                throw new TaskAndTaskParentCannotBeTheSameException();
60
            }
61
            if ($task instanceof Task) {
62
                throw new TaskAlreadyExistsException();
63
            }
64
        }
65
        $project = $this->projectRepository->projectOfId(
66
            ProjectId::generate(
67
                $command->projectId()
68
            )
69
        );
70
        if (!$project instanceof Project) {
71
            throw new ProjectDoesNotExistException();
72
        }
73
        $organization = $this->organizationRepository->organizationOfId(
74
            $project->organizationId()
75
        );
76
        $creatorId = MemberId::generate(UserId::generate($command->creatorId()), $organization->id());
77
        $assigneeId = MemberId::generate(UserId::generate($command->assigneeId()), $organization->id());
78
        if (!$organization->isMember($creatorId) || !$organization->isMember($assigneeId)) {
79
            throw new TaskCreationNotAllowedException();
80
        }
81
        if (null !== $parentId = $command->parentId()) {
82
            $parent = $this->repository->taskOfId(
83
                TaskId::generate(
84
                    $parentId
85
                )
86
            );
87
            if (!$parent instanceof Task) {
88
                throw new TaskParentDoesNotExistException();
89
            }
90
        }
91
        $task = new Task(
92
            TaskId::generate($id),
93
            new TaskTitle(
94
                $command->title()
95
            ),
96
            $command->description(),
97
            $creatorId,
98
            $assigneeId,
99
            new TaskPriority($command->priority()),
100
            $project->id(),
101
            TaskId::generate(
102
                $parentId
103
            )
104
        );
105
        $this->repository->persist($task);
106
    }
107
}
108