60 lines
1.7 KiB
PL/PgSQL
60 lines
1.7 KiB
PL/PgSQL
CREATE TYPE menu_item_category AS ENUM (
|
|
'dessert',
|
|
'main_course',
|
|
'beverages',
|
|
'appetizer',
|
|
'snack'
|
|
);
|
|
|
|
CREATE TABLE menu_items (
|
|
"id" serial primary key not null,
|
|
"location_id" integer references "locations"("id") not null,
|
|
"name" varchar not null,
|
|
"price" integer,
|
|
"category" menu_item_category,
|
|
"description" text,
|
|
"is_available" boolean default(true),
|
|
"is_deleted" boolean default(false),
|
|
"submitted_by" integer references "users"("id") not null,
|
|
"created_at" timestamp default(now()),
|
|
"updated_at" timestamp default(now())
|
|
);
|
|
|
|
CREATE TABLE menu_item_price_history (
|
|
"id" serial primary key not null,
|
|
"menu_item_id" integer references "menu_items"("id") not null,
|
|
"price" integer not null,
|
|
"recorded_at" timestamp default(now())
|
|
);
|
|
|
|
CREATE OR REPLACE FUNCTION log_menu_item_price_change()
|
|
RETURNS TRIGGER AS $$
|
|
BEGIN
|
|
IF OLD.price IS DISTINCT FROM NEW.price THEN
|
|
INSERT INTO menu_item_price_history (menu_item_id, price, recorded_at)
|
|
VALUES (OLD.id, OLD.price, now());
|
|
END IF;
|
|
RETURN NEW;
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
CREATE TRIGGER menu_item_price_change_trigger
|
|
BEFORE UPDATE ON menu_items
|
|
FOR EACH ROW EXECUTE FUNCTION log_menu_item_price_change();
|
|
|
|
-- For menu item images, use the existing polymorphic `images` table:
|
|
-- image_type = 'menu_items', image_of = menu_item_id
|
|
|
|
CREATE TABLE menu_item_reviews (
|
|
"id" serial primary key not null,
|
|
"menu_item_id" integer references "menu_items"("id") not null,
|
|
"submitted_by" integer references "users"("id") not null,
|
|
"score" smallint not null,
|
|
"comments" text,
|
|
"is_hidden" boolean default(false),
|
|
"created_at" timestamp default(now()),
|
|
"updated_at" timestamp default(now()),
|
|
UNIQUE("menu_item_id", "submitted_by")
|
|
);
|
|
|