summaryrefslogtreecommitdiff
path: root/packages/backend/src/server/api
diff options
context:
space:
mode:
authorsyuilo <Syuilotan@yahoo.co.jp>2022-06-25 18:26:31 +0900
committersyuilo <Syuilotan@yahoo.co.jp>2022-06-25 18:26:31 +0900
commit58e83f8e4f634bfd95a3afc847a875413120c301 (patch)
tree9882477cac227f59c904900b0271ac1bc4e6f517 /packages/backend/src/server/api
parentrefactor(client): extract tooltip logic of chart (diff)
downloadsharkey-58e83f8e4f634bfd95a3afc847a875413120c301.tar.gz
sharkey-58e83f8e4f634bfd95a3afc847a875413120c301.tar.bz2
sharkey-58e83f8e4f634bfd95a3afc847a875413120c301.zip
feat: allow GET for some endpoints
Resolve #8263
Diffstat (limited to 'packages/backend/src/server/api')
-rw-r--r--packages/backend/src/server/api/api-handler.ts9
-rw-r--r--packages/backend/src/server/api/call.ts2
-rw-r--r--packages/backend/src/server/api/endpoints.ts10
-rw-r--r--packages/backend/src/server/api/endpoints/charts/active-users.ts5
-rw-r--r--packages/backend/src/server/api/endpoints/charts/ap-request.ts5
-rw-r--r--packages/backend/src/server/api/endpoints/charts/drive.ts5
-rw-r--r--packages/backend/src/server/api/endpoints/charts/federation.ts5
-rw-r--r--packages/backend/src/server/api/endpoints/charts/hashtag.ts5
-rw-r--r--packages/backend/src/server/api/endpoints/charts/instance.ts5
-rw-r--r--packages/backend/src/server/api/endpoints/charts/notes.ts5
-rw-r--r--packages/backend/src/server/api/endpoints/charts/user/drive.ts5
-rw-r--r--packages/backend/src/server/api/endpoints/charts/user/following.ts3
-rw-r--r--packages/backend/src/server/api/endpoints/charts/user/notes.ts5
-rw-r--r--packages/backend/src/server/api/endpoints/charts/user/reactions.ts5
-rw-r--r--packages/backend/src/server/api/endpoints/charts/users.ts5
-rw-r--r--packages/backend/src/server/api/index.ts19
16 files changed, 82 insertions, 16 deletions
diff --git a/packages/backend/src/server/api/api-handler.ts b/packages/backend/src/server/api/api-handler.ts
index f97c3dd397..d2d16597e1 100644
--- a/packages/backend/src/server/api/api-handler.ts
+++ b/packages/backend/src/server/api/api-handler.ts
@@ -6,7 +6,11 @@ import call from './call.js';
import { ApiError } from './error.js';
export default (endpoint: IEndpoint, ctx: Koa.Context) => new Promise<void>((res) => {
- const body = ctx.request.body;
+ const body = ctx.is('multipart/form-data')
+ ? (ctx.req as any).body
+ : ctx.method === 'GET'
+ ? ctx.query
+ : ctx.request.body;
const reply = (x?: any, y?: ApiError) => {
if (x == null) {
@@ -33,6 +37,9 @@ export default (endpoint: IEndpoint, ctx: Koa.Context) => new Promise<void>((res
authenticate(body['i']).then(([user, app]) => {
// API invoking
call(endpoint.name, user, app, body, ctx).then((res: any) => {
+ if (ctx.method === 'GET' && endpoint.meta.cacheSec && !body['i'] && !user) {
+ ctx.set('Cache-Control', `public, max-age=${endpoint.meta.cacheSec}`);
+ }
reply(res);
}).catch((e: ApiError) => {
reply(e.httpStatusCode ? e.httpStatusCode : e.kind === 'client' ? 400 : 500, e);
diff --git a/packages/backend/src/server/api/call.ts b/packages/backend/src/server/api/call.ts
index 46afde4e47..75bbc9f908 100644
--- a/packages/backend/src/server/api/call.ts
+++ b/packages/backend/src/server/api/call.ts
@@ -94,7 +94,7 @@ export default async (endpoint: string, user: CacheableLocalUser | null | undefi
}
// Cast non JSON input
- if (ep.meta.requireFile && ep.params.properties) {
+ if ((ep.meta.requireFile || ctx?.method === 'GET') && ep.params.properties) {
for (const k of Object.keys(ep.params.properties)) {
const param = ep.params.properties![k];
if (['boolean', 'number', 'integer'].includes(param.type ?? '') && typeof data[k] === 'string') {
diff --git a/packages/backend/src/server/api/endpoints.ts b/packages/backend/src/server/api/endpoints.ts
index 5fac7df239..11d9d7c026 100644
--- a/packages/backend/src/server/api/endpoints.ts
+++ b/packages/backend/src/server/api/endpoints.ts
@@ -701,6 +701,16 @@ export interface IEndpointMeta {
readonly kind?: string;
readonly description?: string;
+
+ /**
+ * GETでのリクエストを許容するか否か
+ */
+ readonly allowGet?: boolean;
+
+ /**
+ * 正常応答をキャッシュ (Cache-Control: public) する秒数
+ */
+ readonly cacheSec?: number;
}
export interface IEndpoint {
diff --git a/packages/backend/src/server/api/endpoints/charts/active-users.ts b/packages/backend/src/server/api/endpoints/charts/active-users.ts
index 97f7885dbe..ea23794296 100644
--- a/packages/backend/src/server/api/endpoints/charts/active-users.ts
+++ b/packages/backend/src/server/api/endpoints/charts/active-users.ts
@@ -1,11 +1,14 @@
-import define from '../../define.js';
import { getJsonSchema } from '@/services/chart/core.js';
import { activeUsersChart } from '@/services/chart/index.js';
+import define from '../../define.js';
export const meta = {
tags: ['charts', 'users'],
res: getJsonSchema(activeUsersChart.schema),
+
+ allowGet: true,
+ cacheSec: 60 * 60,
} as const;
export const paramDef = {
diff --git a/packages/backend/src/server/api/endpoints/charts/ap-request.ts b/packages/backend/src/server/api/endpoints/charts/ap-request.ts
index 4477bfc987..06dee250ee 100644
--- a/packages/backend/src/server/api/endpoints/charts/ap-request.ts
+++ b/packages/backend/src/server/api/endpoints/charts/ap-request.ts
@@ -1,11 +1,14 @@
-import define from '../../define.js';
import { getJsonSchema } from '@/services/chart/core.js';
import { apRequestChart } from '@/services/chart/index.js';
+import define from '../../define.js';
export const meta = {
tags: ['charts'],
res: getJsonSchema(apRequestChart.schema),
+
+ allowGet: true,
+ cacheSec: 60 * 60,
} as const;
export const paramDef = {
diff --git a/packages/backend/src/server/api/endpoints/charts/drive.ts b/packages/backend/src/server/api/endpoints/charts/drive.ts
index fd6033392f..dd2c2d6838 100644
--- a/packages/backend/src/server/api/endpoints/charts/drive.ts
+++ b/packages/backend/src/server/api/endpoints/charts/drive.ts
@@ -1,11 +1,14 @@
-import define from '../../define.js';
import { getJsonSchema } from '@/services/chart/core.js';
import { driveChart } from '@/services/chart/index.js';
+import define from '../../define.js';
export const meta = {
tags: ['charts', 'drive'],
res: getJsonSchema(driveChart.schema),
+
+ allowGet: true,
+ cacheSec: 60 * 60,
} as const;
export const paramDef = {
diff --git a/packages/backend/src/server/api/endpoints/charts/federation.ts b/packages/backend/src/server/api/endpoints/charts/federation.ts
index f842f574ec..8c35b3c46d 100644
--- a/packages/backend/src/server/api/endpoints/charts/federation.ts
+++ b/packages/backend/src/server/api/endpoints/charts/federation.ts
@@ -1,11 +1,14 @@
-import define from '../../define.js';
import { getJsonSchema } from '@/services/chart/core.js';
import { federationChart } from '@/services/chart/index.js';
+import define from '../../define.js';
export const meta = {
tags: ['charts'],
res: getJsonSchema(federationChart.schema),
+
+ allowGet: true,
+ cacheSec: 60 * 60,
} as const;
export const paramDef = {
diff --git a/packages/backend/src/server/api/endpoints/charts/hashtag.ts b/packages/backend/src/server/api/endpoints/charts/hashtag.ts
index 01407defdd..77e24a62c3 100644
--- a/packages/backend/src/server/api/endpoints/charts/hashtag.ts
+++ b/packages/backend/src/server/api/endpoints/charts/hashtag.ts
@@ -1,11 +1,14 @@
-import define from '../../define.js';
import { getJsonSchema } from '@/services/chart/core.js';
import { hashtagChart } from '@/services/chart/index.js';
+import define from '../../define.js';
export const meta = {
tags: ['charts', 'hashtags'],
res: getJsonSchema(hashtagChart.schema),
+
+ allowGet: true,
+ cacheSec: 60 * 60,
} as const;
export const paramDef = {
diff --git a/packages/backend/src/server/api/endpoints/charts/instance.ts b/packages/backend/src/server/api/endpoints/charts/instance.ts
index 2d12951c6c..817d51ad01 100644
--- a/packages/backend/src/server/api/endpoints/charts/instance.ts
+++ b/packages/backend/src/server/api/endpoints/charts/instance.ts
@@ -1,11 +1,14 @@
-import define from '../../define.js';
import { getJsonSchema } from '@/services/chart/core.js';
import { instanceChart } from '@/services/chart/index.js';
+import define from '../../define.js';
export const meta = {
tags: ['charts'],
res: getJsonSchema(instanceChart.schema),
+
+ allowGet: true,
+ cacheSec: 60 * 60,
} as const;
export const paramDef = {
diff --git a/packages/backend/src/server/api/endpoints/charts/notes.ts b/packages/backend/src/server/api/endpoints/charts/notes.ts
index b6089f67ef..951adf5408 100644
--- a/packages/backend/src/server/api/endpoints/charts/notes.ts
+++ b/packages/backend/src/server/api/endpoints/charts/notes.ts
@@ -1,11 +1,14 @@
-import define from '../../define.js';
import { getJsonSchema } from '@/services/chart/core.js';
import { notesChart } from '@/services/chart/index.js';
+import define from '../../define.js';
export const meta = {
tags: ['charts', 'notes'],
res: getJsonSchema(notesChart.schema),
+
+ allowGet: true,
+ cacheSec: 60 * 60,
} as const;
export const paramDef = {
diff --git a/packages/backend/src/server/api/endpoints/charts/user/drive.ts b/packages/backend/src/server/api/endpoints/charts/user/drive.ts
index e5db7131a8..f165b40224 100644
--- a/packages/backend/src/server/api/endpoints/charts/user/drive.ts
+++ b/packages/backend/src/server/api/endpoints/charts/user/drive.ts
@@ -1,11 +1,14 @@
-import define from '../../../define.js';
import { getJsonSchema } from '@/services/chart/core.js';
import { perUserDriveChart } from '@/services/chart/index.js';
+import define from '../../../define.js';
export const meta = {
tags: ['charts', 'drive', 'users'],
res: getJsonSchema(perUserDriveChart.schema),
+
+ allowGet: true,
+ cacheSec: 60 * 60,
} as const;
export const paramDef = {
diff --git a/packages/backend/src/server/api/endpoints/charts/user/following.ts b/packages/backend/src/server/api/endpoints/charts/user/following.ts
index 9b72de745d..f5d42e21c2 100644
--- a/packages/backend/src/server/api/endpoints/charts/user/following.ts
+++ b/packages/backend/src/server/api/endpoints/charts/user/following.ts
@@ -6,6 +6,9 @@ export const meta = {
tags: ['charts', 'users', 'following'],
res: getJsonSchema(perUserFollowingChart.schema),
+
+ allowGet: true,
+ cacheSec: 60 * 60,
} as const;
export const paramDef = {
diff --git a/packages/backend/src/server/api/endpoints/charts/user/notes.ts b/packages/backend/src/server/api/endpoints/charts/user/notes.ts
index 7cc6cbf316..aefe550d43 100644
--- a/packages/backend/src/server/api/endpoints/charts/user/notes.ts
+++ b/packages/backend/src/server/api/endpoints/charts/user/notes.ts
@@ -1,11 +1,14 @@
-import define from '../../../define.js';
import { getJsonSchema } from '@/services/chart/core.js';
import { perUserNotesChart } from '@/services/chart/index.js';
+import define from '../../../define.js';
export const meta = {
tags: ['charts', 'users', 'notes'],
res: getJsonSchema(perUserNotesChart.schema),
+
+ allowGet: true,
+ cacheSec: 60 * 60,
} as const;
export const paramDef = {
diff --git a/packages/backend/src/server/api/endpoints/charts/user/reactions.ts b/packages/backend/src/server/api/endpoints/charts/user/reactions.ts
index 5c58a7f152..6bc6b56bf0 100644
--- a/packages/backend/src/server/api/endpoints/charts/user/reactions.ts
+++ b/packages/backend/src/server/api/endpoints/charts/user/reactions.ts
@@ -1,11 +1,14 @@
-import define from '../../../define.js';
import { getJsonSchema } from '@/services/chart/core.js';
import { perUserReactionsChart } from '@/services/chart/index.js';
+import define from '../../../define.js';
export const meta = {
tags: ['charts', 'users', 'reactions'],
res: getJsonSchema(perUserReactionsChart.schema),
+
+ allowGet: true,
+ cacheSec: 60 * 60,
} as const;
export const paramDef = {
diff --git a/packages/backend/src/server/api/endpoints/charts/users.ts b/packages/backend/src/server/api/endpoints/charts/users.ts
index 49c762b2e4..338e8fd338 100644
--- a/packages/backend/src/server/api/endpoints/charts/users.ts
+++ b/packages/backend/src/server/api/endpoints/charts/users.ts
@@ -1,11 +1,14 @@
-import define from '../../define.js';
import { getJsonSchema } from '@/services/chart/core.js';
import { usersChart } from '@/services/chart/index.js';
+import define from '../../define.js';
export const meta = {
tags: ['charts', 'users'],
res: getJsonSchema(usersChart.schema),
+
+ allowGet: true,
+ cacheSec: 60 * 60,
} as const;
export const paramDef = {
diff --git a/packages/backend/src/server/api/index.ts b/packages/backend/src/server/api/index.ts
index 02bec31b17..83ece51f51 100644
--- a/packages/backend/src/server/api/index.ts
+++ b/packages/backend/src/server/api/index.ts
@@ -8,6 +8,8 @@ import multer from '@koa/multer';
import bodyParser from 'koa-bodyparser';
import cors from '@koa/cors';
+import { Instances, AccessTokens, Users } from '@/models/index.js';
+import config from '@/config/index.js';
import endpoints from './endpoints.js';
import handler from './api-handler.js';
import signup from './private/signup.js';
@@ -16,8 +18,6 @@ import signupPending from './private/signup-pending.js';
import discord from './service/discord.js';
import github from './service/github.js';
import twitter from './service/twitter.js';
-import { Instances, AccessTokens, Users } from '@/models/index.js';
-import config from '@/config/index.js';
// Init app
const app = new Koa();
@@ -56,11 +56,24 @@ for (const endpoint of endpoints) {
if (endpoint.meta.requireFile) {
router.post(`/${endpoint.name}`, upload.single('file'), handler.bind(null, endpoint));
} else {
+ // 後方互換性のため
if (endpoint.name.includes('-')) {
- // 後方互換性のため
router.post(`/${endpoint.name.replace(/-/g, '_')}`, handler.bind(null, endpoint));
+
+ if (endpoint.meta.allowGet) {
+ router.get(`/${endpoint.name.replace(/-/g, '_')}`, handler.bind(null, endpoint));
+ } else {
+ router.get(`/${endpoint.name.replace(/-/g, '_')}`, async ctx => { ctx.status = 405; });
+ }
}
+
router.post(`/${endpoint.name}`, handler.bind(null, endpoint));
+
+ if (endpoint.meta.allowGet) {
+ router.get(`/${endpoint.name}`, handler.bind(null, endpoint));
+ } else {
+ router.get(`/${endpoint.name}`, async ctx => { ctx.status = 405; });
+ }
}
}