aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--apps/files_sharing/api/sharees.php54
-rw-r--r--apps/files_sharing/tests/api/sharees.php50
2 files changed, 88 insertions, 16 deletions
diff --git a/apps/files_sharing/api/sharees.php b/apps/files_sharing/api/sharees.php
index de5f9c8cbf4..714b4950c59 100644
--- a/apps/files_sharing/api/sharees.php
+++ b/apps/files_sharing/api/sharees.php
@@ -285,7 +285,6 @@ class Sharees {
//Pagination
$start = ($page - 1) * $perPage;
- $end = $page * $perPage;
$total = sizeof($sharees);
$sharees = array_slice($sharees, $start, $perPage);
@@ -294,18 +293,16 @@ class Sharees {
$response->setTotalItems($total);
$response->setItemsPerPage($perPage);
- if ($total > $end) {
- $params = [
- 'search' => $search,
- 'itemType' => $itemType,
- 'existingShares' => $existingShares,
- 'shareType' => $shareTypes,
- 'page' => $page + 1,
- 'limit' => $perPage,
- ];
+ $links = $this->getPaginationLinks($page, $total, [
+ 'search' => $search,
+ 'itemType' => $itemType,
+ 'existingShares' => $existingShares,
+ 'shareType' => $shareTypes,
+ 'limit' => $perPage,
+ ]);
- $url = $this->urlGenerator->getAbsoluteURL('/ocs/v1.php/apps/files_sharing/api/v1/sharees') . '?' . http_build_query($params);
- $response->addHeader('Link', '<' . $url . '> rel="next"');
+ if (!empty($links)) {
+ $response->addHeader('Link', implode(', ', $links));
}
return $response;
@@ -319,10 +316,37 @@ class Sharees {
* @return array
*/
protected function filterSharees($potentialSharees, $existingSharees) {
- $sharees = array_map(function ($sharee) use ($existingSharees) {
+ $sharees = array_filter($potentialSharees, function ($sharee) use ($existingSharees) {
return in_array($sharee['value']['shareWith'], $existingSharees) ? null : $sharee;
- }, $potentialSharees);
+ });
- return array_filter($sharees);
+ return $sharees;
+ }
+
+ /**
+ * Generates a bunch of pagination links for the current page
+ *
+ * @param int $page Current page
+ * @param int $total Number of total items that need to be paginated
+ * @param array $params Parameters for the URL
+ * @return array
+ */
+ protected function getPaginationLinks($page, $total, array $params) {
+ $url = $this->urlGenerator->getAbsoluteURL('/ocs/v1.php/apps/files_sharing/api/v1/sharees') . '?';
+
+ $links = [];
+ if ($page > 1) {
+ $params['page'] = 1;
+ $links[] = '<' . $url . http_build_query($params) . '>; rel="first"';
+ $params['page'] = $page - 1;
+ $links[] = '<' . $url . http_build_query($params) . '>; rel="prev"';
+ }
+ if ($page * $params['limit'] < $total) {
+ $params['page'] = $page + 1;
+ $links[] = '<' . $url . http_build_query($params) . '>; rel="next"';
+ $params['page'] = ceil($total / $params['limit']);
+ $links[] = '<' . $url . http_build_query($params) . '>; rel="last"';
+ }
+ return $links;
}
}
diff --git a/apps/files_sharing/tests/api/sharees.php b/apps/files_sharing/tests/api/sharees.php
index ec19036bb8f..7efd29e592d 100644
--- a/apps/files_sharing/tests/api/sharees.php
+++ b/apps/files_sharing/tests/api/sharees.php
@@ -672,7 +672,7 @@ class ShareesTest extends TestCase {
$headers = $ocs->getHeaders();
$this->assertArrayHasKey('Link', $headers);
$this->assertStringStartsWith('<', $headers['Link']);
- $this->assertStringEndsWith('> rel="next"', $headers['Link']);
+ $this->assertStringEndsWith('"', $headers['Link']);
}
}
@@ -735,4 +735,52 @@ class ShareesTest extends TestCase {
public function testFilterSharees($potentialSharees, $existingSharees, $expectedSharees) {
$this->assertEquals($expectedSharees, $this->invokePrivate($this->sharees, 'filterSharees', [$potentialSharees, $existingSharees]));
}
+
+ public function dataGetPaginationLinks() {
+ return [
+ [1, 1, ['limit' => 2], []],
+ [1, 3, ['limit' => 2], [
+ '<?limit=2&page=2>; rel="next"',
+ '<?limit=2&page=2>; rel="last"',
+ ]],
+ [1, 21, ['limit' => 2], [
+ '<?limit=2&page=2>; rel="next"',
+ '<?limit=2&page=11>; rel="last"',
+ ]],
+ [2, 21, ['limit' => 2], [
+ '<?limit=2&page=1>; rel="first"',
+ '<?limit=2&page=1>; rel="prev"',
+ '<?limit=2&page=3>; rel="next"',
+ '<?limit=2&page=11>; rel="last"',
+ ]],
+ [5, 21, ['limit' => 2], [
+ '<?limit=2&page=1>; rel="first"',
+ '<?limit=2&page=4>; rel="prev"',
+ '<?limit=2&page=6>; rel="next"',
+ '<?limit=2&page=11>; rel="last"',
+ ]],
+ [10, 21, ['limit' => 2], [
+ '<?limit=2&page=1>; rel="first"',
+ '<?limit=2&page=9>; rel="prev"',
+ '<?limit=2&page=11>; rel="next"',
+ '<?limit=2&page=11>; rel="last"',
+ ]],
+ [11, 21, ['limit' => 2], [
+ '<?limit=2&page=1>; rel="first"',
+ '<?limit=2&page=10>; rel="prev"',
+ ]],
+ ];
+ }
+
+ /**
+ * @dataProvider dataGetPaginationLinks
+ *
+ * @param int $page
+ * @param int $total
+ * @param array $params
+ * @param array $expected
+ */
+ public function testGetPaginationLinks($page, $total, $params, $expected) {
+ $this->assertEquals($expected, $this->invokePrivate($this->sharees, 'getPaginationLinks', [$page, $total, $params]));
+ }
}