概要
createInvoice は「番号を生成 → 請求書を作成」という 2 ステップで、その間がアトミックではありません。
const invoiceNumber =
validatedData.invoiceNumber || (await generateInvoiceNumber(userId));
// ...
const invoice = await invoiceRepository.create({ ... invoiceNumber ... });
Invoice.invoiceNumber は @unique のため、同時作成でユニーク制約違反となり、ユーザーには原因不明のエラーが表示されます。
補足
現状の @unique はグローバルユニークです。将来的にマルチユーザー化(#51)すると、別ユーザーが同じ番号を使えなくなる設計上の問題もあります。@@unique([userId, invoiceNumber]) が適切かを合わせて検討します。
実装内容
対象ファイル
src/lib/invoice/invoiceNumberGenerator.ts
src/application/usecases/invoices/createInvoice.ts
prisma/schema.prisma
受け入れ条件
関連
概要
createInvoiceは「番号を生成 → 請求書を作成」という 2 ステップで、その間がアトミックではありません。Invoice.invoiceNumberは@uniqueのため、同時作成でユニーク制約違反となり、ユーザーには原因不明のエラーが表示されます。補足
現状の
@uniqueはグローバルユニークです。将来的にマルチユーザー化(#51)すると、別ユーザーが同じ番号を使えなくなる設計上の問題もあります。@@unique([userId, invoiceNumber])が適切かを合わせて検討します。実装内容
@unique→@@unique([userId, invoiceNumber])への変更を検討(マイグレーション必要)対象ファイル
src/lib/invoice/invoiceNumberGenerator.tssrc/application/usecases/invoices/createInvoice.tsprisma/schema.prisma受け入れ条件
docs/design/database.mdに記載されている関連