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:
syuilo 2019-02-22 11:46:58 +09:00 committed by GitHub
parent fc52e95ad0
commit 2756f553c6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
181 changed files with 2010 additions and 1322 deletions

View file

@ -27,12 +27,7 @@ export const meta = {
}
};
export default define(meta, (ps, user) => new Promise(async (res, rej) => {
// Check if both of sinceId and untilId is specified
if (ps.sinceId && ps.untilId) {
return rej('cannot set sinceId and untilId');
}
export default define(meta, async (ps, user) => {
const q: any = ps.my ? {
isStarted: true,
$or: [{
@ -65,8 +60,7 @@ export default define(meta, (ps, user) => new Promise(async (res, rej) => {
limit: ps.limit
});
// Reponse
res(Promise.all(games.map(async (g) => await pack(g, user, {
return await Promise.all(games.map((g) => pack(g, user, {
detail: false
}))));
}));
})));
});

View file

@ -3,6 +3,7 @@ import ID, { transform } from '../../../../../../misc/cafy-id';
import ReversiGame, { pack } from '../../../../../../models/games/reversi/game';
import Reversi from '../../../../../../games/reversi/core';
import define from '../../../../define';
import { ApiError } from '../../../../error';
export const meta = {
params: {
@ -10,14 +11,22 @@ export const meta = {
validator: $.type(ID),
transform: transform,
},
},
errors: {
noSuchGame: {
message: 'No such game.',
code: 'NO_SUCH_GAME',
id: 'f13a03db-fae1-46c9-87f3-43c8165419e1'
},
}
};
export default define(meta, (ps, user) => new Promise(async (res, rej) => {
export default define(meta, async (ps, user) => {
const game = await ReversiGame.findOne({ _id: ps.gameId });
if (game == null) {
return rej('game not found');
throw new ApiError(meta.errors.noSuchGame);
}
const o = new Reversi(game.settings.map, {
@ -31,8 +40,8 @@ export default define(meta, (ps, user) => new Promise(async (res, rej) => {
const packed = await pack(game, user);
res(Object.assign({
return Object.assign({
board: o.board,
turn: o.turn
}, packed));
}));
}, packed);
});

View file

@ -3,6 +3,7 @@ import ID, { transform } from '../../../../../../misc/cafy-id';
import ReversiGame, { pack } from '../../../../../../models/games/reversi/game';
import { publishReversiGameStream } from '../../../../../../services/stream';
import define from '../../../../define';
import { ApiError } from '../../../../error';
export const meta = {
desc: {
@ -19,22 +20,42 @@ export const meta = {
'ja-JP': '投了したい対局'
}
}
},
errors: {
noSuchGame: {
message: 'No such game.',
code: 'NO_SUCH_GAME',
id: 'ace0b11f-e0a6-4076-a30d-e8284c81b2df'
},
alreadyEnded: {
message: 'That game has already ended.',
code: 'ALREADY_ENDED',
id: '6c2ad4a6-cbf1-4a5b-b187-b772826cfc6d'
},
accessDenied: {
message: 'Access denied.',
code: 'ACCESS_DENIED',
id: '6e04164b-a992-4c93-8489-2123069973e1'
},
}
};
export default define(meta, (ps, user) => new Promise(async (res, rej) => {
export default define(meta, async (ps, user) => {
const game = await ReversiGame.findOne({ _id: ps.gameId });
if (game == null) {
return rej('game not found');
throw new ApiError(meta.errors.noSuchGame);
}
if (game.isEnded) {
return rej('this game is already ended');
throw new ApiError(meta.errors.alreadyEnded);
}
if (!game.user1Id.equals(user._id) && !game.user2Id.equals(user._id)) {
return rej('access denied');
throw new ApiError(meta.errors.accessDenied);
}
const winnerId = game.user1Id.equals(user._id) ? game.user2Id : game.user1Id;
@ -54,5 +75,5 @@ export default define(meta, (ps, user) => new Promise(async (res, rej) => {
game: await pack(game._id, user)
});
res();
}));
return;
});

View file

@ -5,7 +5,7 @@ export const meta = {
requireCredential: true
};
export default define(meta, (ps, user) => new Promise(async (res, rej) => {
export default define(meta, async (ps, user) => {
// Find session
const invitations = await Matching.find({
childId: user._id
@ -15,6 +15,5 @@ export default define(meta, (ps, user) => new Promise(async (res, rej) => {
}
});
// Reponse
res(Promise.all(invitations.map(async (i) => await packMatching(i, user))));
}));
return await Promise.all(invitations.map((i) => packMatching(i, user)));
});

View file

@ -6,6 +6,7 @@ import User from '../../../../../models/user';
import { publishMainStream, publishReversiStream } from '../../../../../services/stream';
import { eighteight } from '../../../../../games/reversi/maps';
import define from '../../../define';
import { ApiError } from '../../../error';
export const meta = {
requireCredential: true,
@ -19,13 +20,27 @@ export const meta = {
'en-US': 'Target user ID'
}
},
},
errors: {
noSuchUser: {
message: 'No such user.',
code: 'NO_SUCH_USER',
id: '0b4f0559-b484-4e31-9581-3f73cee89b28'
},
isYourself: {
message: 'Target user is yourself.',
code: 'TARGET_IS_YOURSELF',
id: '96fd7bd6-d2bc-426c-a865-d055dcd2828e'
},
}
};
export default define(meta, (ps, user) => new Promise(async (res, rej) => {
export default define(meta, async (ps, user) => {
// Myself
if (ps.userId.equals(user._id)) {
return rej('invalid userId param');
throw new ApiError(meta.errors.isYourself);
}
// Find session
@ -57,9 +72,6 @@ export default define(meta, (ps, user) => new Promise(async (res, rej) => {
}
});
// Reponse
res(await packGame(game, user));
publishReversiStream(exist.parentId, 'matched', await packGame(game, exist.parentId));
const other = await Matching.count({
@ -69,6 +81,8 @@ export default define(meta, (ps, user) => new Promise(async (res, rej) => {
if (other == 0) {
publishMainStream(user._id, 'reversiNoInvites');
}
return await packGame(game, user);
} else {
// Fetch child
const child = await User.findOne({
@ -80,7 +94,7 @@ export default define(meta, (ps, user) => new Promise(async (res, rej) => {
});
if (child === null) {
return rej('user not found');
throw new ApiError(meta.errors.noSuchUser);
}
// 以前のセッションはすべて削除しておく
@ -95,14 +109,10 @@ export default define(meta, (ps, user) => new Promise(async (res, rej) => {
childId: child._id
});
// Reponse
res();
const packed = await packMatching(matching, child);
// 招待
publishReversiStream(child._id, 'invited', packed);
publishMainStream(child._id, 'reversiInvited', packed);
return;
}
}));
});

View file

@ -5,10 +5,10 @@ export const meta = {
requireCredential: true
};
export default define(meta, (ps, user) => new Promise(async (res, rej) => {
export default define(meta, async (ps, user) => {
await Matching.remove({
parentId: user._id
});
res();
}));
return;
});