Add transactions to auth procedures and extract DB models

- Wrap multiple DB operations in transactions for atomicity:
  - login-if-completed: device upsert + session + login_request deletion
  - forgot-password: delete old tokens + insert new token
  - signup: session + email_verification creation

- Extract reusable DB model operations to packages/db/src/models/:
  - sessions.ts: insertSession()
  - user-devices.ts: upsertUserDevice(), isDeviceTrusted()

- Update session.ts to use new model functions from @reviq/db
- Fix type narrowing in admin.test.ts

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
igm
2026-01-12 15:52:05 +08:00
parent 5a2e0297e5
commit b085a315be
9 changed files with 241 additions and 124 deletions

View File

@@ -1095,15 +1095,17 @@ describeE2E("admin", () => {
expect(org?.display_name).toBe("New Organization");
// Verify owner membership
const membership = await db
.selectFrom("org_members")
.where("org_id", "=", org?.id)
.where("user_id", "=", owner.id)
.selectAll()
.executeTakeFirst();
if (org) {
const membership = await db
.selectFrom("org_members")
.where("org_id", "=", org.id)
.where("user_id", "=", owner.id)
.selectAll()
.executeTakeFirst();
expect(membership).toBeDefined();
expect(membership?.role).toBe("owner");
expect(membership).toBeDefined();
expect(membership?.role).toBe("owner");
}
});
test("normalizes owner email to lowercase", async () => {