← ソースコード説明書

apps/hono - Hono API サーバー

概要

Hono 4 ベースの REST API サーバー。認証、プロジェクト管理、アセット管理、プレビュー生成、AI 執筆支援、管理画面機能を提供する。Prisma ORM で PostgreSQL に接続し、Azure Blob Storage にアセットを格納する。

ディレクトリ構成

apps/hono/
├── src/
│   ├── index.ts              # エントリポイント (151行)
│   ├── routes/               # 20 ルートファイル
│   ├── middleware/            # 5 ミドルウェア
│   ├── lib/                  # 共通ライブラリ
│   │   ├── assist/           # AI 執筆支援モジュール (12ファイル)
│   │   └── logging/          # ログシステム
│   ├── types/                # 型定義
│   └── scripts/              # DB マイグレーションスクリプト
├── test/                     # 43 テストファイル (6,814行)
├── prisma/
│   ├── schema.prisma         # 22 モデル (392行)
│   └── migrations/           # マイグレーションファイル
├── Dockerfile                # マルチステージビルド
└── package.json

主要ファイル

ファイル行数役割
src/index.ts151エントリポイント、ミドルウェアチェーン、ルート登録
src/routes/assets.ts987アセット管理(アップロード、公式インポート、キャラクタークラス)
src/routes/admin.ts970管理画面(ユーザー、アセット、バックアップ、DB マイグレーション)
src/routes/assist.ts799AI 執筆支援(4段階 LLM パイプライン)
src/routes/auth.ts750認証(登録、ログイン、パスワードリセット、ゲスト)
src/routes/works.ts573公開作品(公開/非公開、いいね、再生数)
src/routes/projects.ts505プロジェクト CRUD + AI コンテキスト
prisma/schema.prisma392DB スキーマ (22 モデル)

ミドルウェアチェーン (適用順)

  1. CORSALLOWED_ORIGINS 環境変数で許可オリジン設定
  2. Logger — JSON 形式アクセスログ (Azure Log Analytics 向け)
  3. Compress — gzip レスポンス圧縮
  4. Analytics — 分析ログシンク
  5. Security Headers — X-Content-Type-Options, X-Frame-Options, X-XSS-Protection, HSTS
  6. Rate Limit/api/* ルートに適用

レートリミッター

リミッターウィンドウ環境変数
apiLimiter1分API_RATE_LIMIT
loginLimiter1分LOGIN_RATE_LIMIT
registerLimiter1時間REGISTER_RATE_LIMIT
contactLimiter1時間
forgotPasswordLimiter1時間
aiAssistLimiter1分
guestLimiter1時間

具体的な上限値は環境変数で設定。デフォルト値はソースコードを参照。

ルート一覧

認証 (auth.ts)

メソッドパス認証説明
POST/api/auth/register不要ユーザー登録 + メール認証送信
POST/api/auth/login不要ログイン (JWT トークン返却)
POST/api/auth/logout不要ログアウト
GET/api/auth/me必要現在のユーザー情報
POST/api/auth/verify-email必要メール認証
POST/api/auth/forgot-password不要パスワードリセットメール送信
POST/api/auth/reset-password不要パスワードリセット実行
POST/api/auth/code必要ワンタイム認証コード生成 (OAuth)
POST/api/auth/exchange-code不要コード → トークン交換
POST/api/auth/guest不要ゲストアカウント作成 (7日有効)
POST/api/auth/guest/restore不要ゲストデータ復元
POST/api/auth/change-password必要パスワード変更

プロジェクト (projects.ts)

メソッドパス説明
GET/api/projectsユーザーのプロジェクト一覧
POST/api/projectsプロジェクト作成
GET/api/projects/:id詳細取得 (+ _ai_context 付与)
PUT/api/projects/:id更新
DELETE/api/projects/:id削除

アセット (assets.ts)

メソッドパス説明
POST/api/assets/:projectId/upload画像/音声アップロード
GET/api/assets/:projectIdプロジェクトアセット一覧
PATCH/api/assets/:projectId/:assetIdアセット更新 (slug, カテゴリ)
DELETE/api/assets/:projectId/:assetIdアセット削除
POST/api/assets/:projectId/use-official公式アセットインポート
POST/api/assets/:projectId/character-classキャラクタークラス作成
PUT/api/assets/:projectId/character-class/:slugキャラクタークラス更新
POST/api/assets/:projectId/upload-framesetスプライトシートアップロード

作品 (works.ts)

メソッドパス認証説明
GET/api/works不要公開作品一覧
POST/api/works必要作品公開
GET/api/works/:id不要作品詳細
PUT/api/works/:id必要公開/非公開切替
POST/api/works/:id/play不要再生数インクリメント
GET/POST/DELETE/api/works/:id/like必要いいね管理

AI 執筆支援 (assist.ts)

メソッドパス説明
POST/api/assist/work-setting作品設定保存
POST/api/assist/generate/chaptersStage 1: 章プロット生成
POST/api/assist/generate/episodesStage 2: 話プロット生成
POST/api/assist/generate/textStage 3: 本文生成
POST/api/assist/generate/ksStage 4: .ks スクリプト変換
POST/api/assist/regenerate再生成
GET/api/assist/result/:stage/:stageKey生成結果取得

その他ルート

パス説明
GET /api/healthヘルスチェック
GET /api/editor-schemaブロック型定義 (24h キャッシュ)
GET /api/preview/:idKS プレビュースクリプト生成
GET /api/users/:id公開ユーザープロフィール
GET /api/official-assets公式アセット検索
GET /api/messages通知一覧
POST /api/contactお問い合わせ
POST /mcpModel Context Protocol エンドポイント
/api/admin/*管理画面 API (admin ロール必要)

Prisma スキーマ (22 モデル)

コアモデル

モデル役割
Userアカウント (username, email, role: user/admin/guest, status: active/suspended)
Project編集可能プロジェクト (title, data: JSON)
Work公開作品 (playCount, likeCount, category, status)
Tag / WorkTagタグ (多対多)

アセットモデル

モデル役割
Assetプロジェクトアセット (slug, kind, category, blobPath, sourceType)
OfficialAsset管理者管理の共有アセット
UserAssetユーザー個人ライブラリ

キャラクターモデル

モデル役割
Characterレガシーキャラクター (per project)
Expressionキャラクター表情
FrameSetアニメーションスプライトシート
UserCharacter / UserExpressionユーザー所有クロスプロジェクトキャラクター

AI / ソーシャル

モデル役割
AiRequestLLM 呼び出し監査ログ
WorkSetting作品設定 (JSON)
GenerationResult生成結果 (stage, stageKey, result)
RagChunkRAG ベクトルインデックス
Likeいいね (userId, workId)
Message管理者 → ユーザー通知

共通ライブラリ (src/lib/)

ファイル役割
auth.tsJWT 生成/検証、bcrypt
db.tsPrisma シングルトン
id.tsULID 生成・検証・タイムスタンプ抽出
config.tsランタイム設定、ストレージモード、アセット URL 解決
validation.tsZod スキーマ (register, login)
email.tsメール送信 (Azure or コンソール)
azure.tsAzure Email/Blob Storage クライアント
image.tssharp による画像最適化
editor-schema.tsブロック型定義 (14 ブロック)

テスト

  • 43 テストファイル、6,814 行
  • ルートテスト (17 ファイル): 全エンドポイントの CRUD テスト
  • ミドルウェアテスト (5 ファイル): auth, admin, error, logger, rate-limit
  • ライブラリテスト (5 ファイル): auth, id, validation, email, editor-schema
  • AI テスト (14 ファイル): 4段階パイプライン、RAG、プロンプト、パーサー
  • 構造テスト (2 ファイル): api-structure, schema-sync
  • 統合テスト (2 ファイル): MCP, Azure live

セキュリティ

  • JWT 認証 (Authorization: Bearer)
  • ロールベースアクセス制御 (user/admin/guest)
  • ゲストアカウント有効期限 (7日)
  • 停止ユーザー拒否
  • エンドポイント別レートリミッティング
  • SQL インジェクション防止 (Prisma)
  • XSS/クリックジャッキング防止ヘッダー
  • CORS ホワイトリスト
Ad: stickyBottom (728x90)
kaedevn - ノベルゲームを作れるプラットフォーム