Files
parking_solution/wiki/concepts/first-run-setup.md
T
julian 72ba4099ea Device-agnostic driver registry + first-run setup
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.
2026-06-14 07:59:46 +02:00

1.6 KiB

type, tags, sources, updated
type tags sources updated
concept
parking
architecture
devices
admin
parking-system-architecture
2026-06-15

First-Run Setup (device selection)

The admin install flow that makes the system device-agnostic in practice: on first run, an admin assigns devices per lane by choosing from the device-registry catalog and entering each device's connection config.

Implementation-derived (from apps/server + apps/web), not the source doc.

Flow

  1. Read the catalog — GET /api/setup/catalog returns supported drivers per category (no secrets, just schema). The web SetupWizard renders a picker + the driver's config fields.
  2. Assign per lane — POST /api/setup/assign (admin-only, role-guarded; see local-jwt-auth). The server validates the chosen driver + config against the registry before persisting to the lane_devices table; unknown drivers / missing required fields are rejected.
  3. Complete — POST /api/setup/complete marks the single-row setup_state.

Config granularity

Organized per lane — each lane gets an access controller, reader(s), and camera(s), each with its own connection settings. Matches the architecture's "mixable per lane" reality (a lane can serve permit holders via wiegand and casual via host-side reads on one relay — see entry-exit-readers).

Security notes