diff options
| author | syuilo <Syuilotan@yahoo.co.jp> | 2019-02-22 11:46:58 +0900 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-02-22 11:46:58 +0900 |
| commit | 2756f553c68082342a784ef716c62da6cea6f3ca (patch) | |
| tree | 1e0364ca9ddc1fd88e311f0687746f44e007effd /src/server/api/endpoints/users | |
| parent | Update CHANGELOG.md (diff) | |
| download | sharkey-2756f553c68082342a784ef716c62da6cea6f3ca.tar.gz sharkey-2756f553c68082342a784ef716c62da6cea6f3ca.tar.bz2 sharkey-2756f553c68082342a784ef716c62da6cea6f3ca.zip | |
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
* :v:
* Fix
Diffstat (limited to 'src/server/api/endpoints/users')
| -rw-r--r-- | src/server/api/endpoints/users/followers.ts | 20 | ||||
| -rw-r--r-- | src/server/api/endpoints/users/following.ts | 20 | ||||
| -rw-r--r-- | src/server/api/endpoints/users/get_frequently_replied_users.ts | 19 | ||||
| -rw-r--r-- | src/server/api/endpoints/users/lists/create.ts | 8 | ||||
| -rw-r--r-- | src/server/api/endpoints/users/lists/delete.ts | 17 | ||||
| -rw-r--r-- | src/server/api/endpoints/users/lists/list.ts | 7 | ||||
| -rw-r--r-- | src/server/api/endpoints/users/lists/pull.ts | 25 | ||||
| -rw-r--r-- | src/server/api/endpoints/users/lists/push.ts | 33 | ||||
| -rw-r--r-- | src/server/api/endpoints/users/lists/show.ts | 17 | ||||
| -rw-r--r-- | src/server/api/endpoints/users/lists/update.ts | 19 | ||||
| -rw-r--r-- | src/server/api/endpoints/users/notes.ts | 58 | ||||
| -rw-r--r-- | src/server/api/endpoints/users/recommendation.ts | 51 | ||||
| -rw-r--r-- | src/server/api/endpoints/users/relation.ts | 6 | ||||
| -rw-r--r-- | src/server/api/endpoints/users/report-abuse.ts | 34 | ||||
| -rw-r--r-- | src/server/api/endpoints/users/search.ts | 6 | ||||
| -rw-r--r-- | src/server/api/endpoints/users/show.ts | 44 |
16 files changed, 237 insertions, 147 deletions
diff --git a/src/server/api/endpoints/users/followers.ts b/src/server/api/endpoints/users/followers.ts index 2f7f1af6a5..cb5b047626 100644 --- a/src/server/api/endpoints/users/followers.ts +++ b/src/server/api/endpoints/users/followers.ts @@ -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, - }); -})); + }; +}); diff --git a/src/server/api/endpoints/users/following.ts b/src/server/api/endpoints/users/following.ts index 1485a63f24..04abe5f4b3 100644 --- a/src/server/api/endpoints/users/following.ts +++ b/src/server/api/endpoints/users/following.ts @@ -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, - }); -})); + }; +}); diff --git a/src/server/api/endpoints/users/get_frequently_replied_users.ts b/src/server/api/endpoints/users/get_frequently_replied_users.ts index e897fe8db2..b20d1ef69e 100644 --- a/src/server/api/endpoints/users/get_frequently_replied_users.ts +++ b/src/server/api/endpoints/users/get_frequently_replied_users.ts @@ -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; +}); diff --git a/src/server/api/endpoints/users/lists/create.ts b/src/server/api/endpoints/users/lists/create.ts index d93cf13d94..a3d91b6c25 100644 --- a/src/server/api/endpoints/users/lists/create.ts +++ b/src/server/api/endpoints/users/lists/create.ts @@ -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); +}); diff --git a/src/server/api/endpoints/users/lists/delete.ts b/src/server/api/endpoints/users/lists/delete.ts index 8d297198c9..6aaf4701d4 100644 --- a/src/server/api/endpoints/users/lists/delete.ts +++ b/src/server/api/endpoints/users/lists/delete.ts @@ -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(); -})); +}); diff --git a/src/server/api/endpoints/users/lists/list.ts b/src/server/api/endpoints/users/lists/list.ts index 8f9775e19b..5bd662878d 100644 --- a/src/server/api/endpoints/users/lists/list.ts +++ b/src/server/api/endpoints/users/lists/list.ts @@ -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))); +}); diff --git a/src/server/api/endpoints/users/lists/pull.ts b/src/server/api/endpoints/users/lists/pull.ts index 86eaa1dd8d..416c1b4b2d 100644 --- a/src/server/api/endpoints/users/lists/pull.ts +++ b/src/server/api/endpoints/users/lists/pull.ts @@ -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)); -})); +}); diff --git a/src/server/api/endpoints/users/lists/push.ts b/src/server/api/endpoints/users/lists/push.ts index 6e2dbed518..90dd2aa045 100644 --- a/src/server/api/endpoints/users/lists/push.ts +++ b/src/server/api/endpoints/users/lists/push.ts @@ -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); } -})); +}); diff --git a/src/server/api/endpoints/users/lists/show.ts b/src/server/api/endpoints/users/lists/show.ts index c508659a15..3bd8ce6573 100644 --- a/src/server/api/endpoints/users/lists/show.ts +++ b/src/server/api/endpoints/users/lists/show.ts @@ -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); +}); diff --git a/src/server/api/endpoints/users/lists/update.ts b/src/server/api/endpoints/users/lists/update.ts index 79a7da5658..842ae189ee 100644 --- a/src/server/api/endpoints/users/lists/update.ts +++ b/src/server/api/endpoints/users/lists/update.ts @@ -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); +}); diff --git a/src/server/api/endpoints/users/notes.ts b/src/server/api/endpoints/users/notes.ts index 5c776e48e2..98d67e865a 100644 --- a/src/server/api/endpoints/users/notes.ts +++ b/src/server/api/endpoints/users/notes.ts @@ -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が指定されている場合のみ有効)' } }, - } -}; - -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'; + errors: { + noSuchUser: { + message: 'No such user.', + code: 'NO_SUCH_USER', + id: '27e494ba-2ac2-48e8-893b-10d4d8c2387b' + } } +}; - 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); +}); diff --git a/src/server/api/endpoints/users/recommendation.ts b/src/server/api/endpoints/users/recommendation.ts index e9f0107716..dc37bc56ba 100644 --- a/src/server/api/endpoints/users/recommendation.ts +++ b/src/server/api/endpoints/users/recommendation.ts @@ -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; diff --git a/src/server/api/endpoints/users/relation.ts b/src/server/api/endpoints/users/relation.ts index 43d5e70640..5b7b4d8e4d 100644 --- a/src/server/api/endpoints/users/relation.ts +++ b/src/server/api/endpoints/users/relation.ts @@ -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]; +}); diff --git a/src/server/api/endpoints/users/report-abuse.ts b/src/server/api/endpoints/users/report-abuse.ts index c592e5cfd4..32a2393493 100644 --- a/src/server/api/endpoints/users/report-abuse.ts +++ b/src/server/api/endpoints/users/report-abuse.ts @@ -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(); -})); +}); diff --git a/src/server/api/endpoints/users/search.ts b/src/server/api/endpoints/users/search.ts index 5dc1e4aeab..6fd390f283 100644 --- a/src/server/api/endpoints/users/search.ts +++ b/src/server/api/endpoints/users/search.ts @@ -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 }))); +}); diff --git a/src/server/api/endpoints/users/show.ts b/src/server/api/endpoints/users/show.ts index 025598b8ff..4f870b8b92 100644 --- a/src/server/api/endpoints/users/show.ts +++ b/src/server/api/endpoints/users/show.ts @@ -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 + }); } -})); +}); |