Completed
Push — master ( 04e368...e67480 )
by Daniel
02:38
created

MergeRequestService::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 1

Importance

Changes 0
Metric Value
cc 1
eloc 2
nc 1
nop 2
dl 0
loc 4
ccs 3
cts 3
cp 1
crap 1
rs 10
c 0
b 0
f 0
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 ProjectService */
18
    private $projectService;
19
20 1
    public function __construct(\Gitlab\Client $gitlabClient, ProjectService $projectService)
21
    {
22 1
        $this->gitlabClient = $gitlabClient;
23 1
        $this->projectService = $projectService;
24 1
    }
25
26
    /**
27
     * @param Project $project
28
     * @param int $id
29
     * @return MergeRequest|null
30
     */
31 1
    public function findByProject(Project $project, int $id): ?MergeRequest
32
    {
33 1
        $mergeRequest = $this->gitlabClient->mergeRequests()->show($project->getId(), $id);
34 1
        if (!is_array($mergeRequest)) {
35
            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 Carbon|null $createdAfter
57
     * @return MergeRequest[]
58
     * @throws \Exception
59
     */
60
    public function all(?Carbon $createdAfter = null): array
61
    {
62
        if (!$createdAfter) {
63
            $createdAfter = new Carbon('1 month ago');
64
        }
65
66
        $mergeRequests = [];
67
        foreach ($this->projectService->all() as $project) {
68
            $pager = new ResultPager($this->gitlabClient);
69
            $projectMergeRequests = $pager->fetchAll(
70
                $this->gitlabClient->mergeRequests(),
71
                'all',
72
                [
73
                    $project->getId(),
74
                    [
75
                        'page' => 1,
76
                        'per_page' => 100,
77
                        'state' => 'opened',
78
                        'scope' => 'all',
79
                        'created_after' => $createdAfter,
80
                    ]
81
                ]
82
            );
83
            foreach ($projectMergeRequests as $projectMergeRequest) {
84
                $mergeRequests[] = $this->transform($project, $projectMergeRequest);
85
            }
86
        }
87
88
        return $mergeRequests;
89
    }
90
91
    /**
92
     * @param Project $project
93
     * @param Carbon|null $createdAfter
94
     * @return MergeRequest[]
95
     * @throws \Exception
96
     */
97
    public function allByProject(Project $project, ?Carbon $createdAfter = null): array
98
    {
99
        if (!$createdAfter) {
100
            $createdAfter = new Carbon('1 month ago');
101
        }
102
103
        $parameters = [
104
            'page' => 1,
105
            'per_page' => 100,
106
            'state' => 'opened',
107
            'created_after' => $createdAfter,
108
        ];
109
        $pager = new ResultPager($this->gitlabClient);
110
        $mergeRequests = $pager->fetchAll(
111
            $this->gitlabClient->mergeRequests(),
112
            'all',
113
            [
114
                $project->getId(),
115
                $parameters,
116
            ]
117
        );
118
119
        return array_map(function ($mergeRequest) use ($project) {
120
            return $this->transform($project, $mergeRequest);
121
        }, $mergeRequests);
122
    }
123
124
    /**
125
     * @param Project $project
126
     * @param array $mergeRequest
127
     * @return MergeRequest
128
     */
129 1
    private function transform(Project $project, array $mergeRequest): MergeRequest
130
    {
131 1
        $mergeRequest['project'] = $project;
132 1
        $mergeRequest['author'] = User::fromArray($mergeRequest['author']);
133 1
        if ($mergeRequest['assignee']) {
134 1
            $mergeRequest['assignee'] = User::fromArray($mergeRequest['assignee']);
135
        }
136 1
        return MergeRequest::fromArray($mergeRequest);
137
    }
138
}
139