From fbc77eb648bda9add4634c08dbb6af48c3670b5d Mon Sep 17 00:00:00 2001 From: Rigel Kent Date: Thu, 9 Jan 2020 00:43:52 +0100 Subject: [PATCH] Add outbox page size parameter --- server/controllers/activitypub/outbox.ts | 5 +++- server/helpers/activitypub.ts | 11 ++++++--- .../validators/activitypub/index.ts | 1 + .../validators/activitypub/pagination.ts | 23 +++++++++++++++++++ 4 files changed, 36 insertions(+), 4 deletions(-) create mode 100644 server/middlewares/validators/activitypub/pagination.ts diff --git a/server/controllers/activitypub/outbox.ts b/server/controllers/activitypub/outbox.ts index f3dd2ad7d..916a110a8 100644 --- a/server/controllers/activitypub/outbox.ts +++ b/server/controllers/activitypub/outbox.ts @@ -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) } diff --git a/server/helpers/activitypub.ts b/server/helpers/activitypub.ts index 735f2d73a..239d8291d 100644 --- a/server/helpers/activitypub.ts +++ b/server/helpers/activitypub.ts @@ -100,7 +100,12 @@ function activityPubContextify (data: T) { } type ActivityPubCollectionPaginationHandler = (start: number, count: number) => Bluebird> | Promise> -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) } diff --git a/server/middlewares/validators/activitypub/index.ts b/server/middlewares/validators/activitypub/index.ts index 84d1107fc..159338d26 100644 --- a/server/middlewares/validators/activitypub/index.ts +++ b/server/middlewares/validators/activitypub/index.ts @@ -1,2 +1,3 @@ export * from './activity' export * from './signature' +export * from './pagination' diff --git a/server/middlewares/validators/activitypub/pagination.ts b/server/middlewares/validators/activitypub/pagination.ts new file mode 100644 index 000000000..8b32d3415 --- /dev/null +++ b/server/middlewares/validators/activitypub/pagination.ts @@ -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 +} -- 2.25.1