MergeRequestApprovalFilter::__invoke()   A
last analyzed

Complexity

Conditions 5
Paths 5

Size

Total Lines 10
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 30

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 5
eloc 5
c 1
b 0
f 0
nc 5
nop 1
dl 0
loc 10
ccs 0
cts 6
cp 0
crap 30
rs 9.6111
1
<?php declare(strict_types=1);
2
3
namespace DanielPieper\MergeReminder\Filter;
4
5
use DanielPieper\MergeReminder\ValueObject\MergeRequestApproval;
6
use DanielPieper\MergeReminder\ValueObject\User;
7
8
class MergeRequestApprovalFilter
9
{
10
    /** @var User */
11
    private $user;
12
13
    /** @var bool */
14
    private $includeSuggestedApprovers;
15
16
    /**
17
     * MergeRequestApprovalFilter constructor.
18
     * @param User|null $user
19
     * @param bool $includeSuggestedApprovers
20
     *
21
     * @SuppressWarnings(PHPMD.BooleanArgumentFlag)
22
     */
23
    public function __construct(?User $user = null, bool $includeSuggestedApprovers = false)
24
    {
25
        $this->user = $user;
26
        $this->includeSuggestedApprovers = $user && $includeSuggestedApprovers;
27
    }
28
29
    /**
30
     * @param User $user
31
     * @param bool $includeSuggestedApprovers
32
     * @return MergeRequestApprovalFilter
33
     *
34
     * @SuppressWarnings(PHPMD.BooleanArgumentFlag)
35
     */
36
    public function addUser(User $user, bool $includeSuggestedApprovers = false): MergeRequestApprovalFilter
37
    {
38
        return new static($user, $includeSuggestedApprovers);
39
    }
40
41
    /**
42
     * @param bool $includeSuggestedApprovers
43
     * @return MergeRequestApprovalFilter
44
     */
45
    public function addIncludeSuggestedApprovers(bool $includeSuggestedApprovers): MergeRequestApprovalFilter
46
    {
47
        return new static($this->user, $includeSuggestedApprovers);
48
    }
49
50
    /**
51
     * @param MergeRequestApproval $mergeRequestApproval
52
     * @return bool
53
     */
54
    public function __invoke(MergeRequestApproval $mergeRequestApproval): bool
55
    {
56
        $hasApprovalsLeft = $mergeRequestApproval->getApprovalsLeft() > 0;
57
        $isWorkInProgress = $mergeRequestApproval->getMergeRequest()->isWorkInProgress();
58
59
        if ($this->user) {
60
            return $hasApprovalsLeft && !$isWorkInProgress && $this->isUserInvolved($mergeRequestApproval);
61
        }
62
63
        return $hasApprovalsLeft && !$isWorkInProgress;
64
    }
65
66
    public function isUserInvolved(MergeRequestApproval $mergeRequestApproval): bool
67
    {
68
        $isApprover = $this->isApprover($mergeRequestApproval);
69
        $isAssignee = $this->isAssignee($mergeRequestApproval);
70
        $isSuggestedApprover = $this->includeSuggestedApprovers && $this->isSuggestedApprover($mergeRequestApproval);
71
72
        return $isApprover || $isAssignee || $isSuggestedApprover;
73
    }
74
75
    /**
76
     * @param MergeRequestApproval $mergeRequestApproval
77
     * @return bool
78
     */
79
    public function isSuggestedApprover(MergeRequestApproval $mergeRequestApproval): bool
80
    {
81
        if (!$this->user) {
82
            return false;
83
        }
84
        return in_array($this->user->getUsername(), $mergeRequestApproval->getSuggestedApproverNames());
85
    }
86
87
    /**
88
     * @param MergeRequestApproval $mergeRequestApproval
89
     * @return bool
90
     */
91
    public function isApprover(MergeRequestApproval $mergeRequestApproval): bool
92
    {
93
        if (!$this->user) {
94
            return false;
95
        }
96
        return in_array($this->user->getUsername(), $mergeRequestApproval->getApproverNames());
97
    }
98
99
    /**
100
     * @param MergeRequestApproval $mergeRequestApproval
101
     * @return bool
102
     */
103
    public function isAssignee(MergeRequestApproval $mergeRequestApproval): bool
104
    {
105
        if (!$this->user || !$mergeRequestApproval->getMergeRequest()->getAssignee()) {
106
            return false;
107
        }
108
        return $mergeRequestApproval->getMergeRequest()->getAssignee()->getUsername() == $this->user->getUsername();
109
    }
110
}
111