From 1b85c275e29b14a48721d63c1c3f141578b954cb Mon Sep 17 00:00:00 2001 From: Greg Burri Date: Tue, 6 May 2025 17:10:54 +0200 Subject: [PATCH] Enhance data validation with additional CHECK constraints for User, Recipe, and ShoppingEntry tables; add lang field to Tag table. --- backend/sql/version_1.sql | 45 ++++++++++++++++++++++----------------- 1 file changed, 26 insertions(+), 19 deletions(-) diff --git a/backend/sql/version_1.sql b/backend/sql/version_1.sql index 446d79e..21b1a89 100644 --- a/backend/sql/version_1.sql +++ b/backend/sql/version_1.sql @@ -35,8 +35,10 @@ CREATE TABLE [User] ( CHECK ( length([email]) <= 255 AND length([name]) <= 255 AND + length([lang]) = 2 AND length([password]) <= 255 AND - [first_day_of_the_week] >= 0 AND [first_day_of_the_week] <= 6 + [first_day_of_the_week] >= 0 AND [first_day_of_the_week] <= 6 AND + ([is_admin] = TRUE OR [is_admin] = FALSE) ) ) STRICT; @@ -80,17 +82,19 @@ CREATE TABLE [Recipe] ( [creation_datetime] TEXT NOT NULL, CHECK ( - length([lang]) = 2 AND length([title]) <= 255 AND + length([lang]) = 2 AND length([description]) <= 65535 AND - [difficulty] >= 0 AND [difficulty] <= 3 + [difficulty] >= 0 AND [difficulty] <= 3 AND + [servings] > 0 AND [servings] <= 255 AND + ([is_public] = TRUE OR [is_public] = FALSE) ), FOREIGN KEY([user_id]) REFERENCES [User]([id]) ON DELETE SET NULL ) STRICT; CREATE TABLE [Image] ( - [Id] INTEGER PRIMARY KEY, + [id] INTEGER PRIMARY KEY, [recipe_id] INTEGER NOT NULL, [name] TEXT NOT NULL DEFAULT '', [description] TEXT NOT NULL DEFAULT '', @@ -104,6 +108,19 @@ CREATE TABLE [Image] ( FOREIGN KEY([recipe_id]) REFERENCES [Recipe]([id]) ON DELETE CASCADE ) STRICT; +CREATE TABLE [Tag] ( + [id] INTEGER PRIMARY KEY, + [name] TEXT NOT NULL, + [lang] TEXT NOT NULL DEFAULT 'en', + + CHECK ( + length([name]) <= 31 AND + length([lang]) = 2 + ) +) STRICT; + +CREATE UNIQUE INDEX [Tag_name_lang_index] ON [Tag]([name], [lang]); + CREATE TABLE [RecipeTag] ( [id] INTEGER PRIMARY KEY, @@ -116,17 +133,6 @@ CREATE TABLE [RecipeTag] ( FOREIGN KEY([tag_id]) REFERENCES [Tag]([id]) ON DELETE CASCADE ) STRICT; -CREATE TABLE [Tag] ( - [id] INTEGER PRIMARY KEY, - [name] TEXT NOT NULL, - - CHECK ( - length([name]) <= 31 - ) -) STRICT; - -CREATE UNIQUE INDEX [Tag_name_lang_index] ON [Tag]([name]); - CREATE TABLE [Group] ( [id] INTEGER PRIMARY KEY, @@ -161,7 +167,7 @@ CREATE TABLE [Step] ( FOREIGN KEY(group_id) REFERENCES [Group](id) ON DELETE CASCADE ) STRICT; -CREATE INDEX [Step_order_index] ON [Group]([order]); +CREATE INDEX [Step_order_index] ON [Step]([order]); CREATE TABLE [Ingredient] ( [id] INTEGER PRIMARY KEY, @@ -196,7 +202,7 @@ CREATE TABLE [RecipeScheduled] ( FOREIGN KEY([user_id]) REFERENCES [User]([id]) ON DELETE CASCADE, FOREIGN KEY([recipe_id]) REFERENCES [Recipe]([id]) ON DELETE CASCADE -); +) STRICT; CREATE INDEX [RecipeScheduled_user_id_index] ON [RecipeScheduled]([user_id]); CREATE INDEX [RecipeScheduled_date_index] ON [RecipeScheduled]([date]); @@ -219,13 +225,14 @@ CREATE TABLE [ShoppingEntry] ( [servings] INTEGER, CHECK ( - length([name]) <= 255 + length([name]) <= 255 AND + ([is_checked] = TRUE OR [is_checked] = FALSE) ), FOREIGN KEY([user_id]) REFERENCES [User]([id]) ON DELETE CASCADE, FOREIGN KEY([ingredient_id]) REFERENCES [Ingredient]([id]) ON DELETE SET NULL, FOREIGN KEY([recipe_scheduled_id]) REFERENCES [RecipeScheduled]([id]) ON DELETE SET NULL -); +) STRICT; CREATE INDEX [ShoppingEntry_user_id_index] ON [ShoppingEntry]([user_id]);