From 5361a3819b38c5991308d94e01dc7375454d8988 Mon Sep 17 00:00:00 2001
From: Copilot <198982749+Copilot@users.noreply.github.com>
Date: Wed, 1 Apr 2026 14:43:34 +0900
Subject: [PATCH] =?UTF-8?q?fix(backend):=20/api-doc=20=E3=81=AB=E3=82=A2?=
=?UTF-8?q?=E3=82=AF=E3=82=BB=E3=82=B9=E3=81=A7=E3=81=8D=E3=81=AA=E3=81=84?=
=?UTF-8?q?=E5=95=8F=E9=A1=8C=E3=82=92=E4=BF=AE=E6=AD=A3=20(#17267)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* Initial plan
* fix: fix /api-doc returning 404 after backend minification (#17266)
Agent-Logs-Url: https://github.com/misskey-dev/misskey/sessions/8d7d0585-55da-412f-a8ee-dde1b6565026
Co-authored-by: syuilo <4439005+syuilo@users.noreply.github.com>
* enhance: API DocのHTMLをJSXで生成するように
* Update Changelog
* chore: remove unused imports [ci skip]
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: syuilo <4439005+syuilo@users.noreply.github.com>
Co-authored-by: kakkokari-gtyih <67428053+kakkokari-gtyih@users.noreply.github.com>
---
CHANGELOG.md | 2 +-
packages/backend/assets/api-doc.html | 20 --------------
packages/backend/assets/api-doc.png | Bin 5542 -> 0 bytes
.../api/openapi/OpenApiServerService.ts | 7 ++---
.../src/server/api/openapi/api-doc.tsx | 26 ++++++++++++++++++
5 files changed, 30 insertions(+), 25 deletions(-)
delete mode 100644 packages/backend/assets/api-doc.html
delete mode 100644 packages/backend/assets/api-doc.png
create mode 100644 packages/backend/src/server/api/openapi/api-doc.tsx
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 051b68c239..1f52942914 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,7 +7,7 @@
-
### Server
--
+- Fix: `/api-doc` にアクセスできない問題を修正
## 2026.3.2
diff --git a/packages/backend/assets/api-doc.html b/packages/backend/assets/api-doc.html
deleted file mode 100644
index 19e0349d47..0000000000
--- a/packages/backend/assets/api-doc.html
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
- Misskey API
-
-
-
-
-
-
-
-
-
diff --git a/packages/backend/assets/api-doc.png b/packages/backend/assets/api-doc.png
deleted file mode 100644
index 9b07f1f39805081b6a407095d8c13fbf2805825d..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 5542
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
Y0Dn85KUKh91VI2=$4L9BmSfaE0N>yk1ONa4
diff --git a/packages/backend/src/server/api/openapi/OpenApiServerService.ts b/packages/backend/src/server/api/openapi/OpenApiServerService.ts
index f124aa9f39..24fc46e4ba 100644
--- a/packages/backend/src/server/api/openapi/OpenApiServerService.ts
+++ b/packages/backend/src/server/api/openapi/OpenApiServerService.ts
@@ -3,16 +3,14 @@
* SPDX-License-Identifier: AGPL-3.0-only
*/
-import { fileURLToPath } from 'node:url';
import { Inject, Injectable } from '@nestjs/common';
import type { Config } from '@/config.js';
import { DI } from '@/di-symbols.js';
import { bindThis } from '@/decorators.js';
import { genOpenapiSpec } from './gen-spec.js';
+import { ApiDocPage } from './api-doc.js';
import type { FastifyInstance, FastifyPluginOptions } from 'fastify';
-const staticAssets = fileURLToPath(new URL('../../../../assets/', import.meta.url));
-
@Injectable()
export class OpenApiServerService {
constructor(
@@ -25,7 +23,8 @@ export class OpenApiServerService {
public createServer(fastify: FastifyInstance, _options: FastifyPluginOptions, done: (err?: Error) => void) {
fastify.get('/api-doc', async (_request, reply) => {
reply.header('Cache-Control', 'public, max-age=86400');
- return await reply.sendFile('/api-doc.html', staticAssets);
+ reply.type('text/html; charset=utf-8');
+ reply.send(await ApiDocPage());
});
fastify.get('/api.json', (_request, reply) => {
reply.header('Cache-Control', 'public, max-age=600');
diff --git a/packages/backend/src/server/api/openapi/api-doc.tsx b/packages/backend/src/server/api/openapi/api-doc.tsx
new file mode 100644
index 0000000000..663d9f5be3
--- /dev/null
+++ b/packages/backend/src/server/api/openapi/api-doc.tsx
@@ -0,0 +1,26 @@
+/*
+ * SPDX-FileCopyrightText: syuilo and misskey-project
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+export function ApiDocPage() {
+ return (
+ <>
+ {''}
+
+
+
+ Misskey API
+
+
+
+
+
+
+
+
+ >
+ );
+}