Fix AP collections pagination
authorChocobozzz <me@florianbigard.com>
Fri, 16 Nov 2018 14:38:09 +0000 (15:38 +0100)
committerChocobozzz <me@florianbigard.com>
Fri, 16 Nov 2018 14:49:16 +0000 (15:49 +0100)
server/controllers/activitypub/client.ts
server/helpers/activitypub.ts
server/models/activitypub/actor-follow.ts

index a342a48d4084e143fe775007a86d9aae0d3cce2f..d9d3854603bcac9c0ebf15223f9423718d19af29 100644 (file)
@@ -298,7 +298,7 @@ async function actorFollowing (req: express.Request, actor: ActorModel) {
     return ActorFollowModel.listAcceptedFollowingUrlsForApi([ actor.id ], undefined, start, count)
   }
 
-  return activityPubCollectionPagination(CONFIG.WEBSERVER.URL + req.url, handler, req.query.page)
+  return activityPubCollectionPagination(CONFIG.WEBSERVER.URL + req.path, handler, req.query.page)
 }
 
 async function actorFollowers (req: express.Request, actor: ActorModel) {
@@ -306,7 +306,7 @@ async function actorFollowers (req: express.Request, actor: ActorModel) {
     return ActorFollowModel.listAcceptedFollowerUrlsForApi([ actor.id ], undefined, start, count)
   }
 
-  return activityPubCollectionPagination(CONFIG.WEBSERVER.URL + req.url, handler, req.query.page)
+  return activityPubCollectionPagination(CONFIG.WEBSERVER.URL + req.path, handler, req.query.page)
 }
 
 function videoRates (req: express.Request, rateType: VideoRateType, video: VideoModel, url: string) {
index 4bf6e387dde27c8b93bc76c1eec48877175ff68f..bcbd9be59d52bb07bb2d19b248698ec96c98e244 100644 (file)
@@ -57,16 +57,16 @@ function activityPubContextify <T> (data: T) {
 }
 
 type ActivityPubCollectionPaginationHandler = (start: number, count: number) => Bluebird<ResultList<any>> | Promise<ResultList<any>>
-async function activityPubCollectionPagination (url: string, handler: ActivityPubCollectionPaginationHandler, page?: any) {
+async function activityPubCollectionPagination (baseUrl: string, handler: ActivityPubCollectionPaginationHandler, page?: any) {
   if (!page || !validator.isInt(page)) {
     // We just display the first page URL, we only need the total items
     const result = await handler(0, 1)
 
     return {
-      id: url,
+      id: baseUrl,
       type: 'OrderedCollection',
       totalItems: result.total,
-      first: url + '?page=1'
+      first: baseUrl + '?page=1'
     }
   }
 
@@ -81,19 +81,19 @@ async function activityPubCollectionPagination (url: string, handler: ActivityPu
 
   // There are more results
   if (result.total > page * ACTIVITY_PUB.COLLECTION_ITEMS_PER_PAGE) {
-    next = url + '?page=' + (page + 1)
+    next = baseUrl + '?page=' + (page + 1)
   }
 
   if (page > 1) {
-    prev = url + '?page=' + (page - 1)
+    prev = baseUrl + '?page=' + (page - 1)
   }
 
   return {
-    id: url + '?page=' + page,
+    id: baseUrl + '?page=' + page,
     type: 'OrderedCollectionPage',
     prev,
     next,
-    partOf: url,
+    partOf: baseUrl,
     orderedItems: result.data,
     totalItems: result.total
   }
index 3373355efff67f0aa8f852d78a8ab00249e82ed3..0a693508354549ff3fbd46d55a9014211535cdb1 100644 (file)
@@ -509,12 +509,12 @@ export class ActorFollowModel extends Model<ActorFollowModel> {
       tasks.push(ActorFollowModel.sequelize.query(query, options))
     }
 
-    const [ followers, [ { total } ] ] = await Promise.all(tasks)
+    const [ followers, [ dataTotal ] ] = await Promise.all(tasks)
     const urls: string[] = followers.map(f => f.url)
 
     return {
       data: urls,
-      total: parseInt(total, 10)
+      total: dataTotal ? parseInt(dataTotal.total, 10) : 0
     }
   }