From d7df26d92b3363df197afa47343d3a05e943e362 Mon Sep 17 00:00:00 2001 From: takonomura Date: Sun, 30 Aug 2020 18:18:34 +0900 Subject: [PATCH] Fix channels list pagination (#6679) --- src/client/pages/channels.vue | 2 +- src/server/api/endpoints/channels/followed.ts | 27 ++++++++++++++++--- src/server/api/endpoints/channels/owned.ts | 27 ++++++++++++++++--- 3 files changed, 49 insertions(+), 7 deletions(-) diff --git a/src/client/pages/channels.vue b/src/client/pages/channels.vue index 85804141f..34a79e70e 100644 --- a/src/client/pages/channels.vue +++ b/src/client/pages/channels.vue @@ -44,7 +44,7 @@ export default Vue.extend({ tab: 'featured', featuredPagination: { endpoint: 'channels/featured', - limit: 5, + noPaging: true, }, followingPagination: { endpoint: 'channels/followed', diff --git a/src/server/api/endpoints/channels/followed.ts b/src/server/api/endpoints/channels/followed.ts index 05c2ec6a7..bd37d420f 100644 --- a/src/server/api/endpoints/channels/followed.ts +++ b/src/server/api/endpoints/channels/followed.ts @@ -1,5 +1,8 @@ +import $ from 'cafy'; +import { ID } from '../../../../misc/cafy-id'; import define from '../../define'; import { Channels, ChannelFollowings } from '../../../../models'; +import { makePaginationQuery } from '../../common/make-pagination-query'; export const meta = { tags: ['channels', 'account'], @@ -8,6 +11,21 @@ export const meta = { kind: 'read:channels', + params: { + sinceId: { + validator: $.optional.type(ID), + }, + + untilId: { + validator: $.optional.type(ID), + }, + + limit: { + validator: $.optional.num.range(1, 100), + default: 5 + }, + }, + res: { type: 'array' as const, optional: false as const, nullable: false as const, @@ -20,9 +38,12 @@ export const meta = { }; export default define(meta, async (ps, me) => { - const followings = await ChannelFollowings.find({ - followerId: me.id, - }); + const query = makePaginationQuery(ChannelFollowings.createQueryBuilder(), ps.sinceId, ps.untilId) + .andWhere({ followerId: me.id }); + + const followings = await query + .take(ps.limit!) + .getMany(); return await Promise.all(followings.map(x => Channels.pack(x.followeeId, me))); }); diff --git a/src/server/api/endpoints/channels/owned.ts b/src/server/api/endpoints/channels/owned.ts index 9e563c0ac..1a7e04640 100644 --- a/src/server/api/endpoints/channels/owned.ts +++ b/src/server/api/endpoints/channels/owned.ts @@ -1,5 +1,8 @@ +import $ from 'cafy'; +import { ID } from '../../../../misc/cafy-id'; import define from '../../define'; import { Channels } from '../../../../models'; +import { makePaginationQuery } from '../../common/make-pagination-query'; export const meta = { tags: ['channels', 'account'], @@ -8,6 +11,21 @@ export const meta = { kind: 'read:channels', + params: { + sinceId: { + validator: $.optional.type(ID), + }, + + untilId: { + validator: $.optional.type(ID), + }, + + limit: { + validator: $.optional.num.range(1, 100), + default: 5 + }, + }, + res: { type: 'array' as const, optional: false as const, nullable: false as const, @@ -20,9 +38,12 @@ export const meta = { }; export default define(meta, async (ps, me) => { - const channels = await Channels.find({ - userId: me.id, - }); + const query = makePaginationQuery(Channels.createQueryBuilder(), ps.sinceId, ps.untilId) + .andWhere({ userId: me.id }); + + const channels = await query + .take(ps.limit!) + .getMany(); return await Promise.all(channels.map(x => Channels.pack(x, me))); });