From 44356cac33e3d75722f0fed5e07751a4237a742e Mon Sep 17 00:00:00 2001 From: MWorld Deployer Date: Wed, 15 Jul 2026 20:28:58 +0530 Subject: [PATCH] chore: initial database schema --- .gitignore | 5 ++++ database/01_init.sql | 68 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+) create mode 100644 .gitignore create mode 100644 database/01_init.sql 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..7629fa5 --- /dev/null +++ b/database/01_init.sql @@ -0,0 +1,68 @@ +CREATE TABLE IF NOT EXISTS posts ( + id TEXT PRIMARY KEY, + anonymous_user_id TEXT NOT NULL, + content_type TEXT NOT NULL CHECK(content_type IN ('text', 'voice', 'photo')), + content_data TEXT NOT NULL, + emotion_tag TEXT NOT NULL, + created_at DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL, + expires_at DATETIME NOT NULL +); + +CREATE INDEX IF NOT EXISTS idx_posts_anonymous_user_id ON posts (anonymous_user_id); +CREATE INDEX IF NOT EXISTS idx_posts_expires_at ON posts (expires_at); + +CREATE TABLE IF NOT EXISTS holds ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + post_id TEXT NOT NULL, + anonymous_user_id TEXT NOT NULL, + created_at DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL, + FOREIGN KEY (post_id) REFERENCES posts(id) ON DELETE CASCADE, + UNIQUE(post_id, anonymous_user_id) +); + +CREATE TABLE IF NOT EXISTS reports ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + post_id TEXT NOT NULL, + reporter_anonymous_user_id TEXT NOT NULL, + reason TEXT, + status TEXT NOT NULL DEFAULT 'pending' CHECK(status IN ('pending', 'reviewed')), + created_at DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL, + FOREIGN KEY (post_id) REFERENCES posts(id) ON DELETE CASCADE +); + +CREATE INDEX IF NOT EXISTS idx_reports_status ON reports (status); + +CREATE TABLE IF NOT EXISTS post_summaries ( + id TEXT PRIMARY KEY, + anonymous_user_id TEXT NOT NULL, + emotion_tag TEXT NOT NULL, + hold_count INTEGER NOT NULL, + dissolved_at DATETIME NOT NULL +); + +CREATE INDEX IF NOT EXISTS idx_post_summaries_anonymous_user_id ON post_summaries (anonymous_user_id); + +CREATE TABLE IF NOT EXISTS users ( + email TEXT PRIMARY KEY, + username TEXT UNIQUE, + fullName TEXT NOT NULL, + mauth_token TEXT, + phone TEXT, + citizen_id TEXT, + role TEXT DEFAULT 'visitor' CHECK(role IN ('visitor', 'moderator', 'admin')), + 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 +); + +INSERT INTO settings (key, value) VALUES ('site_name', 'Cloudflare D1 App'); +INSERT INTO settings (key, value) VALUES ('default_post_ttl_hours', '24'); +INSERT INTO settings (key, value) VALUES ('maintenance_mode', 'false'); +INSERT INTO settings (key, value) VALUES ('max_report_count_before_auto_hide', '5'); \ No newline at end of file