app-uau39m/database/01_init.sql
2026-09-28 22:45:48 +05:30

117 lines
4.1 KiB
SQL

CREATE TABLE IF NOT EXISTS users (
email TEXT PRIMARY KEY,
username TEXT UNIQUE,
full_name TEXT NOT NULL,
phone TEXT,
citizen_id TEXT,
mauth_token TEXT,
role TEXT DEFAULT 'visitor',
is_banned INTEGER DEFAULT 0,
created_at TEXT DEFAULT CURRENT_TIMESTAMP,
updated_at TEXT DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE IF NOT EXISTS restaurants (
id TEXT PRIMARY KEY,
owner_email TEXT NOT NULL,
name TEXT NOT NULL,
description TEXT,
address TEXT NOT NULL,
latitude REAL NOT NULL,
longitude REAL NOT NULL,
image_url TEXT,
status TEXT DEFAULT 'active',
created_at TEXT DEFAULT CURRENT_TIMESTAMP,
updated_at TEXT DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (owner_email) REFERENCES users(email) ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS menu_items (
id TEXT PRIMARY KEY,
restaurant_id TEXT NOT NULL,
name TEXT NOT NULL,
description TEXT,
category TEXT,
ingredients TEXT,
recipe TEXT,
price REAL NOT NULL,
image_url TEXT,
is_available INTEGER DEFAULT 1,
created_at TEXT DEFAULT CURRENT_TIMESTAMP,
updated_at TEXT DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (restaurant_id) REFERENCES restaurants(id) ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS delivery_agents (
user_email TEXT PRIMARY KEY,
vehicle_type TEXT,
current_latitude REAL,
current_longitude REAL,
is_available INTEGER DEFAULT 1,
updated_at TEXT DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_email) REFERENCES users(email) ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS orders (
id TEXT PRIMARY KEY,
customer_email TEXT NOT NULL,
restaurant_id TEXT NOT NULL,
delivery_agent_email TEXT,
delivery_address TEXT NOT NULL,
delivery_latitude REAL NOT NULL,
delivery_longitude REAL NOT NULL,
subtotal REAL NOT NULL,
delivery_fee REAL NOT NULL,
total_amount REAL NOT NULL,
status TEXT DEFAULT 'placed',
created_at TEXT DEFAULT CURRENT_TIMESTAMP,
updated_at TEXT DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (customer_email) REFERENCES users(email),
FOREIGN KEY (restaurant_id) REFERENCES restaurants(id),
FOREIGN KEY (delivery_agent_email) REFERENCES users(email)
);
CREATE TABLE IF NOT EXISTS order_items (
id TEXT PRIMARY KEY,
order_id TEXT NOT NULL,
menu_item_id TEXT NOT NULL,
item_name TEXT NOT NULL,
quantity INTEGER NOT NULL,
unit_price REAL NOT NULL,
special_instructions TEXT,
FOREIGN KEY (order_id) REFERENCES orders(id) ON DELETE CASCADE,
FOREIGN KEY (menu_item_id) REFERENCES menu_items(id)
);
CREATE TABLE IF NOT EXISTS ratings (
id TEXT PRIMARY KEY,
order_id TEXT NOT NULL,
customer_email TEXT NOT NULL,
restaurant_rating INTEGER NOT NULL,
driver_rating INTEGER,
comment TEXT,
created_at TEXT DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (order_id) REFERENCES orders(id),
FOREIGN KEY (customer_email) REFERENCES users(email)
);
CREATE TABLE IF NOT EXISTS notifications (
id TEXT PRIMARY KEY,
recipient_email TEXT NOT NULL,
type TEXT DEFAULT 'info',
title TEXT NOT NULL,
body TEXT,
link TEXT,
actor_email TEXT,
is_read INTEGER DEFAULT 0,
created_at TEXT DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (recipient_email) REFERENCES users(email) ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS settings (
key TEXT PRIMARY KEY,
value TEXT,
updated_at TEXT DEFAULT CURRENT_TIMESTAMP
);
CREATE INDEX IF NOT EXISTS idx_restaurants_owner ON restaurants(owner_email);
CREATE INDEX IF NOT EXISTS idx_menu_items_restaurant ON menu_items(restaurant_id);
CREATE INDEX IF NOT EXISTS idx_orders_customer ON orders(customer_email);
CREATE INDEX IF NOT EXISTS idx_orders_restaurant ON orders(restaurant_id);
CREATE INDEX IF NOT EXISTS idx_orders_delivery_agent ON orders(delivery_agent_email);
CREATE INDEX IF NOT EXISTS idx_order_items_order ON order_items(order_id);
CREATE INDEX IF NOT EXISTS idx_ratings_order ON ratings(order_id);
CREATE INDEX IF NOT EXISTS idx_notifications_recipient ON notifications(recipient_email);
CREATE UNIQUE INDEX IF NOT EXISTS idx_users_email ON users(email);