diff --git a/src/lib/server/db/migrations/014_recipe_views.sql b/src/lib/server/db/migrations/014_recipe_view.sql similarity index 100% rename from src/lib/server/db/migrations/014_recipe_views.sql rename to src/lib/server/db/migrations/014_recipe_view.sql diff --git a/src/lib/server/recipes/views.ts b/src/lib/server/recipes/views.ts index 66b5c07..02fb3eb 100644 --- a/src/lib/server/recipes/views.ts +++ b/src/lib/server/recipes/views.ts @@ -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); }