Add outbox page size parameter
This commit is contained in:
parent
c08579e14f
commit
fbc77eb648
|
@ -9,15 +9,18 @@ import { asyncMiddleware, localAccountValidator, localVideoChannelValidator } fr
|
||||||
import { VideoModel } from '../../models/video/video'
|
import { VideoModel } from '../../models/video/video'
|
||||||
import { activityPubResponse } from './utils'
|
import { activityPubResponse } from './utils'
|
||||||
import { MActorLight } from '@server/typings/models'
|
import { MActorLight } from '@server/typings/models'
|
||||||
|
import { apPaginationValidator } from '../../middlewares/validators/activitypub'
|
||||||
|
|
||||||
const outboxRouter = express.Router()
|
const outboxRouter = express.Router()
|
||||||
|
|
||||||
outboxRouter.get('/accounts/:name/outbox',
|
outboxRouter.get('/accounts/:name/outbox',
|
||||||
|
apPaginationValidator,
|
||||||
localAccountValidator,
|
localAccountValidator,
|
||||||
asyncMiddleware(outboxController)
|
asyncMiddleware(outboxController)
|
||||||
)
|
)
|
||||||
|
|
||||||
outboxRouter.get('/video-channels/:name/outbox',
|
outboxRouter.get('/video-channels/:name/outbox',
|
||||||
|
apPaginationValidator,
|
||||||
localVideoChannelValidator,
|
localVideoChannelValidator,
|
||||||
asyncMiddleware(outboxController)
|
asyncMiddleware(outboxController)
|
||||||
)
|
)
|
||||||
|
@ -38,7 +41,7 @@ async function outboxController (req: express.Request, res: express.Response) {
|
||||||
logger.info('Receiving outbox request for %s.', actorOutboxUrl)
|
logger.info('Receiving outbox request for %s.', actorOutboxUrl)
|
||||||
|
|
||||||
const handler = (start: number, count: number) => buildActivities(actor, start, count)
|
const handler = (start: number, count: number) => buildActivities(actor, start, count)
|
||||||
const json = await activityPubCollectionPagination(actorOutboxUrl, handler, req.query.page)
|
const json = await activityPubCollectionPagination(actorOutboxUrl, handler, req.query.page, req.query.size)
|
||||||
|
|
||||||
return activityPubResponse(activityPubContextify(json), res)
|
return activityPubResponse(activityPubContextify(json), res)
|
||||||
}
|
}
|
||||||
|
|
|
@ -100,7 +100,12 @@ function activityPubContextify <T> (data: T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
type ActivityPubCollectionPaginationHandler = (start: number, count: number) => Bluebird<ResultList<any>> | Promise<ResultList<any>>
|
type ActivityPubCollectionPaginationHandler = (start: number, count: number) => Bluebird<ResultList<any>> | Promise<ResultList<any>>
|
||||||
async function activityPubCollectionPagination (baseUrl: string, handler: ActivityPubCollectionPaginationHandler, page?: any) {
|
async function activityPubCollectionPagination (
|
||||||
|
baseUrl: string,
|
||||||
|
handler: ActivityPubCollectionPaginationHandler,
|
||||||
|
page?: any,
|
||||||
|
size = ACTIVITY_PUB.COLLECTION_ITEMS_PER_PAGE
|
||||||
|
) {
|
||||||
if (!page || !validator.isInt(page)) {
|
if (!page || !validator.isInt(page)) {
|
||||||
// We just display the first page URL, we only need the total items
|
// We just display the first page URL, we only need the total items
|
||||||
const result = await handler(0, 1)
|
const result = await handler(0, 1)
|
||||||
|
@ -113,7 +118,7 @@ async function activityPubCollectionPagination (baseUrl: string, handler: Activi
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const { start, count } = pageToStartAndCount(page, ACTIVITY_PUB.COLLECTION_ITEMS_PER_PAGE)
|
const { start, count } = pageToStartAndCount(page, size)
|
||||||
const result = await handler(start, count)
|
const result = await handler(start, count)
|
||||||
|
|
||||||
let next: string | undefined
|
let next: string | undefined
|
||||||
|
@ -123,7 +128,7 @@ async function activityPubCollectionPagination (baseUrl: string, handler: Activi
|
||||||
page = parseInt(page, 10)
|
page = parseInt(page, 10)
|
||||||
|
|
||||||
// There are more results
|
// There are more results
|
||||||
if (result.total > page * ACTIVITY_PUB.COLLECTION_ITEMS_PER_PAGE) {
|
if (result.total > page * size) {
|
||||||
next = baseUrl + '?page=' + (page + 1)
|
next = baseUrl + '?page=' + (page + 1)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,2 +1,3 @@
|
||||||
export * from './activity'
|
export * from './activity'
|
||||||
export * from './signature'
|
export * from './signature'
|
||||||
|
export * from './pagination'
|
||||||
|
|
|
@ -0,0 +1,23 @@
|
||||||
|
import * as express from 'express'
|
||||||
|
import { query } from 'express-validator'
|
||||||
|
import { logger } from '../../../helpers/logger'
|
||||||
|
import { areValidationErrors } from '../utils'
|
||||||
|
|
||||||
|
const apPaginationValidator = [
|
||||||
|
query('page').optional().isInt({ min: 1 }).withMessage('Should have a valid page number'),
|
||||||
|
query('size').optional().isInt({ max: 50 }).withMessage('Should have a valid page size (max: 50)'),
|
||||||
|
|
||||||
|
(req: express.Request, res: express.Response, next: express.NextFunction) => {
|
||||||
|
logger.debug('Checking pagination parameters', { parameters: req.query })
|
||||||
|
|
||||||
|
if (areValidationErrors(req, res)) return
|
||||||
|
|
||||||
|
return next()
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
export {
|
||||||
|
apPaginationValidator
|
||||||
|
}
|
Loading…
Reference in New Issue