import { sql } from 'drizzle-orm'; import { index, integer, sqliteTable, text } from 'drizzle-orm/sqlite-core'; export const pots = sqliteTable('pots', { slug: text('slug').primaryKey(), name: text('name').notNull(), currency: text('currency').notNull(), createdAt: integer('created_at') .notNull() .default(sql`(unixepoch())`), }); export const participants = sqliteTable( 'participants', { id: integer('id').primaryKey({ autoIncrement: true }), potSlug: text('pot_slug') .notNull() .references(() => pots.slug), name: text('name').notNull(), paymentLink: text('payment_link'), createdAt: integer('created_at') .notNull() .default(sql`(unixepoch())`), }, (table) => [index('participants_pot_slug_idx').on(table.potSlug)], ); export const expenses = sqliteTable( 'expenses', { id: integer('id').primaryKey({ autoIncrement: true }), potSlug: text('pot_slug') .notNull() .references(() => pots.slug), // 'payment' rows are settlements: payerId is who paid, and the single row // in expenseParticipants is who received it — same shape as a one-person // split expense, which is mathematically what a settlement is. type: text('type').notNull().default('expense'), description: text('description').notNull(), amountCents: integer('amount_cents').notNull(), payerId: integer('payer_id') .notNull() .references(() => participants.id), createdAt: integer('created_at') .notNull() .default(sql`(unixepoch())`), }, (table) => [index('expenses_pot_slug_idx').on(table.potSlug)], ); export const expenseParticipants = sqliteTable( 'expense_participants', { expenseId: integer('expense_id') .notNull() .references(() => expenses.id), participantId: integer('participant_id') .notNull() .references(() => participants.id), }, (table) => [index('expense_participants_expense_id_idx').on(table.expenseId)], );