import { boolean, index, integer, jsonb, pgEnum, pgTable, text, timestamp, } from "drizzle-orm/pg-core"; import { createId } from "@paralleldrive/cuid2"; export const users = pgTable("users", { id: text("id").primaryKey(), name: text("name"), email: text("email").notNull().unique(), emailVerified: boolean("email_verified").default(false), image: text("image"), createdAt: timestamp("created_at", { withTimezone: true }).defaultNow().notNull(), updatedAt: timestamp("updated_at", { withTimezone: true }).defaultNow().notNull(), }); export const accounts = pgTable("accounts", { id: text("id").primaryKey().$defaultFn(() => createId()), userId: text("user_id") .notNull() .references(() => users.id, { onDelete: "cascade" }), accountId: text("account_id").notNull(), providerId: text("provider_id").notNull(), accessToken: text("access_token"), refreshToken: text("refresh_token"), accessTokenExpiresAt: timestamp("access_token_expires_at"), refreshTokenExpiresAt: timestamp("refresh_token_expires_at"), scope: text("scope"), idToken: text("id_token"), password: text("password"), createdAt: timestamp("created_at", { withTimezone: true }).defaultNow().notNull(), updatedAt: timestamp("updated_at", { withTimezone: true }).defaultNow().notNull(), }); export const verifications = pgTable("verifications", { id: text("id").primaryKey().$defaultFn(() => createId()), identifier: text("identifier").notNull(), value: text("value").notNull(), expiresAt: timestamp("expires_at", { withTimezone: true }).notNull(), createdAt: timestamp("created_at", { withTimezone: true }).defaultNow(), updatedAt: timestamp("updated_at", { withTimezone: true }).defaultNow(), }); export const comparisonStatusEnum = pgEnum("comparison_status", [ "researching", "completed", "failed", ]); export const sessions = pgTable("sessions", { id: text("id").primaryKey(), userId: text("user_id") .notNull() .references(() => users.id, { onDelete: "cascade" }), token: text("token").notNull().unique(), expiresAt: timestamp("expires_at", { withTimezone: true }).notNull(), ipAddress: text("ip_address"), userAgent: text("user_agent"), createdAt: timestamp("created_at", { withTimezone: true }).defaultNow().notNull(), updatedAt: timestamp("updated_at", { withTimezone: true }).defaultNow().notNull(), }); export const comparisons = pgTable( "comparisons", { id: text("id") .primaryKey() .$defaultFn(() => createId()), userId: text("user_id") .notNull() .references(() => users.id), title: text("title").notNull(), query: text("query").notNull(), slug: text("slug").notNull().unique(), status: comparisonStatusEnum("status").notNull().default("researching"), summary: text("summary"), overallData: jsonb("overall_data"), tags: text("tags").array(), isPublic: boolean("is_public").notNull().default(true), viewCount: integer("view_count").notNull().default(0), createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(), updatedAt: timestamp("updated_at", { withTimezone: true }).notNull().defaultNow(), }, (table) => [ index("comparisons_user_id_idx").on(table.userId), index("comparisons_slug_idx").on(table.slug), index("comparisons_status_idx").on(table.status), ], ); export const comparisonItems = pgTable( "comparison_items", { id: text("id") .primaryKey() .$defaultFn(() => createId()), comparisonId: text("comparison_id") .notNull() .references(() => comparisons.id, { onDelete: "cascade" }), name: text("name").notNull(), description: text("description"), imageUrl: text("image_url"), researchData: jsonb("research_data"), scores: jsonb("scores"), pros: text("pros").array(), cons: text("cons").array(), order: integer("order").notNull().default(0), }, (table) => [index("comparison_items_comparison_id_idx").on(table.comparisonId)], ); export const comparisonDimensions = pgTable( "comparison_dimensions", { id: text("id") .primaryKey() .$defaultFn(() => createId()), comparisonId: text("comparison_id") .notNull() .references(() => comparisons.id, { onDelete: "cascade" }), name: text("name").notNull(), description: text("description"), weight: integer("weight").notNull().default(1), order: integer("order").notNull().default(0), }, (table) => [index("comparison_dimensions_comparison_id_idx").on(table.comparisonId)], );