mirror of
https://github.com/mauriceboe/TREK.git
synced 2026-06-22 14:51:45 +00:00
0b218d53b2
Co-hosted NestJS app behind the existing Express server via a strangler-fig dispatcher, sharing the same better-sqlite3 connection and JWT httpOnly cookie. Additive and dormant: default routing stays on Express, Nest only serves its own /api/_nest diagnostics until a module opts in. F1 @trek/shared Zod contract package; F2 Nest bootstrap co-hosted (fall-through, single Dockerfile/port); F3 shared better-sqlite3 provider; F4 JWT cookie auth guard (+ @CurrentUser, admin guard); F5 Zod validation pipe + error-envelope parity; F6 Nest test + coverage gates; F7 per-prefix strangler toggle (env, default Express); F8 CI build/typecheck/test/coverage. Remaining F4/F6/F8 checklist items (trip-access + permission levels + MFA policy, e2e harness/seed + 80% gate, Nest↔Express parity test, Playwright PR-comment workflow) are tracked on the first consuming module cards (L1/A1/C1).
40 lines
1.2 KiB
TypeScript
40 lines
1.2 KiB
TypeScript
import { Injectable } from '@nestjs/common';
|
|
import type Database from 'better-sqlite3';
|
|
import { db } from '../../db/database';
|
|
|
|
/**
|
|
* Injectable wrapper around TREK's existing better-sqlite3 connection.
|
|
*
|
|
* `db` is a Proxy onto the singleton connection the legacy app already uses
|
|
* (WAL enabled), so Nest modules share the exact same connection — no second
|
|
* connection, no split state, single writer preserved.
|
|
*/
|
|
@Injectable()
|
|
export class DatabaseService {
|
|
/** The shared better-sqlite3 connection (same singleton the legacy app uses). */
|
|
get connection(): Database.Database {
|
|
return db;
|
|
}
|
|
|
|
prepare(sql: string): Database.Statement {
|
|
return db.prepare(sql);
|
|
}
|
|
|
|
get<T = unknown>(sql: string, ...params: unknown[]): T | undefined {
|
|
return db.prepare(sql).get(...params) as T | undefined;
|
|
}
|
|
|
|
all<T = unknown>(sql: string, ...params: unknown[]): T[] {
|
|
return db.prepare(sql).all(...params) as T[];
|
|
}
|
|
|
|
run(sql: string, ...params: unknown[]): Database.RunResult {
|
|
return db.prepare(sql).run(...params);
|
|
}
|
|
|
|
/** Run `fn` inside a synchronous better-sqlite3 transaction. */
|
|
transaction<T>(fn: (conn: Database.Database) => T): T {
|
|
return db.transaction(() => fn(db))();
|
|
}
|
|
}
|