Passed
Push — master ( 4c1740...b98411 )
by Daniel
02:28
created

MergeRequestApprovalService::get()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 7
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 4
CRAP Score 2.032

Importance

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