chore: initial database schema

This commit is contained in:
MWorld Deployer 2026-09-29 19:56:47 +05:30
commit 2059c9d81c
2 changed files with 138 additions and 0 deletions

5
.gitignore vendored Normal file
View File

@ -0,0 +1,5 @@
node_modules
dist
.wrangler
.env
.next

133
database/01_init.sql Normal file
View File

@ -0,0 +1,133 @@
CREATE TABLE IF NOT EXISTS users (
id TEXT PRIMARY KEY,
email TEXT NOT NULL UNIQUE,
full_name TEXT,
role TEXT NOT NULL DEFAULT 'passenger',
username TEXT UNIQUE,
mauth_token TEXT,
phone TEXT,
citizen_id TEXT,
is_banned INTEGER DEFAULT 0,
created_at TEXT DEFAULT CURRENT_TIMESTAMP,
updated_at TEXT DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE IF NOT EXISTS companion_safety_profiles (
user_email TEXT PRIMARY KEY,
persona_label TEXT NOT NULL,
safety_consent INTEGER NOT NULL DEFAULT 0,
background_check_status TEXT NOT NULL DEFAULT 'not_started',
reviewed_at TEXT,
created_at TEXT DEFAULT CURRENT_TIMESTAMP,
updated_at TEXT DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_email) REFERENCES users(email)
);
CREATE TABLE IF NOT EXISTS companion_circles (
id TEXT PRIMARY KEY,
name TEXT NOT NULL,
cadence TEXT NOT NULL,
status TEXT NOT NULL DEFAULT 'forming',
created_at TEXT DEFAULT CURRENT_TIMESTAMP,
updated_at TEXT DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE IF NOT EXISTS companion_circle_members (
circle_id TEXT NOT NULL,
user_email TEXT NOT NULL,
status TEXT NOT NULL DEFAULT 'invited',
created_at TEXT DEFAULT CURRENT_TIMESTAMP,
updated_at TEXT DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (circle_id, user_email),
FOREIGN KEY (circle_id) REFERENCES companion_circles(id),
FOREIGN KEY (user_email) REFERENCES users(email)
);
CREATE TABLE IF NOT EXISTS companion_activities (
id TEXT PRIMARY KEY,
circle_id TEXT NOT NULL,
created_by_email TEXT NOT NULL,
title TEXT NOT NULL,
description TEXT,
location_label TEXT NOT NULL,
starts_at TEXT NOT NULL,
max_attendees INTEGER,
status TEXT NOT NULL DEFAULT 'planned',
created_at TEXT DEFAULT CURRENT_TIMESTAMP,
updated_at TEXT DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (circle_id) REFERENCES companion_circles(id),
FOREIGN KEY (created_by_email) REFERENCES users(email)
);
CREATE TABLE IF NOT EXISTS companion_activity_rsvps (
activity_id TEXT NOT NULL,
user_email TEXT NOT NULL,
status TEXT NOT NULL DEFAULT 'going',
created_at TEXT DEFAULT CURRENT_TIMESTAMP,
updated_at TEXT DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (activity_id, user_email),
FOREIGN KEY (activity_id) REFERENCES companion_activities(id),
FOREIGN KEY (user_email) REFERENCES users(email)
);
CREATE TABLE IF NOT EXISTS driver_profiles (
id TEXT PRIMARY KEY,
user_email TEXT NOT NULL UNIQUE,
vehicle_make TEXT NOT NULL,
vehicle_model TEXT NOT NULL,
license_plate TEXT NOT NULL,
vehicle_color TEXT NOT NULL,
is_available INTEGER NOT NULL DEFAULT 0,
current_lat REAL,
current_lng REAL,
created_at TEXT DEFAULT CURRENT_TIMESTAMP,
updated_at TEXT DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_email) REFERENCES users(email)
);
CREATE TABLE IF NOT EXISTS rides (
id TEXT PRIMARY KEY,
passenger_email TEXT NOT NULL,
driver_email TEXT,
pickup_location TEXT NOT NULL,
pickup_lat REAL NOT NULL,
pickup_lng REAL NOT NULL,
destination_location TEXT NOT NULL,
destination_lat REAL NOT NULL,
destination_lng REAL NOT NULL,
status TEXT NOT NULL DEFAULT 'requested',
driver_lat REAL,
driver_lng REAL,
rating INTEGER,
created_at TEXT DEFAULT CURRENT_TIMESTAMP,
updated_at TEXT DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (passenger_email) REFERENCES users(email),
FOREIGN KEY (driver_email) REFERENCES users(email)
);
CREATE TABLE IF NOT EXISTS orders (
order_id TEXT PRIMARY KEY,
user_email TEXT NOT NULL,
amount REAL NOT NULL,
currency TEXT NOT NULL DEFAULT 'INR',
status TEXT NOT NULL DEFAULT 'PENDING',
payment_session_id TEXT NOT NULL,
created_at TEXT DEFAULT CURRENT_TIMESTAMP,
updated_at TEXT DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_email) REFERENCES users(email)
);
CREATE TABLE IF NOT EXISTS notifications (
id TEXT PRIMARY KEY,
recipient_email TEXT NOT NULL,
type TEXT NOT NULL DEFAULT 'info',
title TEXT NOT NULL,
body TEXT,
link TEXT,
actor_email TEXT,
is_read INTEGER NOT NULL DEFAULT 0,
created_at TEXT DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (recipient_email) REFERENCES users(email),
FOREIGN KEY (actor_email) REFERENCES users(email)
);
CREATE INDEX IF NOT EXISTS idx_users_email ON users(email);
CREATE INDEX IF NOT EXISTS idx_companion_circle_members_user ON companion_circle_members(user_email);
CREATE INDEX IF NOT EXISTS idx_companion_activities_circle ON companion_activities(circle_id);
CREATE INDEX IF NOT EXISTS idx_companion_activity_rsvps_user ON companion_activity_rsvps(user_email);
CREATE INDEX IF NOT EXISTS idx_driver_profiles_user ON driver_profiles(user_email);
CREATE INDEX IF NOT EXISTS idx_rides_passenger ON rides(passenger_email);
CREATE INDEX IF NOT EXISTS idx_rides_driver ON rides(driver_email);
CREATE INDEX IF NOT EXISTS idx_orders_user ON orders(user_email);
CREATE INDEX IF NOT EXISTS idx_notifications_recipient ON notifications(recipient_email, is_read);
CREATE UNIQUE INDEX IF NOT EXISTS idx_users_email ON users(email);