Skip to content

Commit aada87d

Browse files
Add additional and sort parameters for merge request filtering and querying
1 parent b7516e4 commit aada87d

2 files changed

Lines changed: 175 additions & 62 deletions

File tree

src/Api/MergeRequests.php

Lines changed: 128 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -46,26 +46,70 @@ class MergeRequests extends AbstractApi
4646
public const STATE_LOCKED = 'locked';
4747

4848
/**
49-
* @param array $parameters {
5049
*
51-
* @var int[] $iids return the request having the given iid
52-
* @var string $state return all merge requests or just those that are opened, closed, or
53-
* merged
54-
* @var string $scope Return merge requests for the given scope: created-by-me,
55-
* assigned-to-me or all (default is created-by-me)
56-
* @var string $order_by return requests ordered by created_at or updated_at fields (default is created_at)
57-
* @var string $sort return requests sorted in asc or desc order (default is desc)
58-
* @var string $milestone return merge requests for a specific milestone
59-
* @var string $view if simple, returns the iid, URL, title, description, and basic state of merge request
60-
* @var string $labels return merge requests matching a comma separated list of labels
61-
* @var \DateTimeInterface $created_after return merge requests created after the given time (inclusive)
62-
* @var \DateTimeInterface $created_before return merge requests created before the given time (inclusive)
63-
* @var int $reviewer_id return merge requests which have the user as a reviewer with the given user id
64-
* @var bool $wip return only draft merge requests (true) or only non-draft merge requests (false)
50+
* @param array $parameters {
51+
* @throws UndefinedOptionsException if an option name is undefined
52+
* @throws InvalidOptionsException if an option doesn't fulfill the specified validation rules
53+
*@var int[] $iids return the request having the given iid
54+
* @var int[] $approved_by_ids return merge requests approved by all the users with the given id.
55+
* @var int[] $approver_ids return merge requests which have specified all the users with
56+
* the given id as individual approvers.
57+
* @var int $assignee_id return merge requests assigned to the given user id.
58+
* None returns unassigned merge requests.
59+
* @var int $author_id return merge requests created by the given user id.
60+
* Mutually exclusive with author_username.
61+
* @var string $author_username return merge requests created by the given username.
62+
* Mutually exclusive with author_id.
63+
* @var \DateTimeInterface $created_after return merge requests created after the given time (inclusive)
64+
* @var \DateTimeInterface $created_before return merge requests created before the given time (inclusive)
65+
* @var \DateTimeInterface $deployed_after return merge requests deployed after the given time (inclusive)
66+
* @var \DateTimeInterface $deployed_before return merge requests deployed before the given time (inclusive)
67+
* @var string $environment return only merge requests deployed to the given environment.
68+
* @var string $in Change the scope of the search attribute. title, description, or
69+
* a string joining them with comma. Default is title,description.
70+
* @var string $labels return merge requests matching a comma separated list of labels
71+
* @var int $merge_user_id return merge requests merged by the given user id.
72+
* Mutually exclusive with merge_username.
73+
* @var string $merge_user_username return merge requests merged by the given username.
74+
* Mutually exclusive with merge_user_id.
75+
* @var string $milestone return merge requests for a specific milestone
76+
* @var string $my_reaction_emoji return merge requests reacted by the authenticated user
77+
* by the given emoji.
78+
* @var string[] $not return merge requests that do not match the parameters supplied.
79+
* Accepts: labels, milestone, author_id, author_username, assignee_id,
80+
* assignee_username, reviewer_id, reviewer_username,
81+
* my_reaction_emoji.
82+
* @var string $order_by return requests ordered by created_at or updated_at fields
83+
* (default is created_at)
84+
* @var bool $render_html if true, the response includes rendered HTML fields title_html
85+
* and description_html.
86+
* @var int $reviewer_id return merge requests which have the user as a reviewer with the
87+
* given user id. Mutually exclusive with reviewer_username.
88+
* @var string $reviewer_username return merge requests which have the user as a reviewer with
89+
* the given username. Mutually exclusive with reviewer_id.
90+
* @var string $scope Return merge requests for the given scope: created-by-me,
91+
* assigned-to-me, reviews_for_me or all (default is created-by-me)
92+
* reviews_for_me returns merge requests where the current user is
93+
* assigned as a reviewer.
94+
* @var string $search Search merge requests against their title and description.
95+
* @var string $sort return requests sorted in asc or desc order (default is desc)
96+
* @var string $source_branch return merge requests with the given source branch.
97+
* @var string $state return all merge requests or just those that are opened, closed, or
98+
* merged
99+
* @var string $target_branch Returns merge requests with the given target branch.
100+
* @var \DateTimeInterface $updated_after Returns merge requests updated on or after the given time.
101+
* @var \DateTimeInterface $updated_before Returns merge requests updated on or before the given time.
102+
* @var string $view if simple, returns the iid, URL, title, description, and basic
103+
* @var bool $with_labels_details if true, response returns more details for each label in labels field:
104+
* :name, :color, :description, :description_html, :text_color
105+
* @var bool $with_merge_status_recheck If true, this projection requests (but does not guarantee)
106+
* an asynchronous recalculation of the merge_status field.
107+
* Enable the restrict_merge_status_recheck feature flag to ignore
108+
* this attribute when requested by users without the Developer,
109+
* Maintainer, or Owner role.
110+
* @var bool $wip return only draft merge requests (true) or only non-draft merge
65111
* }
66112
*
67-
* @throws UndefinedOptionsException if an option name is undefined
68-
* @throws InvalidOptionsException if an option doesn't fulfill the specified validation rules
69113
*/
70114
public function all(int|string|null $project_id = null, array $parameters = []): mixed
71115
{
@@ -81,23 +125,25 @@ public function all(int|string|null $project_id = null, array $parameters = []):
81125
return \count($value) === \count(\array_filter($value, 'is_int'));
82126
})
83127
;
84-
$resolver->setDefined('state')
85-
->setAllowedValues('state', [self::STATE_ALL, self::STATE_MERGED, self::STATE_OPENED, self::STATE_CLOSED, self::STATE_LOCKED])
86-
;
87-
$resolver->setDefined('scope')
88-
->setAllowedValues('scope', ['created-by-me', 'assigned-to-me', 'all'])
128+
$resolver->setDefined('approved_by_ids')
129+
->setAllowedTypes('approved_by_ids', 'array')
130+
->setAllowedValues('approved_by_ids', function (array $value) {
131+
return \count($value) === \count(\array_filter($value, 'is_int'));
132+
})
89133
;
90-
$resolver->setDefined('order_by')
91-
->setAllowedValues('order_by', ['created_at', 'updated_at'])
134+
$resolver->setDefined('approver_ids')
135+
->setAllowedTypes('approver_ids', 'array')
136+
->setAllowedValues('approver_ids', function (array $value) {
137+
return \count($value) === \count(\array_filter($value, 'is_int'));
138+
})
92139
;
93-
$resolver->setDefined('sort')
94-
->setAllowedValues('sort', ['asc', 'desc'])
140+
$resolver->setDefined('assignee_id')
141+
->setAllowedTypes('assignee_id', 'integer')
95142
;
96-
$resolver->setDefined('milestone');
97-
$resolver->setDefined('view')
98-
->setAllowedValues('view', ['simple'])
143+
$resolver->setDefined('author_id')
144+
->setAllowedTypes('author_id', 'integer')
99145
;
100-
$resolver->setDefined('labels');
146+
$resolver->setDefined('author_username');
101147
$resolver->setDefined('created_after')
102148
->setAllowedTypes('created_after', \DateTimeInterface::class)
103149
->setNormalizer('created_after', $datetimeNormalizer)
@@ -106,7 +152,53 @@ public function all(int|string|null $project_id = null, array $parameters = []):
106152
->setAllowedTypes('created_before', \DateTimeInterface::class)
107153
->setNormalizer('created_before', $datetimeNormalizer)
108154
;
109-
155+
$resolver->setDefined('deployed_after')
156+
->setAllowedTypes('deployed_after', \DateTimeInterface::class)
157+
->setNormalizer('deployed_after', $datetimeNormalizer)
158+
;
159+
$resolver->setDefined('deployed_before')
160+
->setAllowedTypes('deployed_before', \DateTimeInterface::class)
161+
->setNormalizer('deployed_before', $datetimeNormalizer)
162+
;
163+
$resolver->setDefined('environment');
164+
$resolver->setDefined('in')
165+
->setAllowedValues('in', ['title', 'description', 'title,description', 'description,title'])
166+
;
167+
$resolver->setDefined('labels');
168+
$resolver->setDefined('merge_user_id')
169+
->setAllowedTypes('merge_user_id', 'integer')
170+
;
171+
$resolver->setDefined('merge_username');
172+
$resolver->setDefined('milestone');
173+
$resolver->setDefined('my_reaction_emoji');
174+
$resolver->setDefined('not')
175+
->setAllowedValues('not', [
176+
'labels', 'milestone', 'author_id', 'author_username', 'assignee_id', 'assignee_username',
177+
'reviewer_id', 'reviewer_username', 'my_reaction_emoji'
178+
])
179+
;
180+
$resolver->setDefined('order_by')
181+
->setAllowedValues('order_by', ['created_at', 'updated_at'])
182+
;
183+
$resolver->setDefined('render_html')
184+
->setAllowedTypes('render_html', 'bool')
185+
;
186+
$resolver->setDefined('reviewer_id')
187+
->setAllowedTypes('reviewer_id', 'integer')
188+
;
189+
$resolver->setDefined('reviewer_username');
190+
$resolver->setDefined('scope')
191+
->setAllowedValues('scope', ['created-by-me', 'assigned-to-me', 'reviews_for_me', 'all'])
192+
;
193+
$resolver->setDefined('search');
194+
$resolver->setDefined('sort')
195+
->setAllowedValues('sort', ['asc', 'desc'])
196+
;
197+
$resolver->setDefined('source_branch');
198+
$resolver->setDefined('state')
199+
->setAllowedValues('state', [self::STATE_ALL, self::STATE_MERGED, self::STATE_OPENED, self::STATE_CLOSED, self::STATE_LOCKED])
200+
;
201+
$resolver->setDefined('target_branch');
110202
$resolver->setDefined('updated_after')
111203
->setAllowedTypes('updated_after', \DateTimeInterface::class)
112204
->setNormalizer('updated_after', $datetimeNormalizer)
@@ -115,30 +207,15 @@ public function all(int|string|null $project_id = null, array $parameters = []):
115207
->setAllowedTypes('updated_before', \DateTimeInterface::class)
116208
->setNormalizer('updated_before', $datetimeNormalizer)
117209
;
118-
119-
$resolver->setDefined('scope')
120-
->setAllowedValues('scope', ['created_by_me', 'assigned_to_me', 'all'])
210+
$resolver->setDefined('view')
211+
->setAllowedValues('view', ['simple'])
212+
;
213+
$resolver->setDefined('with_labels_details')
214+
->setAllowedTypes('with_labels_details', 'bool')
121215
;
122-
$resolver->setDefined('author_id')
123-
->setAllowedTypes('author_id', 'integer');
124-
125-
$resolver->setDefined('assignee_id')
126-
->setAllowedTypes('assignee_id', 'integer');
127-
128-
$resolver->setDefined('search');
129-
$resolver->setDefined('source_branch');
130-
$resolver->setDefined('target_branch');
131216
$resolver->setDefined('with_merge_status_recheck')
132217
->setAllowedTypes('with_merge_status_recheck', 'bool')
133218
;
134-
$resolver->setDefined('approved_by_ids')
135-
->setAllowedTypes('approved_by_ids', 'array')
136-
->setAllowedValues('approved_by_ids', function (array $value) {
137-
return \count($value) === \count(\array_filter($value, 'is_int'));
138-
})
139-
;
140-
$resolver->setDefined('reviewer_id')
141-
->setAllowedTypes('reviewer_id', 'integer');
142219
$resolver->setDefined('wip')
143220
->setAllowedTypes('wip', 'boolean')
144221
->addNormalizer('wip', static function ($resolver, $wip) {

tests/Api/MergeRequestsTest.php

Lines changed: 47 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -60,37 +60,58 @@ public function shouldGetAllWithParams(): void
6060
->with('projects/1/merge_requests', [
6161
'page' => 2,
6262
'per_page' => 5,
63+
64+
'approved_by_ids' => [1],
65+
'approver_ids' => [1],
66+
'assignee_id' => 1,
67+
'author_id' => 1,
68+
'environment' => 'production',
69+
'in' => 'title',
6370
'labels' => 'label1,label2,label3',
71+
'merge_user_id' => 1,
6472
'milestone' => 'milestone1',
6573
'order_by' => 'updated_at',
66-
'state' => 'all',
67-
'sort' => 'desc',
74+
'render_html' => true,
75+
'reviewer_id' => 1,
6876
'scope' => 'all',
69-
'author_id' => 1,
70-
'assignee_id' => 1,
77+
'search' => 'search term',
78+
'sort' => 'desc',
7179
'source_branch' => 'develop',
80+
'state' => 'all',
7281
'target_branch' => 'master',
82+
'view' => 'simple',
83+
'with_labels_details' => true,
7384
'with_merge_status_recheck' => true,
74-
'approved_by_ids' => [1],
85+
'wip' => 'yes',
7586
])
7687
->willReturn($expectedArray)
7788
;
7889

7990
$this->assertEquals($expectedArray, $api->all(1, [
8091
'page' => 2,
8192
'per_page' => 5,
93+
'approved_by_ids' => [1],
94+
'approver_ids' => [1],
95+
'assignee_id' => 1,
96+
'author_id' => 1,
97+
'environment' => 'production',
98+
'in' => 'title',
8299
'labels' => 'label1,label2,label3',
100+
'merge_user_id' => 1,
83101
'milestone' => 'milestone1',
84102
'order_by' => 'updated_at',
85-
'state' => 'all',
86-
'sort' => 'desc',
103+
'render_html' => true,
104+
'reviewer_id' => 1,
87105
'scope' => 'all',
88-
'author_id' => 1,
89-
'assignee_id' => 1,
106+
'search' => 'search term',
107+
'sort' => 'desc',
90108
'source_branch' => 'develop',
109+
'state' => 'all',
91110
'target_branch' => 'master',
111+
'view' => 'simple',
112+
'with_labels_details' => true,
92113
'with_merge_status_recheck' => true,
93-
'approved_by_ids' => [1],
114+
'wip' => true,
94115
]));
95116
}
96117

@@ -101,10 +122,18 @@ public function shouldGetAllWithDateTimeParams(): void
101122

102123
$createdAfter = new \DateTime('2018-01-01 00:00:00');
103124
$createdBefore = new \DateTime('2018-01-31 12:00:00.123+03:00');
125+
$deployedAfter = new \DateTime('2018-01-01 00:00:00');
126+
$deployedBefore = new \DateTime('2018-01-31 12:00:00.123+03:00');
127+
$updatedAfter = new \DateTime('2018-01-01 00:00:00');
128+
$updatedBefore = new \DateTime('2018-01-31 12:00:00.123+03:00');
104129

105130
$expectedWithArray = [
106131
'created_after' => '2018-01-01T00:00:00.000Z',
107132
'created_before' => '2018-01-31T09:00:00.123Z',
133+
'deployed_after' => '2018-01-01T00:00:00.000Z',
134+
'deployed_before' => '2018-01-31T09:00:00.123Z',
135+
'updated_after' => '2018-01-01T00:00:00.000Z',
136+
'updated_before' => '2018-01-31T09:00:00.123Z',
108137
];
109138

110139
$api = $this->getApiMock();
@@ -116,7 +145,14 @@ public function shouldGetAllWithDateTimeParams(): void
116145

117146
$this->assertEquals(
118147
$expectedArray,
119-
$api->all(1, ['created_after' => $createdAfter, 'created_before' => $createdBefore])
148+
$api->all(1, [
149+
'created_after' => $createdAfter,
150+
'created_before' => $createdBefore,
151+
'deployed_after' => $deployedAfter,
152+
'deployed_before' => $deployedBefore,
153+
'updated_after' => $updatedAfter,
154+
'updated_before' => $updatedBefore,
155+
])
120156
);
121157
}
122158

0 commit comments

Comments
 (0)