Completed
Push — master ( b57eb8...07347c )
by Daniel
02:24
created

MergeRequestService::all()   A

Complexity

Conditions 4
Paths 6

Size

Total Lines 29
Code Lines 17

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 20

Importance

Changes 0
Metric Value
cc 4
eloc 17
nc 6
nop 1
dl 0
loc 29
ccs 0
cts 18
cp 0
crap 20
rs 9.7
c 0
b 0
f 0

1 Method

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