import { integer, pgTable, varchar, timestamp, text, pgEnum, uniqueIndex, index, } from "drizzle-orm/pg-core"; export const authChallengeTypeEnum = pgEnum("auth_challenge_type", [ "email_verify", "password_reset", ]); export const usersTable = pgTable("users_table", { id: integer().primaryKey().generatedAlwaysAsIdentity(), name: varchar({ length: 255 }).notNull(), age: integer().notNull(), email: varchar({ length: 320 }).notNull().unique(), passwordHash: text("password_hash").notNull(), emailVerifiedAt: timestamp("email_verified_at", { withTimezone: true, }), sessionVersion: integer("session_version").notNull().default(0), createdAt: timestamp("created_at", { withTimezone: true }) .notNull() .defaultNow(), updatedAt: timestamp("updated_at", { withTimezone: true }) .notNull() .defaultNow(), }); export const authChallengesTable = pgTable( "auth_challenges", { id: integer().primaryKey().generatedAlwaysAsIdentity(), userId: integer("user_id") .notNull() .references(() => usersTable.id, { onDelete: "cascade" }), type: authChallengeTypeEnum("type").notNull(), tokenHash: varchar("token_hash", { length: 64 }).notNull(), expiresAt: timestamp("expires_at", { withTimezone: true }).notNull(), consumedAt: timestamp("consumed_at", { withTimezone: true }), createdAt: timestamp("created_at", { withTimezone: true }) .notNull() .defaultNow(), }, (t) => ({ tokenHashIdx: index("auth_challenges_token_hash_idx").on(t.tokenHash), }), ); export const linkedAccountsTable = pgTable( "linked_accounts", { id: integer().primaryKey().generatedAlwaysAsIdentity(), userId: integer("user_id") .notNull() .references(() => usersTable.id, { onDelete: "cascade" }), provider: varchar({ length: 64 }).notNull(), providerUserId: varchar("provider_user_id", { length: 255 }).notNull(), createdAt: timestamp("created_at", { withTimezone: true }) .notNull() .defaultNow(), }, (t) => ({ providerUserUnique: uniqueIndex("linked_accounts_provider_uid").on( t.provider, t.providerUserId, ), }), );