]>
Commit | Line | Data |
---|---|---|
1 | import Bluebird from 'bluebird' | |
2 | import validator from 'validator' | |
3 | import { pageToStartAndCount } from '@server/helpers/core-utils' | |
4 | import { ACTIVITY_PUB } from '@server/initializers/constants' | |
5 | import { ResultList } from '@shared/models' | |
6 | import { forceNumber } from '@shared/core-utils' | |
7 | ||
8 | type ActivityPubCollectionPaginationHandler = (start: number, count: number) => Bluebird<ResultList<any>> | Promise<ResultList<any>> | |
9 | ||
10 | async function activityPubCollectionPagination ( | |
11 | baseUrl: string, | |
12 | handler: ActivityPubCollectionPaginationHandler, | |
13 | page?: any, | |
14 | size = ACTIVITY_PUB.COLLECTION_ITEMS_PER_PAGE | |
15 | ) { | |
16 | if (!page || !validator.isInt(page)) { | |
17 | // We just display the first page URL, we only need the total items | |
18 | const result = await handler(0, 1) | |
19 | ||
20 | return { | |
21 | id: baseUrl, | |
22 | type: 'OrderedCollection', | |
23 | totalItems: result.total, | |
24 | first: result.data.length === 0 | |
25 | ? undefined | |
26 | : baseUrl + '?page=1' | |
27 | } | |
28 | } | |
29 | ||
30 | const { start, count } = pageToStartAndCount(page, size) | |
31 | const result = await handler(start, count) | |
32 | ||
33 | let next: string | undefined | |
34 | let prev: string | undefined | |
35 | ||
36 | // Assert page is a number | |
37 | page = forceNumber(page) | |
38 | ||
39 | // There are more results | |
40 | if (result.total > page * size) { | |
41 | next = baseUrl + '?page=' + (page + 1) | |
42 | } | |
43 | ||
44 | if (page > 1) { | |
45 | prev = baseUrl + '?page=' + (page - 1) | |
46 | } | |
47 | ||
48 | return { | |
49 | id: baseUrl + '?page=' + page, | |
50 | type: 'OrderedCollectionPage', | |
51 | prev, | |
52 | next, | |
53 | partOf: baseUrl, | |
54 | orderedItems: result.data, | |
55 | totalItems: result.total | |
56 | } | |
57 | } | |
58 | ||
59 | // --------------------------------------------------------------------------- | |
60 | ||
61 | export { | |
62 | activityPubCollectionPagination | |
63 | } |