commit 2059c9d81c78dbdc8e36846b1acd58db59dd4a00 Author: MWorld Deployer Date: Tue Sep 29 19:56:47 2026 +0530 chore: initial database schema diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5de5f73 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +node_modules +dist +.wrangler +.env +.next diff --git a/database/01_init.sql b/database/01_init.sql new file mode 100644 index 0000000..f04cf75 --- /dev/null +++ b/database/01_init.sql @@ -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);