|
3 | 3 | use Symfony\Component\OptionsResolver\Options; |
4 | 4 | use Symfony\Component\OptionsResolver\Exception\InvalidOptionsException; |
5 | 5 | use Symfony\Component\OptionsResolver\Exception\UndefinedOptionsException; |
| 6 | +use Symfony\Component\OptionsResolver\OptionsResolver; |
6 | 7 |
|
7 | 8 | class MergeRequests extends AbstractApi |
8 | 9 | { |
@@ -36,62 +37,38 @@ class MergeRequests extends AbstractApi |
36 | 37 | */ |
37 | 38 | public function all($project_id, array $parameters = []) |
38 | 39 | { |
39 | | - $resolver = $this->createOptionsResolver(); |
40 | | - $datetimeNormalizer = function (Options $resolver, \DateTimeInterface $value) { |
41 | | - return $value->format('c'); |
42 | | - }; |
43 | | - $resolver->setDefined('iids') |
44 | | - ->setAllowedTypes('iids', 'array') |
45 | | - ->setAllowedValues('iids', function (array $value) { |
46 | | - return count($value) == count(array_filter($value, 'is_int')); |
47 | | - }) |
48 | | - ; |
49 | | - $resolver->setDefined('state') |
50 | | - ->setAllowedValues('state', ['all', 'opened', 'merged', 'closed']) |
51 | | - ; |
52 | | - $resolver->setDefined('order_by') |
53 | | - ->setAllowedValues('order_by', ['created_at', 'updated_at']) |
54 | | - ; |
55 | | - $resolver->setDefined('sort') |
56 | | - ->setAllowedValues('sort', ['asc', 'desc']) |
57 | | - ; |
58 | | - $resolver->setDefined('milestone'); |
59 | | - $resolver->setDefined('view') |
60 | | - ->setAllowedValues('view', ['simple']) |
61 | | - ; |
62 | | - $resolver->setDefined('labels'); |
63 | | - $resolver->setDefined('created_after') |
64 | | - ->setAllowedTypes('created_after', \DateTimeInterface::class) |
65 | | - ->setNormalizer('created_after', $datetimeNormalizer) |
66 | | - ; |
67 | | - $resolver->setDefined('created_before') |
68 | | - ->setAllowedTypes('created_before', \DateTimeInterface::class) |
69 | | - ->setNormalizer('created_before', $datetimeNormalizer) |
70 | | - ; |
| 40 | + $resolver = $this->createGetListOptionsResolver(); |
71 | 41 |
|
72 | | - $resolver->setDefined('updated_after') |
73 | | - ->setAllowedTypes('updated_after', \DateTimeInterface::class) |
74 | | - ->setNormalizer('updated_after', $datetimeNormalizer) |
75 | | - ; |
76 | | - $resolver->setDefined('updated_before') |
77 | | - ->setAllowedTypes('updated_before', \DateTimeInterface::class) |
78 | | - ->setNormalizer('updated_before', $datetimeNormalizer) |
79 | | - ; |
80 | | - |
81 | | - $resolver->setDefined('scope') |
82 | | - ->setAllowedValues('scope', ['created_by_me', 'assigned_to_me', 'all']) |
83 | | - ; |
84 | | - $resolver->setDefined('author_id') |
85 | | - ->setAllowedTypes('author_id', 'integer'); |
86 | | - |
87 | | - $resolver->setDefined('assignee_id') |
88 | | - ->setAllowedTypes('assignee_id', 'integer'); |
| 42 | + return $this->get($this->getProjectPath($project_id, 'merge_requests'), $resolver->resolve($parameters)); |
| 43 | + } |
89 | 44 |
|
90 | | - $resolver->setDefined('search'); |
91 | | - $resolver->setDefined('source_branch'); |
92 | | - $resolver->setDefined('target_branch'); |
| 45 | + /** |
| 46 | + * @param array $parameters { |
| 47 | + * |
| 48 | + * @var int[] $iids Return the request having the given iid. |
| 49 | + * @var string $state Return all merge requests or just those that are opened, closed, or |
| 50 | + * merged. |
| 51 | + * @var string $order_by Return requests ordered by created_at or updated_at fields. Default |
| 52 | + * is created_at. |
| 53 | + * @var string $sort Return requests sorted in asc or desc order. Default is desc. |
| 54 | + * @var string $milestone Return merge requests for a specific milestone. |
| 55 | + * @var string $view If simple, returns the iid, URL, title, description, and basic state |
| 56 | + * of merge request. |
| 57 | + * @var string $labels Return merge requests matching a comma separated list of labels. |
| 58 | + * @var \DateTimeInterface $created_after Return merge requests created after the given time (inclusive). |
| 59 | + * @var \DateTimeInterface $created_before Return merge requests created before the given time (inclusive). |
| 60 | + * } |
| 61 | + * |
| 62 | + * @throws UndefinedOptionsException If an option name is undefined. |
| 63 | + * @throws InvalidOptionsException If an option doesn't fulfill the specified validation rules. |
| 64 | + * |
| 65 | + * @return mixed |
| 66 | + */ |
| 67 | + public function search(array $parameters) |
| 68 | + { |
| 69 | + $resolver = $this->createGetListOptionsResolver(); |
93 | 70 |
|
94 | | - return $this->get($this->getProjectPath($project_id, 'merge_requests'), $resolver->resolve($parameters)); |
| 71 | + return $this->get('merge_requests', $resolver->resolve($parameters)); |
95 | 72 | } |
96 | 73 |
|
97 | 74 | /** |
@@ -368,4 +345,67 @@ public function awardEmoji($project_id, $mr_iid) |
368 | 345 | { |
369 | 346 | return $this->get($this->getProjectPath($project_id, 'merge_requests/'.$this->encodePath($mr_iid).'/award_emoji')); |
370 | 347 | } |
| 348 | + |
| 349 | + /** |
| 350 | + * @return OptionsResolver |
| 351 | + */ |
| 352 | + private function createGetListOptionsResolver() |
| 353 | + { |
| 354 | + $resolver = $this->createOptionsResolver(); |
| 355 | + $datetimeNormalizer = function (Options $resolver, \DateTimeInterface $value) { |
| 356 | + return $value->format('c'); |
| 357 | + }; |
| 358 | + $resolver->setDefined('iids') |
| 359 | + ->setAllowedTypes('iids', 'array') |
| 360 | + ->setAllowedValues('iids', function (array $value) { |
| 361 | + return count($value) == count(array_filter($value, 'is_int')); |
| 362 | + }) |
| 363 | + ; |
| 364 | + $resolver->setDefined('state') |
| 365 | + ->setAllowedValues('state', ['all', 'opened', 'merged', 'closed']) |
| 366 | + ; |
| 367 | + $resolver->setDefined('order_by') |
| 368 | + ->setAllowedValues('order_by', ['created_at', 'updated_at']) |
| 369 | + ; |
| 370 | + $resolver->setDefined('sort') |
| 371 | + ->setAllowedValues('sort', ['asc', 'desc']) |
| 372 | + ; |
| 373 | + $resolver->setDefined('milestone'); |
| 374 | + $resolver->setDefined('view') |
| 375 | + ->setAllowedValues('view', ['simple']) |
| 376 | + ; |
| 377 | + $resolver->setDefined('labels'); |
| 378 | + $resolver->setDefined('created_after') |
| 379 | + ->setAllowedTypes('created_after', \DateTimeInterface::class) |
| 380 | + ->setNormalizer('created_after', $datetimeNormalizer) |
| 381 | + ; |
| 382 | + $resolver->setDefined('created_before') |
| 383 | + ->setAllowedTypes('created_before', \DateTimeInterface::class) |
| 384 | + ->setNormalizer('created_before', $datetimeNormalizer) |
| 385 | + ; |
| 386 | + |
| 387 | + $resolver->setDefined('updated_after') |
| 388 | + ->setAllowedTypes('updated_after', \DateTimeInterface::class) |
| 389 | + ->setNormalizer('updated_after', $datetimeNormalizer) |
| 390 | + ; |
| 391 | + $resolver->setDefined('updated_before') |
| 392 | + ->setAllowedTypes('updated_before', \DateTimeInterface::class) |
| 393 | + ->setNormalizer('updated_before', $datetimeNormalizer) |
| 394 | + ; |
| 395 | + |
| 396 | + $resolver->setDefined('scope') |
| 397 | + ->setAllowedValues('scope', ['created_by_me', 'assigned_to_me', 'all']) |
| 398 | + ; |
| 399 | + $resolver->setDefined('author_id') |
| 400 | + ->setAllowedTypes('author_id', 'integer'); |
| 401 | + |
| 402 | + $resolver->setDefined('assignee_id') |
| 403 | + ->setAllowedTypes('assignee_id', 'integer'); |
| 404 | + |
| 405 | + $resolver->setDefined('search'); |
| 406 | + $resolver->setDefined('source_branch'); |
| 407 | + $resolver->setDefined('target_branch'); |
| 408 | + |
| 409 | + return $resolver; |
| 410 | + } |
371 | 411 | } |
0 commit comments