diff --git a/packages/backend/src/server/api/endpoints.ts b/packages/backend/src/server/api/endpoints.ts index c85bb6632..6e69b3b11 100644 --- a/packages/backend/src/server/api/endpoints.ts +++ b/packages/backend/src/server/api/endpoints.ts @@ -702,6 +702,24 @@ export interface IEndpointMeta { * 正常応答をキャッシュ (Cache-Control: public) する秒数 */ readonly cacheSec?: number; + + /** + * API v2 options + */ + readonly v2?: { + + /** + * HTTP verb this endpoint supports + */ + readonly method: 'get' | 'put' | 'post' | 'patch' | 'delete'; + + /** + * Path alias for v2 endpoint + * + * @example (v0) /api/notes/create -> /api/v2/notes + */ + readonly alias?: string; + }; } export interface IEndpoint { diff --git a/packages/backend/src/server/api/index.ts b/packages/backend/src/server/api/index.ts index af6026925..1aaee70a6 100644 --- a/packages/backend/src/server/api/index.ts +++ b/packages/backend/src/server/api/index.ts @@ -91,6 +91,11 @@ for (const endpoint of endpoints) { } else { router.get(`/${endpoint.name}`, async ctx => { ctx.status = 405; }); } + + if (endpoint.meta.v2) { + const path = endpoint.meta.v2.alias ?? endpoint.name.replace(/-/g, '_'); + router[endpoint.meta.v2.method](`/v2/${path}`, handler.bind(null, endpoint)); + } } }