Enhance data validation with additional CHECK constraints for User, Recipe, and ShoppingEntry tables; add lang field to Tag table.

This commit is contained in:
Greg Burri 2025-05-06 17:10:54 +02:00
parent eb47844f05
commit 1b85c275e2

View file

@ -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]);