Add outbox page size parameter

pull/2396/head
Rigel Kent 2020-01-09 00:43:52 +01:00 committed by Chocobozzz
parent c08579e14f
commit fbc77eb648
4 changed files with 36 additions and 4 deletions

View File

@ -9,15 +9,18 @@ import { asyncMiddleware, localAccountValidator, localVideoChannelValidator } fr
import { VideoModel } from '../../models/video/video'
import { activityPubResponse } from './utils'
import { MActorLight } from '@server/typings/models'
import { apPaginationValidator } from '../../middlewares/validators/activitypub'
const outboxRouter = express.Router()
outboxRouter.get('/accounts/:name/outbox',
apPaginationValidator,
localAccountValidator,
asyncMiddleware(outboxController)
)
outboxRouter.get('/video-channels/:name/outbox',
apPaginationValidator,
localVideoChannelValidator,
asyncMiddleware(outboxController)
)
@ -38,7 +41,7 @@ async function outboxController (req: express.Request, res: express.Response) {
logger.info('Receiving outbox request for %s.', actorOutboxUrl)
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)
}

View File

@ -100,7 +100,12 @@ function activityPubContextify <T> (data: T) {
}
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)) {
// We just display the first page URL, we only need the total items
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)
let next: string | undefined
@ -123,7 +128,7 @@ async function activityPubCollectionPagination (baseUrl: string, handler: Activi
page = parseInt(page, 10)
// There are more results
if (result.total > page * ACTIVITY_PUB.COLLECTION_ITEMS_PER_PAGE) {
if (result.total > page * size) {
next = baseUrl + '?page=' + (page + 1)
}

View File

@ -1,2 +1,3 @@
export * from './activity'
export * from './signature'
export * from './pagination'

View File

@ -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
}