Completed
Pull Request — master (#180)
by Gorka
05:29
created

ReassignTaskHandler::__invoke()   B

Complexity

Conditions 4
Paths 3

Size

Total Lines 26
Code Lines 15

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 26
c 0
b 0
f 0
rs 8.5806
cc 4
eloc 15
nc 3
nop 1
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\Command\Project\Task;
16
17
use Kreta\TaskManager\Domain\Model\Organization\OrganizationRepository;
18
use Kreta\TaskManager\Domain\Model\Project\ProjectRepository;
19
use Kreta\TaskManager\Domain\Model\Project\Task\Task;
20
use Kreta\TaskManager\Domain\Model\Project\Task\TaskDoesNotExistException;
21
use Kreta\TaskManager\Domain\Model\Project\Task\TaskId;
22
use Kreta\TaskManager\Domain\Model\Project\Task\TaskRepository;
23
use Kreta\TaskManager\Domain\Model\Project\Task\UnauthorizedTaskActionException;
24
use Kreta\TaskManager\Domain\Model\User\UserId;
25
26
class ReassignTaskHandler
27
{
28
    private $organizationRepository;
29
    private $projectRepository;
30
    private $taskRepository;
31
32
    public function __construct(
33
        OrganizationRepository $organizationRepository,
34
        ProjectRepository $projectRepository,
35
        TaskRepository $taskRepository
36
    ) {
37
        $this->organizationRepository = $organizationRepository;
38
        $this->projectRepository = $projectRepository;
39
        $this->taskRepository = $taskRepository;
40
    }
41
42
    public function __invoke(ReassignTaskCommand $command)
43
    {
44
        $task = $this->taskRepository->taskOfId(TaskId::generate($command->id()));
45
        if (!$task instanceof Task) {
46
            throw new TaskDoesNotExistException();
47
        }
48
49
        $project = $this->projectRepository->projectOfId(
50
            $task->projectId()
51
        );
52
        $organization = $this->organizationRepository->organizationOfId(
53
            $project->organizationId()
54
        );
55
56
        $newAssigneeId = UserId::generate($command->assigneeId());
57
        if (!$organization->isOrganizationMember(UserId::generate($command->editorId()))
58
            || !$organization->isOrganizationMember($newAssigneeId)
59
        ) {
60
            throw new UnauthorizedTaskActionException();
61
        }
62
63
        $task->reassign(
64
            $organization->organizationMember($newAssigneeId)->id()
65
        );
66
        $this->taskRepository->persist($task);
67
    }
68
}
69