jubnl
18a4784ebd
refactor(trips): trips through repositories
2026-09-23 09:33:48 +02:00
jubnl
f19face405
refactor(places): import paths through repositories
2026-09-23 08:53:54 +02:00
jubnl
955809f15f
fix(server): place-shadow source counts ordered in SQL; identity-map ratchets load-bearing; photo-cache race pinned
2026-09-23 08:31:36 +02:00
jubnl
9f1f5c45bf
refactor(places): places, tags, ratings and place images through repositories
2026-09-23 08:15:05 +02:00
jubnl
94c6efbbcc
refactor(trip-members): membership, guests and the trip read model through repositories
2026-09-23 08:00:39 +02:00
jubnl
cee6310e59
refactor(server): trip-membership, place-shadow, place-enrichment, place-photos and query helpers through repositories
2026-09-23 06:41:03 +02:00
jubnl
f41da98df3
refactor(assignments): day assignments through repositories
2026-09-23 06:27:21 +02:00
jubnl
d7f5bc64c1
refactor(days): days and day notes through repositories
2026-09-23 05:31:36 +02:00
jubnl
d2e0d7e320
refactor(trips): trip access through TripsRepository; demo seed in a request context; dialect helpers for the trips cluster
2026-09-23 04:46:18 +02:00
jubnl
769b9577ec
refactor(server): trip-access primitives async at every caller
2026-09-23 02:46:39 +02:00
jubnl
8efb3c8623
fix(server): plan 3b close-out — case folding on both sides for identifier lookups (non-ASCII login regression); coverage ratchet restored; repository scaffold and instanceof ratchet on TrekRepository; D-shape tests load-bearing
2026-09-23 01:48:27 +02:00
jubnl
8b815891f5
fix(auth): invite validation keeps expires_at null on the wire; password transaction scopes and reset-token burn pinned
2026-09-23 00:00:32 +02:00
jubnl
8610a67bb9
refactor(oidc): OIDC identities and settings through repositories
2026-09-22 23:44:26 +02:00
jubnl
33b9488653
refactor(auth): AuthService and account cleanup through repositories
2026-09-22 23:17:17 +02:00
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
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