source: sql/latest-unmigrated/ddl_nutritioneer_2_0.sql

Last change on this file was 98cd519, checked in by Acko <lavurovski.a65@…>, 15 hours ago

Shema update + project push

  • Property mode set to 100644
File size: 7.1 KB
Line 
1
2CREATE TYPE user_role AS ENUM (
3 'user',
4 'administrator',
5 'trainer'
6);
7
8CREATE TYPE ingredient_type AS ENUM (
9 'dairy',
10 'meat',
11 'fish',
12 'herb',
13 'carb',
14 'vegetable',
15 'fruit',
16 'legume',
17 'nut',
18 'seed',
19 'oil',
20 'spice',
21 'beverage',
22 'other'
23);
24
25CREATE TYPE nutrient_unit AS ENUM (
26 'milligram',
27 'gram',
28 'microgram'
29);
30
31CREATE TYPE nutrient_type AS ENUM (
32 'macro',
33 'micro'
34);
35
36CREATE TYPE restriction_type AS ENUM (
37 'vegan',
38 'vegetarian',
39 'halal',
40 'kosher',
41 'pescatarian',
42 'allergen',
43 'keto',
44 'paleo',
45 'gluten_free',
46 'lactose_free',
47 'diabetic',
48 'low_sodium',
49 'other'
50);
51
52CREATE TYPE post_status AS ENUM (
53 'published',
54 'draft',
55 'archived'
56);
57
58
59CREATE TABLE "user" (
60 id BIGINT PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
61 email TEXT NOT NULL,
62 username TEXT NOT NULL,
63 password TEXT NOT NULL,
64 role user_role NOT NULL DEFAULT 'user',
65
66 CONSTRAINT uq_user_email UNIQUE (email),
67 CONSTRAINT uq_user_username UNIQUE (username),
68 CONSTRAINT ck_user_email_format CHECK (email LIKE '%_@_%.__%'),
69 CONSTRAINT ck_user_username_len CHECK (length(username) BETWEEN 3 AND 40),
70 CONSTRAINT ck_user_password_len CHECK (length(password) >= 8)
71);
72
73CREATE TABLE ingredient (
74 id BIGINT PRIMARY KEY GENERATED ALWAYS AS IDENTITY, --FIX
75 name TEXT NOT NULL,
76 description TEXT NOT NULL,
77 energy NUMERIC NOT NULL,
78 kcal NUMERIC NOT NULL,
79 type ingredient_type NOT NULL DEFAULT 'other',
80
81 CONSTRAINT uq_ingredient_name UNIQUE (name),
82 CONSTRAINT ck_ingredient_energy CHECK (energy >= 0),
83 CONSTRAINT ck_ingredient_kcal CHECK (kcal >= 0)
84);
85
86CREATE TABLE nutrient (
87 id BIGINT PRIMARY KEY GENERATED ALWAYS AS IDENTITY, -- FIX
88 quantity NUMERIC NOT NULL,
89 description TEXT NOT NULL,
90 unit nutrient_unit NOT NULL,
91 type nutrient_type NOT NULL,
92
93 CONSTRAINT uq_nutrient_description UNIQUE (description),
94 CONSTRAINT ck_nutrient_quantity CHECK (quantity > 0)
95);
96
97CREATE TABLE restriction (
98 id BIGINT PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
99 description TEXT NOT NULL,
100 type restriction_type NOT NULL,
101
102 CONSTRAINT uq_restriction_description UNIQUE (description)
103);
104
105
106CREATE TABLE recipe (
107 id BIGINT PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
108 name TEXT NOT NULL,
109 guide TEXT NOT NULL,
110 kcal_sum NUMERIC NOT NULL,
111 servings NUMERIC NOT NULL DEFAULT 1,
112 user_id BIGINT NOT NULL REFERENCES "user"(id) ON DELETE CASCADE, -- FIX (user_email)
113
114 CONSTRAINT ck_recipe_kcal_sum CHECK (kcal_sum >= 0),
115 CONSTRAINT ck_recipe_servings CHECK (servings > 0)
116);
117
118
119CREATE TABLE post (
120 id BIGINT PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
121 media BYTEA,
122 media_type TEXT,
123 media_name TEXT,
124 is_private BOOLEAN NOT NULL DEFAULT FALSE,
125 is_favourite BOOLEAN NOT NULL DEFAULT FALSE,
126 status post_status NOT NULL DEFAULT 'draft',
127 created_at TIMESTAMP NOT NULL DEFAULT NOW(),
128 user_id BIGINT NOT NULL REFERENCES "user"(id) ON DELETE CASCADE, --FIX (created_by)
129 recipe_id BIGINT REFERENCES recipe(id) ON DELETE SET NULL,
130
131 CONSTRAINT ck_post_media_type CHECK (media IS NULL OR media_type IS NOT NULL),
132 CONSTRAINT uq_post_recipe UNIQUE (recipe_id)
133);
134
135CREATE TABLE comment (
136 id BIGINT PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
137 description TEXT NOT NULL,
138 created_at TIMESTAMP NOT NULL DEFAULT NOW(),
139 post_id BIGINT NOT NULL REFERENCES post(id) ON DELETE CASCADE,
140 user_id BIGINT NOT NULL REFERENCES "user"(id) ON DELETE CASCADE, --FIX (created_by)
141
142 CONSTRAINT ck_comment_not_empty CHECK (length(trim(description)) > 0)
143);
144
145CREATE TABLE grocery_list (
146 id BIGINT PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
147 date_time TIMESTAMP NOT NULL DEFAULT NOW(),
148 notes TEXT,
149 is_bought BOOLEAN NOT NULL DEFAULT FALSE,
150 kcal NUMERIC NOT NULL,
151 user_id BIGINT NOT NULL REFERENCES "user"(id) ON DELETE CASCADE, -- FIX (user_email)
152
153 CONSTRAINT ck_grocery_list_kcal CHECK (kcal >= 0)
154);
155
156CREATE TABLE intake_planner (
157 id BIGINT PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
158 date_time TIMESTAMP NOT NULL DEFAULT NOW(),
159 notes TEXT,
160 kcal NUMERIC NOT NULL,
161 is_consumed BOOLEAN NOT NULL DEFAULT FALSE,
162 user_id BIGINT NOT NULL REFERENCES "user"(id) ON DELETE CASCADE, -- FIX (user_email)
163
164 CONSTRAINT ck_intake_planner_kcal CHECK (kcal >= 0)
165);
166
167CREATE TABLE biometrics (
168 id BIGINT PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
169 date DATE NOT NULL,
170 weight NUMERIC,
171 height NUMERIC,
172 age NUMERIC,
173 muscle_fat_ratio NUMERIC,
174 user_id BIGINT NOT NULL REFERENCES "user"(id) ON DELETE CASCADE, -- FIX (user_email)
175
176 CONSTRAINT uq_biometrics_user_date UNIQUE (user_id, date)
177);
178
179
180CREATE TABLE recipe_contains_ingredient (
181 recipe_id BIGINT NOT NULL REFERENCES recipe(id) ON DELETE CASCADE,
182 ingredient_id BIGINT NOT NULL REFERENCES ingredient(id) ON DELETE CASCADE, -- FIX (ingredient_name)
183 ingredient_quantity NUMERIC NOT NULL,
184 PRIMARY KEY (recipe_id, ingredient_id)
185);
186
187CREATE TABLE ingredient_contains_nutrient (
188 ingredient_id BIGINT NOT NULL REFERENCES ingredient(id) ON DELETE CASCADE, -- FIX (ingredient_name)
189 nutrient_id BIGINT NOT NULL REFERENCES nutrient(id) ON DELETE CASCADE,
190 quantity NUMERIC NOT NULL,
191 PRIMARY KEY (ingredient_id, nutrient_id)
192);
193
194CREATE TABLE recipe_contains_restriction (
195 recipe_id BIGINT NOT NULL REFERENCES recipe(id) ON DELETE CASCADE,
196 restriction_id BIGINT NOT NULL REFERENCES restriction(id) ON DELETE CASCADE,
197 PRIMARY KEY (recipe_id, restriction_id)
198);
199
200CREATE TABLE grocery_list_bulk_add_ingredient (
201 list_id BIGINT NOT NULL REFERENCES grocery_list(id) ON DELETE CASCADE,
202 recipe_id BIGINT NOT NULL REFERENCES recipe(id) ON DELETE CASCADE,
203 PRIMARY KEY (list_id, recipe_id)
204);
205
206CREATE TABLE grocery_list_single_add_ingredient (
207 list_id BIGINT NOT NULL REFERENCES grocery_list(id) ON DELETE CASCADE,
208 ingredient_id BIGINT NOT NULL REFERENCES ingredient(id) ON DELETE CASCADE, -- FIX (ingredient_name)
209 buy_quantity NUMERIC NOT NULL,
210 PRIMARY KEY (list_id, ingredient_id)
211);
212
213CREATE TABLE intake_planner_save_to_list_post (
214 planner_id BIGINT NOT NULL REFERENCES intake_planner(id) ON DELETE CASCADE,
215 post_id BIGINT NOT NULL REFERENCES post(id) ON DELETE CASCADE,
216 PRIMARY KEY (planner_id, post_id)
217);
218
Note: See TracBrowser for help on using the repository browser.