- Remove ~60 unused imports and variables across 88 files - Replace ~80 `any` type annotations with proper types (unknown, Record<string, unknown>, or specific types) - Prefix unused callback args with underscore - Fix unescaped JSX entities - Lint now passes cleanly (0 errors, 2 intentional img warnings) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
57 lines
1.5 KiB
TypeScript
57 lines
1.5 KiB
TypeScript
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<T>(
|
|
callback: (tx: typeof db) => Promise<T>,
|
|
): Promise<T> {
|
|
return db.transaction(callback as unknown as Parameters<typeof db.transaction>[0]) as Promise<T>;
|
|
}
|
|
|
|
/**
|
|
* 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<TTable extends PgTable>(
|
|
table: TTable,
|
|
idColumn: PgColumn,
|
|
id: string,
|
|
): Promise<void> {
|
|
await db
|
|
.update(table)
|
|
.set({ archived_at: sql`now()` } as Record<string, unknown>)
|
|
.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<TTable extends PgTable>(
|
|
table: TTable,
|
|
idColumn: PgColumn,
|
|
id: string,
|
|
): Promise<void> {
|
|
await db
|
|
.update(table)
|
|
.set({ archived_at: null } as Record<string, unknown>)
|
|
.where(eq(idColumn, id));
|
|
}
|