Mitchell R
|
ed2050cfd8
|
feat(db): full async Repository conversion for PostgreSQL support
Mechanical conversion of the entire data access layer from synchronous
node:sqlite API to async DbAdapter interface. Enables PostgreSQL
(PgAdapter) as a drop-in backend alongside SQLite (SqliteAdapter).
Repository (2208 lines):
- Constructor accepts DbAdapter instead of DatabaseSync
- Internal _run/_get/_all/_exec helpers wrap adapter calls
- All 155 methods converted to async, return Promise<T>
- transact() uses adapter.transaction() (supports PG savepoints)
14 caller files updated (327 call sites):
- routes-admin.ts: 202 repo calls + 6 async helper functions
- service-api-http: 40 repo calls + async getClusterKey
- routes-firmware.ts, routes-os-updates.ts, routes-auth.ts,
routes-setup.ts, middleware.ts: all handlers made async
- shared/auth.ts: resolveSession + revokeSession now async
- shared/bundle.ts: generateBundle now async, .map→for..of loops
- shared/pairing.ts: all 3 functions async
- shared/audit.ts: audit() now async
- shared/camera-health.ts: checkAll repo calls awaited
- service-coordinator-ws: session + kiosk lookups awaited
- service-store/index.ts: creates SqliteAdapter.fromExisting()
SqliteAdapter gains static fromExisting(db) factory for wrapping an
already-opened DatabaseSync (migrations run on raw db, then adapter
wraps for Repository queries).
tsc --noEmit: zero errors.
|
2026-05-23 02:07:44 +02:00 |
|
Mitchell R
|
444bb4c116
|
feat(firmware): allow env import token
|
2026-05-20 05:02:12 +02:00 |
|
Mitchell R
|
3ec2f3bf85
|
feat(server): audit log — schema, helper, admin UI, hooks for login/pair/firmware
|
2026-05-14 07:38:18 +02:00 |
|
Mitchell R
|
69cd0391b5
|
feat(ota): phase 3 — rollouts + automated rollback
Rollouts (server side):
- /admin/firmware/rollouts page lists + creates campaigns. Pick release,
target kiosk_ids (empty = whole channel), percentage (1-100).
- Active rollouts override channel-latest in /api/kiosk/firmware/check.
- Deterministic bucket via sha256(rollout_id:kiosk_id) % 100 — same kiosk
consistently lands in the same bucket across re-checks.
- Pause / resume / complete state controls.
Rollback (kiosk side):
- Before swap, kiosk writes firmware-applying.json marker.
- After clean boot + first successful heartbeat, marker deleted.
- New ExecStartPre hook (/usr/local/sbin/betterframe-firmware-rollback.sh)
runs every service start; stale marker (>120s) + .prev present →
restore .prev. Pairs with systemd's StartLimit to catch crash loops.
|
2026-05-14 07:28:20 +02:00 |
|
Mitchell R
|
e5009fdd14
|
feat(ota): replacement pairing + firmware OTA (admin UI, kiosk client, CI)
|
2026-05-13 20:56:42 +02:00 |
|