fix: ユーザー作成の採番をINSERTのRETURNINGで受け取る - #538
Conversation
Create 後に ORDER BY id DESC LIMIT 1 で最新行を読み直す実装は、 同時に作成された別のレコードを掴む。レスキュー3テーブル(#536)と同じく INSERT ... RETURNING id に揃え、使わなくなった FindNewRecord を削除する。 名簿送信の新規作成も、名前での再取得から採番した id での取得に変える。
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Advanced Run ID: 📒 Files selected for processing (6)
Included review availability: Your plan provides up to 1 included review per hour; 0 remain after this review. 📝 WalkthroughWalkthrough
Changesユーザー作成IDフロー
Priority: ⬇️ Low Estimated code review effort: 3 (Moderate) | ~20 minutes Change: Bug fix Sequence Diagram(s)sequenceDiagram
participant WebSignUp
participant UserRepository
participant Database
WebSignUp->>UserRepository: Create(...)
UserRepository->>Database: INSERT ... RETURNING id
Database-->>UserRepository: 作成したユーザーID
UserRepository-->>WebSignUp: ユーザーID
WebSignUp->>UserRepository: Find(ユーザーID)
UserRepository->>Database: SELECT FROM users WHERE id
Database-->>UserRepository: ユーザー情報
UserRepository-->>WebSignUp: ユーザー情報
Merge Risk: ⚪ Minimal · up to The ID-based creation flow is compatible with the configured database and consistently used by the updated call sites. No actionable merge risk remains. 🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
PR #537(#536)でレスキュー3テーブルに入れた採番の修正を、
usersにも同じ形で広げる。変更前
作成したレコードの id を「テーブルの最新行」から取り直していた。
INSERT と SELECT が別ステートメントなので、ほぼ同時に別のユーザーが作成されると、そちらの行を読む。
変更後
INSERT ... RETURNING idで採番を受け取り、その id で対象行を引く。使わなくなったFindNewRecordはUserRepositoryから削除した。呼び出し元は3か所。
3つ目は名簿送信の新規作成。名前での引き直しをやめたので、同名や表記ゆれの影響も受けなくなる。
テスト
TestUserRepositoryCreate_ReturnsIDFromInsertを追加。最新行を読み直す実装に戻すと落ちるTestUpdateUsersFromGAS_新規ユーザーはmailとslackUserIDを保存するを新しい経路(RETURNING と id での再取得)に更新db.Clientが同一パッケージに3つ重複していたので、リポジトリ非依存のnewDBMockを追加した。今回のテストはこれを使う。既存3ファイルはそのままSummary by CodeRabbit