セッション開始:2026/06/08 16:48
3D間取りの一覧・運用を改善するため、 削除・物件名検索・一覧非表示・物件名編集の各機能を追加する。あわせて、3D間取りの 生成エンジンを Google Gemini から ChatGPT(OpenAI)へ切り替える。
やること
やらないこと
deletedAt による論理削除のみ)generationEndedAt)でのフォールバック表示 → 作成日時を採用| 削除の可否 | 生成前のみ削除可。generationStartedAt !== null なら
SolidFloorPlanGenerationHasAlreadyStarted で失敗。生成済みは一覧非表示で隠す運用。 |
| 削除方式 | 論理削除(deletedAt に現在時刻)。削除ボタンは編集3画面(details / styles / room-images)下部に配置し、確認ダイアログ付き。 |
| 物件名の呼称 | UI 表記は 「物件名」に統一(旧「部屋名」を改名)。ラベル/ヘルプ文言/検索プレースホルダ/詳細の編集ボタンの4箇所。 |
| 物件名のフォールバック | 物件名が空(null)のとき、表示は 作成日時(createdAt)を使用。ヘルプ文言も「作成日時が使用されます」に統一(内部は createdAt)。 |
| 物件名の保存 | 空欄入力は null に変換して保存(name?: string | null)。 |
| 一覧非表示 | isUnlisted(既定 false)。詳細画面のスイッチでON/OFF。一覧では EyeOff アイコンを重畳表示。 |
| 検索(物件名) | Prisma contains による部分一致。URL クエリ ?name=。 |
| 検索(非表示を含める) | 既定は表示中のみ(isUnlisted: false)。トグルONで ?includeUnlisted=1 → 絞り込みを外し全件表示。 |
| 生成エンジン | ChatGPT(OpenAI)へ切替。model: "gpt-5.5" + image_generation ツール(Responses API)。Gemini は lib/gemini/ へ退避し温存。 |
| instructions スキーマ | kind(chatgpt / gemini)で系統を分け、各 version を持つ。保存時の kind は現状 "chatgpt" ハードコード(課題参照)。 |
一覧:検索フォーム+非表示バッジ
詳細:一覧表示スイッチ+物件名編集導線
編集(各ステップ)下部:削除ボタン
※ 生成開始後は押下しても「生成が既に開始」エラーで削除不可。
prisma/schema/solid-floor-plan.prisma
isUnlisted Boolean @default(false) 追加(マイグレーション 20260608154235_solid_floor_plans)。
apps/user/actions/solid-floor-plan/delete-solid-floor-plan.ts
論理削除アクション。generationStartedAt !== null で失敗。所有者・組織・deletedAt: null でスコープ。
apps/user/actions/solid-floor-plan/list-solid-floor-plan.ts
検索オプション { name?, hasGenerationFinished?, month?, isUnlisted? } を受け取り where 構築。name は contains。(hasGenerationFinished / month はUI未配線)
apps/user/actions/solid-floor-plan/update-solid-floor-plan.ts
name?: string | null(空→null)と isUnlisted? を受理。
.../search-form/{index,schema}.tsx + _fields/{name-field,include-unlisted-field}.tsx
検索フォーム。_fields/ 分割+schema.ts 集約+createSearchParams でクエリ組み立て(既存規約に踏襲)。
.../edit/name/page.tsx + _components/solid-floor-plan-update-form/{index,schema}.tsx
物件名編集ページ。保存後は詳細へ戻る。
.../_components/is-listed-switch/index.tsx + components/delete-button/solid-floor-plan/index.tsx
一覧表示スイッチ(共通 IsListedSwitch ラップ)と削除ボタン(共通 DeleteButton ラップ、確認ダイアログ)。
.../generate-image/lib/chatgpt/index.ts + apps/user/lib/chatgpt/upload-file.ts
ChatGPT(OpenAI)での画像生成。files.create(purpose: "vision") でアップロードし responses.create の image_generation で生成、結果を S3 へ保存。
.../generate-image/lib/gemini/index.ts(旧 generate-image-with-gemini.ts)/packages/database/.../instructions-schema/{chatgpt,gemini}/v1.ts
Gemini 実装をフォルダ退避し温存。instructions スキーマを chatgpt / gemini の2系統に再編。generate/route.ts は kind: "chatgpt" で保存。
用語:「部屋名」→「物件名」へ統一
実装は全箇所「部屋名」だったが、正式名称は「物件名」。ラベル・ヘルプ文言・検索プレースホルダ・詳細の編集ボタンを「物件名」へ修正。
文言:空欄時のフォールバックは「作成日時」
ヘルプ文言は「生成した日時」だったが、表示ロジックは createdAt(作成日時)を使用。文言を「作成日時が使用されます」に修正し、コードに整合させた。
現状維持と判断した点
generate/route.ts の kind: "chatgpt" ハードコード:現状維持(デシンク懸念は課題へ)。instructionsSchema の z.union:現状維持(discriminatedUnion("kind") 化は見送り)。server-only の付与:不要と判断し追加せず。