diff options
Diffstat (limited to 'src/server/api/endpoints/users/followers.ts')
| -rw-r--r-- | src/server/api/endpoints/users/followers.ts | 98 |
1 files changed, 24 insertions, 74 deletions
diff --git a/src/server/api/endpoints/users/followers.ts b/src/server/api/endpoints/users/followers.ts index 3c8290a8b1..51b007ddaa 100644 --- a/src/server/api/endpoints/users/followers.ts +++ b/src/server/api/endpoints/users/followers.ts @@ -1,11 +1,9 @@ import $ from 'cafy'; -import ID, { transform } from '../../../../misc/cafy-id'; -import User from '../../../../models/user'; -import Following from '../../../../models/following'; -import { pack } from '../../../../models/user'; -import { getFriendIds } from '../../common/get-friends'; +import { ID } from '../../../../misc/cafy-id'; import define from '../../define'; import { ApiError } from '../../error'; +import { Users, Followings } from '../../../../models'; +import { makePaginationQuery } from '../../common/make-pagination-query'; export const meta = { desc: { @@ -20,7 +18,6 @@ export const meta = { params: { userId: { validator: $.optional.type(ID), - transform: transform, desc: { 'ja-JP': '対象のユーザーのID', 'en-US': 'Target user ID' @@ -35,38 +32,25 @@ export const meta = { validator: $.optional.nullable.str }, - limit: { - validator: $.optional.num.range(1, 100), - default: 10 + sinceId: { + validator: $.optional.type(ID), }, - cursor: { + untilId: { validator: $.optional.type(ID), - default: null as any, - transform: transform, }, - iknow: { - validator: $.optional.bool, - default: false, - } + limit: { + validator: $.optional.num.range(1, 100), + default: 10 + }, }, res: { - type: 'object', - properties: { - users: { - type: 'array', - items: { - type: 'User', - } - }, - next: { - type: 'string', - format: 'id', - nullable: true - } - } + type: 'array', + items: { + type: 'Following', + }, }, errors: { @@ -79,54 +63,20 @@ export const meta = { }; export default define(meta, async (ps, me) => { - const q: any = ps.userId != null - ? { _id: ps.userId } - : { usernameLower: ps.username.toLowerCase(), host: ps.host }; - - const user = await User.findOne(q); + const user = await Users.findOne(ps.userId != null + ? { id: ps.userId } + : { usernameLower: ps.username.toLowerCase(), host: ps.host }); - if (user === null) { + if (user == null) { throw new ApiError(meta.errors.noSuchUser); } - const query = { - followeeId: user._id - } as any; - - // ログインしていてかつ iknow フラグがあるとき - if (me && ps.iknow) { - // Get my friends - const myFriends = await getFriendIds(me._id); - - query.followerId = { - $in: myFriends - }; - } - - // カーソルが指定されている場合 - if (ps.cursor) { - query._id = { - $lt: ps.cursor - }; - } - - // Get followers - const following = await Following - .find(query, { - limit: ps.limit + 1, - sort: { _id: -1 } - }); - - // 「次のページ」があるかどうか - const inStock = following.length === ps.limit + 1; - if (inStock) { - following.pop(); - } + const query = makePaginationQuery(Followings.createQueryBuilder('following'), ps.sinceId, ps.untilId) + .andWhere(`following.followeeId = :userId`, { userId: user.id }); - const users = await Promise.all(following.map(f => pack(f.followerId, me, { detail: true }))); + const followings = await query + .take(ps.limit) + .getMany(); - return { - users: users, - next: inStock ? following[following.length - 1]._id : null, - }; + return await Followings.packMany(followings, me, { populateFollower: true }); }); |