NoMoosh / schema.sql
saadrizvi09
websocket fix
9d905d6
-- ==========================================================
-- Nomoosh — Supabase-compatible PostgreSQL schema
-- Run this in the Supabase SQL Editor (Dashboard → SQL → New Query)
-- ==========================================================
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
-- ==========================================================
-- 1. ONBOARDING / MASTER DATA
-- ==========================================================
-- Accounts (Restaurant Owner / Admin)
CREATE TABLE IF NOT EXISTS accounts (
id SERIAL PRIMARY KEY,
supabase_uid TEXT UNIQUE, -- links to auth.users.id
name VARCHAR(25) NOT NULL,
email VARCHAR(255) UNIQUE,
mob_number VARCHAR(16) UNIQUE,
profile_pic TEXT,
created_at TIMESTAMPTZ DEFAULT now(),
updated_at TIMESTAMPTZ DEFAULT now()
);
-- Restaurant Location
CREATE TABLE IF NOT EXISTS rest_location (
id SERIAL PRIMARY KEY,
street TEXT NOT NULL,
locality TEXT NOT NULL,
city TEXT NOT NULL,
pincode TEXT NOT NULL,
landmark TEXT,
latitude TEXT NOT NULL DEFAULT '0',
longitude TEXT NOT NULL DEFAULT '0'
);
-- Bank Details
CREATE TABLE IF NOT EXISTS bank_details (
id SERIAL PRIMARY KEY,
pan TEXT,
bank_name TEXT,
account_holder TEXT,
account_no TEXT,
ifsc TEXT,
upi TEXT
);
-- Restaurants (Master)
CREATE TABLE IF NOT EXISTS restaurants (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
accounts_id INT NOT NULL UNIQUE,
location_id INT NOT NULL UNIQUE,
bank_id INT UNIQUE,
rating REAL,
rating_by_no_of_people INT,
mob_number VARCHAR(16) NOT NULL DEFAULT '',
description TEXT,
FOREIGN KEY (accounts_id) REFERENCES accounts(id),
FOREIGN KEY (location_id) REFERENCES rest_location(id),
FOREIGN KEY (bank_id) REFERENCES bank_details(id)
);
-- Cuisines (pre-seeded below)
CREATE TABLE IF NOT EXISTS cuisines (
id SERIAL PRIMARY KEY,
cuisine VARCHAR(50) NOT NULL UNIQUE
);
-- Restaurant ↔ Cuisines
CREATE TABLE IF NOT EXISTS rest_cuisines (
restaurant_id INT NOT NULL,
cuisine_id INT NOT NULL,
PRIMARY KEY (restaurant_id, cuisine_id),
FOREIGN KEY (restaurant_id) REFERENCES restaurants(id) ON DELETE CASCADE,
FOREIGN KEY (cuisine_id) REFERENCES cuisines(id)
);
-- Menu
CREATE TABLE IF NOT EXISTS menu (
id SERIAL PRIMARY KEY,
restaurant_id INT NOT NULL,
dish_name VARCHAR(100) NOT NULL,
type_maincourse TEXT,
quantity TEXT,
price INT NOT NULL DEFAULT 0,
category_veg BOOLEAN,
availability BOOLEAN DEFAULT TRUE NOT NULL,
preperation_time INTERVAL,
image_link TEXT,
description TEXT,
customizability BOOLEAN DEFAULT FALSE NOT NULL,
order_freq TEXT,
serving_for_no_of_people INT,
rating REAL,
rating_by_no_of_people INT,
cuisine VARCHAR(50),
category TEXT,
variant_name TEXT DEFAULT 'Regular',
FOREIGN KEY (restaurant_id) REFERENCES restaurants(id) ON DELETE CASCADE
);
-- Restaurant Timing (open/close per day per shift)
CREATE TABLE IF NOT EXISTS rest_timing (
id SERIAL PRIMARY KEY,
restaurant_id INT NOT NULL,
day VARCHAR(9) NOT NULL,
open_time TIME NOT NULL,
close_time TIME NOT NULL,
FOREIGN KEY (restaurant_id) REFERENCES restaurants(id) ON DELETE CASCADE
);
-- Restaurant Media
CREATE TABLE IF NOT EXISTS rest_media (
id SERIAL PRIMARY KEY,
restaurant_id INT NOT NULL,
image_link TEXT NOT NULL,
exterior BOOLEAN DEFAULT FALSE NOT NULL,
interior BOOLEAN DEFAULT FALSE NOT NULL,
lavatory BOOLEAN DEFAULT FALSE NOT NULL,
kitchen BOOLEAN DEFAULT FALSE NOT NULL,
video BOOLEAN DEFAULT FALSE NOT NULL,
FOREIGN KEY (restaurant_id) REFERENCES restaurants(id) ON DELETE CASCADE
);
-- Customer Feedback
CREATE TABLE IF NOT EXISTS customer_feedback (
id SERIAL PRIMARY KEY,
customer_id INT NOT NULL,
restaurant_id INT NOT NULL,
food INT CHECK (food BETWEEN 1 AND 5),
staff_behavior INT CHECK (staff_behavior BETWEEN 1 AND 5),
hygiene INT CHECK (hygiene BETWEEN 1 AND 5),
optional TEXT,
FOREIGN KEY (restaurant_id) REFERENCES restaurants(id) ON DELETE CASCADE
);
-- ==========================================================
-- 2. TEMP / DRAFT TABLES (ONBOARDING FLOW)
-- ==========================================================
CREATE TABLE IF NOT EXISTS temp (
user_id INT PRIMARY KEY,
restaurant_name VARCHAR(100),
owner_name VARCHAR(25),
owner_email VARCHAR(255),
owner_mobile VARCHAR(16),
street TEXT,
locality TEXT,
city TEXT,
pincode TEXT,
landmark TEXT,
latitude TEXT,
longitude TEXT,
bank_name TEXT,
account_no TEXT,
ifsc TEXT,
upi TEXT,
rest_mob_number VARCHAR(16),
description TEXT,
pan TEXT,
account_holder TEXT,
FOREIGN KEY (user_id) REFERENCES accounts(id) ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS temp_media (
id SERIAL PRIMARY KEY,
user_id INT NOT NULL,
file_link TEXT NOT NULL,
exterior BOOLEAN DEFAULT FALSE NOT NULL,
interior BOOLEAN DEFAULT FALSE NOT NULL,
kitchen BOOLEAN DEFAULT FALSE NOT NULL,
menu BOOLEAN DEFAULT FALSE NOT NULL,
video BOOLEAN DEFAULT FALSE NOT NULL,
FOREIGN KEY (user_id) REFERENCES temp(user_id) ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS temp_menu (
id SERIAL PRIMARY KEY,
user_id INT NOT NULL,
dish_name VARCHAR(100) NOT NULL,
type_maincourse TEXT,
quantity TEXT,
price INT NOT NULL DEFAULT 0,
category_veg BOOLEAN,
availability BOOLEAN DEFAULT TRUE NOT NULL,
preperation_time INTERVAL,
image_link TEXT,
description TEXT,
customizability BOOLEAN DEFAULT FALSE NOT NULL,
serving_for_no_of_people INT,
cuisine VARCHAR(50),
category TEXT,
variant_name TEXT DEFAULT 'Regular',
FOREIGN KEY (user_id) REFERENCES temp(user_id) ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS temp_rest_timing (
id SERIAL PRIMARY KEY,
user_id INT NOT NULL,
day VARCHAR(9) NOT NULL,
open_time TIME NOT NULL,
close_time TIME NOT NULL,
FOREIGN KEY (user_id) REFERENCES temp(user_id) ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS temp_rest_cuisines (
user_id INT NOT NULL,
cuisine_id INT NOT NULL,
PRIMARY KEY (user_id, cuisine_id),
FOREIGN KEY (user_id) REFERENCES temp(user_id) ON DELETE CASCADE,
FOREIGN KEY (cuisine_id) REFERENCES cuisines(id)
);
-- ==========================================================
-- 3. CORE APPLICATION (TRANSACTIONAL)
-- ==========================================================
CREATE TABLE IF NOT EXISTS restaurant_tables (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
restaurant_id INT NOT NULL,
number VARCHAR(50) NOT NULL,
FOREIGN KEY (restaurant_id) REFERENCES restaurants(id) ON DELETE CASCADE
);
DO $$ BEGIN
CREATE TYPE session_status AS ENUM ('active','payment_pending','completed','expired');
EXCEPTION
WHEN duplicate_object THEN null;
END $$;
CREATE TABLE IF NOT EXISTS sessions (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
table_id UUID NOT NULL,
restaurant_id INT NOT NULL,
status session_status DEFAULT 'active',
created_at TIMESTAMPTZ DEFAULT now(),
expires_at TIMESTAMPTZ,
payment_lock BOOLEAN DEFAULT FALSE,
payment_locked_by TEXT,
payment_lock_at TIMESTAMPTZ,
FOREIGN KEY (table_id) REFERENCES restaurant_tables(id),
FOREIGN KEY (restaurant_id) REFERENCES restaurants(id)
);
DO $$ BEGIN
CREATE TYPE participant_role AS ENUM ('guest','host');
EXCEPTION
WHEN duplicate_object THEN null;
END $$;
CREATE TABLE IF NOT EXISTS participants (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
session_id UUID NOT NULL,
device_fingerprint VARCHAR(255),
joined_at TIMESTAMPTZ DEFAULT now(),
last_active_at TIMESTAMPTZ DEFAULT now(),
role participant_role DEFAULT 'guest',
FOREIGN KEY (session_id) REFERENCES sessions(id)
);
CREATE TABLE IF NOT EXISTS carts (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
session_id UUID NOT NULL UNIQUE,
version INT DEFAULT 1,
updated_at TIMESTAMPTZ DEFAULT now(),
FOREIGN KEY (session_id) REFERENCES sessions(id)
);
CREATE TABLE IF NOT EXISTS cart_items (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
cart_id UUID NOT NULL,
menu_item_id INT NOT NULL,
quantity INT DEFAULT 1,
added_by UUID,
notes TEXT,
created_at TIMESTAMPTZ DEFAULT now(),
FOREIGN KEY (cart_id) REFERENCES carts(id) ON DELETE CASCADE,
FOREIGN KEY (menu_item_id) REFERENCES menu(id),
FOREIGN KEY (added_by) REFERENCES participants(id)
);
DO $$ BEGIN
CREATE TYPE order_status AS ENUM ('pending','paid','failed');
EXCEPTION
WHEN duplicate_object THEN null;
END $$;
CREATE TABLE IF NOT EXISTS orders (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
session_id UUID NOT NULL,
total_amount DECIMAL(10,2) NOT NULL,
status order_status DEFAULT 'pending',
transaction_id VARCHAR(255),
created_at TIMESTAMPTZ DEFAULT now(),
FOREIGN KEY (session_id) REFERENCES sessions(id)
);
CREATE TABLE IF NOT EXISTS order_items (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
order_id UUID NOT NULL,
menu_item_id INT NOT NULL,
quantity INT NOT NULL,
price_at_time DECIMAL(10,2) NOT NULL,
FOREIGN KEY (order_id) REFERENCES orders(id) ON DELETE CASCADE,
FOREIGN KEY (menu_item_id) REFERENCES menu(id)
);
-- ==========================================================
-- 4. PAYMENTS
-- ==========================================================
DO $$ BEGIN
CREATE TYPE payment_status AS ENUM ('initiated','success','failed','refunded');
EXCEPTION
WHEN duplicate_object THEN null;
END $$;
DO $$ BEGIN
CREATE TYPE payment_method AS ENUM ('upi','card','wallet','net_banking','cash');
EXCEPTION
WHEN duplicate_object THEN null;
END $$;
CREATE TABLE IF NOT EXISTS payments (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
order_id UUID NOT NULL,
participant_id UUID NOT NULL,
amount DECIMAL(10,2) NOT NULL,
method payment_method NOT NULL,
status payment_status DEFAULT 'initiated',
gateway_transaction_id VARCHAR(255),
gateway_response JSONB,
created_at TIMESTAMPTZ DEFAULT now(),
updated_at TIMESTAMPTZ DEFAULT now(),
FOREIGN KEY (order_id) REFERENCES orders(id) ON DELETE CASCADE,
FOREIGN KEY (participant_id) REFERENCES participants(id)
);
-- ==========================================================
-- 5. SEED: Cuisines
-- ==========================================================
INSERT INTO cuisines (cuisine) VALUES
('North Indian'),('South Indian'),('Chinese'),('Fast Food'),('Biryani'),
('Pizza'),('Bakery'),('Street Food'),('Burger'),('Mughlai'),
('Momos'),('Sandwich'),('Fresh Veggie'),('Kebab'),('Ice Cream'),
('Cafe'),('Healthy Food'),('Italian'),('Continental'),('Lebanese'),
('Salad'),('Shawarma'),('Gujarati'),('Andhra'),('Waffle'),
('Coffee'),('Rajasthani'),('Wraps'),('Mexican'),('Bengali'),
('Sushi'),('Lucknowi'),('Goan'),('Assamese'),('American'),
('Mandi'),('Chettinad'),('Mishti'),('Bar Food'),('Malwani'),
('Odia'),('Japanese'),('Finger Food'),('Korean'),('North Eastern'),
('Thai'),('Steak'),('Frozen Yogurt'),('Panini'),('Parsi'),
('Sichuan'),('Iranian'),('Grilled Chicken'),('French'),('Raw Meats'),
('Drinks Only'),('Vietnamese'),('Liquor'),('Greek'),('Himachali'),
('Bohri'),('Garhwali'),('Cantonese'),('Malaysian'),('Belgian'),
('British'),('African'),('Spanish'),('Manipur'),('Egyptian')
ON CONFLICT (cuisine) DO NOTHING;
-- ==========================================================
-- 6. SUPABASE STORAGE (run these manually in Dashboard)
-- ==========================================================
-- 1. Go to Supabase Dashboard → Storage → Create bucket
-- Name: restaurant-media | Public: ON
--
-- 2. Add a Storage Policy (allow uploads via service key):
-- INSERT policy: Allowed for service_role
-- SELECT policy: Allowed for everyone (public read)
--
-- These are NOT SQL commands — do them through the Dashboard UI.