REST API ドキュメント
GEO Wiki Pro REST API の完全なエンドポイントリファレンス、認証、ドキュメント管理、カテゴリ、タグ、メディアアップロードなどのすべてのエンドポイントを含む
# REST API ドキュメント
> GEO Wiki Pro バックエンド REST API の完全なリファレンスマニュアル
---
## 概要
GEO Wiki Pro は RESTful スタイルの HTTP API を提供し、すべてのエンドポイントは `/api/v1/` パス下にあります。公開エンドポイントは認証不要で、管理エンドポイントには JWT 認証と管理者ロールが必要です。
### 基本情報
| 項目 | 説明 |
|------|------|
| ベース URL | `https://your-domain.com/api/v1` |
| 認証方法 | JWT(httpOnly cookie) |
| CSRF 保護 | Double-submit cookie HMAC |
| コンテンツタイプ | `application/json` |
| レート制限 | グローバル 300 リクエスト/分、認証エンドポイント 10 リクエスト/分 |
### レスポンス形式
**成功レスポンス:**
```json
{
"success": true,
"data": { ... }
}
```
**ページネーションレスポンス:**
```json
{
"success": true,
"data": [ ... ],
"pagination": {
"page": 1,
"limit": 20,
"total": 42,
"totalPages": 3
}
}
```
**エラーレスポンス:**
```json
{
"success": false,
"message": "Not found"
}
```
---
## 公開エンドポイント
以下のエンドポイントは認証不要で、誰でもアクセスできます。
### ドキュメントリストの取得
```
GET /api/v1/docs
```
**クエリパラメータ:**
| パラメータ | タイプ | 必須 | 説明 |
|-----------|--------|------|------|
| `lang` | string | いいえ | 言語コード(zh/en/jp)、デフォルト zh |
| `category` | string | いいえ | カテゴリスラッグフィルタ |
| `page` | number | いいえ | ページ番号、デフォルト 1 |
| `limit` | number | いいえ | 1 ページあたりの件数、デフォルト 20 |
**例:**
```bash
curl "https://geowiki.pro/api/v1/docs?lang=en&category=can-motion&page=1&limit=10"
```
**レスポンス:**
```json
{
"success": true,
"data": [
{
"slug": "can-bus-protocol",
"title": "CAN Bus Protocol",
"category": "can-motion",
"tags": ["can-bus", "protocol"],
"author": "admin",
"sort": 1,
"description": "CAN bus communication protocol overview",
"updated_at": "2026-05-20T10:30:00Z"
}
],
"pagination": {
"page": 1,
"limit": 10,
"total": 25,
"totalPages": 3
}
}
```
### 単一ドキュメントの取得
```
GET /api/v1/docs/:slug
```
**パスパラメータ:**
| パラメータ | タイプ | 説明 |
|-----------|--------|------|
| `slug` | string | ドキュメントスラッグ |
**クエリパラメータ:**
| パラメータ | タイプ | 必須 | 説明 |
|-----------|--------|------|------|
| `lang` | string | いいえ | 言語コード、デフォルト zh |
**例:**
```bash
curl "https://geowiki.pro/api/v1/docs/can-bus-protocol?lang=en"
```
**レスポンス:**
```json
{
"success": true,
"data": {
"slug": "can-bus-protocol",
"title": "CAN Bus Protocol",
"category": "can-motion",
"tags": ["can-bus", "protocol"],
"author": "admin",
"sort": 1,
"description": "CAN bus communication protocol overview",
"content": "# CAN Bus Protocol\n\nThe Controller Area Network (CAN)...",
"updated_at": "2026-05-20T10:30:00Z"
}
}
```
::: note
デフォルト言語以外のリクエストでは、システムはカスケードマージを実行:まず中国語ドキュメントをベースとして読み込み、ターゲット言語ドキュメントで一致するスラッグをオーバーレイします。したがって、中国語バージョンのみのドキュメントでも、英語リクエストではコンテンツを返すことができます。
:::
### ドキュメント検索
```
GET /api/v1/docs/search
```
**クエリパラメータ:**
| パラメータ | タイプ | 必須 | 説明 |
|-----------|--------|------|------|
| `q` | string | はい | 検索キーワード |
| `lang` | string | いいえ | 言語コード |
| `category` | string | いいえ | カテゴリスラッグ |
| `page` | number | いいえ | ページ番号 |
| `limit` | number | いいえ | 1 ページあたりの件数 |
**例:**
```bash
curl "https://geowiki.pro/api/v1/docs/search?q=can+bus&lang=en&category=can-motion"
```
**レスポンス:**
```json
{
"success": true,
"data": [
{
"slug": "can-bus-protocol",
"title": "CAN Bus Protocol",
"description": "CAN bus communication protocol overview",
"score": 0.95
}
],
"pagination": {
"page": 1,
"limit": 20,
"total": 5,
"totalPages": 1
}
}
```
### カテゴリリストの取得
```
GET /api/v1/categories
```
**レスポンス:**
```json
{
"success": true,
"data": [
{
"slug": "can-motion",
"name": "CAN 运动控制",
"name_en": "CAN Motion Control",
"description": "CAN 总线运动控制产品文档"
}
]
}
```
### タグリストの取得
```
GET /api/v1/tags
```
**レスポンス:**
```json
{
"success": true,
"data": [
{
"slug": "can-bus",
"name": "CAN 总线",
"name_en": "CAN Bus"
}
]
}
```
### サイト設定の取得
```
GET /api/v1/config
```
**レスポンス:**
```json
{
"success": true,
"data": {
"hero_title": "GEO Wiki Pro",
"hero_subtitle": "Technical Documentation Platform",
"featured_slugs": ["quick-start", "faq"],
"logo_url": "/media/logo.png",
"favicon_url": "/media/favicon.ico"
}
}
```
### 統合メタデータの取得
```
GET /api/v1/meta
```
カテゴリ、タグ、通知情報の統合データを返します。
**レスポンス:**
```json
{
"success": true,
"data": {
"categories": [ ... ],
"tags": [ ... ],
"notice": "Important announcement text"
}
}
```
### AI クローラーフィード
```
GET /api/v1/llms.txt
```
AI クローラー向けに最適化されたテキストコンテンツを返します。
### サイトマップ
```
GET /api/v1/geo/sitemap.xml
```
XML 形式のサイトマップを返します。
### フィードバックの送信
```
POST /api/v1/feedback
```
**リクエストボディ:**
```json
{
"slug": "can-bus-protocol",
"content": "Great documentation!",
"rating": 5
}
```
**レスポンス:**
```json
{
"success": true,
"data": {
"id": "fb_123456"
}
}
```
---
## 認証エンドポイント
### ユーザーログイン
```
POST /api/v1/auth/login
```
**リクエストボディ:**
```json
{
"username": "admin",
"password": "your-password"
}
```
**レスポンス:**
```json
{
"success": true,
"data": {
"user": {
"username": "admin",
"role": "admin"
},
"mustChangePassword": false
}
}
```
::: warning
初回ログイン时、`mustChangePassword` は `true` となり、管理機能にアクセスする前にパスワード変更エンドポイントを呼び出す必要があります。
:::
### ユーザーログアウト
```
POST /api/v1/auth/logout
```
### 現在のユーザー情報の取得
```
GET /api/v1/auth/me
```
**レスポンス:**
```json
{
"success": true,
"data": {
"username": "admin",
"role": "admin",
"passwordChanged": true
}
}
```
### パスワード変更
```
POST /api/v1/auth/change-password
```
**リクエストボディ:**
```json
{
"oldPassword": "current-password",
"newPassword": "new-password"
}
```
### 新規ユーザー登録
```
POST /api/v1/auth/register
```
::: warning
このエンドポイントは管理者のみ利用可能です。
:::
**リクエストボディ:**
```json
{
"username": "newuser",
"password": "user-password",
"role": "editor"
}
```
---
## 管理エンドポイント
すべての管理エンドポイントには JWT 認証と管理者/エディターロールが必要です。
### ドキュメント管理
#### ドキュメント作成
```
POST /api/v1/admin/docs
```
**リクエストボディ:**
```json
{
"slug": "my-new-doc",
"title": "My New Document",
"category": "support",
"tags": ["guide", "tutorial"],
"author": "admin",
"sort": 5,
"description": "A helpful guide",
"content": "# My New Document\n\nContent here...",
"lang": "en"
}
```
::: tip
スラッグが提供されない場合、システムはタイトルから自動生成します。作成時にスラッグの重複をチェックします。
:::
#### ドキュメント更新
```
PUT /api/v1/admin/docs/:slug
```
ドキュメントを更新すると、共有フィールド(category、tags、author、sort)が他の言語バージョンに自動同期されます。
#### ドキュメント削除
```
DELETE /api/v1/admin/docs/:slug
```
#### ドキュメント並べ替え
```
PUT /api/v1/admin/docs/reorder
```
**リクエストボディ:**
```json
{
"slugs": ["doc-1", "doc-2", "doc-3"],
"category": "can-motion",
"lang": "zh"
}
```
::: note
このエンドポイントは `PUT /api/v1/admin/docs/:slug` の前に定義する必要があります。否则、Express が `reorder` をスラッグパラメータとしてマッチングします。
:::
### カテゴリ管理
#### カテゴリリストの取得
```
GET /api/v1/admin/categories
```
#### カテゴリ作成
```
POST /api/v1/admin/categories
```
**リクエストボディ:**
```json
{
"slug": "new-category",
"name": "新分类",
"name_en": "New Category",
"description": "Category description"
}
```
#### カテゴリ更新
```
PUT /api/v1/admin/categories/:slug
```
#### カテゴリ削除
```
DELETE /api/v1/admin/categories/:slug
```
### タグ管理
#### タグリストの取得
```
GET /api/v1/admin/tags
```
#### タグ作成
```
POST /api/v1/admin/tags
```
**リクエストボディ:**
```json
{
"slug": "new-tag",
"name": "新标签",
"name_en": "New Tag"
}
```
#### タグ削除
```
DELETE /api/v1/admin/tags/:slug
```
### フィードバック管理
#### フィードバックリストの取得
```
GET /api/v1/admin/feedback
```
#### フィードバック削除
```
DELETE /api/v1/admin/feedback/:id
```
### メディア管理
#### メディアリストの取得
```
GET /api/v1/admin/media
```
#### メディアファイルの削除
```
DELETE /api/v1/admin/media/:filename
```
### ファイルアップロード
```
POST /api/v1/media/upload
```
**リクエスト:** `multipart/form-data`
| フィールド | タイプ | 必須 | 説明 |
|-----------|--------|------|------|
| `file` | file | はい | アップロードするファイル |
::: warning
ファイルアップロードはマジックバイトで実際のタイプを検出します。ファイル名は `encodeURIComponent` でエンコードされます。
:::
**例:**
```bash
curl -X POST "https://geowiki.pro/api/v1/media/upload" \
-H "Cookie: jwt=your-token" \
-F "[email protected]"
```
### サイト設定管理
#### 完全な設定の取得
```
GET /api/v1/admin/config
```
#### 設定の更新
```
PUT /api/v1/admin/config
```
**リクエストボディ:**
```json
{
"hero_title": "My Wiki",
"hero_subtitle": "Technical Documentation",
"featured_slugs": ["quick-start", "faq"],
"logo_url": "/media/logo.png",
"favicon_url": "/media/favicon.ico",
"customHeadHtml": "<meta name=\"theme-color\" content=\"#3b82f6\">"
}
```
::: note
`customHeadHtml` フィールドは `<script>`、`<iframe>`、`on*` イベント属性を自動的にフィルタリングし、XSS 攻撃を防止します。
:::
### ドラフト管理
#### ドラフトの公開
```
POST /api/v1/admin/drafts/:slug/publish
```
#### ドラフトの拒否
```
DELETE /api/v1/admin/drafts/:slug
```
### ユーザー管理
#### ユーザーリストの取得
```
GET /api/v1/admin/users
```
#### ユーザー作成
```
POST /api/v1/admin/users
```
#### ユーザー削除
```
DELETE /api/v1/admin/users/:username
```
### 統計情報
```
GET /api/v1/admin/stats
```
ドキュメント数、カテゴリ統計、タグ使用状況などのダッシュボードデータを返します。
### 留言管理
#### 留言リストの取得
```
GET /api/v1/admin/guestbook
```
#### 留言作成
```
POST /api/v1/admin/guestbook
```
#### 留言更新
```
PUT /api/v1/admin/guestbook/:id
```
#### 留言削除
```
DELETE /api/v1/admin/guestbook/:id
```
### GEO 分析
#### GEO 概要の取得
```
GET /api/v1/admin/geo/overview
```
#### GEO ファイルの再生成
```
POST /api/v1/admin/geo/rebuild
```
`llms.txt` と `sitemap.xml` の再生成をトリガーします。
---
## HTTP ステータスコード
| HTTP ステータスコード | 説明 |
|---------------------|------|
| 200 | 成功 |
| 201 | 正常に作成 |
| 400 | リクエストパラメータエラー |
| 401 | 未認証またはトークン期限切れ |
| 403 | 権限なし |
| 404 | リソースが見つからない |
| 409 | リソース競合(例:スラッグ重複) |
| 429 | リクエストが多すぎ(レート制限) |
| 500 | サーバー内部エラー |
---
## セキュリティメカニズム
| メカニズム | 説明 |
|-----------|------|
| JWT 認証 | httpOnly cookie、2 時間で期限切れ |
| CSRF 保護 | Double-submit cookie HMAC 検証 |
| レート制限 | グローバル 300 リクエスト/分、認証エンドポイント 10 リクエスト/分 |
| CSP | Helmet nonce ベースの Content Security Policy |
| ファイルアップロード | マジックバイトタイプ検出 |
| スラッグ検証 | 正規表現マッチング + 長度制限 + 重複チェック |
---
*最終更新: 2026-06-06 | バージョン: v3.0.2*