CREATE TABLE IF NOT EXISTS users ( email TEXT PRIMARY KEY, username TEXT NOT NULL UNIQUE, fullName TEXT NOT NULL, mauth_token TEXT, phone TEXT, citizen_id TEXT, role TEXT DEFAULT 'visitor', avatar_url TEXT, bio TEXT, id_document_url TEXT, id_verification_status TEXT DEFAULT 'pending' CHECK(id_verification_status IN ('pending', 'verified', 'rejected')), created_at DATETIME DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE IF NOT EXISTS settings ( key TEXT PRIMARY KEY, value TEXT NOT NULL ); CREATE TABLE IF NOT EXISTS posts ( id INTEGER PRIMARY KEY AUTOINCREMENT, user_email TEXT NOT NULL, media_url TEXT NOT NULL, media_type TEXT NOT NULL CHECK(media_type IN ('image', 'video')), caption TEXT, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (user_email) REFERENCES users(email) ON DELETE CASCADE ); CREATE TABLE IF NOT EXISTS likes ( id INTEGER PRIMARY KEY AUTOINCREMENT, user_email TEXT NOT NULL, post_id INTEGER NOT NULL, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (user_email) REFERENCES users(email) ON DELETE CASCADE, FOREIGN KEY (post_id) REFERENCES posts(id) ON DELETE CASCADE, UNIQUE(user_email, post_id) ); CREATE TABLE IF NOT EXISTS comments ( id INTEGER PRIMARY KEY AUTOINCREMENT, user_email TEXT NOT NULL, post_id INTEGER NOT NULL, text TEXT NOT NULL, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (user_email) REFERENCES users(email) ON DELETE CASCADE, FOREIGN KEY (post_id) REFERENCES posts(id) ON DELETE CASCADE ); CREATE INDEX IF NOT EXISTS idx_users_username ON users(username); CREATE INDEX IF NOT EXISTS idx_posts_user_email ON posts(user_email); CREATE INDEX IF NOT EXISTS idx_likes_post_id ON likes(post_id); CREATE INDEX IF NOT EXISTS idx_comments_post_id ON comments(post_id); CREATE INDEX IF NOT EXISTS idx_comments_user_email ON comments(user_email); INSERT INTO settings (key, value) VALUES ('site_name', 'Cloudflare Social'), ('site_description', 'A social media platform powered by Cloudflare D1.'), ('allow_registration', 'true'), ('default_role', 'visitor'), ('valid_roles', '["visitor", "admin", "moderator"]');