[DB] Fehlende Unique Constraints erlauben doppelte Essensplaene und Eintraege #46
Labels
No labels
bug
critical
database
duplicate
enhancement
help wanted
invalid
performance
question
refactoring
security
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
Aceless/RecipePlanner#46
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Problem
backend/database_definition.sqlkennt wederweekly_meal_plan (space_id, week_start)nochmeal_plan_entry (meal_plan_id, date, meal_type)als eindeutig. Beide Regeln werden nur im Anwendungscode geprueft (
MealPlansController.CreateWeeklyMealPlan,MealPlanEntriesController.AddEntry) und dort jeweils als Check-Then-Act ohne Sperre.Auswirkung
Sind erst einmal Duplikate in der Tabelle, wirft
GetWeeklyMealPlanbeim Lesen eine Exception, weilQuerySingleOrDefaultAsyncbei mehr als einer Zeile fehlschlaegt. Der Space ist damit nicht mehr benutzbar. Der Commit "fixed creating double mealplan" hat das Symptom in der Anwendungsschicht entschaerft, die Ursache bleibt.Fix
Vorher vorhandene Duplikate bereinigen. Im Code
INSERT ... ON CONFLICT ... DO NOTHING RETURNING *verwenden.Ergaenzend fehlt ein CHECK, dass
recipe_idodercustom_mealgesetzt ist.Erledigt in
backend/migrations/001_constraints_and_indexes.sql.weekly_meal_plan_space_week_key UNIQUE (space_id, week_start)meal_plan_entry_slot_key UNIQUE (meal_plan_id, date, meal_type)meal_plan_entry_content_check CHECK (recipe_id IS NOT NULL OR custom_meal IS NOT NULL), alsNOT VALIDangelegt, damit vorhandene Zeilen die Migration nicht blockieren.Der Code nutzt diese Constraints über
ON CONFLICT. Die Migration muss vor dem Deployment eingespielt werden.Geprüft: Migration auf einer frischen PostgreSQL-16-Datenbank eingespielt, Constraints sind vorhanden, doppelter Wochenplan liefert denselben Plan zurück, doppelter Eintrag 409.
Branch
backend/issue-fixes, Commits90183ae.