summaryrefslogtreecommitdiff
path: root/src/server/api/endpoints/users/followers.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/api/endpoints/users/followers.ts')
-rw-r--r--src/server/api/endpoints/users/followers.ts98
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 });
});