機能仕様書

RoomCraft — v1.0.0 — 2026-03-19

機能仕様書: RoomCraft(ルームクラフト)

プロジェクト名: RoomCraft バージョン: 1.0.0 作成日: 2026-03-19 ステータス: Phase 2 設計中 参照: docs/requirements/requirements.md


目次

  1. 画面遷移図
  2. 消費者向け画面仕様
  3. メーカー向け画面仕様
  4. プラットフォーム管理画面仕様
  5. API仕様
  6. データモデル(ER図)
  7. ビジネスロジック仕様
  8. 状態遷移仕様
  9. エラーコード一覧

1. 画面遷移図

1.1 消費者向け画面遷移

flowchart TD
    LP[ランディングページ] --> |未ログイン| GUEST[ゲストモード]
    LP --> |ログイン/登録| AUTH[認証画面\nCC-Auth]
    AUTH --> |成功| MY[マイルーム一覧]
    GUEST --> |間取り作成| FLOOR_G[間取りエディタ\nゲストモード]
    MY --> |新規作成| FLOOR[間取りエディタ]
    MY --> |既存選択| SIM[3Dシミュレーション]
    FLOOR --> |保存/完了| SIM
    FLOOR_G --> |保存しようとする| AUTH
    SIM --> |家具検索| CAT[家具カタログ]
    CAT --> |商品選択| PROD[家具詳細]
    PROD --> |配置| SIM
    PROD --> |カート追加| CART[カート]
    SIM --> |AIコーディネート| AI[AIコーディネート画面]
    AI --> |適用| SIM
    SIM --> |投稿| COM_POST[コミュニティ投稿]
    COM_POST --> COM[コミュニティ一覧]
    COM --> COM_DETAIL[投稿詳細]
    COM_DETAIL --> |参考コピー| SIM
    CART --> |チェックアウト| CHECKOUT[チェックアウト]
    CHECKOUT --> |完了| ORDER_CONFIRM[注文確認]
    ORDER_CONFIRM --> MY
    LP --> MYPAGE[マイページ]
    MY --> MYPAGE
    MYPAGE --> |ログアウト| LP

1.2 メーカー向け画面遷移

flowchart TD
    MAKER_LP[メーカー向けLP] --> |申請| APPLY[メーカー申請フォーム]
    APPLY --> |審査中| WAIT[審査待ち画面]
    WAIT --> |承認| MAKER_LOGIN[メーカーログイン\nCC-Auth]
    MAKER_LOGIN --> |成功| DASH[ダッシュボード]
    DASH --> PROD_LIST[商品管理一覧]
    DASH --> ORDER_LIST[注文管理一覧]
    DASH --> ANALYTICS[アナリティクス]
    DASH --> BRAND_STORE[ブランドストア設定]
    DASH --> ACCOUNT[アカウント設定]
    PROD_LIST --> |新規登録| PROD_CREATE[商品登録]
    PROD_LIST --> |編集| PROD_EDIT[商品編集]
    PROD_CREATE --> MODEL_UPLOAD[3Dモデル管理]
    PROD_EDIT --> MODEL_UPLOAD
    MODEL_UPLOAD --> |アップロード| MODEL_PREVIEW[3Dモデルプレビュー]
    MODEL_UPLOAD --> |AI変換| MODEL_CONVERT[写真→3D変換]
    ORDER_LIST --> ORDER_DETAIL[注文詳細]
    ORDER_DETAIL --> |発送処理| SHIP[配送情報入力]
    ACCOUNT --> PLAN[プラン変更]
    ACCOUNT --> BILLING[請求・決済管理]

1.3 プラットフォーム管理画面遷移

flowchart TD
    ADMIN_LOGIN[管理者ログイン] --> ADMIN_DASH[管理ダッシュボード]
    ADMIN_DASH --> MAKER_REVIEW[メーカー審査管理]
    ADMIN_DASH --> USER_MANAGE[ユーザー管理]
    ADMIN_DASH --> CAT_MANAGE[カテゴリマスタ管理]
    ADMIN_DASH --> CONTENT_MOD[コンテンツモデレーション]
    ADMIN_DASH --> NOTICE[システム通知配信]
    ADMIN_DASH --> REVENUE[売上・決済管理]
    MAKER_REVIEW --> |承認/却下| MAKER_NOTIFY[メーカーへ通知]
    CONTENT_MOD --> |削除/警告| USER_ACTION[ユーザーへアクション]

2. 消費者向け画面仕様

2.1 ランディングページ(/)

概要: サービス紹介、人気コーディネート、提携メーカー一覧を表示するトップページ。

入力

要素種別説明
メールアドレスtext inputクイック登録フォーム
間取り選択(テンプレート)select1K/1LDK/2LDK等

出力

要素データソース
人気コーディネート(最大12件)/api/community/featured
提携メーカー一覧(最大30件)/api/makers/featured
掲載商品数・ユーザー数/api/stats/public

バリデーション

フィールドルール
メールアドレスRFC 5322準拠、255文字以内

エラーハンドリング

エラー表示
メール形式不正インラインエラー「正しいメールアドレスを入力してください」
APIエラートースト通知(3秒)「読み込みに失敗しました。再度お試しください」

2.2 認証画面(/login, /register, /auth/callback)

概要: CC-Auth(Cognito)を利用したSSO認証。外部IdPにリダイレクトして認証後、コールバックでセッションを確立する。

入力

要素種別必須説明
メールアドレスemailYes認証用メールアドレス
パスワードpasswordYes8文字以上
氏名(新規登録)textYes1〜50文字
生年月日(新規登録)dateNo統計利用

出力

  • JWT(アクセストークン): HttpOnly Cookie、有効期間1時間
  • リフレッシュトークン: HttpOnly Cookie、有効期間30日
  • ユーザープロフィール: Zustand store に格納

バリデーション

フィールドルール
メールアドレス必須、RFC 5322準拠、255文字以内
パスワード必須、8文字以上、英数字混在、大文字1文字以上
氏名必須(登録時)、1〜50文字

エラーハンドリング

エラーコード画面表示
AUTH_001「メールアドレスまたはパスワードが正しくありません」
AUTH_002「このメールアドレスは既に登録されています」
AUTH_003「アカウントがロックされています。30分後に再試行してください」
AUTH_004「メール認証が完了していません。認証メールをご確認ください」
ソーシャルログイン失敗「Googleログインに失敗しました。ブラウザを更新してお試しください」

ゲストモード

  • セッションIDをlocalStorageに保存
  • 間取りデータをIndexedDBに一時保存(最大1件)
  • ゲストで作成したデータは会員登録後に引き継ぎ可能

2.3 マイルーム一覧(/rooms)

概要: ユーザーが作成した部屋(ルーム)の一覧管理画面。

入力

要素種別説明
新規作成ボタンbutton間取りエディタへ遷移
ルーム選択card click3Dシミュレーションへ遷移
ルーム名編集inline editルーム名を変更
複製ボタンbuttonルームをコピー
削除ボタンbutton確認ダイアログ後に削除

出力

要素説明
ルームカードサムネイル、ルーム名、更新日時、家具数、合計金額
ルーム数最大10件(Starterプラン:1件、有料プラン以外は制限なし)

バリデーション

フィールドルール
ルーム名1〜50文字

エラーハンドリング

エラー表示
ルーム上限超過「ルームは最大10件まで作成できます」
削除失敗「削除に失敗しました。再度お試しください」

2.4 間取りエディタ(/rooms/new, /rooms/[id]/floor)

概要: 部屋の形状(間取り)を2D平面図で作成・編集する画面。

機能詳細

機能説明
壁の描画クリック→ドラッグで壁を描画。スナップグリッド5cm単位
部屋形状矩形、L字型、多角形(最大16頂点)対応
ドア配置壁上にドラッグで配置。開き方向(左/右)設定可能
窓配置壁上にドラッグで配置。幅サイズ設定可能
柱配置任意位置に配置。サイズ設定可能
斜め壁45°/30°/60°スナップ対応
寸法入力各壁の長さをcm単位で数値入力可能
テンプレート1K/1DK/1LDK/2LDK/2LDKプラス/3LDK(全6種)

入力

要素種別必須バリデーション
部屋幅numberYes100〜2000 cm
部屋奥行きnumberYes100〜2000 cm
天井高numberNo200〜400 cm(デフォルト240cm)
ドア幅numberNo60〜120 cm(デフォルト80cm)
窓幅numberNo60〜240 cm
柱サイズnumberNo10〜100 cm

出力

  • FloorPlanオブジェクト(JSON)がIndexedDB/APIに保存
  • サムネイル画像(PNG、400x300px)を自動生成

エラーハンドリング

エラー表示
部屋サイズ上限超過「部屋のサイズは2000cm x 2000cm以内に設定してください」
自己交差ポリゴン「壁が交差しています。間取りを修正してください」
保存失敗「保存に失敗しました。再度お試しください」(オートセーブ30秒毎)

2.5 3Dシミュレーション(/rooms/[id]/simulate)

概要: 作成した間取りに家具を配置・編集するメイン画面。Three.js + React Three Fiberで描画。

レイアウト

┌─────────────────────────────────────────────────┐ │ ToolBar [Undo/Redo | 2D/3D切替 | 視点 | 共有] │ ├──────────────┬──────────────────────────────────┤ │ │ │ │ サイドパネル │ 3Dビューポート(メイン) │ │ ・家具検索 │ │ │ ・配置済み │ [Three.js Canvas] │ │ 家具リスト │ │ │ ・AIコーデ │ │ │ │ │ ├──────────────┴──────────────────────────────────┤ │ BottomBar [選択家具情報 | 合計金額 | カート] │ └─────────────────────────────────────────────────┘

操作仕様

操作PCモバイル
視点回転右クリック+ドラッグ2本指スワイプ
視点移動中クリック+ドラッグ3本指スワイプ
ズームスクロールピンチ
家具選択クリックタップ
家具移動ドラッグドラッグ
家具回転選択後Rキー or ハンドル操作選択後回転ハンドル
家具削除Deleteキー or コンテキストメニューロングタップ→削除
マルチ選択Shift+クリック-
UndoCtrl+Zアイコンボタン
RedoCtrl+Yアイコンボタン

パフォーマンス仕様

項目目標値
フレームレート60fps(デスクトップ)、30fps(モバイル)
最大同時表示家具数100点
3Dモデルロード2秒以内/点
LOD(Level of Detail)距離に応じて3段階自動切替

バリデーション

チェック項目処理
家具の衝突判定重なり時に赤色ハイライト+警告メッセージ
部屋外配置部屋の境界外にドロップ不可(スナップで最寄り位置に補正)
家具上限100点超過時「これ以上配置できません」

エラーハンドリング

エラー処理
3Dモデル読み込み失敗プレースホルダーボックスを表示、リトライボタン提示
WebGL非対応ブラウザ「このブラウザは3D表示に対応していません。Chrome/Firefoxをお使いください」
オフラインローカルキャッシュで継続、同期は復帰後に自動実行

2.6 家具カタログ(/catalog)

概要: 複数メーカーの家具を検索・フィルタリング・閲覧する画面。OpenSearchを使った全文検索対応。

検索・フィルタ仕様

フィルタ種別説明
キーワードtext商品名・説明・タグ全文検索
カテゴリtree selectリビング/ダイニング/寝室/書斎/収納/その他(3階層)
メーカーmulti select審査済みメーカー一覧
スタイルmulti selectモダン/ナチュラル/北欧/インダストリアル/和モダン/ヴィンテージ
価格帯range slider¥0〜¥1,000,000(1万円単位)
color picker15色パレット(複数選択可)
素材multi select木材/スチール/ファブリック/レザー/ガラス/プラスチック
range slider10〜500 cm
奥行きrange slider10〜300 cm
高さrange slider10〜300 cm
在庫ありtoggle在庫数1以上のみ表示
送料無料toggle送料無料商品のみ

ソート

オプションデフォルト
おすすめ順(スコア降順)Yes
価格昇順No
価格降順No
新着順No
人気順(配置数降順)No

ページネーション

  • 1ページ24件表示
  • 無限スクロール(モバイル)/ ページネーション(デスクトップ)

出力(商品カード)

要素説明
サムネイル200x200px、ホバーで複数枚スライド
商品名最大2行、省略表示
メーカー名バッジ表示
価格税込表示。バリアントあれば「¥XX,000〜」
カラーチップ最大5色、6色目以降は「+N」
お気に入りボタンハートアイコン
在庫状況「残り僅か」(在庫3以下)/ 「在庫切れ」

2.7 家具詳細(/catalog/[productId])

概要: 個別商品の詳細情報・3Dプレビュー・購入アクション画面。

入力

要素種別説明
カラーバリエーション選択radio/swatchバリアントID切替
サイズバリアント選択radioWサイズ等
数量number1〜99
お気に入り登録buttonウィッシュリストに追加
カートに追加buttonカートへ追加
部屋に配置buttonアクティブなシミュレーション画面に配置
ECサイトで見るlinkメーカーECサイトへ遷移(新タブ)

出力

要素説明
商品画像ギャラリーメイン1枚+サムネイル最大10枚
3Dビュー360°インタラクティブビュー。モデルが存在する場合
商品名・ブランドテキスト
価格税込、税別表示
サイズ情報W×D×H(cm)
素材・仕上げテキスト
商品説明リッチテキスト
配送情報送料、お届け目安日数
レビュー評価(5段階)、コメント一覧
在庫状況数量・入荷予定
関連商品同カテゴリ・同メーカー4件

バリデーション

フィールドルール
数量1〜99、整数、在庫数以下

2.8 AIコーディネート(/rooms/[id]/ai-coordinate)

概要: ユーザーの入力条件をもとにClaudeAPIがコーディネート提案を生成する画面。

入力フォーム

フィールド種別必須バリデーション
予算numberYes¥10,000〜¥10,000,000
スタイルmulti selectYes1〜3種選択
優先家具multi selectNo最大5カテゴリ
除外メーカーmulti selectNo最大5社
希望カラートーンcolor selectNo暖色/寒色/ニュートラル/モノトーン
家族構成selectNo1人/カップル/3〜4人家族/5人以上
ライフスタイルtext areaNo200文字以内。自由記述

処理フロー

  1. フォーム送信 → POST /api/ai/coordinate
  2. WebSocketで生成進捗を受信(ストリーミング)
  3. 最低3パターン生成(約5秒以内に初回パターン表示)
  4. 各パターン: 配置家具リスト + 合計金額 + コーディネート解説

出力(コーディネートカード)

要素説明
パターン名例:「スカンジナビアンナチュラル」
3Dプレビューサムネイル表示
使用家具リスト家具名、メーカー、価格
合計金額予算内/超過の表示
AIコメント選定理由・スタイルポイント(200文字程度)
「このパターンを採用」ボタン現在のシミュレーションに適用
「家具を差し替え」ボタン個別家具の差し替えモード

エラーハンドリング

エラー処理
予算内で家具が見つからない「予算を¥XX,000以上に設定すると提案できます」
AIサービス障害「現在AIコーディネートを利用できません。しばらく後にお試しください」
タイムアウト(30秒)「生成に時間がかかっています。再試行しますか?」

2.9 コミュニティ(/community)

概要: ユーザーがルームデザインを投稿・閲覧・交流する画面。

一覧画面

フィルタ説明
新着投稿日時降順
人気いいね数降順(過去7日間)
スタイル別モダン/ナチュラル/北欧等
部屋タイプ1K/1LDK/2LDK等

投稿詳細(/community/[postId])

要素説明
3Dビュー閲覧専用3Dシミュレーション
スクリーンショット投稿者が選択したアングルの画像
使用家具リスト各家具へのリンク付き
いいねログインユーザーのみ可能
ブックマークログインユーザーのみ可能
参考コピーログインユーザー限定。同じ家具配置を自分のルームにコピー
コメントテキスト、300文字以内
通報コンテンツ通報(スパム/不適切コンテンツ/著作権侵害)

投稿フォーム(/community/new)

フィールド種別必須バリデーション
タイトルtextYes1〜100文字
説明textareaNo500文字以内
スタイルタグmulti selectNo最大5タグ
公開設定selectYes公開/限定公開/非公開
スクリーンショット自動生成-現在のビューから自動キャプチャ

2.10 カート・チェックアウト(/cart, /checkout)

概要: カート管理・購入手続きの画面。メーカーをまたぐ複数商品を一括管理。

カート画面

要素説明
商品リストサムネイル、名前、バリアント、数量変更、削除
メーカー別グループメーカーごとにグループ化して表示
小計メーカー別、全体
送料メーカー別に表示
合計金額税込/税別
クーポン入力コードを入力して割引適用
購入手続きへログイン必須。未ログイン時は認証画面へ

チェックアウト画面

ステップ入力フィールド
配送先氏名、郵便番号(自動補完)、住所、電話番号
配送方法メーカー別に選択(通常/速達)
支払い方法Stripe Elements(クレカ/コンビニ/銀行振込)
注文確認全項目確認。確定ボタン

バリデーション

フィールドルール
氏名必須、1〜50文字
郵便番号必須、7桁数字(ハイフン任意)
電話番号必須、10〜11桁数字
クレジットカードStripe側でバリデーション

エラーハンドリング

エラー表示
在庫切れ(チェックアウト時)「[商品名]が在庫切れになりました。カートから削除してください」
決済失敗Stripeエラーメッセージをそのまま表示
一部在庫不足数量自動調整+通知「[商品名]の在庫が1点のみのため数量を変更しました」

2.11 マイページ(/mypage)

概要: ユーザーのアカウント情報・注文履歴・お気に入り管理画面。

サブページ構成

パス内容
/mypageプロフィール概要
/mypage/profile氏名、メール、パスワード変更
/mypage/orders注文履歴一覧
/mypage/orders/[orderId]注文詳細・追跡
/mypage/favoritesお気に入り家具一覧
/mypage/roomsマイルーム一覧(リダイレクト)
/mypage/notifications通知設定(メール/プッシュ)

3. メーカー向け画面仕様

3.1 メーカー申請フォーム(/maker/apply)

概要: メーカーとして出店申請を行うフォーム。審査ワークフローの起点。

入力

フィールド種別必須バリデーション
会社名/屋号textYes1〜100文字
代表者名textYes1〜50文字
メールアドレスemailYesRFC 5322準拠
電話番号telYes10〜11桁
郵便番号textYes7桁
住所textYes10〜200文字
事業形態selectYes個人事業主/法人
法人番号textYes(法人)13桁数字
年商規模selectYes~500万/500万〜5000万/5000万〜10億/10億〜
希望プランselectYesStarter/Growth/Professional/Enterprise
ブランド概要textareaYes50〜1000文字
商品カテゴリmulti selectYes最大5カテゴリ
ウェブサイトURLurlNoURL形式
SNSアカウントtextNoURL形式
商品画像サンプルfile uploadYesJPG/PNG、5MB以内、最大5枚
利用規約同意checkboxYes-

エラーハンドリング

エラー表示
既に申請済み「このメールアドレスでは申請済みです。審査結果をお待ちください」
法人番号不正「正しい法人番号を入力してください(13桁)」
ファイルサイズ超過「ファイルサイズは5MB以内にしてください」

3.2 ダッシュボード(/maker/dashboard)

概要: メーカーの主要KPI・通知・クイックアクションを表示するホーム画面。

KPIカード(本日/今月/累計)

指標説明
売上金額本日/今月
注文件数本日/今月
商品閲覧数本日/今月
配置回数本日/今月(シミュレーションで配置された回数)
購入コンバージョン率配置→購入率
未処理注文数要対応件数(バッジ表示)

通知一覧

通知種別トリガー
新着注文注文受付時
在庫警告在庫数5以下
審査完了プラットフォームからの連絡
レビュー投稿ユーザーがレビュー投稿

3.3 商品管理(/maker/products)

概要: 商品の登録・編集・公開管理を行う画面。

商品一覧

フィルタ説明
ステータス公開中/下書き/審査中/非公開
カテゴリ絞り込み
在庫状況在庫あり/在庫なし/残り僅か
テキスト検索商品名・SKUコード

商品登録フォーム(/maker/products/new, /maker/products/[id]/edit)

基本情報

フィールド種別必須バリデーション
商品名textYes1〜200文字
商品説明richtextYes10〜10000文字
カテゴリtree selectYes末端カテゴリを選択
スタイルタグmulti selectNo最大10タグ
SKUコードtextYes英数字・ハイフン、50文字以内

価格・在庫

フィールド種別必須バリデーション
定価(税抜)numberYes1〜99,999,999円
販売価格(税抜)numberYes1〜99,999,999円(定価以下)
消費税率selectYes10%/軽減8%
在庫数numberYes0〜999,999
入荷予定日dateNo未来日付のみ
送料設定selectYes無料/地域別/重量別
送料(一律)number条件付き0〜99,999円

寸法・素材

フィールド種別必須バリデーション
幅(cm)numberYes1〜500
奥行き(cm)numberYes1〜300
高さ(cm)numberYes1〜300
重量(kg)numberNo0.1〜999.9
素材multi selectYes1〜5種選択
カラーcolor selectYes1〜15色

バリエーション

フィールド説明
カラーバリエーション色ごとに価格・在庫・画像・3Dモデルを設定
サイズバリアントSサイズ/Mサイズ等、寸法・価格を個別設定

画像・3Dモデル

フィールド制約
商品画像JPG/PNG/WebP、10MB以内、最大20枚
メイン画像1枚必須、正方形推奨(1000x1000px)
3DモデルGLB/GLTF推奨、最大100MB

バリデーション(共通)

チェックルール
販売価格定価以下であること
SKUコードメーカー内でユニーク
3Dモデルアップロード後に自動品質チェック

3.4 3Dモデル管理(/maker/models)

概要: 3Dモデルのアップロード・変換・プレビュー・バージョン管理画面。

アップロード仕様

項目仕様
対応形式GLB(推奨)、GLTF、OBJ(MTLファイル付き)、FBX
最大ファイルサイズ100MB
アップロード方式マルチパート、プログレスバー表示
自動処理アップロード後にLOD生成(高/中/低の3段階)

自動品質チェック

チェック項目合格基準
ポリゴン数50,000以下
テクスチャサイズ4096x4096px以下
ファイルサイズ50MB以下(変換後)
マテリアル数10以下
UVマッピングエラーなし

写真→3D変換ツール(AI変換)

ステップ説明
1商品写真アップロード(正面/側面/背面の3枚必須、上面任意)
2寸法入力(W×D×H)
3変換開始(処理時間:約3〜10分)
4プレビュー確認・承認
5商品への紐付け

3.5 注文管理(/maker/orders)

概要: プラットフォーム経由の注文を管理する画面。

注文一覧フィルタ

フィルタ説明
ステータス新着/確認中/発送済み/完了/キャンセル/返品中
期間今日/今週/今月/カスタム期間
商品名テキスト検索

注文詳細(/maker/orders/[orderId])

要素説明
注文情報注文ID、注文日時、顧客名(匿名化オプション)
商品明細商品名、バリアント、数量、小計
配送先住所(番地まで表示)
配送情報入力配送業者選択、追跡番号入力
ステータス変更ドロップダウンで変更
メモ社内メモ(顧客には非表示)

ステータス変更ルール

詳細は 8.1 注文ステータス遷移 を参照。


3.6 アナリティクス(/maker/analytics)

概要: 商品パフォーマンス・ユーザー行動の詳細分析ダッシュボード。

グラフ・指標一覧

指標粒度期間
売上推移日/週/月最大365日
商品別閲覧数-選択期間
商品別配置回数-選択期間
購入コンバージョン率-選択期間
AI採用率AIコーディネートで採用された割合選択期間
ユーザー属性年齢層/地域/デバイス選択期間
同カテゴリ比較自社vs業界平均選択期間
コンバージョンファネル閲覧→配置→カート→購入選択期間

エクスポート

  • CSV形式でダウンロード可能
  • 全指標のRAWデータを対象期間で出力

4. プラットフォーム管理画面仕様

4.1 メーカー審査管理(/admin/makers)

概要: メーカー申請の審査・承認・却下を行う管理画面。

審査フロー

  1. 申請受付 → ステータスPENDING
  2. 担当者アサイン → ステータスREVIEWING
  3. 審査実施(書類確認・サイト確認)
  4. 承認 → ステータスAPPROVED + メーカーへ通知メール
  5. 却下 → ステータスREJECTED + 却下理由メール

審査チェックリスト

チェック項目必須
法人番号照合(GBiz API)法人のみ
商品画像の品質確認Yes
ウェブサイト確認No
個人情報取扱方針の確認Yes
特定商取引法表示確認Yes

4.2 カテゴリマスタ管理(/admin/categories)

概要: 商品カテゴリの階層管理(3階層まで)。

カテゴリツリー(初期データ)

リビング ├── ソファ │ ├── 1人掛け │ ├── 2人掛け │ ├── 3人掛け │ └── コーナー/L字 ├── テレビ台・ローボード ├── センターテーブル/ローテーブル ├── シェルフ・棚 └── ラグ・カーペット ダイニング ├── ダイニングテーブル ├── ダイニングチェア └── 食器棚・キッチン収納 寝室 ├── ベッド・寝具 │ ├── シングル │ ├── セミダブル │ ├── ダブル │ └── クイーン/キング ├── マットレス ├── 枕・寝具 ├── ドレッサー └── チェスト・たんす 書斎・ワークスペース ├── デスク ├── チェア・ワークチェア ├── 本棚・ブックシェルフ └── 収納ボックス・ファイルケース 収納・クローゼット ├── ワードローブ・洋服タンス ├── チェスト ├── シューズラック └── ハンガーラック その他・インテリア小物 ├── 照明・ライト ├── ミラー・鏡 ├── 観葉植物 └── インテリア雑貨

5. API仕様

5.1 認証

全APIエンドポイント(/api/public/を除く)は、リクエストヘッダーに有効なJWTトークンが必要です。

Authorization: Bearer <access_token>

または HttpOnly Cookie rc_access_token


5.2 共通レスポンス形式

成功

{
  "success": true,
  "data": { ... },
  "meta": {
    "page": 1,
    "limit": 24,
    "total": 100
  }
}

エラー

{
  "success": false,
  "error": {
    "code": "PRODUCT_NOT_FOUND",
    "message": "商品が見つかりませんでした",
    "details": {}
  }
}

5.3 消費者向けAPI

認証

メソッドパス説明
POST/api/auth/register新規ユーザー登録
POST/api/auth/loginログイン(CC-Auth委託)
POST/api/auth/logoutログアウト
GET/api/auth/me自分のプロフィール取得
PUT/api/auth/meプロフィール更新
POST/api/auth/refreshトークンリフレッシュ

ルーム管理

メソッドパス説明認証
GET/api/rooms自分のルーム一覧Required
POST/api/roomsルーム新規作成Required
GET/api/rooms/:roomIdルーム詳細取得Required
PUT/api/rooms/:roomIdルーム更新Required
DELETE/api/rooms/:roomIdルーム削除Required
POST/api/rooms/:roomId/duplicateルーム複製Required
GET/api/rooms/:roomId/snapshotスナップショット生成Required

POST /api/rooms リクエスト

{
  "name": "リビングルーム",
  "floorPlan": {
    "width": 500,
    "depth": 400,
    "height": 240,
    "shape": "rectangle",
    "walls": [
      { "x1": 0, "y1": 0, "x2": 500, "y2": 0 },
      ...
    ],
    "doors": [{ "wallIndex": 0, "offset": 100, "width": 80, "direction": "left" }],
    "windows": [{ "wallIndex": 2, "offset": 50, "width": 160 }]
  },
  "furnitures": []
}

PUT /api/rooms/:roomId/furnitures リクエスト

{
  "furnitures": [
    {
      "productId": "prod_abc123",
      "variantId": "var_def456",
      "position": { "x": 100, "y": 0, "z": 150 },
      "rotation": { "x": 0, "y": 90, "z": 0 },
      "scale": { "x": 1, "y": 1, "z": 1 }
    }
  ]
}

家具カタログ

メソッドパス説明認証
GET/api/products商品一覧・検索Optional
GET/api/products/:productId商品詳細Optional
GET/api/products/:productId/model3Dモデル取得(署名付きURL)Optional
GET/api/categoriesカテゴリツリー取得None
GET/api/makersメーカー一覧None
GET/api/makers/:makerIdメーカー詳細(ブランドストア)None

GET /api/products クエリパラメータ

パラメータ説明
qstringキーワード検索ソファ
categoryIdstringカテゴリIDcat_sofa_2
makerIdsstring[]メーカーIDs(カンマ区切り)maker1,maker2
stylesstring[]スタイルmodern,natural
colorHexesstring[]カラーコード#ffffff,#000000
minPricenumber最低価格(税抜)10000
maxPricenumber最高価格(税抜)100000
minWidthnumber最小幅(cm)50
maxWidthnumber最大幅(cm)200
inStockboolean在庫ありのみtrue
sortstringソートprice_asc
pagenumberページ番号1
limitnumber件数(最大50)24

AIコーディネート

メソッドパス説明認証
POST/api/ai/coordinateコーディネート生成(SSE)Optional
POST/api/ai/coordinate/:requestId/applyコーディネートを部屋に適用Required
GET/api/ai/coordinate/history生成履歴Required

POST /api/ai/coordinate リクエスト

{
  "roomId": "room_abc123",
  "budget": 500000,
  "styles": ["natural", "nordic"],
  "colorTone": "warm",
  "familyType": "couple",
  "priorityCategories": ["sofa", "dining_table"],
  "excludeMakerIds": [],
  "freeText": "北欧ナチュラルな雰囲気で、木の温もりを感じる空間にしたい"
}

SSEレスポンス(event-stream)

event: progress data: {"step": 1, "message": "部屋の情報を分析中..."} event: pattern data: {"patternIndex": 1, "name": "スカンジナビアンナチュラル", "furnitures": [...], "totalPrice": 480000, "comment": "..."} event: complete data: {"totalPatterns": 3}

カート・注文

メソッドパス説明認証
GET/api/cartカート取得Required
POST/api/cart/itemsカートに追加Required
PUT/api/cart/items/:itemIdカートアイテム数量変更Required
DELETE/api/cart/items/:itemIdカートから削除Required
POST/api/orders注文作成(Stripe Payment Intent生成)Required
GET/api/orders注文履歴Required
GET/api/orders/:orderId注文詳細Required
POST/api/orders/:orderId/cancel注文キャンセルRequired

POST /api/orders リクエスト

{
  "cartId": "cart_abc123",
  "shippingAddress": {
    "name": "山田 太郎",
    "postalCode": "1500001",
    "prefecture": "東京都",
    "city": "渋谷区",
    "line1": "神南1-2-3",
    "line2": "マンション101",
    "phone": "09012345678"
  },
  "paymentMethodId": "pm_stripe_xxx",
  "couponCode": "SUMMER2026"
}

コミュニティ

メソッドパス説明認証
GET/api/community/posts投稿一覧None
GET/api/community/posts/:postId投稿詳細None
POST/api/community/posts投稿作成Required
PUT/api/community/posts/:postId投稿更新Required
DELETE/api/community/posts/:postId投稿削除Required
POST/api/community/posts/:postId/likeいいねRequired
DELETE/api/community/posts/:postId/likeいいね取消Required
POST/api/community/posts/:postId/bookmarkブックマークRequired
POST/api/community/posts/:postId/copy参考コピー(ルームに複製)Required
POST/api/community/posts/:postId/report通報Required
GET/api/community/posts/:postId/commentsコメント一覧None
POST/api/community/posts/:postId/commentsコメント投稿Required

5.4 メーカー向けAPI

全エンドポイントは /api/maker/ プレフィックス。メーカーアカウントでのログインが必要。

商品管理

メソッドパス説明
GET/api/maker/products商品一覧(自社のみ)
POST/api/maker/products商品新規作成
GET/api/maker/products/:productId商品詳細
PUT/api/maker/products/:productId商品更新
DELETE/api/maker/products/:productId商品削除(論理削除)
POST/api/maker/products/:productId/publish公開
POST/api/maker/products/:productId/unpublish非公開
POST/api/maker/products/bulk-importCSVバルクインポート
GET/api/maker/products/bulk-import/:jobIdインポートジョブ状態

3Dモデル管理

メソッドパス説明
POST/api/maker/models/upload-url署名付きS3アップロードURL取得
POST/api/maker/modelsモデル登録(アップロード完了後)
GET/api/maker/models/:modelIdモデル詳細
DELETE/api/maker/models/:modelIdモデル削除
POST/api/maker/models/convert写真→3D変換ジョブ作成
GET/api/maker/models/convert/:jobId変換ジョブ状態

注文管理

メソッドパス説明
GET/api/maker/orders注文一覧
GET/api/maker/orders/:orderId注文詳細
PUT/api/maker/orders/:orderId/statusステータス更新
POST/api/maker/orders/:orderId/ship発送処理(追跡番号登録)
POST/api/maker/orders/:orderId/cancelキャンセル処理

アナリティクス

メソッドパス説明
GET/api/maker/analytics/overviewKPI概要
GET/api/maker/analytics/products商品別パフォーマンス
GET/api/maker/analytics/sales売上推移
GET/api/maker/analytics/usersユーザー属性
GET/api/maker/analytics/funnelコンバージョンファネル
GET/api/maker/analytics/exportCSVエクスポート

ブランドストア

メソッドパス説明
GET/api/maker/brand-storeブランドストア設定取得
PUT/api/maker/brand-storeブランドストア設定更新
POST/api/maker/brand-store/hero-imageヒーロー画像アップロード

5.5 プラットフォーム管理API

全エンドポイントは /api/admin/ プレフィックス。管理者アカウント必須。

メソッドパス説明
GET/api/admin/makersメーカー申請一覧
PUT/api/admin/makers/:makerId/approveメーカー承認
PUT/api/admin/makers/:makerId/rejectメーカー却下
GET/api/admin/usersユーザー一覧
PUT/api/admin/users/:userId/banユーザーBANパン
GET/api/admin/reports通報一覧
PUT/api/admin/reports/:reportId/resolve通報処理
GET/api/admin/categoriesカテゴリ一覧
POST/api/admin/categoriesカテゴリ作成
PUT/api/admin/categories/:categoryIdカテゴリ更新
DELETE/api/admin/categories/:categoryIdカテゴリ削除
POST/api/admin/notificationsシステム通知配信
GET/api/admin/revenue売上・手数料レポート

5.6 Webhook(外部サービス連携)

エンドポイント送信元説明
POST /api/webhook/stripeStripe決済完了・失敗通知
POST /api/webhook/maker-ecメーカーEC在庫・価格更新(Professional以上)

6. データモデル(ER図)

erDiagram
    User {
        uuid id PK
        string email UK
        string name
        string ccAuthUserId UK
        string avatarUrl
        enum userType "consumer | maker_staff | admin"
        date birthdate
        timestamp createdAt
        timestamp updatedAt
        timestamp deletedAt
    }

    Maker {
        uuid id PK
        string companyName
        string brandName
        string email UK
        string phone
        string postalCode
        string address
        enum businessType "individual | corporation"
        string corporateNumber
        enum revenueScale "tiny | small | medium | large"
        enum plan "starter | growth | professional | enterprise"
        enum status "pending | reviewing | approved | rejected | suspended"
        string logoUrl
        string brandDescription
        string websiteUrl
        decimal commissionRate
        timestamp approvedAt
        timestamp createdAt
        timestamp updatedAt
    }

    MakerStaff {
        uuid id PK
        uuid userId FK
        uuid makerId FK
        enum role "owner | admin | editor | viewer"
        timestamp createdAt
    }

    Category {
        uuid id PK
        uuid parentId FK
        string name
        string slug UK
        int depth "1-3"
        int sortOrder
        boolean isActive
    }

    Product {
        uuid id PK
        uuid makerId FK
        uuid categoryId FK
        string name
        string description
        string skuCode UK
        int priceBase "税抜定価(円)"
        int priceSale "税抜販売価格(円)"
        int taxRate "8 or 10"
        enum shippingType "free | fixed | by_region | by_weight"
        int shippingFee
        float widthCm
        float depthCm
        float heightCm
        float weightKg
        enum status "draft | reviewing | published | unpublished | deleted"
        string[] styleTags
        string[] materialTags
        timestamp publishedAt
        timestamp createdAt
        timestamp updatedAt
    }

    ProductVariant {
        uuid id PK
        uuid productId FK
        string variantType "color | size"
        string variantLabel
        string colorHex
        int priceAdjust "差額(円)"
        int stockCount
        date restockDate
        boolean isDefault
    }

    ProductImage {
        uuid id PK
        uuid productId FK
        uuid variantId FK
        string url
        int sortOrder
        boolean isMain
    }

    Model3D {
        uuid id PK
        uuid productId FK
        uuid variantId FK
        string s3Key
        string cdnUrl
        string format "glb | gltf | obj | fbx"
        int polygonCount
        int fileSizeMb
        enum status "processing | ready | error"
        string errorMessage
        int version
        timestamp createdAt
    }

    Room {
        uuid id PK
        uuid userId FK
        string name
        jsonb floorPlan "間取りデータ(JSON)"
        jsonb furnitures "配置家具リスト(JSON)"
        string thumbnailUrl
        boolean isPublic
        timestamp createdAt
        timestamp updatedAt
    }

    Cart {
        uuid id PK
        uuid userId FK
        uuid guestSessionId
        timestamp expiresAt
        timestamp createdAt
        timestamp updatedAt
    }

    CartItem {
        uuid id PK
        uuid cartId FK
        uuid productId FK
        uuid variantId FK
        int quantity
        int priceSnapshot "追加時点の価格"
        timestamp addedAt
    }

    Order {
        uuid id PK
        uuid userId FK
        string orderNumber UK
        enum status "pending | confirmed | processing | shipped | delivered | cancelled | refunded"
        jsonb shippingAddress
        string paymentIntentId UK
        int subtotal
        int shippingFee
        int tax
        int total
        string couponCode
        int discountAmount
        timestamp orderedAt
        timestamp updatedAt
    }

    OrderItem {
        uuid id PK
        uuid orderId FK
        uuid makerId FK
        uuid productId FK
        uuid variantId FK
        string productNameSnapshot
        int priceSnapshot
        int quantity
        int subtotal
        enum status "confirmed | processing | shipped | delivered | cancelled | return_requested | returned"
        string trackingNumber
        string shippingCarrier
        timestamp shippedAt
        timestamp deliveredAt
    }

    CommunityPost {
        uuid id PK
        uuid userId FK
        uuid roomId FK
        string title
        string description
        string thumbnailUrl
        string[] styleTags
        enum visibility "public | limited | private"
        int likeCount
        int bookmarkCount
        boolean isOfficialStylist
        timestamp createdAt
        timestamp updatedAt
    }

    PostLike {
        uuid id PK
        uuid postId FK
        uuid userId FK
        timestamp createdAt
    }

    PostBookmark {
        uuid id PK
        uuid postId FK
        uuid userId FK
        timestamp createdAt
    }

    PostComment {
        uuid id PK
        uuid postId FK
        uuid userId FK
        string content
        timestamp createdAt
    }

    ContentReport {
        uuid id PK
        uuid reporterId FK
        string targetType "post | comment | user"
        uuid targetId
        enum reason "spam | inappropriate | copyright | other"
        string description
        enum status "pending | reviewed | resolved"
        timestamp createdAt
    }

    WishlistItem {
        uuid id PK
        uuid userId FK
        uuid productId FK
        uuid variantId FK
        timestamp addedAt
    }

    AICoordinateRequest {
        uuid id PK
        uuid userId FK
        uuid roomId FK
        int budget
        string[] styles
        string colorTone
        string familyType
        string[] priorityCategories
        string[] excludeMakerIds
        string freeText
        jsonb results "生成結果(3パターン)"
        int tokenUsed
        enum status "pending | processing | completed | failed"
        timestamp createdAt
        timestamp completedAt
    }

    MakerApplication {
        uuid id PK
        uuid makerId FK
        uuid reviewerId FK
        string[] checklistItems
        string reviewNote
        enum status "pending | reviewing | approved | rejected"
        timestamp submittedAt
        timestamp reviewedAt
    }

    User ||--o{ Room : "creates"
    User ||--o{ Cart : "has"
    User ||--o{ Order : "places"
    User ||--o{ CommunityPost : "posts"
    User ||--o{ WishlistItem : "saves"
    User ||--o{ AICoordinateRequest : "requests"
    User ||--o{ MakerStaff : "belongs to"
    Maker ||--o{ MakerStaff : "has"
    Maker ||--o{ Product : "owns"
    Maker ||--o{ OrderItem : "fulfills"
    Product ||--o{ ProductVariant : "has"
    Product ||--o{ ProductImage : "has"
    Product ||--o{ Model3D : "has"
    Product ||--o{ CartItem : "added to"
    Product ||--o{ OrderItem : "ordered as"
    Product ||--o{ WishlistItem : "saved as"
    Category ||--o{ Product : "contains"
    Category ||--o{ Category : "has children"
    Cart ||--o{ CartItem : "contains"
    Order ||--o{ OrderItem : "has"
    CommunityPost ||--o{ PostLike : "receives"
    CommunityPost ||--o{ PostBookmark : "receives"
    CommunityPost ||--o{ PostComment : "has"
    Room ||--o{ CommunityPost : "featured in"

7. ビジネスロジック仕様

7.1 販売手数料計算

メーカーのプランに応じて、プラットフォームへの手数料が異なる。

プラン手数料率
Starter15%
Growth10%
Professional7%
Enterprise3〜5%(個別交渉)

計算式

売上 = 商品価格(税込)× 数量 手数料 = 売上 × 手数料率 メーカー受取額 = 売上 - 手数料

精算サイクル: 月末締め翌月末払い(Stripe Connect経由)


7.2 商品掲載数制限

プランごとに掲載できる商品数の上限を管理する。

プラン上限
Starter20点
Growth200点
Professional1,000点
Enterprise無制限

判定タイミング: 商品を「公開」状態に変更しようとした時点で判定。上限超過時はエラーを返す。

エラーコード: PRODUCT_LIMIT_EXCEEDED メッセージ: "現在のプラン(Starter)では最大20点まで掲載できます。プランをアップグレードしてください"

7.3 AIコーディネート生成ロジック

Claude API(claude-3-7-sonnet)を使用して、以下のフローで家具提案を生成する。

入力コンテキスト

  1. 部屋の間取り情報(サイズ、形状、開口部)
  2. ユーザー設定(予算、スタイル、家族構成等)
  3. 利用可能な家具DB(予算・カテゴリでフィルタ後、上位100件)

生成プロンプト構造

System: あなたはプロのインテリアスタイリストです...(スタイルガイドライン) User: 以下の条件でインテリアコーディネートを3パターン提案してください。 - 部屋: {width}cm × {depth}cm、{style}間取り - 予算: ¥{budget} - 好みのスタイル: {styles} - 利用可能な家具リスト: {furnitureList} JSON形式で回答してください: { patterns: [...] }

パターン選定基準

  • パターン1: 予算内で最も人気の組み合わせ(配置回数スコア優先)
  • パターン2: スタイル一致度優先(埋め込みベクトル類似度)
  • パターン3: 価格パフォーマンス優先(評価/価格比)

家具配置アルゴリズム

  1. 部屋の重心を計算
  2. 主要家具(ソファ、ダイニングテーブル等)を先に配置(壁際スナップ)
  3. 副次家具をルールベースで配置(サイドテーブルはソファ横、等)
  4. 衝突チェック→修正
  5. 寸法の最終確認

7.4 在庫管理ロジック

楽観的ロックを使用して在庫を管理する。注文確定時に以下の処理を行う。

1. BEGIN TRANSACTION 2. SELECT stock_count FROM product_variants WHERE id = ? FOR UPDATE 3. IF stock_count < quantity THEN ROLLBACK → エラー返却 4. UPDATE product_variants SET stock_count = stock_count - quantity WHERE id = ? 5. CREATE order_item (...) 6. COMMIT

在庫ステータス判定

在庫数ステータス表示
0「在庫切れ」(カート追加不可)
1〜3「残り僅か(残{N}点)」
4以上表示なし

7.5 コミュニティモデレーション

自動フィルタ

  • 投稿テキストに不適切ワードが含まれる場合、自動で審査保留状態にする
  • 24時間以内に管理者が確認・判定

通報後処理

通報数自動処理
3件以上(同一投稿)管理者へアラート通知
5件以上(同一投稿)自動非表示(管理者確認後に再公開)
10件以上(同一ユーザー)アカウント一時制限(24時間)

7.6 検索スコアリング

OpenSearchを使用した商品検索スコアは以下の重み付けで計算する。

要素重み
キーワード一致(商品名)3.0
キーワード一致(タグ)2.0
キーワード一致(説明文)1.0
配置回数(直近30日)1.5
購入コンバージョン率2.0
メーカープランボーナス(Growth以上)1.2倍
在庫あり1.1倍

8. 状態遷移仕様

8.1 注文ステータス遷移

stateDiagram-v2
    [*] --> pending : 注文作成(決済処理中)
    pending --> confirmed : Stripe決済完了Webhook受信
    pending --> cancelled : 決済失敗 or タイムアウト(30分)
    confirmed --> processing : メーカーが受注確認
    confirmed --> cancelled : メーカーがキャンセル or 在庫切れ
    processing --> shipped : メーカーが発送処理(追跡番号登録)
    shipped --> delivered : 配送完了(追跡APIまたは手動更新)
    shipped --> return_requested : ユーザーが返品申請
    delivered --> return_requested : ユーザーが返品申請(配送完了後14日以内)
    return_requested --> returned : メーカーが返品承認・着荷確認
    returned --> refunded : Stripe返金処理完了
    cancelled --> refunded : 決済済みの場合、Stripe返金

OrderItemの独立ステータス遷移

各OrderItemは独立してステータスを持ち、異なるメーカーの商品は別々に処理される。OrderのステータスはOrderItem全体の集約で決定する。

OrderItems状態Order全体ステータス
全てconfirmedconfirmed
1件以上processingprocessing
全てshippedshipped
全てdelivereddelivered
全てcancelledcancelled
混在(partial)個別ステータスを表示

8.2 メーカー審査ステータス遷移

stateDiagram-v2
    [*] --> pending : メーカー申請フォーム送信
    pending --> reviewing : 管理者が担当者アサイン
    reviewing --> approved : 審査合格
    reviewing --> rejected : 審査不合格
    approved --> suspended : 規約違反・料金未払い等
    suspended --> approved : 問題解消・再審査合格
    rejected --> pending : 再申請(修正後)

8.3 商品ステータス遷移

stateDiagram-v2
    [*] --> draft : 商品新規作成
    draft --> reviewing : 公開申請(初回のみ。2回目以降はdraft→publishedへ)
    reviewing --> published : 審査合格(初回登録時)
    reviewing --> draft : 審査不合格(修正要求)
    draft --> published : 再編集後の公開(審査不要)
    published --> unpublished : メーカーが非公開設定
    unpublished --> published : メーカーが再公開
    published --> deleted : 削除(論理削除)
    unpublished --> deleted : 削除(論理削除)

8.4 3Dモデル処理ステータス遷移

stateDiagram-v2
    [*] --> uploading : S3アップロード開始
    uploading --> processing : アップロード完了→自動処理開始
    processing --> ready : 品質チェック合格・LOD生成完了
    processing --> error : 品質チェック不合格 or 変換エラー
    error --> uploading : 再アップロード
    ready --> [*] : 商品に紐付け完了

9. エラーコード一覧

9.1 認証エラー(AUTH_XXX)

コードHTTPステータス説明
AUTH_001401認証失敗(メール/パスワード不一致)
AUTH_002409メールアドレス重複
AUTH_003403アカウントロック(ログイン試行過多)
AUTH_004403メール未認証
AUTH_005401トークン期限切れ
AUTH_006401無効なトークン
AUTH_007403権限不足

9.2 商品エラー(PRODUCT_XXX)

コードHTTPステータス説明
PRODUCT_001404商品が見つからない
PRODUCT_002409SKUコード重複
PRODUCT_003422販売価格が定価を超えている
PRODUCT_004422必須フィールド不足
PRODUCT_005403商品掲載数上限超過
PRODUCT_0064223Dモデルの品質チェック不合格(詳細付き)

9.3 注文エラー(ORDER_XXX)

コードHTTPステータス説明
ORDER_001409在庫不足(商品名・在庫数含む)
ORDER_002422カートが空
ORDER_003402決済失敗(Stripeメッセージ付き)
ORDER_004409キャンセル不可状態(発送済み等)
ORDER_005404注文が見つからない
ORDER_006403返品期限超過(14日)

9.4 AIエラー(AI_XXX)

コードHTTPステータス説明
AI_001503AIサービス一時停止
AI_002422予算内の商品なし
AI_003408生成タイムアウト(30秒)
AI_004429レート制限(1ユーザーあたり1日10回)

9.5 ファイルエラー(FILE_XXX)

コードHTTPステータス説明
FILE_001413ファイルサイズ超過
FILE_002415対応していないファイル形式
FILE_0034223Dモデル品質チェック不合格
FILE_004500アップロード失敗(S3エラー)

9.6 メーカーエラー(MAKER_XXX)

コードHTTPステータス説明
MAKER_001409既に申請済み
MAKER_002403審査中または却下
MAKER_003403アカウント停止中
MAKER_004422法人番号不正

Generated by CCAGI SDK v3.14.4 - Phase 2: Design (spec.md) 作成日: 2026-03-19