From 2756f553c68082342a784ef716c62da6cea6f3ca Mon Sep 17 00:00:00 2001 From: syuilo Date: Fri, 22 Feb 2019 11:46:58 +0900 Subject: 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 --- .../api/endpoints/notes/polls/recommendation.ts | 49 +++++++++++----------- src/server/api/endpoints/notes/polls/vote.ts | 46 ++++++++++++++++---- 2 files changed, 61 insertions(+), 34 deletions(-) (limited to 'src/server/api/endpoints/notes/polls') diff --git a/src/server/api/endpoints/notes/polls/recommendation.ts b/src/server/api/endpoints/notes/polls/recommendation.ts index 8e11e65296..61a1840b88 100644 --- a/src/server/api/endpoints/notes/polls/recommendation.ts +++ b/src/server/api/endpoints/notes/polls/recommendation.ts @@ -25,7 +25,7 @@ export const meta = { } }; -export default define(meta, (ps, user) => new Promise(async (res, rej) => { +export default define(meta, async (ps, user) => { // Get votes const votes = await Vote.find({ userId: user._id @@ -41,29 +41,28 @@ export default define(meta, (ps, user) => new Promise(async (res, rej) => { // 隠すユーザーを取得 const hideUserIds = await getHideUserIds(user); - const notes = await Note - .find({ - '_user.host': null, - _id: { - $nin: nin - }, - userId: { - $ne: user._id, - $nin: hideUserIds - }, - poll: { - $exists: true, - $ne: null - } - }, { - limit: ps.limit, - skip: ps.offset, - sort: { - _id: -1 - } - }); + const notes = await Note.find({ + '_user.host': null, + _id: { + $nin: nin + }, + userId: { + $ne: user._id, + $nin: hideUserIds + }, + poll: { + $exists: true, + $ne: null + } + }, { + limit: ps.limit, + skip: ps.offset, + sort: { + _id: -1 + } + }); - res(await Promise.all(notes.map(note => pack(note, user, { + return await Promise.all(notes.map(note => pack(note, user, { detail: true - })))); -})); + }))); +}); diff --git a/src/server/api/endpoints/notes/polls/vote.ts b/src/server/api/endpoints/notes/polls/vote.ts index 68c3898e05..fe0fffec61 100644 --- a/src/server/api/endpoints/notes/polls/vote.ts +++ b/src/server/api/endpoints/notes/polls/vote.ts @@ -9,6 +9,7 @@ import notify from '../../../../../services/create-notification'; import define from '../../../define'; import createNote from '../../../../../services/note/create'; import User from '../../../../../models/user'; +import { ApiError } from '../../../error'; export const meta = { desc: { @@ -33,24 +34,52 @@ export const meta = { choice: { validator: $.num }, + }, + + errors: { + noSuchNote: { + message: 'No such note.', + code: 'NO_SUCH_NOTE', + id: 'ecafbd2e-c283-4d6d-aecb-1a0a33b75396' + }, + + noPoll: { + message: 'The note does not attach a poll.', + code: 'NO_POLL', + id: '5f979967-52d9-4314-a911-1c673727f92f' + }, + + invalidChoice: { + message: 'Choice ID is invalid.', + code: 'INVALID_CHOICE', + id: 'e0cc9a04-f2e8-41e4-a5f1-4127293260cc' + }, + + alreadyVoted: { + message: 'You have already voted.', + code: 'ALREADY_VOTED', + id: '0963fc77-efac-419b-9424-b391608dc6d8' + }, } }; -export default define(meta, (ps, user) => new Promise(async (res, rej) => { +export default define(meta, async (ps, user) => { // Get votee const note = await Note.findOne({ _id: ps.noteId }); if (note === null) { - return rej('note not found'); + throw new ApiError(meta.errors.noSuchNote); } if (note.poll == null) { - return rej('poll not found'); + throw new ApiError(meta.errors.noPoll); } - if (!note.poll.choices.some(x => x.id == ps.choice)) return rej('invalid choice param'); + if (!note.poll.choices.some(x => x.id == ps.choice)) { + throw new ApiError(meta.errors.invalidChoice); + } // if already voted const exist = await Vote.findOne({ @@ -59,7 +88,7 @@ export default define(meta, (ps, user) => new Promise(async (res, rej) => { }); if (exist !== null) { - return rej('already voted'); + throw new ApiError(meta.errors.alreadyVoted); } // Create vote @@ -70,9 +99,6 @@ export default define(meta, (ps, user) => new Promise(async (res, rej) => { choice: ps.choice }); - // Send response - res(); - const inc: any = {}; inc[`poll.choices.${note.poll.choices.findIndex(c => c.id == ps.choice)}.votes`] = 1; @@ -132,4 +158,6 @@ export default define(meta, (ps, user) => new Promise(async (res, rej) => { visibleUsers: [ pollOwner ], }); } -})); + + return; +}); -- cgit v1.2.3-freya