Passed
Push — master ( b98411...adfca8 )
by Daniel
02:30
created

MergeRequestApprovalService::get()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 7
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 5
CRAP Score 2

Importance

Changes 0
Metric Value
cc 2
eloc 4
nc 2
nop 1
dl 0
loc 7
ccs 5
cts 5
cp 1
crap 2
rs 10
c 0
b 0
f 0
1
<?php declare(strict_types=1);
2
3
namespace DanielPieper\MergeReminder\Service;
4
5
use DanielPieper\MergeReminder\Exception\MergeRequestApprovalNotFoundException;
6
use DanielPieper\MergeReminder\ValueObject\MergeRequest;
7
use DanielPieper\MergeReminder\ValueObject\MergeRequestApproval;
8
use DanielPieper\MergeReminder\ValueObject\User;
9
use DanielPieper\MergeReminder\ValueObject\Group;
10
11
class MergeRequestApprovalService
12
{
13
    /** @var \Gitlab\Client */
14
    private $gitlabClient;
15
16 5
    public function __construct(\Gitlab\Client $gitlabClient)
17
    {
18 5
        $this->gitlabClient = $gitlabClient;
19 5
    }
20
21
    /**
22
     * @param MergeRequest $mergeRequest
23
     * @return MergeRequestApproval|null
24
     * @throws \Exception
25
     */
26 5
    public function find(MergeRequest $mergeRequest): ?MergeRequestApproval
27
    {
28 5
        $mergeRequestApproval = $this->gitlabClient->mergeRequests()->approvals(
29 5
            $mergeRequest->getProject()->getId(),
30 5
            $mergeRequest->getIid()
31
        );
32 5
        if (!is_array($mergeRequestApproval)) {
33 1
            return null;
34
        }
35 4
        return $this->transform($mergeRequest, $mergeRequestApproval);
36
    }
37
38
    /**
39
     * @param MergeRequest $mergeRequest
40
     * @return MergeRequestApproval
41
     * @throws MergeRequestApprovalNotFoundException
42
     * @throws \Exception
43
     */
44 2
    public function get(MergeRequest $mergeRequest): MergeRequestApproval
45
    {
46 2
        $mergeRequestApproval = $this->find($mergeRequest);
47 2
        if (!$mergeRequestApproval) {
48 1
            throw new MergeRequestApprovalNotFoundException();
49
        }
50 1
        return $mergeRequestApproval;
51
    }
52
53
    /**
54
     * @param MergeRequest $mergeRequest
55
     * @param array $mergeRequestApproval
56
     * @return MergeRequestApproval
57
     * @throws \Exception
58
     */
59 4
    private function transform(MergeRequest $mergeRequest, array $mergeRequestApproval): MergeRequestApproval
60
    {
61 4
        $mergeRequestApproval['merge_request'] = $mergeRequest;
62
63 4
        $this->transformApprovers($mergeRequestApproval['approved_by']);
64 4
        $this->transformApprovers($mergeRequestApproval['approvers']);
65 4
        $this->transformApprovers($mergeRequestApproval['suggested_approvers']);
66
67 4
        $mergeRequestApproval['suggested_approvers'] = array_udiff(
68 4
            $mergeRequestApproval['suggested_approvers'],
69 4
            $mergeRequestApproval['approvers'],
70
            function (User $userA, User $userB) {
71 2
                return $userA->getId() <=> $userB->getId();
72 4
            }
73
        );
74 4
        $mergeRequestApproval['approvers'] = array_udiff(
75 4
            $mergeRequestApproval['approvers'],
76 4
            $mergeRequestApproval['approved_by'],
77
            function (User $userA, User $userB) {
78 2
                return $userA->getId() <=> $userB->getId();
79 4
            }
80
        );
81
82
        array_walk($mergeRequestApproval['approver_groups'], function (&$approverGroup) {
83 1
            $approverGroup = Group::fromArray($approverGroup['group']);
84 4
        });
85
86 4
        return MergeRequestApproval::fromArray($mergeRequestApproval);
87
    }
88
89
    /**
90
     * @param array $approvers
91
     * @return void
92
     */
93 4
    private function transformApprovers(array &$approvers): void
94
    {
95
        array_walk($approvers, function (&$approver) {
96
            // suggested_approvers are not encapsulated in 'user'...
97 2
            if (isset($approver['user'])) {
98 2
                $approver = $approver['user'];
99
            }
100 2
            $approver = User::fromArray($approver);
101 4
        });
102 4
    }
103
}
104