refactor(views): ON CONFLICT DO UPDATE statt INSERT OR REPLACE

Code-Review-Finding zu commit 6c8de6f: INSERT OR REPLACE ist intern
DELETE+INSERT, das wuerde eventuelle FK-Children kuenftig stillschweigend
mitloeschen. ON CONFLICT DO UPDATE bumpt nur das Timestamp-Feld und
matcht den Stil der anderen Repos (shopping/repository.ts:43).

Migration-Dateiname zu recipe_view (singular) angeglichen, matcht
jetzt den Tabellennamen aus 543008b.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
hsiegeln
2026-04-22 14:14:44 +02:00
parent 6c8de6fa3a
commit 5357c9787b
2 changed files with 7 additions and 5 deletions

View File

@@ -5,12 +5,14 @@ export function recordView(
profileId: number,
recipeId: number
): void {
// INSERT OR REPLACE re-fires the DEFAULT (CURRENT_TIMESTAMP) on conflict,
// so subsequent views of the same recipe by the same profile bump the
// timestamp without breaking the composite PK.
// ON CONFLICT DO UPDATE bumps only the timestamp field — avoids the
// DELETE+INSERT that INSERT OR REPLACE performs under the hood, which would
// silently cascade-delete any future FK-referencing children.
db.prepare(
`INSERT OR REPLACE INTO recipe_view (profile_id, recipe_id)
VALUES (?, ?)`
`INSERT INTO recipe_view (profile_id, recipe_id)
VALUES (?, ?)
ON CONFLICT(profile_id, recipe_id) DO UPDATE
SET last_viewed_at = CURRENT_TIMESTAMP`
).run(profileId, recipeId);
}