関連する問題
#292 / #295 で家事の承認ステータス(pendingApproval)を廃止したが、Firestoreには承認待ちのままの家事ドキュメントが残っている。
アプリ側は HouseworkState のデコードで未知のケースを完了として扱うため表示は壊れないが、データとしては廃止したステータスと承認者の情報(reviewerId / approvedAt / reviewerComment)を保持し続けている。デコードのフォールバックはあくまで移行漏れに対する保険なので、実データを完了に揃えておきたい。
提案する解決策
#295 のマージ後に、同PRで追加した firebase/functions/src/scripts/migratePendingApproval.ts を stg → prod の順で実行する。
スクリプトの挙動:
Cohabitant を全件走査し、各グループの Houseworks サブコレクションを __name__ 順に500件ずつページングする
state に pendingApproval を持つドキュメントの state を { completed: {} } に書き換え、reviewerId / approvedAt / reviewerComment を FieldValue.delete() で削除する
--dry-run を付けると書き込みを行わず対象件数だけを出力する
collectionGroup + where を使うとコレクショングループスコープのインデックスが必要になるため、既存の updateHouseworkExpiredAt と同じページング走査方式にしている。
実行手順
# 事前準備(初回のみ)
gcloud auth application-default login
cd firebase/functions
npm run build
1. stg(homete-ios-dev-e3ef7)で対象件数を確認する
node lib/scripts/migratePendingApproval.js --project homete-ios-dev-e3ef7 --dry-run
2. stgで実行する
node lib/scripts/migratePendingApproval.js --project homete-ios-dev-e3ef7
3. STGビルド(TestFlight)で家事ボードの表示・完了・未完了に戻す操作を確認する
4. prod(homete-ios-dev)で対象件数を確認する
node lib/scripts/migratePendingApproval.js --project homete-ios-dev --dry-run
5. prodで実行する
node lib/scripts/migratePendingApproval.js --project homete-ios-dev
プロジェクトIDは homete-ios-dev が本番、-e3ef7 付きがSTGという紛らわしい命名なので、--project の指定を毎回読み返すこと(スクリプトは対象プロジェクトIDをログの先頭に出す)。
実行タイミング
App Storeへのリリース前に実行する。旧バージョンのアプリは完了の家事をそのまま読めるため、先に流しても表示は壊れない。逆にリリース後まで放置すると、新バージョンのアプリがフォールバックに頼り続ける状態が続く。
タスク
代替案
アプリ側のデコードフォールバックに任せてマイグレーションを行わない案も考えられるが、以下の理由で採らない。
- 廃止したステータスがFirestoreに残り続け、データを直接見たときに現在の仕様と食い違う
- フォールバックを将来外せなくなる(外した時点で古いドキュメントが読めなくなる)
- 不要になった承認者の情報が残り続ける
その他の情報
- 実装方針:
doc/strategy/remove-approval-state.md
- スクリプト:
firebase/functions/src/scripts/migratePendingApproval.ts
- Firebaseプロジェクトの対応関係は
CLAUDE.md の「Firebaseプロジェクトの対応関係」を参照
🤖 Generated with Claude Code
https://claude.ai/code/session_011NkFuVWMJSeuaWUyHhqvrr
関連する問題
#292 / #295 で家事の承認ステータス(
pendingApproval)を廃止したが、Firestoreには承認待ちのままの家事ドキュメントが残っている。アプリ側は
HouseworkStateのデコードで未知のケースを完了として扱うため表示は壊れないが、データとしては廃止したステータスと承認者の情報(reviewerId/approvedAt/reviewerComment)を保持し続けている。デコードのフォールバックはあくまで移行漏れに対する保険なので、実データを完了に揃えておきたい。提案する解決策
#295 のマージ後に、同PRで追加した
firebase/functions/src/scripts/migratePendingApproval.tsを stg → prod の順で実行する。スクリプトの挙動:
Cohabitantを全件走査し、各グループのHouseworksサブコレクションを__name__順に500件ずつページングするstateにpendingApprovalを持つドキュメントのstateを{ completed: {} }に書き換え、reviewerId/approvedAt/reviewerCommentをFieldValue.delete()で削除する--dry-runを付けると書き込みを行わず対象件数だけを出力するcollectionGroup+whereを使うとコレクショングループスコープのインデックスが必要になるため、既存のupdateHouseworkExpiredAtと同じページング走査方式にしている。実行手順
1. stg(
homete-ios-dev-e3ef7)で対象件数を確認する2. stgで実行する
3. STGビルド(TestFlight)で家事ボードの表示・完了・未完了に戻す操作を確認する
4. prod(
homete-ios-dev)で対象件数を確認する5. prodで実行する
プロジェクトIDは
homete-ios-devが本番、-e3ef7付きがSTGという紛らわしい命名なので、--projectの指定を毎回読み返すこと(スクリプトは対象プロジェクトIDをログの先頭に出す)。実行タイミング
App Storeへのリリース前に実行する。旧バージョンのアプリは完了の家事をそのまま読めるため、先に流しても表示は壊れない。逆にリリース後まで放置すると、新バージョンのアプリがフォールバックに頼り続ける状態が続く。
タスク
--dry-runを実行して対象件数を確認する--dry-runを実行して対象件数を確認するdoc/strategy/remove-approval-state.mdのステータス(Firestoreデータのマイグレーション実行)にチェックを入れる代替案
アプリ側のデコードフォールバックに任せてマイグレーションを行わない案も考えられるが、以下の理由で採らない。
その他の情報
doc/strategy/remove-approval-state.mdfirebase/functions/src/scripts/migratePendingApproval.tsCLAUDE.mdの「Firebaseプロジェクトの対応関係」を参照🤖 Generated with Claude Code
https://claude.ai/code/session_011NkFuVWMJSeuaWUyHhqvrr