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

MergeRequestApprovalService   A

Complexity

Total Complexity 8

Size/Duplication

Total Lines 86
Duplicated Lines 0 %

Test Coverage

Coverage 90.91%

Importance

Changes 0
Metric Value
eloc 31
dl 0
loc 86
ccs 30
cts 33
cp 0.9091
rs 10
c 0
b 0
f 0
wmc 8

5 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 3 1
A transformApprovers() 0 8 2
A get() 0 7 2
A find() 0 10 2
A transform() 0 24 1
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