jubnl
21ade19d44
refactor(db): TrekRepository base — every repository path validates the request context and reads bypass the identity map by default
2026-09-22 22:37:49 +02:00
jubnl
8ba55bda30
fix(db): generator emits the referenced column for non-PK foreign keys; OAuth client joins through the relation; FK parity un-skipped
2026-09-22 21:53:34 +02:00
jubnl
80a0fdc4d9
fix(auth): non-numeric passkey and invite ids answer the legacy 404, never NaN; invite join type pinned
2026-09-22 21:31:46 +02:00
jubnl
d82395d0ae
refactor(oauth): OAuth server tables through repositories
...
OauthClientsRepository/OauthTokensRepository/OauthConsentsRepository
replace OauthService's raw SQL (OA1-OA33). revokeChain's recursive CTE
and the oauth_clients join (its FK actually targets client_id, not the
row id the generated relation assumes) go through em.getKysely();
OA19's chain revoke is one nativeUpdate($in); OA12's consent grant is
em.upsert on the (client, user) unique key. revokeAllForUser built now
for Task 5. Every row-out read is disableIdentityMap: true; inserts go
through em.insert.
2026-09-22 21:18:08 +02:00
jubnl
44cf31c958
fix(server): non-numeric route ids answer the legacy not-found, never NaN (tokens, categories, tags); mint path back to two statements; identity-map regression pinned
2026-09-22 21:08:06 +02:00
jubnl
8d0dddf385
fix(db): row-out repository reads bypass the identity map — stale write-back over nativeUpdate at flush; insertUser via em.insert; settings round-trip pinned
2026-09-22 20:32:35 +02:00
jubnl
e9d0cb60e0
refactor(auth): passkeys and registration invites through repositories
2026-09-22 20:25:50 +02:00
jubnl
daef15be70
refactor(tokens): MCP and API tokens through McpTokensRepository
2026-09-22 20:23:11 +02:00
jubnl
57f4e29b9a
refactor(auth): users table through UsersRepository; JWT and MFA lookups repository-backed
2026-09-22 19:39:01 +02:00
jubnl
7453c7dafa
feat(server): pre-init photo route and WS handshake run in a request context; InviteTokensRepository
2026-09-22 18:48:24 +02:00
jubnl
e98f86efba
fix(server): plan 3a re-review 2 follow-ups — absent-ORM boot branch pinned; airports boot hook never rejects; BOOT-SWEEP-001 asserts the seven routes; duplicate comment removed
2026-09-22 18:13:28 +02:00
jubnl
66703efeb7
feat(db): generated entities declare their repository type; test casts dropped
2026-09-22 18:01:45 +02:00
jubnl
46bb11f508
fix(server): plan 3a re-review follow-ups — plugin boot activation and the airports backfill inside a request context; the supervisor answers the child before failing closed; BOOT-SWEEP-001 drives the real boot hooks; ws adapter seam pinned
2026-09-22 17:39:38 +02:00
jubnl
761cd14b2b
fix(server): plan 3a review follow-ups — fail closed without an ORM at every choke point; seam and D5 ratchet tests; dead method and DDL copies removed
2026-09-22 16:54:45 +02:00
jubnl
6fafcd72f2
fix(settings): drop dead wiring and the speculative deleteForUser; strict row assertions
2026-09-22 15:47:02 +02:00
jubnl
570a6ede85
fix(db): generator names relation properties in captured UNIQUE constraints
2026-09-22 15:46:46 +02:00
jubnl
59fa932ec8
test(server): harness constructors follow the Task 5 repository signatures; one test ORM per handle in the plugin host
2026-09-22 15:19:58 +02:00
jubnl
6763648c45
refactor(settings): user and instance settings through repositories
...
SettingsRepository (getForUser/upsertForUser/getOne/deleteForUser) replaces
the per-user settings table's raw SQL; SettingsService drops DatabaseService
entirely. instance-api-keys.ts's readInstanceApiKey/writeInstanceApiKey/
resolveApiKey take an explicit AppSettingsRepository/UsersRepository instead
of a raw connection.
An earlier version resolved those two repositories itself from the active
MikroORM request context, so none of its six callers needed to change. That
worked in production and e2e (always inside a real request) but broke
service construction in plain unit tests across every calling domain
(addons, auth x2, maps, transit, unsplash - 185 failures on a full run),
since none of them wrap a request context. Each of those six services now
injects its own AppSettingsRepository/UsersRepository and passes them
through explicitly, matching how every other converted repository in this
migration is consumed; their own SQL is untouched (outside Plan 3a).
2026-09-22 15:08:49 +02:00
jubnl
09a0a929b4
fix(db): PK lookups inside patch refresh past the identity map; corrected identity-map notes
2026-09-22 14:26:29 +02:00
jubnl
98e906a88e
chore(addons): well-known gate wraps only the addon read in a request context; drop unused test factories
2026-09-22 14:23:39 +02:00
jubnl
310a3b0ad3
fix(db): generator captures inline UNIQUE constraints
...
SqliteSchemaHelper.getIndexes() drops every unnamed sqlite_autoindex_
entry before entity-generator ever sees it, so a table-level
UNIQUE(...) constraint with no separate named CREATE UNIQUE INDEX
(settings' UNIQUE(user_id, key) among ~40 others) never reached the
generated entity's uniques: metadata. Adds a general
RULE9_addImplicitUniqueConstraints (skips a column set identical to
the table's own primary key — AppSettings.key/Addons.id noise) fed by
a PRAGMA index_list/index_info scan, and regenerates every entity.
2026-09-22 14:13:09 +02:00
jubnl
6db91c8bf3
refactor(addons): addon catalog and photo providers through repositories
2026-09-22 14:06:57 +02:00
jubnl
aa1067035f
refactor(categories, tags): repositories replace raw SQL
2026-09-22 13:54:13 +02:00
jubnl
e9391a9ae1
fix(server): non-HTTP entrypoints run inside an ORM request context; permission loads fail closed on context errors
2026-09-22 13:25:17 +02:00
jubnl
86c558cdd6
fix(audit): audit rows are native inserts, not a unit-of-work flush; closed test ORMs
2026-09-22 12:56:03 +02:00
jubnl
b0905f9867
docs(db): owned-lookup call-site convention; refresh side effect; e2e ORM module spread notes
2026-09-22 12:53:47 +02:00
jubnl
4209343328
fix(db): PK reads refresh past the identity map; typed owned-lookup generics; e2e ORM module mirrors production config
2026-09-22 12:38:59 +02:00
jubnl
c2da9d62f7
refactor(audit): audit log writes through AuditLogRepository
2026-09-22 12:34:49 +02:00
jubnl
7908914345
refactor(permissions): permission flags through AppSettingsRepository
2026-09-22 12:30:20 +02:00
jubnl
f460ae4fcb
feat(db): AppSettings and Users repositories; forFeature wiring pattern
2026-09-22 12:06:13 +02:00
jubnl
47e1801908
chore(db): entity --check reports stray files; class-field census is a ratchet; migrate-encryption typechecked
2026-09-22 11:57:50 +02:00
jubnl
11eeed46ee
fix(db): no NaN class-field initialisers; entity generator --check gate in CI; parity normaliser keeps literal case
2026-09-22 11:42:48 +02:00
jubnl
60d6e1fcd1
refactor(db): every entity in the snake_case shape; document-sync entities added; one repository per entity
2026-09-22 11:01:36 +02:00
jubnl
7534c2f903
fix(db): generator keeps NOT NULL boolean defaults; fails if a JSON interface import survives
2026-09-22 10:39:07 +02:00
jubnl
257529b250
fix(db): generator guard rails — validation cannot mask hidden()/index loss; typed JSON; loud failures
2026-09-22 10:24:10 +02:00
jubnl
7f379cac85
feat(db): re-runnable entity generator encoding the snake_case/DbTimestampType rules
2026-09-22 09:26:28 +02:00
jubnl
1e52332208
test(db): numeric ids for the primary-relation spike
2026-09-22 08:43:20 +02:00
jubnl
fc1c788e9a
test(db): parity gate also holds declared pivot entities; per-field column types; missing-set ratchets both ways
2026-09-22 08:38:06 +02:00
jubnl
4a67be3f87
feat(db): primary-relation entities proven (BudgetCategoryOrder, VacayUserSettings)
2026-09-22 08:35:46 +02:00
jubnl
6d6b6932f4
test(db): entity metadata must match the migrated schema; fix the four drifts it found
2026-09-22 08:25:43 +02:00
jubnl
de2d13b1af
fix(server): upload filters answer multer once on a throwing callback; positive call-graph gate test
2026-09-22 08:10:23 +02:00
jubnl
ae2af05cad
fix(server): phase 1 review follow-ups — awaited returns, logged upload-filter rejections, covered handshake/notice branches, call-graph gate in CI, dead test imports
2026-09-22 07:54:09 +02:00
jubnl
39a6d991ce
refactor(server): remove DatabaseService.transaction — every transaction runs through UnitOfWork
2026-09-22 06:39:38 +02:00
jubnl
a0f50c8316
refactor(trip-read-model, trips, feeds): async DB-touching methods; transactions through UnitOfWork
2026-09-22 06:30:13 +02:00
jubnl
869d139412
refactor(reservations, booking-import, calendar, integrations, roadtrip): async DB-touching methods; transactions through UnitOfWork
2026-09-22 06:11:41 +02:00
jubnl
571df42bed
refactor(trips): rewrite AccommodationsService.createAccommodation .bind alias
...
Recipe R4 trap named in the Task 12 brief: a .bind alias of an
AssignmentsService/AccommodationsService method is typed any and hides a
missing await from tsc and the promise lint rules. createAccommodation
belongs to this task's group, so rewritten as an arrow forwarding to the
method instead of a bound reference.
2026-09-22 05:22:51 +02:00
jubnl
5c8decd3ea
refactor(assignments, public-api, accommodations, places): async DB-touching methods; transactions through UnitOfWork
2026-09-22 05:21:48 +02:00
jubnl
3a8b54d761
fix(server): the journey hooks are awaited by their callers, not detached
2026-09-22 04:38:12 +02:00
jubnl
845320e0a4
refactor(journey, oidc, place-enrichment, tokens, trip-members): async DB-touching methods; transactions through UnitOfWork
2026-09-22 04:16:07 +02:00
jubnl
ad6e1ce8f0
fix(vacay): type the loop accumulators the async sweep introduced
2026-09-22 03:44:48 +02:00