summaryrefslogtreecommitdiff
path: root/packages/backend/src/server/api/call.ts
diff options
context:
space:
mode:
authorMeiMei <30769358+mei23@users.noreply.github.com>2022-01-31 01:40:27 +0900
committerGitHub <noreply@github.com>2022-01-31 01:40:27 +0900
commitf2b40b51c2d631a6185e1c4614632d29c40bce6c (patch)
tree1288aa49102a75a9312bf289972e4875c71a3d09 /packages/backend/src/server/api/call.ts
parentUpdate CONTRIBUTING.md (diff)
downloadsharkey-f2b40b51c2d631a6185e1c4614632d29c40bce6c.tar.gz
sharkey-f2b40b51c2d631a6185e1c4614632d29c40bce6c.tar.bz2
sharkey-f2b40b51c2d631a6185e1c4614632d29c40bce6c.zip
refactor: APIで非JSON入力の型変換はendpointに渡す前に行うように (#8229)
* Resolve #8228 * fix
Diffstat (limited to 'packages/backend/src/server/api/call.ts')
-rw-r--r--packages/backend/src/server/api/call.ts16
1 files changed, 14 insertions, 2 deletions
diff --git a/packages/backend/src/server/api/call.ts b/packages/backend/src/server/api/call.ts
index 399ee65bde..5bc7d2f25e 100644
--- a/packages/backend/src/server/api/call.ts
+++ b/packages/backend/src/server/api/call.ts
@@ -1,3 +1,4 @@
+import * as Koa from 'koa';
import { performance } from 'perf_hooks';
import { limiter } from './limiter';
import { User } from '@/models/entities/user';
@@ -12,7 +13,7 @@ const accessDenied = {
id: '56f35758-7dd5-468b-8439-5d6fb8ec9b8e',
};
-export default async (endpoint: string, user: User | null | undefined, token: AccessToken | null | undefined, data: any, file?: any) => {
+export default async (endpoint: string, user: User | null | undefined, token: AccessToken | null | undefined, data: any, ctx?: Koa.Context) => {
const isSecure = user != null && token == null;
const ep = endpoints.find(e => e.name === endpoint);
@@ -76,9 +77,20 @@ export default async (endpoint: string, user: User | null | undefined, token: Ac
});
}
+ // Cast non JSON input
+ if (ep.meta.requireFile && ep.meta.params) {
+ const body = (ctx!.request as any).body;
+ for (const k of Object.keys(ep.meta.params)) {
+ const param = ep.meta.params[k];
+ if (['Boolean', 'Number'].includes(param.validator.name) && typeof body[k] === 'string') {
+ body[k] = JSON.parse(body[k]);
+ }
+ }
+ }
+
// API invoking
const before = performance.now();
- return await ep.exec(data, user, token, file).catch((e: Error) => {
+ return await ep.exec(data, user, token, ctx!.file).catch((e: Error) => {
if (e instanceof ApiError) {
throw e;
} else {