Skip to content

Refactor: 承認待ちの家事を完了へ移行するFirestoreマイグレーションを実行する #296

Description

@stotic-dev

関連する問題

#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へのリリース前に実行する。旧バージョンのアプリは完了の家事をそのまま読めるため、先に流しても表示は壊れない。逆にリリース後まで放置すると、新バージョンのアプリがフォールバックに頼り続ける状態が続く。

タスク

  • 家事の承認ステータスを廃止し、完了と「ありがとう」に分ける #295 をマージする
  • stgで --dry-run を実行して対象件数を確認する
  • stgで本実行する
  • STGビルドで家事ボードの表示と操作を確認する
  • prodで --dry-run を実行して対象件数を確認する
  • prodで本実行する
  • doc/strategy/remove-approval-state.md のステータス(Firestoreデータのマイグレーション実行)にチェックを入れる
  • 実行済みであることをスクリプト冒頭のコメントに追記する(または役目を終えたスクリプトを削除する)

代替案

アプリ側のデコードフォールバックに任せてマイグレーションを行わない案も考えられるが、以下の理由で採らない。

  • 廃止したステータスが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

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    mentenance開発環境のメンテナンスrelease-blockerリリース前の対応が必須

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions