72ba4099ea
Make the device-adapter pattern selectable so the admin chooses hardware at install — per lane, from a catalog of supported drivers. Adding a device = registering one more driver; no business-logic change. packages/devices: - interfaces.ts: AccessControlDevice / ReaderDevice / CameraDevice / PrinterDevice (adds CameraDevice for entry/exit snapshot-on-event; access relay stays intent-only per "a barrier is not a door"). - registry.ts: driver catalog with per-driver config fields + factory, config validation, and a catalog payload for the setup UI. - drivers/: stub adapters — access (zkteco, esp32-relay), reader (wiegand, tcp-ip), camera (hikvision, dahua). Real vendor protocols TBD. packages/db: - lane_devices + setup_state tables (migration 0001); re-export query helpers. apps/server: - routes/setup.ts: GET /api/setup/catalog (public schema), and admin-only /assign, /state, /complete with registry validation before persisting. - extract auth.ts (requireJwtSecret, requireRole, JWT type aug). apps/web: - SetupWizard scaffold + api client: pick a driver per category for a lane, render its config fields. wiki: device-registry + first-run-setup concept pages; cross-link from device-adapter-pattern; index + log updated. Verified: full turbo build (5/5); catalog lists all drivers; admin assign persists; missing-config and no-token requests are rejected.
23 lines
849 B
TypeScript
23 lines
849 B
TypeScript
import Database from "better-sqlite3";
|
|
import { drizzle } from "drizzle-orm/better-sqlite3";
|
|
import * as schema from "./schema.js";
|
|
|
|
export * from "./schema.js";
|
|
// Re-export the query helpers consumers need, so they don't depend on
|
|
// drizzle-orm directly (it's an implementation detail of this package).
|
|
export { eq, and, desc, sql } from "drizzle-orm";
|
|
|
|
/**
|
|
* Open the local SQLite database in WAL mode. WAL allows many concurrent readers
|
|
* plus one writer — a parking workload never approaches SQLite's single-writer
|
|
* limit. See wiki/entities/sqlite.md.
|
|
*/
|
|
export function createDb(url = process.env.DATABASE_URL ?? "./parking.sqlite") {
|
|
const sqlite = new Database(url);
|
|
sqlite.pragma("journal_mode = WAL");
|
|
sqlite.pragma("foreign_keys = ON");
|
|
return drizzle(sqlite, { schema });
|
|
}
|
|
|
|
export type Db = ReturnType<typeof createDb>;
|