Refactoring, Clean up and bug fixes
This commit is contained in:
@ -1,32 +1,49 @@
|
||||
import $ from 'cafy'; import ID from '../../../../misc/cafy-id';
|
||||
import $ from 'cafy'; import ID, { transform } from '../../../../misc/cafy-id';
|
||||
import User, { ILocalUser } from '../../../../models/user';
|
||||
import Following from '../../../../models/following';
|
||||
import { pack } from '../../../../models/user';
|
||||
import { getFriendIds } from '../../common/get-friends';
|
||||
import getParams from '../../get-params';
|
||||
|
||||
export const meta = {
|
||||
desc: {
|
||||
'ja-JP': '指定したユーザーのフォロワー一覧を取得します。',
|
||||
'en-US': 'Get followers of a user.'
|
||||
},
|
||||
|
||||
requireCredential: false,
|
||||
|
||||
params: {
|
||||
userId: {
|
||||
validator: $.type(ID),
|
||||
transform: transform,
|
||||
},
|
||||
|
||||
limit: {
|
||||
validator: $.num.optional.range(1, 100),
|
||||
default: 10
|
||||
},
|
||||
|
||||
cursor: {
|
||||
validator: $.type(ID).optional,
|
||||
default: null as any,
|
||||
transform: transform,
|
||||
},
|
||||
|
||||
iknow: {
|
||||
validator: $.bool.optional,
|
||||
default: false,
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Get followers of a user
|
||||
*/
|
||||
export default (params: any, me: ILocalUser) => new Promise(async (res, rej) => {
|
||||
// Get 'userId' parameter
|
||||
const [userId, userIdErr] = $.type(ID).get(params.userId);
|
||||
if (userIdErr) return rej('invalid userId param');
|
||||
|
||||
// Get 'iknow' parameter
|
||||
const [iknow = false, iknowErr] = $.bool.optional.get(params.iknow);
|
||||
if (iknowErr) return rej('invalid iknow param');
|
||||
|
||||
// Get 'limit' parameter
|
||||
const [limit = 10, limitErr] = $.num.optional.range(1, 100).get(params.limit);
|
||||
if (limitErr) return rej('invalid limit param');
|
||||
|
||||
// Get 'cursor' parameter
|
||||
const [cursor = null, cursorErr] = $.type(ID).optional.get(params.cursor);
|
||||
if (cursorErr) return rej('invalid cursor param');
|
||||
const [ps, psErr] = getParams(meta, params);
|
||||
if (psErr) return rej(psErr);
|
||||
|
||||
// Lookup user
|
||||
const user = await User.findOne({
|
||||
_id: userId
|
||||
_id: ps.userId
|
||||
}, {
|
||||
fields: {
|
||||
_id: true
|
||||
@ -43,7 +60,7 @@ export default (params: any, me: ILocalUser) => new Promise(async (res, rej) =>
|
||||
} as any;
|
||||
|
||||
// ログインしていてかつ iknow フラグがあるとき
|
||||
if (me && iknow) {
|
||||
if (me && ps.iknow) {
|
||||
// Get my friends
|
||||
const myFriends = await getFriendIds(me._id);
|
||||
|
||||
@ -53,29 +70,27 @@ export default (params: any, me: ILocalUser) => new Promise(async (res, rej) =>
|
||||
}
|
||||
|
||||
// カーソルが指定されている場合
|
||||
if (cursor) {
|
||||
if (ps.cursor) {
|
||||
query._id = {
|
||||
$lt: cursor
|
||||
$lt: ps.cursor
|
||||
};
|
||||
}
|
||||
|
||||
// Get followers
|
||||
const following = await Following
|
||||
.find(query, {
|
||||
limit: limit + 1,
|
||||
limit: ps.limit + 1,
|
||||
sort: { _id: -1 }
|
||||
});
|
||||
|
||||
// 「次のページ」があるかどうか
|
||||
const inStock = following.length === limit + 1;
|
||||
const inStock = following.length === ps.limit + 1;
|
||||
if (inStock) {
|
||||
following.pop();
|
||||
}
|
||||
|
||||
// Serialize
|
||||
const users = await Promise.all(following.map(f => pack(f.followerId, me, { detail: true })));
|
||||
|
||||
// Response
|
||||
res({
|
||||
users: users,
|
||||
next: inStock ? following[following.length - 1]._id : null,
|
||||
|
@ -1,32 +1,49 @@
|
||||
import $ from 'cafy'; import ID from '../../../../misc/cafy-id';
|
||||
import $ from 'cafy'; import ID, { transform } from '../../../../misc/cafy-id';
|
||||
import User, { ILocalUser } from '../../../../models/user';
|
||||
import Following from '../../../../models/following';
|
||||
import { pack } from '../../../../models/user';
|
||||
import { getFriendIds } from '../../common/get-friends';
|
||||
import getParams from '../../get-params';
|
||||
|
||||
export const meta = {
|
||||
desc: {
|
||||
'ja-JP': '指定したユーザーのフォロー一覧を取得します。',
|
||||
'en-US': 'Get following users of a user.'
|
||||
},
|
||||
|
||||
requireCredential: false,
|
||||
|
||||
params: {
|
||||
userId: {
|
||||
validator: $.type(ID),
|
||||
transform: transform,
|
||||
},
|
||||
|
||||
limit: {
|
||||
validator: $.num.optional.range(1, 100),
|
||||
default: 10
|
||||
},
|
||||
|
||||
cursor: {
|
||||
validator: $.type(ID).optional,
|
||||
default: null as any,
|
||||
transform: transform,
|
||||
},
|
||||
|
||||
iknow: {
|
||||
validator: $.bool.optional,
|
||||
default: false,
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Get following users of a user
|
||||
*/
|
||||
export default (params: any, me: ILocalUser) => new Promise(async (res, rej) => {
|
||||
// Get 'userId' parameter
|
||||
const [userId, userIdErr] = $.type(ID).get(params.userId);
|
||||
if (userIdErr) return rej('invalid userId param');
|
||||
|
||||
// Get 'iknow' parameter
|
||||
const [iknow = false, iknowErr] = $.bool.optional.get(params.iknow);
|
||||
if (iknowErr) return rej('invalid iknow param');
|
||||
|
||||
// Get 'limit' parameter
|
||||
const [limit = 10, limitErr] = $.num.optional.range(1, 100).get(params.limit);
|
||||
if (limitErr) return rej('invalid limit param');
|
||||
|
||||
// Get 'cursor' parameter
|
||||
const [cursor = null, cursorErr] = $.type(ID).optional.get(params.cursor);
|
||||
if (cursorErr) return rej('invalid cursor param');
|
||||
const [ps, psErr] = getParams(meta, params);
|
||||
if (psErr) return rej(psErr);
|
||||
|
||||
// Lookup user
|
||||
const user = await User.findOne({
|
||||
_id: userId
|
||||
_id: ps.userId
|
||||
}, {
|
||||
fields: {
|
||||
_id: true
|
||||
@ -43,7 +60,7 @@ export default (params: any, me: ILocalUser) => new Promise(async (res, rej) =>
|
||||
} as any;
|
||||
|
||||
// ログインしていてかつ iknow フラグがあるとき
|
||||
if (me && iknow) {
|
||||
if (me && ps.iknow) {
|
||||
// Get my friends
|
||||
const myFriends = await getFriendIds(me._id);
|
||||
|
||||
@ -53,29 +70,27 @@ export default (params: any, me: ILocalUser) => new Promise(async (res, rej) =>
|
||||
}
|
||||
|
||||
// カーソルが指定されている場合
|
||||
if (cursor) {
|
||||
if (ps.cursor) {
|
||||
query._id = {
|
||||
$lt: cursor
|
||||
$lt: ps.cursor
|
||||
};
|
||||
}
|
||||
|
||||
// Get followers
|
||||
const following = await Following
|
||||
.find(query, {
|
||||
limit: limit + 1,
|
||||
limit: ps.limit + 1,
|
||||
sort: { _id: -1 }
|
||||
});
|
||||
|
||||
// 「次のページ」があるかどうか
|
||||
const inStock = following.length === limit + 1;
|
||||
const inStock = following.length === ps.limit + 1;
|
||||
if (inStock) {
|
||||
following.pop();
|
||||
}
|
||||
|
||||
// Serialize
|
||||
const users = await Promise.all(following.map(f => pack(f.followeeId, me, { detail: true })));
|
||||
|
||||
// Response
|
||||
res({
|
||||
users: users,
|
||||
next: inStock ? following[following.length - 1]._id : null,
|
||||
|
@ -1,19 +1,31 @@
|
||||
import $ from 'cafy'; import ID from '../../../../misc/cafy-id';
|
||||
import $ from 'cafy'; import ID, { transform } from '../../../../misc/cafy-id';
|
||||
import Note from '../../../../models/note';
|
||||
import User, { pack, ILocalUser } from '../../../../models/user';
|
||||
import getParams from '../../get-params';
|
||||
|
||||
export const meta = {
|
||||
requireCredential: false,
|
||||
|
||||
params: {
|
||||
userId: {
|
||||
validator: $.type(ID),
|
||||
transform: transform,
|
||||
},
|
||||
|
||||
limit: {
|
||||
validator: $.num.optional.range(1, 100),
|
||||
default: 10
|
||||
},
|
||||
}
|
||||
};
|
||||
|
||||
export default (params: any, me: ILocalUser) => new Promise(async (res, rej) => {
|
||||
// Get 'userId' parameter
|
||||
const [userId, userIdErr] = $.type(ID).get(params.userId);
|
||||
if (userIdErr) return rej('invalid userId param');
|
||||
|
||||
// Get 'limit' parameter
|
||||
const [limit = 10, limitErr] = $.num.optional.range(1, 100).get(params.limit);
|
||||
if (limitErr) return rej('invalid limit param');
|
||||
const [ps, psErr] = getParams(meta, params);
|
||||
if (psErr) return rej(psErr);
|
||||
|
||||
// Lookup user
|
||||
const user = await User.findOne({
|
||||
_id: userId
|
||||
_id: ps.userId
|
||||
}, {
|
||||
fields: {
|
||||
_id: true
|
||||
@ -83,7 +95,7 @@ export default (params: any, me: ILocalUser) => new Promise(async (res, rej) =>
|
||||
const repliedUsersSorted = Object.keys(repliedUsers).sort((a, b) => repliedUsers[b] - repliedUsers[a]);
|
||||
|
||||
// Extract top replied users
|
||||
const topRepliedUsers = repliedUsersSorted.slice(0, limit);
|
||||
const topRepliedUsers = repliedUsersSorted.slice(0, ps.limit);
|
||||
|
||||
// Make replies object (includes weights)
|
||||
const repliesObj = await Promise.all(topRepliedUsers.map(async (user) => ({
|
||||
@ -91,6 +103,5 @@ export default (params: any, me: ILocalUser) => new Promise(async (res, rej) =>
|
||||
weight: repliedUsers[user] / peak
|
||||
})));
|
||||
|
||||
// Response
|
||||
res(repliesObj);
|
||||
});
|
||||
|
@ -1,5 +1,5 @@
|
||||
import $ from 'cafy';
|
||||
import ID from '../../../../../misc/cafy-id';
|
||||
import ID, { transform } from '../../../../../misc/cafy-id';
|
||||
import UserList from '../../../../../models/user-list';
|
||||
import { ILocalUser } from '../../../../../models/user';
|
||||
import getParams from '../../../get-params';
|
||||
@ -15,12 +15,14 @@ export const meta = {
|
||||
kind: 'account-write',
|
||||
|
||||
params: {
|
||||
listId: $.type(ID).note({
|
||||
listId: {
|
||||
validator: $.type(ID),
|
||||
transform: transform,
|
||||
desc: {
|
||||
'ja-JP': '対象となるユーザーリストのID',
|
||||
'en-US': 'ID of target user list'
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -1,10 +1,11 @@
|
||||
import $ from 'cafy'; import ID from '../../../../../misc/cafy-id';
|
||||
import $ from 'cafy'; import ID, { transform } from '../../../../../misc/cafy-id';
|
||||
import UserList from '../../../../../models/user-list';
|
||||
import User, { pack as packUser, isRemoteUser, getGhost, ILocalUser } from '../../../../../models/user';
|
||||
import { publishUserListStream } from '../../../../../stream';
|
||||
import ap from '../../../../../remote/activitypub/renderer';
|
||||
import renderFollow from '../../../../../remote/activitypub/renderer/follow';
|
||||
import { deliver } from '../../../../../queue';
|
||||
import getParams from '../../../get-params';
|
||||
|
||||
export const meta = {
|
||||
desc: {
|
||||
@ -14,20 +15,28 @@ export const meta = {
|
||||
|
||||
requireCredential: true,
|
||||
|
||||
kind: 'account-write'
|
||||
kind: 'account-write',
|
||||
|
||||
params: {
|
||||
listId: {
|
||||
validator: $.type(ID),
|
||||
transform: transform,
|
||||
},
|
||||
|
||||
userId: {
|
||||
validator: $.type(ID),
|
||||
transform: transform,
|
||||
},
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Add a user to a user list
|
||||
*/
|
||||
export default async (params: any, me: ILocalUser) => new Promise(async (res, rej) => {
|
||||
// Get 'listId' parameter
|
||||
const [listId, listIdErr] = $.type(ID).get(params.listId);
|
||||
if (listIdErr) return rej('invalid listId param');
|
||||
const [ps, psErr] = getParams(meta, params);
|
||||
if (psErr) return rej(psErr);
|
||||
|
||||
// Fetch the list
|
||||
const userList = await UserList.findOne({
|
||||
_id: listId,
|
||||
_id: ps.listId,
|
||||
userId: me._id,
|
||||
});
|
||||
|
||||
@ -35,13 +44,9 @@ export default async (params: any, me: ILocalUser) => new Promise(async (res, re
|
||||
return rej('list not found');
|
||||
}
|
||||
|
||||
// Get 'userId' parameter
|
||||
const [userId, userIdErr] = $.type(ID).get(params.userId);
|
||||
if (userIdErr) return rej('invalid userId param');
|
||||
|
||||
// Fetch the user
|
||||
const user = await User.findOne({
|
||||
_id: userId
|
||||
_id: ps.userId
|
||||
});
|
||||
|
||||
if (user == null) {
|
||||
|
@ -1,6 +1,7 @@
|
||||
import $ from 'cafy'; import ID from '../../../../../misc/cafy-id';
|
||||
import $ from 'cafy'; import ID, { transform } from '../../../../../misc/cafy-id';
|
||||
import UserList, { pack } from '../../../../../models/user-list';
|
||||
import { ILocalUser } from '../../../../../models/user';
|
||||
import getParams from '../../../get-params';
|
||||
|
||||
export const meta = {
|
||||
desc: {
|
||||
@ -10,17 +11,23 @@ export const meta = {
|
||||
|
||||
requireCredential: true,
|
||||
|
||||
kind: 'account-read'
|
||||
kind: 'account-read',
|
||||
|
||||
params: {
|
||||
listId: {
|
||||
validator: $.type(ID),
|
||||
transform: transform,
|
||||
},
|
||||
}
|
||||
};
|
||||
|
||||
export default async (params: any, me: ILocalUser) => new Promise(async (res, rej) => {
|
||||
// Get 'listId' parameter
|
||||
const [listId, listIdErr] = $.type(ID).get(params.listId);
|
||||
if (listIdErr) return rej('invalid listId param');
|
||||
const [ps, psErr] = getParams(meta, params);
|
||||
if (psErr) return rej(psErr);
|
||||
|
||||
// Fetch the list
|
||||
const userList = await UserList.findOne({
|
||||
_id: listId,
|
||||
_id: ps.listId,
|
||||
userId: me._id,
|
||||
});
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
import $ from 'cafy';
|
||||
import ID from '../../../../../misc/cafy-id';
|
||||
import ID, { transform } from '../../../../../misc/cafy-id';
|
||||
import UserList, { pack } from '../../../../../models/user-list';
|
||||
import { ILocalUser } from '../../../../../models/user';
|
||||
import getParams from '../../../get-params';
|
||||
@ -15,18 +15,22 @@ export const meta = {
|
||||
kind: 'account-write',
|
||||
|
||||
params: {
|
||||
listId: $.type(ID).note({
|
||||
listId: {
|
||||
validator: $.type(ID),
|
||||
transform: transform,
|
||||
desc: {
|
||||
'ja-JP': '対象となるユーザーリストのID',
|
||||
'en-US': 'ID of target user list'
|
||||
}
|
||||
}),
|
||||
title: $.str.range(1, 100).note({
|
||||
},
|
||||
|
||||
title: {
|
||||
validator: $.str.range(1, 100),
|
||||
desc: {
|
||||
'ja-JP': 'このユーザーリストの名前',
|
||||
'en-US': 'name of this user list'
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
import $ from 'cafy'; import ID from '../../../../misc/cafy-id';
|
||||
import $ from 'cafy'; import ID, { transform } from '../../../../misc/cafy-id';
|
||||
import getHostLower from '../../common/get-host-lower';
|
||||
import Note, { packMany } from '../../../../models/note';
|
||||
import User, { ILocalUser } from '../../../../models/user';
|
||||
@ -11,100 +11,118 @@ export const meta = {
|
||||
},
|
||||
|
||||
params: {
|
||||
userId: $.type(ID).optional.note({
|
||||
userId: {
|
||||
validator: $.type(ID).optional,
|
||||
transform: transform,
|
||||
desc: {
|
||||
'ja-JP': 'ユーザーID'
|
||||
}
|
||||
}),
|
||||
},
|
||||
|
||||
username: $.str.optional.note({
|
||||
username: {
|
||||
validator: $.str.optional,
|
||||
desc: {
|
||||
'ja-JP': 'ユーザー名'
|
||||
}
|
||||
}),
|
||||
},
|
||||
|
||||
host: $.str.optional.note({
|
||||
}),
|
||||
host: {
|
||||
validator: $.str.optional,
|
||||
},
|
||||
|
||||
includeReplies: $.bool.optional.note({
|
||||
includeReplies: {
|
||||
validator: $.bool.optional,
|
||||
default: true,
|
||||
|
||||
desc: {
|
||||
'ja-JP': 'リプライを含めるか否か'
|
||||
}
|
||||
}),
|
||||
},
|
||||
|
||||
limit: $.num.optional.range(1, 100).note({
|
||||
limit: {
|
||||
validator: $.num.optional.range(1, 100),
|
||||
default: 10,
|
||||
desc: {
|
||||
'ja-JP': '最大数'
|
||||
}
|
||||
}),
|
||||
},
|
||||
|
||||
sinceId: $.type(ID).optional.note({
|
||||
sinceId: {
|
||||
validator: $.type(ID).optional,
|
||||
transform: transform,
|
||||
desc: {
|
||||
'ja-JP': '指定すると、この投稿を基点としてより新しい投稿を取得します'
|
||||
}
|
||||
}),
|
||||
},
|
||||
|
||||
untilId: $.type(ID).optional.note({
|
||||
untilId: {
|
||||
validator: $.type(ID).optional,
|
||||
transform: transform,
|
||||
desc: {
|
||||
'ja-JP': '指定すると、この投稿を基点としてより古い投稿を取得します'
|
||||
}
|
||||
}),
|
||||
},
|
||||
|
||||
sinceDate: $.num.optional.note({
|
||||
sinceDate: {
|
||||
validator: $.num.optional,
|
||||
desc: {
|
||||
'ja-JP': '指定した時間を基点としてより新しい投稿を取得します。数値は、1970年1月1日 00:00:00 UTC から指定した日時までの経過時間をミリ秒単位で表します。'
|
||||
}
|
||||
}),
|
||||
},
|
||||
|
||||
untilDate: $.num.optional.note({
|
||||
untilDate: {
|
||||
validator: $.num.optional,
|
||||
desc: {
|
||||
'ja-JP': '指定した時間を基点としてより古い投稿を取得します。数値は、1970年1月1日 00:00:00 UTC から指定した日時までの経過時間をミリ秒単位で表します。'
|
||||
}
|
||||
}),
|
||||
},
|
||||
|
||||
includeMyRenotes: $.bool.optional.note({
|
||||
includeMyRenotes: {
|
||||
validator: $.bool.optional,
|
||||
default: true,
|
||||
desc: {
|
||||
'ja-JP': '自分の行ったRenoteを含めるかどうか'
|
||||
}
|
||||
}),
|
||||
},
|
||||
|
||||
includeRenotedMyNotes: $.bool.optional.note({
|
||||
includeRenotedMyNotes: {
|
||||
validator: $.bool.optional,
|
||||
default: true,
|
||||
desc: {
|
||||
'ja-JP': 'Renoteされた自分の投稿を含めるかどうか'
|
||||
}
|
||||
}),
|
||||
},
|
||||
|
||||
includeLocalRenotes: $.bool.optional.note({
|
||||
includeLocalRenotes: {
|
||||
validator: $.bool.optional,
|
||||
default: true,
|
||||
desc: {
|
||||
'ja-JP': 'Renoteされたローカルの投稿を含めるかどうか'
|
||||
}
|
||||
}),
|
||||
},
|
||||
|
||||
withFiles: $.bool.optional.note({
|
||||
withFiles: {
|
||||
validator: $.bool.optional,
|
||||
default: false,
|
||||
desc: {
|
||||
'ja-JP': 'true にすると、ファイルが添付された投稿だけ取得します'
|
||||
}
|
||||
}),
|
||||
},
|
||||
|
||||
mediaOnly: $.bool.optional.note({
|
||||
mediaOnly: {
|
||||
validator: $.bool.optional,
|
||||
default: false,
|
||||
desc: {
|
||||
'ja-JP': 'true にすると、ファイルが添付された投稿だけ取得します (このパラメータは廃止予定です。代わりに withFiles を使ってください。)'
|
||||
}
|
||||
}),
|
||||
},
|
||||
|
||||
fileType: $.arr($.str).optional.note({
|
||||
fileType: {
|
||||
validator: $.arr($.str).optional,
|
||||
desc: {
|
||||
'ja-JP': '指定された種類のファイルが添付された投稿のみを取得します'
|
||||
}
|
||||
}),
|
||||
},
|
||||
}
|
||||
};
|
||||
|
||||
@ -121,7 +139,7 @@ export default (params: any, me: ILocalUser) => new Promise(async (res, rej) =>
|
||||
throw 'only one of sinceId, untilId, sinceDate, untilDate can be specified';
|
||||
}
|
||||
|
||||
const q = ps.userId !== undefined
|
||||
const q = ps.userId != null
|
||||
? { _id: ps.userId }
|
||||
: { usernameLower: ps.username.toLowerCase(), host: getHostLower(ps.host) } ;
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
import $ from 'cafy'; import ID from '../../../../misc/cafy-id';
|
||||
import $ from 'cafy'; import ID, { transform, ObjectId } from '../../../../misc/cafy-id';
|
||||
import { ILocalUser, getRelation } from '../../../../models/user';
|
||||
import getParams from '../../get-params';
|
||||
|
||||
@ -10,11 +10,13 @@ export const meta = {
|
||||
requireCredential: true,
|
||||
|
||||
params: {
|
||||
userId: $.or($.type(ID), $.arr($.type(ID)).unique()).note({
|
||||
userId: {
|
||||
validator: $.or($.type(ID), $.arr($.type(ID)).unique()),
|
||||
transform: (v: any): ObjectId | ObjectId[] => Array.isArray(v) ? v.map(x => transform(x)) : transform(v),
|
||||
desc: {
|
||||
'ja-JP': 'ユーザーID (配列でも可)'
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -11,32 +11,36 @@ export const meta = {
|
||||
requireCredential: false,
|
||||
|
||||
params: {
|
||||
query: $.str.note({
|
||||
query: {
|
||||
validator: $.str,
|
||||
desc: {
|
||||
'ja-JP': 'クエリ'
|
||||
}
|
||||
}),
|
||||
},
|
||||
|
||||
offset: $.num.optional.min(0).note({
|
||||
offset: {
|
||||
validator: $.num.optional.min(0),
|
||||
default: 0,
|
||||
desc: {
|
||||
'ja-JP': 'オフセット'
|
||||
}
|
||||
}),
|
||||
},
|
||||
|
||||
limit: $.num.optional.range(1, 100).note({
|
||||
limit: {
|
||||
validator: $.num.optional.range(1, 100),
|
||||
default: 10,
|
||||
desc: {
|
||||
'ja-JP': '取得する数'
|
||||
}
|
||||
}),
|
||||
},
|
||||
|
||||
localOnly: $.bool.optional.note({
|
||||
localOnly: {
|
||||
validator: $.bool.optional,
|
||||
default: false,
|
||||
desc: {
|
||||
'ja-JP': 'ローカルユーザーのみ検索対象にするか否か'
|
||||
}
|
||||
}),
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
|
@ -1,35 +1,54 @@
|
||||
import $ from 'cafy'; import ID from '../../../../misc/cafy-id';
|
||||
import $ from 'cafy'; import ID, { transform, transformMany } from '../../../../misc/cafy-id';
|
||||
import User, { pack, ILocalUser, isRemoteUser } from '../../../../models/user';
|
||||
import resolveRemoteUser from '../../../../remote/resolve-user';
|
||||
import getParams from '../../get-params';
|
||||
|
||||
const cursorOption = { fields: { data: false } };
|
||||
|
||||
/**
|
||||
* Show user(s)
|
||||
*/
|
||||
export const meta = {
|
||||
desc: {
|
||||
'ja-JP': '指定したユーザーの情報を取得します。'
|
||||
},
|
||||
|
||||
requireCredential: false,
|
||||
|
||||
params: {
|
||||
userId: {
|
||||
validator: $.type(ID).optional,
|
||||
transform: transform,
|
||||
desc: {
|
||||
'ja-JP': 'ユーザーID'
|
||||
}
|
||||
},
|
||||
|
||||
userIds: {
|
||||
validator: $.arr($.type(ID)).optional.unique(),
|
||||
transform: transformMany,
|
||||
desc: {
|
||||
'ja-JP': 'ユーザーID (配列)'
|
||||
}
|
||||
},
|
||||
|
||||
username: {
|
||||
validator: $.str.optional
|
||||
},
|
||||
|
||||
host: {
|
||||
validator: $.str.optional.nullable
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
export default (params: any, me: ILocalUser) => new Promise(async (res, rej) => {
|
||||
const [ps, psErr] = getParams(meta, params);
|
||||
if (psErr) return rej(psErr);
|
||||
|
||||
let user;
|
||||
|
||||
// Get 'userId' parameter
|
||||
const [userId, userIdErr] = $.type(ID).optional.get(params.userId);
|
||||
if (userIdErr) return rej('invalid userId param');
|
||||
|
||||
// Get 'userIds' parameter
|
||||
const [userIds, userIdsErr] = $.arr($.type(ID)).optional.get(params.userIds);
|
||||
if (userIdsErr) return rej('invalid userIds param');
|
||||
|
||||
// Get 'username' parameter
|
||||
const [username, usernameErr] = $.str.optional.get(params.username);
|
||||
if (usernameErr) return rej('invalid username param');
|
||||
|
||||
// Get 'host' parameter
|
||||
const [host, hostErr] = $.str.optional.nullable.get(params.host);
|
||||
if (hostErr) return rej('invalid host param');
|
||||
|
||||
if (userIds) {
|
||||
if (ps.userIds) {
|
||||
const users = await User.find({
|
||||
_id: {
|
||||
$in: userIds
|
||||
$in: ps.userIds
|
||||
}
|
||||
});
|
||||
|
||||
@ -38,17 +57,17 @@ export default (params: any, me: ILocalUser) => new Promise(async (res, rej) =>
|
||||
}))));
|
||||
} else {
|
||||
// Lookup user
|
||||
if (typeof host === 'string') {
|
||||
if (typeof ps.host === 'string') {
|
||||
try {
|
||||
user = await resolveRemoteUser(username, host, cursorOption);
|
||||
user = await resolveRemoteUser(ps.username, ps.host, cursorOption);
|
||||
} catch (e) {
|
||||
console.warn(`failed to resolve remote user: ${e}`);
|
||||
return rej('failed to resolve remote user');
|
||||
}
|
||||
} else {
|
||||
const q: any = userId !== undefined
|
||||
? { _id: userId }
|
||||
: { usernameLower: username.toLowerCase(), host: null };
|
||||
const q: any = ps.userId != null
|
||||
? { _id: ps.userId }
|
||||
: { usernameLower: ps.username.toLowerCase(), host: null };
|
||||
|
||||
user = await User.findOne(q, cursorOption);
|
||||
|
||||
@ -64,7 +83,7 @@ export default (params: any, me: ILocalUser) => new Promise(async (res, rej) =>
|
||||
|
||||
if (isRemoteUser(user)) {
|
||||
if (user.updatedAt == null || Date.now() - user.updatedAt.getTime() > 1000 * 60 * 60 * 24) {
|
||||
resolveRemoteUser(username, host, { }, true);
|
||||
resolveRemoteUser(ps.username, ps.host, { }, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user