MergeRequestService::__construct()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 2
c 1
b 0
f 0
nc 1
nop 2
dl 0
loc 4
ccs 0
cts 3
cp 0
crap 2
rs 10
1
<?php declare(strict_types=1);
2
3
namespace DanielPieper\MergeReminder\Service;
4
5
use Carbon\Carbon;
6
use DanielPieper\MergeReminder\Exception\MergeRequestNotFoundException;
7
use DanielPieper\MergeReminder\ValueObject\MergeRequest;
8
use DanielPieper\MergeReminder\ValueObject\Project;
9
use DanielPieper\MergeReminder\ValueObject\User;
10
use Gitlab\Client;
11
use Gitlab\ResultPager;
12
13
class MergeRequestService
14
{
15
    /** @var Client */
16
    private $gitlabClient;
17
18
    /** @var ResultPager */
19
    private $resultPager;
20
21
    public function __construct(Client $gitlabClient, ResultPager $resultPager)
22
    {
23
        $this->gitlabClient = $gitlabClient;
24
        $this->resultPager = $resultPager;
25
    }
26
27
    /**
28
     * @param Project $project
29
     * @param int $id
30
     * @return MergeRequest|null
31
     */
32
    public function findByProject(Project $project, int $id): ?MergeRequest
33
    {
34
        $mergeRequest = $this->gitlabClient->mergeRequests()->show($project->getId(), $id);
35
        if (!is_array($mergeRequest)) {
36
            return null;
37
        }
38
        return $this->transform($project, $mergeRequest);
39
    }
40
41
    /**
42
     * @param Project $project
43
     * @param int $id
44
     * @return MergeRequest
45
     * @throws MergeRequestNotFoundException
46
     */
47
    public function getByProject(Project $project, int $id): MergeRequest
48
    {
49
        $mergeRequest = $this->findByProject($project, $id);
50
        if (!$mergeRequest) {
51
            throw new MergeRequestNotFoundException();
52
        }
53
        return $mergeRequest;
54
    }
55
56
    /**
57
     * @param Project $project
58
     * @param Carbon|null $createdAfter
59
     * @return MergeRequest[]
60
     * @throws \Exception
61
     */
62
    public function allByProject(Project $project, ?Carbon $createdAfter = null): array
63
    {
64
        if (!$createdAfter) {
65
            $createdAfter = new Carbon('1 month ago');
66
        }
67
68
        $parameters = [
69
            'page' => 1,
70
            'per_page' => 100,
71
            'state' => 'opened',
72
            'created_after' => $createdAfter,
73
        ];
74
        $mergeRequests = $this->resultPager->fetchAll(
75
            $this->gitlabClient->mergeRequests(),
76
            'all',
77
            [
78
                $project->getId(),
79
                $parameters,
80
            ]
81
        );
82
83
        return array_map(function ($mergeRequest) use ($project) {
84
            return $this->transform($project, $mergeRequest);
85
        }, $mergeRequests);
86
    }
87
88
    /**
89
     * @param Project $project
90
     * @param array $mergeRequest
91
     * @return MergeRequest
92
     */
93
    private function transform(Project $project, array $mergeRequest): MergeRequest
94
    {
95
        $mergeRequest['project'] = $project;
96
        $mergeRequest['author'] = User::fromArray($mergeRequest['author']);
97
        if ($mergeRequest['assignee']) {
98
            $mergeRequest['assignee'] = User::fromArray($mergeRequest['assignee']);
99
        }
100
        return MergeRequest::fromArray($mergeRequest);
101
    }
102
}
103