Improve error handling of API (#4345)
* wip
* wip
* wip
* Update attached_notes.ts
* wip
* Refactor
* wip
* wip
* wip
* wip
* wip
* wip
* wip
* wip
* Update call.ts
* wip
* wip
* wip
* wip
* wip
* wip
* wip
* wip
* wip
* wip
* wip
* wip
* wip
* wip
* wip
* wip
* ✌️
* Fix
This commit is contained in:
@@ -5,6 +5,7 @@ import Following from '../../../../models/following';
|
||||
import { pack } from '../../../../models/user';
|
||||
import { getFriendIds } from '../../common/get-friends';
|
||||
import define from '../../define';
|
||||
import { ApiError } from '../../error';
|
||||
|
||||
export const meta = {
|
||||
desc: {
|
||||
@@ -47,10 +48,18 @@ export const meta = {
|
||||
validator: $.optional.bool,
|
||||
default: false,
|
||||
}
|
||||
},
|
||||
|
||||
errors: {
|
||||
noSuchUser: {
|
||||
message: 'No such user.',
|
||||
code: 'NO_SUCH_USER',
|
||||
id: '27fa5435-88ab-43de-9360-387de88727cd'
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
export default define(meta, (ps, me) => new Promise(async (res, rej) => {
|
||||
export default define(meta, async (ps, me) => {
|
||||
const q: any = ps.userId != null
|
||||
? { _id: ps.userId }
|
||||
: { usernameLower: ps.username.toLowerCase(), host: ps.host };
|
||||
@@ -58,10 +67,9 @@ export default define(meta, (ps, me) => new Promise(async (res, rej) => {
|
||||
const user = await User.findOne(q);
|
||||
|
||||
if (user === null) {
|
||||
return rej('user not found');
|
||||
throw new ApiError(meta.errors.noSuchUser);
|
||||
}
|
||||
|
||||
// Construct query
|
||||
const query = {
|
||||
followeeId: user._id
|
||||
} as any;
|
||||
@@ -98,8 +106,8 @@ export default define(meta, (ps, me) => new Promise(async (res, rej) => {
|
||||
|
||||
const users = await Promise.all(following.map(f => pack(f.followerId, me, { detail: true })));
|
||||
|
||||
res({
|
||||
return {
|
||||
users: users,
|
||||
next: inStock ? following[following.length - 1]._id : null,
|
||||
});
|
||||
}));
|
||||
};
|
||||
});
|
||||
|
||||
@@ -5,6 +5,7 @@ import Following from '../../../../models/following';
|
||||
import { pack } from '../../../../models/user';
|
||||
import { getFriendIds } from '../../common/get-friends';
|
||||
import define from '../../define';
|
||||
import { ApiError } from '../../error';
|
||||
|
||||
export const meta = {
|
||||
desc: {
|
||||
@@ -47,10 +48,18 @@ export const meta = {
|
||||
validator: $.optional.bool,
|
||||
default: false,
|
||||
}
|
||||
},
|
||||
|
||||
errors: {
|
||||
noSuchUser: {
|
||||
message: 'No such user.',
|
||||
code: 'NO_SUCH_USER',
|
||||
id: '63e4aba4-4156-4e53-be25-c9559e42d71b'
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
export default define(meta, (ps, me) => new Promise(async (res, rej) => {
|
||||
export default define(meta, async (ps, me) => {
|
||||
const q: any = ps.userId != null
|
||||
? { _id: ps.userId }
|
||||
: { usernameLower: ps.username.toLowerCase(), host: ps.host };
|
||||
@@ -58,10 +67,9 @@ export default define(meta, (ps, me) => new Promise(async (res, rej) => {
|
||||
const user = await User.findOne(q);
|
||||
|
||||
if (user === null) {
|
||||
return rej('user not found');
|
||||
throw new ApiError(meta.errors.noSuchUser);
|
||||
}
|
||||
|
||||
// Construct query
|
||||
const query = {
|
||||
followerId: user._id
|
||||
} as any;
|
||||
@@ -98,8 +106,8 @@ export default define(meta, (ps, me) => new Promise(async (res, rej) => {
|
||||
|
||||
const users = await Promise.all(following.map(f => pack(f.followeeId, me, { detail: true })));
|
||||
|
||||
res({
|
||||
return {
|
||||
users: users,
|
||||
next: inStock ? following[following.length - 1]._id : null,
|
||||
});
|
||||
}));
|
||||
};
|
||||
});
|
||||
|
||||
@@ -5,6 +5,7 @@ import User, { pack } from '../../../../models/user';
|
||||
import define from '../../define';
|
||||
import { maximum } from '../../../../prelude/array';
|
||||
import { getHideUserIds } from '../../common/get-hide-users';
|
||||
import { ApiError } from '../../error';
|
||||
|
||||
export const meta = {
|
||||
requireCredential: false,
|
||||
@@ -23,10 +24,18 @@ export const meta = {
|
||||
validator: $.optional.num.range(1, 100),
|
||||
default: 10
|
||||
},
|
||||
},
|
||||
|
||||
errors: {
|
||||
noSuchUser: {
|
||||
message: 'No such user.',
|
||||
code: 'NO_SUCH_USER',
|
||||
id: 'e6965129-7b2a-40a4-bae2-cd84cd434822'
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
export default define(meta, (ps, me) => new Promise(async (res, rej) => {
|
||||
export default define(meta, async (ps, me) => {
|
||||
// Lookup user
|
||||
const user = await User.findOne({
|
||||
_id: ps.userId
|
||||
@@ -37,7 +46,7 @@ export default define(meta, (ps, me) => new Promise(async (res, rej) => {
|
||||
});
|
||||
|
||||
if (user === null) {
|
||||
return rej('user not found');
|
||||
throw new ApiError(meta.errors.noSuchUser);
|
||||
}
|
||||
|
||||
// Fetch recent notes
|
||||
@@ -60,7 +69,7 @@ export default define(meta, (ps, me) => new Promise(async (res, rej) => {
|
||||
|
||||
// 投稿が少なかったら中断
|
||||
if (recentNotes.length === 0) {
|
||||
return res([]);
|
||||
return [];
|
||||
}
|
||||
|
||||
const hideUserIds = await getHideUserIds(me);
|
||||
@@ -106,5 +115,5 @@ export default define(meta, (ps, me) => new Promise(async (res, rej) => {
|
||||
weight: repliedUsers[user] / peak
|
||||
})));
|
||||
|
||||
res(repliesObj);
|
||||
}));
|
||||
return repliesObj;
|
||||
});
|
||||
|
||||
@@ -19,8 +19,7 @@ export const meta = {
|
||||
}
|
||||
};
|
||||
|
||||
export default define(meta, (ps, user) => new Promise(async (res, rej) => {
|
||||
// insert
|
||||
export default define(meta, async (ps, user) => {
|
||||
const userList = await UserList.insert({
|
||||
createdAt: new Date(),
|
||||
userId: user._id,
|
||||
@@ -28,6 +27,5 @@ export default define(meta, (ps, user) => new Promise(async (res, rej) => {
|
||||
userIds: []
|
||||
});
|
||||
|
||||
// Response
|
||||
res(await pack(userList));
|
||||
}));
|
||||
return await pack(userList);
|
||||
});
|
||||
|
||||
@@ -2,6 +2,7 @@ import $ from 'cafy';
|
||||
import ID, { transform } from '../../../../../misc/cafy-id';
|
||||
import UserList from '../../../../../models/user-list';
|
||||
import define from '../../../define';
|
||||
import { ApiError } from '../../../error';
|
||||
|
||||
export const meta = {
|
||||
desc: {
|
||||
@@ -22,22 +23,28 @@ export const meta = {
|
||||
'en-US': 'ID of target user list'
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
errors: {
|
||||
noSuchList: {
|
||||
message: 'No such list.',
|
||||
code: 'NO_SUCH_LIST',
|
||||
id: '78436795-db79-42f5-b1e2-55ea2cf19166'
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
export default define(meta, (ps, user) => new Promise(async (res, rej) => {
|
||||
export default define(meta, async (ps, user) => {
|
||||
const userList = await UserList.findOne({
|
||||
_id: ps.listId,
|
||||
userId: user._id
|
||||
});
|
||||
|
||||
if (userList == null) {
|
||||
return rej('list not found');
|
||||
throw new ApiError(meta.errors.noSuchList);
|
||||
}
|
||||
|
||||
await UserList.remove({
|
||||
_id: userList._id
|
||||
});
|
||||
|
||||
res();
|
||||
}));
|
||||
});
|
||||
|
||||
@@ -11,11 +11,10 @@ export const meta = {
|
||||
kind: 'account-read'
|
||||
};
|
||||
|
||||
export default define(meta, (ps, me) => new Promise(async (res, rej) => {
|
||||
// Fetch lists
|
||||
export default define(meta, async (ps, me) => {
|
||||
const userLists = await UserList.find({
|
||||
userId: me._id,
|
||||
});
|
||||
|
||||
res(await Promise.all(userLists.map(x => pack(x))));
|
||||
}));
|
||||
return await Promise.all(userLists.map(x => pack(x)));
|
||||
});
|
||||
|
||||
@@ -4,6 +4,7 @@ import UserList from '../../../../../models/user-list';
|
||||
import User, { pack as packUser } from '../../../../../models/user';
|
||||
import { publishUserListStream } from '../../../../../services/stream';
|
||||
import define from '../../../define';
|
||||
import { ApiError } from '../../../error';
|
||||
|
||||
export const meta = {
|
||||
desc: {
|
||||
@@ -29,10 +30,24 @@ export const meta = {
|
||||
'en-US': 'Target user ID'
|
||||
}
|
||||
},
|
||||
},
|
||||
|
||||
errors: {
|
||||
noSuchList: {
|
||||
message: 'No such list.',
|
||||
code: 'NO_SUCH_LIST',
|
||||
id: '7f44670e-ab16-43b8-b4c1-ccd2ee89cc02'
|
||||
},
|
||||
|
||||
noSuchUser: {
|
||||
message: 'No such user.',
|
||||
code: 'NO_SUCH_USER',
|
||||
id: '588e7f72-c744-4a61-b180-d354e912bda2'
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
export default define(meta, (ps, me) => new Promise(async (res, rej) => {
|
||||
export default define(meta, async (ps, me) => {
|
||||
// Fetch the list
|
||||
const userList = await UserList.findOne({
|
||||
_id: ps.listId,
|
||||
@@ -40,7 +55,7 @@ export default define(meta, (ps, me) => new Promise(async (res, rej) => {
|
||||
});
|
||||
|
||||
if (userList == null) {
|
||||
return rej('list not found');
|
||||
throw new ApiError(meta.errors.noSuchList);
|
||||
}
|
||||
|
||||
// Fetch the user
|
||||
@@ -49,7 +64,7 @@ export default define(meta, (ps, me) => new Promise(async (res, rej) => {
|
||||
});
|
||||
|
||||
if (user == null) {
|
||||
return rej('user not found');
|
||||
throw new ApiError(meta.errors.noSuchUser);
|
||||
}
|
||||
|
||||
// Pull the user
|
||||
@@ -59,7 +74,5 @@ export default define(meta, (ps, me) => new Promise(async (res, rej) => {
|
||||
}
|
||||
});
|
||||
|
||||
res();
|
||||
|
||||
publishUserListStream(userList._id, 'userRemoved', await packUser(user));
|
||||
}));
|
||||
});
|
||||
|
||||
@@ -7,6 +7,7 @@ import { renderActivity } from '../../../../../remote/activitypub/renderer';
|
||||
import renderFollow from '../../../../../remote/activitypub/renderer/follow';
|
||||
import { deliver } from '../../../../../queue';
|
||||
import define from '../../../define';
|
||||
import { ApiError } from '../../../error';
|
||||
|
||||
export const meta = {
|
||||
desc: {
|
||||
@@ -32,10 +33,30 @@ export const meta = {
|
||||
'en-US': 'Target user ID'
|
||||
}
|
||||
},
|
||||
},
|
||||
|
||||
errors: {
|
||||
noSuchList: {
|
||||
message: 'No such list.',
|
||||
code: 'NO_SUCH_LIST',
|
||||
id: '2214501d-ac96-4049-b717-91e42272a711'
|
||||
},
|
||||
|
||||
noSuchUser: {
|
||||
message: 'No such user.',
|
||||
code: 'NO_SUCH_USER',
|
||||
id: 'a89abd3d-f0bc-4cce-beb1-2f446f4f1e6a'
|
||||
},
|
||||
|
||||
alreadyAdded: {
|
||||
message: 'That user has already been added to that list.',
|
||||
code: 'ALREADY_ADDED',
|
||||
id: '1de7c884-1595-49e9-857e-61f12f4d4fc5'
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
export default define(meta, (ps, me) => new Promise(async (res, rej) => {
|
||||
export default define(meta, async (ps, me) => {
|
||||
// Fetch the list
|
||||
const userList = await UserList.findOne({
|
||||
_id: ps.listId,
|
||||
@@ -43,7 +64,7 @@ export default define(meta, (ps, me) => new Promise(async (res, rej) => {
|
||||
});
|
||||
|
||||
if (userList == null) {
|
||||
return rej('list not found');
|
||||
throw new ApiError(meta.errors.noSuchList);
|
||||
}
|
||||
|
||||
// Fetch the user
|
||||
@@ -52,11 +73,11 @@ export default define(meta, (ps, me) => new Promise(async (res, rej) => {
|
||||
});
|
||||
|
||||
if (user == null) {
|
||||
return rej('user not found');
|
||||
throw new ApiError(meta.errors.noSuchUser);
|
||||
}
|
||||
|
||||
if (userList.userIds.map(id => id.toHexString()).includes(user._id.toHexString())) {
|
||||
return rej('the user already added');
|
||||
throw new ApiError(meta.errors.alreadyAdded);
|
||||
}
|
||||
|
||||
// Push the user
|
||||
@@ -66,8 +87,6 @@ export default define(meta, (ps, me) => new Promise(async (res, rej) => {
|
||||
}
|
||||
});
|
||||
|
||||
res();
|
||||
|
||||
publishUserListStream(userList._id, 'userAdded', await packUser(user));
|
||||
|
||||
// このインスタンス内にこのリモートユーザーをフォローしているユーザーがいなくても投稿を受け取るためにダミーのユーザーがフォローしたということにする
|
||||
@@ -76,4 +95,4 @@ export default define(meta, (ps, me) => new Promise(async (res, rej) => {
|
||||
const content = renderActivity(renderFollow(proxy, user));
|
||||
deliver(proxy, content, user.inbox);
|
||||
}
|
||||
}));
|
||||
});
|
||||
|
||||
@@ -2,6 +2,7 @@ import $ from 'cafy';
|
||||
import ID, { transform } from '../../../../../misc/cafy-id';
|
||||
import UserList, { pack } from '../../../../../models/user-list';
|
||||
import define from '../../../define';
|
||||
import { ApiError } from '../../../error';
|
||||
|
||||
export const meta = {
|
||||
desc: {
|
||||
@@ -18,10 +19,18 @@ export const meta = {
|
||||
validator: $.type(ID),
|
||||
transform: transform,
|
||||
},
|
||||
},
|
||||
|
||||
errors: {
|
||||
noSuchList: {
|
||||
message: 'No such list.',
|
||||
code: 'NO_SUCH_LIST',
|
||||
id: '7bc05c21-1d7a-41ae-88f1-66820f4dc686'
|
||||
},
|
||||
}
|
||||
};
|
||||
|
||||
export default define(meta, (ps, me) => new Promise(async (res, rej) => {
|
||||
export default define(meta, async (ps, me) => {
|
||||
// Fetch the list
|
||||
const userList = await UserList.findOne({
|
||||
_id: ps.listId,
|
||||
@@ -29,8 +38,8 @@ export default define(meta, (ps, me) => new Promise(async (res, rej) => {
|
||||
});
|
||||
|
||||
if (userList == null) {
|
||||
return rej('list not found');
|
||||
throw new ApiError(meta.errors.noSuchList);
|
||||
}
|
||||
|
||||
res(await pack(userList));
|
||||
}));
|
||||
return await pack(userList);
|
||||
});
|
||||
|
||||
@@ -2,6 +2,7 @@ import $ from 'cafy';
|
||||
import ID, { transform } from '../../../../../misc/cafy-id';
|
||||
import UserList, { pack } from '../../../../../models/user-list';
|
||||
import define from '../../../define';
|
||||
import { ApiError } from '../../../error';
|
||||
|
||||
export const meta = {
|
||||
desc: {
|
||||
@@ -30,10 +31,18 @@ export const meta = {
|
||||
'en-US': 'name of this user list'
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
errors: {
|
||||
noSuchList: {
|
||||
message: 'No such list.',
|
||||
code: 'NO_SUCH_LIST',
|
||||
id: '796666fe-3dff-4d39-becb-8a5932c1d5b7'
|
||||
},
|
||||
}
|
||||
};
|
||||
|
||||
export default define(meta, (ps, user) => new Promise(async (res, rej) => {
|
||||
export default define(meta, async (ps, user) => {
|
||||
// Fetch the list
|
||||
const userList = await UserList.findOne({
|
||||
_id: ps.listId,
|
||||
@@ -41,16 +50,14 @@ export default define(meta, (ps, user) => new Promise(async (res, rej) => {
|
||||
});
|
||||
|
||||
if (userList == null) {
|
||||
return rej('list not found');
|
||||
throw new ApiError(meta.errors.noSuchList);
|
||||
}
|
||||
|
||||
// update
|
||||
await UserList.update({ _id: userList._id }, {
|
||||
$set: {
|
||||
title: ps.title
|
||||
}
|
||||
});
|
||||
|
||||
// Response
|
||||
res(await pack(userList._id));
|
||||
}));
|
||||
return await pack(userList._id);
|
||||
});
|
||||
|
||||
@@ -1,11 +1,10 @@
|
||||
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 from '../../../../models/user';
|
||||
import define from '../../define';
|
||||
import { countIf } from '../../../../prelude/array';
|
||||
import Following from '../../../../models/following';
|
||||
import { ApiError } from '../../error';
|
||||
|
||||
export const meta = {
|
||||
desc: {
|
||||
@@ -14,7 +13,7 @@ export const meta = {
|
||||
|
||||
params: {
|
||||
userId: {
|
||||
validator: $.optional.type(ID),
|
||||
validator: $.type(ID),
|
||||
transform: transform,
|
||||
desc: {
|
||||
'ja-JP': '対象のユーザーのID',
|
||||
@@ -22,17 +21,6 @@ export const meta = {
|
||||
}
|
||||
},
|
||||
|
||||
username: {
|
||||
validator: $.optional.str,
|
||||
desc: {
|
||||
'ja-JP': 'ユーザー名'
|
||||
}
|
||||
},
|
||||
|
||||
host: {
|
||||
validator: $.optional.nullable.str,
|
||||
},
|
||||
|
||||
includeReplies: {
|
||||
validator: $.optional.bool,
|
||||
default: true,
|
||||
@@ -134,32 +122,27 @@ export const meta = {
|
||||
'ja-JP': 'true にすると、NSFW指定されたファイルを除外します(fileTypeが指定されている場合のみ有効)'
|
||||
}
|
||||
},
|
||||
},
|
||||
|
||||
errors: {
|
||||
noSuchUser: {
|
||||
message: 'No such user.',
|
||||
code: 'NO_SUCH_USER',
|
||||
id: '27e494ba-2ac2-48e8-893b-10d4d8c2387b'
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
export default define(meta, (ps, me) => new Promise(async (res, rej) => {
|
||||
if (ps.userId === undefined && ps.username === undefined) {
|
||||
return rej('userId or username is required');
|
||||
}
|
||||
|
||||
// Check if only one of sinceId, untilId, sinceDate, untilDate specified
|
||||
if (countIf(x => x != null, [ps.sinceId, ps.untilId, ps.sinceDate, ps.untilDate]) > 1) {
|
||||
throw 'only one of sinceId, untilId, sinceDate, untilDate can be specified';
|
||||
}
|
||||
|
||||
const q = ps.userId != null
|
||||
? { _id: ps.userId }
|
||||
: { usernameLower: ps.username.toLowerCase(), host: getHostLower(ps.host) } ;
|
||||
|
||||
export default define(meta, async (ps, me) => {
|
||||
// Lookup user
|
||||
const user = await User.findOne(q, {
|
||||
const user = await User.findOne({ _id: ps.userId }, {
|
||||
fields: {
|
||||
_id: true
|
||||
}
|
||||
});
|
||||
|
||||
if (user === null) {
|
||||
return rej('user not found');
|
||||
throw new ApiError(meta.errors.noSuchUser);
|
||||
}
|
||||
|
||||
const isFollowing = me == null ? false : ((await Following.findOne({
|
||||
@@ -259,13 +242,10 @@ export default define(meta, (ps, me) => new Promise(async (res, rej) => {
|
||||
}
|
||||
//#endregion
|
||||
|
||||
// Issue query
|
||||
const notes = await Note
|
||||
.find(query, {
|
||||
limit: ps.limit,
|
||||
sort: sort
|
||||
});
|
||||
const notes = await Note.find(query, {
|
||||
limit: ps.limit,
|
||||
sort: sort
|
||||
});
|
||||
|
||||
// Serialize
|
||||
res(await packMany(notes, me));
|
||||
}));
|
||||
return await packMany(notes, me);
|
||||
});
|
||||
|
||||
@@ -32,7 +32,7 @@ export const meta = {
|
||||
}
|
||||
};
|
||||
|
||||
export default define(meta, (ps, me) => new Promise(async (res, rej) => {
|
||||
export default define(meta, async (ps, me) => {
|
||||
const instance = await fetchMeta();
|
||||
|
||||
if (instance.enableExternalUserRecommendation) {
|
||||
@@ -48,7 +48,7 @@ export default define(meta, (ps, me) => new Promise(async (res, rej) => {
|
||||
.replace('{{limit}}', limit.toString())
|
||||
.replace('{{offset}}', offset.toString());
|
||||
|
||||
request({
|
||||
const users = await request({
|
||||
url: url,
|
||||
proxy: config.proxy,
|
||||
timeout: timeout,
|
||||
@@ -56,37 +56,36 @@ export default define(meta, (ps, me) => new Promise(async (res, rej) => {
|
||||
followRedirect: true,
|
||||
followAllRedirects: true
|
||||
})
|
||||
.then(body => convertUsers(body, me))
|
||||
.then(packed => res(packed))
|
||||
.catch(e => rej(e));
|
||||
.then(body => convertUsers(body, me));
|
||||
|
||||
return users;
|
||||
} else {
|
||||
// ID list of the user itself and other users who the user follows
|
||||
const followingIds = await getFriendIds(me._id);
|
||||
|
||||
// 隠すユーザーを取得
|
||||
const hideUserIds = await getHideUserIds(me);
|
||||
// 隠すユーザーを取得
|
||||
const hideUserIds = await getHideUserIds(me);
|
||||
|
||||
const users = await User
|
||||
.find({
|
||||
_id: {
|
||||
$nin: followingIds.concat(hideUserIds)
|
||||
},
|
||||
isLocked: { $ne: true },
|
||||
updatedAt: {
|
||||
$gte: new Date(Date.now() - ms('7days'))
|
||||
},
|
||||
host: null
|
||||
}, {
|
||||
limit: ps.limit,
|
||||
skip: ps.offset,
|
||||
sort: {
|
||||
followersCount: -1
|
||||
}
|
||||
});
|
||||
const users = await User.find({
|
||||
_id: {
|
||||
$nin: followingIds.concat(hideUserIds)
|
||||
},
|
||||
isLocked: { $ne: true },
|
||||
updatedAt: {
|
||||
$gte: new Date(Date.now() - ms('7days'))
|
||||
},
|
||||
host: null
|
||||
}, {
|
||||
limit: ps.limit,
|
||||
skip: ps.offset,
|
||||
sort: {
|
||||
followersCount: -1
|
||||
}
|
||||
});
|
||||
|
||||
res(await Promise.all(users.map(user => pack(user, me, { detail: true }))));
|
||||
return await Promise.all(users.map(user => pack(user, me, { detail: true })));
|
||||
}
|
||||
}));
|
||||
});
|
||||
|
||||
type IRecommendUser = {
|
||||
name: string;
|
||||
|
||||
@@ -21,10 +21,10 @@ export const meta = {
|
||||
}
|
||||
};
|
||||
|
||||
export default define(meta, (ps, me) => new Promise(async (res, rej) => {
|
||||
export default define(meta, async (ps, me) => {
|
||||
const ids = Array.isArray(ps.userId) ? ps.userId : [ps.userId];
|
||||
|
||||
const relations = await Promise.all(ids.map(id => getRelation(me._id, id)));
|
||||
|
||||
res(Array.isArray(ps.userId) ? relations : relations[0]);
|
||||
}));
|
||||
return Array.isArray(ps.userId) ? relations : relations[0];
|
||||
});
|
||||
|
||||
@@ -4,6 +4,7 @@ import define from '../../define';
|
||||
import User from '../../../../models/user';
|
||||
import AbuseUserReport from '../../../../models/abuse-user-report';
|
||||
import { publishAdminStream } from '../../../../services/stream';
|
||||
import { ApiError } from '../../error';
|
||||
|
||||
export const meta = {
|
||||
desc: {
|
||||
@@ -28,25 +29,45 @@ export const meta = {
|
||||
'ja-JP': '迷惑行為の詳細'
|
||||
}
|
||||
},
|
||||
},
|
||||
|
||||
errors: {
|
||||
noSuchUser: {
|
||||
message: 'No such user.',
|
||||
code: 'NO_SUCH_USER',
|
||||
id: '1acefcb5-0959-43fd-9685-b48305736cb5'
|
||||
},
|
||||
|
||||
cannotReportYourself: {
|
||||
message: 'Cannot report yourself.',
|
||||
code: 'CANNOT_REPORT_YOURSELF',
|
||||
id: '1e13149e-b1e8-43cf-902e-c01dbfcb202f'
|
||||
},
|
||||
|
||||
cannotReportAdmin: {
|
||||
message: 'Cannot report the admin.',
|
||||
code: 'CANNOT_REPORT_THE_ADMIN',
|
||||
id: '35e166f5-05fb-4f87-a2d5-adb42676d48f'
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
export default define(meta, (ps, me) => new Promise(async (res, rej) => {
|
||||
export default define(meta, async (ps, me) => {
|
||||
// Lookup user
|
||||
const user = await User.findOne({
|
||||
_id: ps.userId
|
||||
});
|
||||
|
||||
if (user === null) {
|
||||
return rej('user not found');
|
||||
throw new ApiError(meta.errors.noSuchUser);
|
||||
}
|
||||
|
||||
if (user._id.equals(me._id)) {
|
||||
return rej('cannot report yourself');
|
||||
throw new ApiError(meta.errors.cannotReportYourself);
|
||||
}
|
||||
|
||||
if (user.isAdmin) {
|
||||
return rej('cannot report admin');
|
||||
throw new ApiError(meta.errors.cannotReportAdmin);
|
||||
}
|
||||
|
||||
const report = await AbuseUserReport.insert({
|
||||
@@ -65,6 +86,7 @@ export default define(meta, (ps, me) => new Promise(async (res, rej) => {
|
||||
isModerator: true
|
||||
}]
|
||||
});
|
||||
|
||||
for (const moderator of moderators) {
|
||||
publishAdminStream(moderator._id, 'newAbuseUserReport', {
|
||||
id: report._id,
|
||||
@@ -74,6 +96,4 @@ export default define(meta, (ps, me) => new Promise(async (res, rej) => {
|
||||
});
|
||||
}
|
||||
}, 1);
|
||||
|
||||
res();
|
||||
}));
|
||||
});
|
||||
|
||||
@@ -52,7 +52,7 @@ export const meta = {
|
||||
},
|
||||
};
|
||||
|
||||
export default define(meta, (ps, me) => new Promise(async (res, rej) => {
|
||||
export default define(meta, async (ps, me) => {
|
||||
const isUsername = validateUsername(ps.query.replace('@', ''), !ps.localOnly);
|
||||
|
||||
let users: IUser[] = [];
|
||||
@@ -80,5 +80,5 @@ export default define(meta, (ps, me) => new Promise(async (res, rej) => {
|
||||
}
|
||||
}
|
||||
|
||||
res(await Promise.all(users.map(user => pack(user, me, { detail: ps.detail }))));
|
||||
}));
|
||||
return await Promise.all(users.map(user => pack(user, me, { detail: ps.detail })));
|
||||
});
|
||||
|
||||
@@ -4,6 +4,7 @@ import User, { pack, isRemoteUser } from '../../../../models/user';
|
||||
import resolveRemoteUser from '../../../../remote/resolve-user';
|
||||
import define from '../../define';
|
||||
import { apiLogger } from '../../logger';
|
||||
import { ApiError } from '../../error';
|
||||
|
||||
const cursorOption = { fields: { data: false } };
|
||||
|
||||
@@ -39,10 +40,25 @@ export const meta = {
|
||||
host: {
|
||||
validator: $.optional.nullable.str
|
||||
}
|
||||
},
|
||||
|
||||
errors: {
|
||||
failedToResolveRemoteUser: {
|
||||
message: 'Failed to resolve remote user.',
|
||||
code: 'FAILED_TO_RESOLVE_REMOTE_USER',
|
||||
id: 'ef7b9be4-9cba-4e6f-ab41-90ed171c7d3c',
|
||||
kind: 'server' as 'server'
|
||||
},
|
||||
|
||||
noSuchUser: {
|
||||
message: 'No such user.',
|
||||
code: 'NO_SUCH_USER',
|
||||
id: '4362f8dc-731f-4ad8-a694-be5a88922a24'
|
||||
},
|
||||
}
|
||||
};
|
||||
|
||||
export default define(meta, (ps, me) => new Promise(async (res, rej) => {
|
||||
export default define(meta, async (ps, me) => {
|
||||
let user;
|
||||
|
||||
if (ps.userIds) {
|
||||
@@ -52,18 +68,16 @@ export default define(meta, (ps, me) => new Promise(async (res, rej) => {
|
||||
}
|
||||
});
|
||||
|
||||
res(await Promise.all(users.map(u => pack(u, me, {
|
||||
return await Promise.all(users.map(u => pack(u, me, {
|
||||
detail: true
|
||||
}))));
|
||||
})));
|
||||
} else {
|
||||
// Lookup user
|
||||
if (typeof ps.host === 'string') {
|
||||
try {
|
||||
user = await resolveRemoteUser(ps.username, ps.host, cursorOption);
|
||||
} catch (e) {
|
||||
user = await resolveRemoteUser(ps.username, ps.host, cursorOption).catch(e => {
|
||||
apiLogger.warn(`failed to resolve remote user: ${e}`);
|
||||
return rej('failed to resolve remote user');
|
||||
}
|
||||
throw new ApiError(meta.errors.failedToResolveRemoteUser);
|
||||
});
|
||||
} else {
|
||||
const q: any = ps.userId != null
|
||||
? { _id: ps.userId }
|
||||
@@ -73,18 +87,18 @@ export default define(meta, (ps, me) => new Promise(async (res, rej) => {
|
||||
}
|
||||
|
||||
if (user === null) {
|
||||
return rej('user not found');
|
||||
throw new ApiError(meta.errors.noSuchUser);
|
||||
}
|
||||
|
||||
// Send response
|
||||
res(await pack(user, me, {
|
||||
detail: true
|
||||
}));
|
||||
|
||||
// ユーザー情報更新
|
||||
if (isRemoteUser(user)) {
|
||||
if (user.lastFetchedAt == null || Date.now() - user.lastFetchedAt.getTime() > 1000 * 60 * 60 * 24) {
|
||||
resolveRemoteUser(ps.username, ps.host, { }, true);
|
||||
}
|
||||
}
|
||||
|
||||
return await pack(user, me, {
|
||||
detail: true
|
||||
});
|
||||
}
|
||||
}));
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user