import { eq, sql } from 'drizzle-orm'; import type { PgTable, PgColumn } from 'drizzle-orm/pg-core'; import { db } from './index'; /** * Wraps a database operation in a transaction. * Rolls back automatically on error. * * @example * const result = await withTransaction(async (tx) => { * await tx.insert(clients).values({ ... }); * await tx.insert(interests).values({ ... }); * return result; * }); */ export async function withTransaction( callback: (tx: typeof db) => Promise, ): Promise { return db.transaction(callback as unknown as Parameters[0]) as Promise; } /** * Soft-deletes a record by setting `archived_at` to now. * The table must have an `archived_at` column. * * @example * await softDelete(clients, clients.id, clientId); */ export async function softDelete( table: TTable, idColumn: PgColumn, id: string, ): Promise { await db .update(table) .set({ archived_at: sql`now()` } as Record) .where(eq(idColumn, id)); } /** * Restores a soft-deleted record by clearing `archived_at`. * The table must have an `archived_at` column. * * @example * await restore(clients, clients.id, clientId); */ export async function restore( table: TTable, idColumn: PgColumn, id: string, ): Promise { await db .update(table) .set({ archived_at: null } as Record) .where(eq(idColumn, id)); }