/** * Products. Source: `db/migrations/0001_init.sql`. */ import { pgTable, uuid, text, integer, boolean, timestamp, index, } from "drizzle-orm/pg-core"; import { brands } from "./brands"; export const products = pgTable( "products", { id: uuid("id").primaryKey().defaultRandom(), brandId: uuid("brand_id") .notNull() .references(() => brands.id, { onDelete: "cascade" }), name: text("name").notNull(), description: text("description"), sku: text("sku"), type: text("type", { enum: ["standard", "wholesale", "both"] }) .notNull() .default("standard"), priceCents: integer("price_cents").notNull(), inventory: integer("inventory").notNull().default(0), unit: text("unit"), active: boolean("active").notNull().default(true), isTaxable: boolean("is_taxable").notNull().default(false), pickupType: text("pickup_type", { enum: ["pickup", "ship", "all"] }) .notNull() .default("all"), imageUrl: text("image_url"), createdAt: timestamp("created_at", { withTimezone: true }) .notNull() .defaultNow(), updatedAt: timestamp("updated_at", { withTimezone: true }) .notNull() .defaultNow(), }, (t) => ({ brandIdx: index("products_brand_idx").on(t.brandId), activeIdx: index("products_active_idx").on(t.brandId, t.active), }), ); export type Product = typeof products.$inferSelect; export type NewProduct = typeof products.$inferInsert; // ── Product Images ───────────────────────────────────────────────────────────── export const productImages = pgTable( "product_images", { id: uuid("id").primaryKey().defaultRandom(), productId: uuid("product_id") .notNull() .references(() => products.id, { onDelete: "cascade" }), storageKey: text("storage_key").notNull(), position: integer("position").notNull().default(0), altText: text("alt_text"), createdAt: timestamp("created_at", { withTimezone: true }) .notNull() .defaultNow(), }, (t) => ({ productIdx: index("product_images_product_idx").on(t.productId), }), ); export type ProductImage = typeof productImages.$inferSelect; export type NewProductImage = typeof productImages.$inferInsert;