コンテンツにスキップ

ディレクトリ構成

ワークスペース全体

ワークスペースのルート自体は git リポジトリではなく、独立した 4 つのリポジトリと設計ドキュメント群で構成される。

design/
├── heineken-survey-design-backend/    # API サーバー (Hono + Bun + Drizzle / PostgreSQL)
├── heineken-survey-design-frontend/   # Web UI (Next.js 15 App Router)
├── Lab-web-extension/                 # Chrome 拡張 (Plasmo)
├── heineken-survey-design-docs/       # 本ドキュメント (MkDocs Material)
├── integration-tests/                 # dev 環境に対する Playwright 統合テスト
├── cs-api-logs/                       # CS 編集画面の実機 API トラフィック
└── *.md                               # 実装計画・CS との仕様差分分析
ディレクトリ 説明
heineken-survey-design-backend/ REST API。AWS Lambda 上でコンテナイメージとして動作する
heineken-survey-design-frontend/ 調査設計担当者が操作する Web UI
Lab-web-extension/ Creative Survey への投入・取り込みを行う Chrome 拡張
heineken-survey-design-docs/ このドキュメントサイト
integration-tests/ dev 環境に対する Playwright テスト(独立ディレクトリ)
cs-api-logs/ CS の API 仕様解明のために採取した実機ログ

ルート直下の設計ドキュメント

ファイル 内容
branch-logic-current-state-and-cs-diff.md 分岐機能の現状と CS との差分整理。実機ログからの確定事項
branch-cs-parity-implementation-plan.md CS 同等化の実装計画とフェーズ分け
free-text-multi-fields-implementation-plan.md FA 複数回答欄の実装プラン
text-matrix-implementation-plan.md テキストマトリクス設定 UI の実装プラン
cs-api-log-collection-guide.md CS 実機ログの収集手順
cs-import-test-cases.md CS 投入テストの観点(CP / I / R のチェックリスト)

backend

heineken-survey-design-backend/
├── src/
│   ├── index.ts                  # ローカル起動のエントリーポイント
│   ├── lambda.ts                 # AWS Lambda のエントリーポイント
│   ├── migrate-handler.ts        # マイグレーション実行 Lambda のエントリーポイント
│   ├── app.ts                    # createApp(): 認証ミドルウェアと router の登録
│   ├── routes/                   # API ルート定義とハンドラ
│   ├── repositories/             # データアクセス層 (権限判定・トランザクション)
│   ├── db/                       # Drizzle スキーマ・型・接続
│   ├── lib/                      # 認証・OpenAPI スキーマ・共通処理
│   ├── types/                    # ドメイン型
│   ├── scripts/                  # OpenAPI 書き出し・マイグレーション・シード
│   └── test/                     # テストヘルパー
├── drizzle/                      # 生成されたマイグレーション SQL
├── openapi.json                  # 書き出された OpenAPI ドキュメント
├── Dockerfile                    # API Lambda のコンテナイメージ
└── Dockerfile.migration          # マイグレーション Lambda のコンテナイメージ
ディレクトリ 説明
src/routes/ リソース単位のルート定義。surveys / sections / questions / versions / permissions / question-library / users / imports
src/repositories/ survey-store.ts(案件まわり全般)と import-store.ts(外部取り込み)。DB 操作と権限判定をここに閉じ込める
src/db/ schema.ts(DB 構造の唯一の正)・models.ts(推論型)・client.ts(接続)
src/lib/ auth.ts(ユーザー解決・管理者判定)・openapi-schemas.ts(Zod スキーマ集約)・openapi.ts・renumber-questions.ts(設問コード振り直しの計算。純粋関数)
src/types/domain.ts API とアプリケーションで共有するドメイン型

テストは対象と同じ階層に *.test.ts として置く(例: src/app.test.ts)。

frontend

src/ を持たず、ルート直下に app/ components/ lib/ を置く構成。

heineken-survey-design-frontend/
├── app/                          # App Router
│   ├── login/                    # ログイン
│   ├── surveys/                  # 案件一覧・新規作成・詳細・セクション・プレビュー
│   ├── library/                  # 質問ライブラリ
│   └── api/auth/[...nextauth]/   # next-auth のハンドラ
├── components/
│   ├── app-shell/                # サイドバー・ヘッダを含む共通シェル
│   ├── common/                   # 汎用 UI (ボタン・バッジ・ダイアログ等)
│   ├── providers/                # 認証・TanStack Query の Provider
│   ├── surveys/                  # 案件・セクション・設問・プレビューの画面本体
│   └── library/                  # 質問ライブラリの画面本体
├── lib/
│   ├── api/                      # orval 生成の API クライアント (手編集禁止)
│   ├── orval/client.ts           # customFetch (共通ヘッダの付与)
│   ├── surveys/                  # 分岐評価・バリデーション等のドメインロジック
│   └── format/                   # 日時整形などのユーティリティ
├── styles/                       # 共通 SCSS
├── types/                        # 共有型
├── scripts/                      # OpenAPI 正規化・orval パッチ・husky セットアップ
├── _templates/                   # hygen のコンポーネント雛形
├── middleware.ts                 # /surveys/* /library/* の認証保護
└── Dockerfile                    # App Runner 用のコンテナイメージ
ディレクトリ 説明
app/ ルーティング。page.tsx(サーバー)と page-client.tsx(クライアント)を対で置く
components/ 1 コンポーネント 1 ディレクトリ。index.tsx + index.module.scss
lib/surveys/ UI に依存しないドメインロジック。分岐評価・バリデーション・カスタムフック
lib/api/ orval の生成物。手編集禁止

画面パスと対応ディレクトリ

画面 パス 実装
ログイン /login components/auth/login-page-client/
案件一覧 /surveys components/surveys/surveys-page-client/
新規作成 /surveys/new components/surveys/new-survey-client/, survey-theme-form/
案件詳細 /surveys/[id] components/surveys/survey-detail-client/, survey-permission-panel/, survey-version-panel/
セクション一覧 /surveys/[id]/sections components/surveys/section-list-client/
セクション詳細 /surveys/[id]/sections/[sectionId] components/surveys/section-detail-client/
プレビュー /surveys/[id]/preview components/surveys/survey-preview/
質問ライブラリ /library components/library/question-library-page-client/

Chrome 拡張

Lab-web-extension/
├── src/
│   ├── background.ts                       # バックグラウンドスクリプト
│   ├── popup/                              # 拡張のポップアップ UI
│   ├── contents/
│   │   ├── creative-survey-overlay.tsx     # CS 画面に重ねる操作パネル
│   │   └── cs-api-logger.ts                # CS の API トラフィック記録
│   ├── components/creative-survey/         # 投入 UI・API ログパネル
│   ├── providers/                          # Theme / SurveyUploader の Provider
│   ├── types/                              # CS API・設計ツール JSON の型定義
│   └── utils/creative-survey/
│       ├── api.ts                          # CS API クライアント
│       ├── constants.ts                    # answer_type / API URL
│       ├── plan/build-import-plan.ts       # 出力 JSON → CS 投入プラン (純粋関数)
│       ├── execute-import-plan.ts           # プランに沿って CS API を呼び出す
│       └── reset-survey.ts                 # CS 側の調査票をリセットする
└── cs-import-test-cases.md                 # CS 投入テストの観点

CS への投入は「変換(プランの組み立て)」と「実行(API 呼び出し)」を分離している。変換が純粋関数なので、CS の API を呼ばずに Vitest で網羅的にテストできる。

flowchart LR
    Json[調査票 JSON] --> Build[build-import-plan.ts<br/>純粋関数]
    Build --> Plan[投入プラン]
    Plan --> Exec[execute-import-plan.ts]
    Exec --> CS[(Creative Survey API)]

integration-tests

integration-tests/
├── config.ts                     # dev の URL と API 用アカウント
├── playwright.config.ts          # Playwright 設定 (workers: 1, headless: false)
├── tests/
│   ├── 00-smoke.spec.ts          # dev への疎通確認
│   ├── 01-build-survey.spec.ts   # サーベイ構築 (CP1〜CP13)
│   └── 02-preview-run.spec.ts    # プレビュー走行 (R1〜R28)
├── pages/                        # 画面操作 (設問エディタ / 分岐 / 表示ロジック / プレビュー)
├── lib/                          # dev API 直叩き・走行ロジック・待機ヘルパー
├── fixtures/scenario.ts          # 設問表 (Q1〜Q13) の定義
└── scripts/                      # 認証状態の保存・後片付け・CS ログ照合

docs(本サイト)

heineken-survey-design-docs/
├── mkdocs.yml                    # サイト設定・ナビゲーション・i18n
├── pyproject.toml                # MkDocs の依存定義 (uv 管理)
└── docs/
    ├── home.{ja,en}.md
    ├── link.{ja,en}.md
    ├── business-domain/          # プロダクト・登場人物・機能・データモデル
    └── development/              # セットアップ・API・DB・インフラ・規約

日本語版は *.ja.md、英語版は *.en.md として同じディレクトリに置く(mkdocs-static-i18n の suffix 方式)。

新ファイルを追加するとき

追加するもの 置き場所
API のエンドポイント backend src/routes/<リソース>.ts(新規リソースなら src/app.ts に登録を追加)
DB 操作 backend src/repositories/survey-store.ts(外部取り込みは import-store.ts)
テーブル定義 backend src/db/schema.ts → bun run db:generate
リクエスト / レスポンススキーマ backend src/lib/openapi-schemas.ts
ドメイン型 backend src/types/domain.ts
画面 frontend app/<パス>/page.tsx + page-client.tsx、本体は components/<ドメイン>/
汎用 UI コンポーネント frontend components/common/(bun run new:common で雛形生成)
画面固有のコンポーネント frontend components/<ドメイン>/(bun run new:component)
UI に依存しないロジック frontend lib/surveys/ に純粋関数として置き、Vitest でテストする
CS 変換ロジック 拡張 src/utils/creative-survey/plan/build-import-plan.ts + 同名の .test.ts
統合テストのシナリオ integration-tests/tests/ と fixtures/scenario.ts