UI for Admin — ディレクトリ構成
レイヤー構成
app/ # Next.js App Router
(auth)/ # 公開ページ: login, forgot-password, reset-password
(authenticated)/ # 保護レイアウト: /auth/me をサーバーコンポーネントで取得しロールガード
admins/
organizations/
projects/
users/
api/ # Next.js Route Handler(ステートレスプロキシ)
auth/
login/route.ts
logout/route.ts
forgot-password/route.ts
reset-password/route.ts
proxy/[...path]/route.ts # 汎用 Bearer 付与プロキシ → 管理者 API
src/
api/
generated/ # Orval 出力(型、フック、Zod)— 手動編集禁止
validators/ # 生成 Zod に対するハンドオーサリングの refinement
client.ts # Orval フェッチャー(同一オリジン /api/proxy に向ける)
auth/
session.ts # Cookie read/write ヘルパー(server-only)
guards.ts # can(flag, level) ヘルパー
components/ # shadcn + アプリ固有
lib/
middleware.ts # エッジでの Cookie 存在チェック → /login リダイレクト
orval.config.ts
リクエストフロー
ブラウザ ──► Next.js Route Handler (/api/proxy/*) ──► 管理者 API /api/v1/*
▲
└─ httpOnly Cookie を読み Authorization: Bearer を付与
ブラウザから管理者 API への直接通信は行わない。すべて Next.js の同一オリジンプロキシ経由。
水平スケール
Next.js プロキシは完全にステートレス。任意のポッドが任意のリクエストを処理でき、スティッキーセッションや共有セッションストアは不要。ポッド間で共有する必要があるのは Cookie 署名シークレット(AWS Secrets Manager / Amplify の環境変数)のみ。
実際のセッション状態は水平共有済みのシステムに存在:
- Cognito — JWT 自体(JWKS で自己検証)
- PostgreSQL
sessionテーブル — 管理者 API が参照するサーバーサイドセッション行 - ブラウザ — Cookie