import { sql } from 'drizzle-orm' import { timestamp, uuid } from 'drizzle-orm/pg-core' import { v7 as uuidv7 } from 'uuid' // id export const id = (name: string) => uuid(name) export const pk = (name: string, strategy?: 'native' | 'extension') => { switch (strategy) { // PG 18+ case 'native': return id(name).primaryKey().default(sql`uuidv7()`) // PG 13+ with extension case 'extension': return id(name).primaryKey().default(sql`uuid_generate_v7()`) // Any PG version default: return id(name) .primaryKey() .$defaultFn(() => uuidv7()) } } // timestamp export const createdAt = (name = 'created_at') => timestamp(name, { withTimezone: true }).notNull().defaultNow() export const updatedAt = (name = 'updated_at') => timestamp(name, { withTimezone: true }) .notNull() .defaultNow() .$onUpdateFn(() => new Date()) // generated fields export const generatedFields = { id: pk('id'), createdAt: createdAt('created_at'), updatedAt: updatedAt('updated_at'), } // Helper to create omit keys from generatedFields const createGeneratedFieldKeys = >( fields: T, ): Record => { return Object.keys(fields).reduce( (acc, key) => { acc[key as keyof T] = true return acc }, {} as Record, ) } export const generatedFieldKeys = createGeneratedFieldKeys(generatedFields)