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..cf177da --- /dev/null +++ b/database/01_init.sql @@ -0,0 +1,75 @@ +CREATE TABLE IF NOT EXISTS settings ( + key TEXT PRIMARY KEY, + value TEXT NOT NULL +); + +CREATE TABLE IF NOT EXISTS roles ( + name TEXT PRIMARY KEY NOT NULL, + description TEXT +); + +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', + created_at DATETIME DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (role) REFERENCES roles(name) ON UPDATE CASCADE ON DELETE SET DEFAULT +); + +CREATE TABLE IF NOT EXISTS posts ( + id TEXT PRIMARY KEY, + user_email TEXT NOT NULL, + media_url TEXT NOT NULL, + media_type TEXT NOT NULL, + caption TEXT, + created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (user_email) REFERENCES users(email) ON DELETE CASCADE +); + +CREATE TABLE IF NOT EXISTS likes ( + id TEXT PRIMARY KEY, + user_email TEXT NOT NULL, + post_id 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, + UNIQUE(user_email, post_id) +); + +CREATE TABLE IF NOT EXISTS comments ( + id TEXT PRIMARY KEY, + user_email TEXT NOT NULL, + post_id TEXT NOT NULL, + content TEXT NOT NULL, + created_at DATETIME NOT NULL 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_users_role ON users(role); +CREATE INDEX IF NOT EXISTS idx_posts_user_email ON posts(user_email); +CREATE INDEX IF NOT EXISTS idx_likes_user_email ON likes(user_email); +CREATE INDEX IF NOT EXISTS idx_likes_post_id ON likes(post_id); +CREATE INDEX IF NOT EXISTS idx_comments_user_email ON comments(user_email); +CREATE INDEX IF NOT EXISTS idx_comments_post_id ON comments(post_id); + +INSERT OR IGNORE INTO settings (key, value) VALUES +('site_name', 'Social Media App'), +('site_description', 'A vibrant community social media platform.'), +('maintenance_mode', 'false'), +('allow_registration', 'true'); + +INSERT OR IGNORE INTO roles (name, description) VALUES +('visitor', 'Read-only access to public content.'), +('member', 'Standard user with posting and interaction rights.'), +('moderator', 'Can manage content and users.'), +('admin', 'Full administrative access to the application.'); \ No newline at end of file