summaryrefslogtreecommitdiff
path: root/packages/backend/src/server/api/api-handler.ts
diff options
context:
space:
mode:
authorsyuilo <Syuilotan@yahoo.co.jp>2021-11-12 02:02:25 +0900
committersyuilo <Syuilotan@yahoo.co.jp>2021-11-12 02:02:25 +0900
commit0e4a111f81cceed275d9bec2695f6e401fb654d8 (patch)
tree40874799472fa07416f17b50a398ac33b7771905 /packages/backend/src/server/api/api-handler.ts
parentupdate deps (diff)
downloadsharkey-0e4a111f81cceed275d9bec2695f6e401fb654d8.tar.gz
sharkey-0e4a111f81cceed275d9bec2695f6e401fb654d8.tar.bz2
sharkey-0e4a111f81cceed275d9bec2695f6e401fb654d8.zip
refactoring
Resolve #7779
Diffstat (limited to 'packages/backend/src/server/api/api-handler.ts')
-rw-r--r--packages/backend/src/server/api/api-handler.ts51
1 files changed, 51 insertions, 0 deletions
diff --git a/packages/backend/src/server/api/api-handler.ts b/packages/backend/src/server/api/api-handler.ts
new file mode 100644
index 0000000000..cbace8917e
--- /dev/null
+++ b/packages/backend/src/server/api/api-handler.ts
@@ -0,0 +1,51 @@
+import * as Koa from 'koa';
+
+import { IEndpoint } from './endpoints';
+import authenticate, { AuthenticationError } from './authenticate';
+import call from './call';
+import { ApiError } from './error';
+
+export default (endpoint: IEndpoint, ctx: Koa.Context) => new Promise((res) => {
+ const body = ctx.request.body;
+
+ const reply = (x?: any, y?: ApiError) => {
+ if (x == null) {
+ ctx.status = 204;
+ } else if (typeof x === 'number' && y) {
+ ctx.status = x;
+ ctx.body = {
+ error: {
+ message: y!.message,
+ code: y!.code,
+ id: y!.id,
+ kind: y!.kind,
+ ...(y!.info ? { info: y!.info } : {})
+ }
+ };
+ } else {
+ // 文字列を返す場合は、JSON.stringify通さないとJSONと認識されない
+ ctx.body = typeof x === 'string' ? JSON.stringify(x) : x;
+ }
+ res();
+ };
+
+ // Authentication
+ authenticate(body['i']).then(([user, app]) => {
+ // API invoking
+ call(endpoint.name, user, app, body, (ctx as any).file).then((res: any) => {
+ reply(res);
+ }).catch((e: ApiError) => {
+ reply(e.httpStatusCode ? e.httpStatusCode : e.kind === 'client' ? 400 : 500, e);
+ });
+ }).catch(e => {
+ if (e instanceof AuthenticationError) {
+ reply(403, new ApiError({
+ message: 'Authentication failed. Please ensure your token is correct.',
+ code: 'AUTHENTICATION_FAILED',
+ id: 'b0a7f5f8-dc2f-4171-b91f-de88ad238e14'
+ }));
+ } else {
+ reply(500, new ApiError());
+ }
+ });
+});