Completed
Push — master ( ed41b4...63431b )
by Beñat
14s
created

ChangeTaskPriorityHandler::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 9
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

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