Additive schema only; no behaviour changes yet. Verified with prisma migrate diff against production: two enums, three new tables, new User columns and foreign keys, and no destructive statements. Role lives on the User row rather than an OWNER_EMAIL env check, because email is nullable and user-editable and so a poor thing to authorize against. The jwt callback will need a per-request lookup for status anyway, so reading role in the same query is free. Invites are bearer tokens in a URL, shared out of band as a link or QR code, because the app has no email capability. claimInvite consumes a use with a single UPDATE guarded on usedCount < maxUses: Prisma cannot compare two columns in a where clause, and one statement means one row lock, so two people redeeming the last use cannot both succeed. SearchCache finally gets its user relation. Every other user-owned model cascades; without it, deleting a user left orphaned rows holding their raw search queries. Verified zero orphans before adding the constraint. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
12 KiB
12 KiB