chore: initial database schema
This commit is contained in:
commit
472b8b1c27
5
.gitignore
vendored
Normal file
5
.gitignore
vendored
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
node_modules
|
||||||
|
dist
|
||||||
|
.wrangler
|
||||||
|
.env
|
||||||
|
.next
|
||||||
74
database/01_init.sql
Normal file
74
database/01_init.sql
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
CREATE TABLE IF NOT EXISTS users (
|
||||||
|
id TEXT PRIMARY KEY,
|
||||||
|
email TEXT NOT NULL UNIQUE,
|
||||||
|
full_name TEXT,
|
||||||
|
display_name TEXT,
|
||||||
|
bio TEXT,
|
||||||
|
avatar_url TEXT,
|
||||||
|
role TEXT DEFAULT 'user',
|
||||||
|
created_at TEXT DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
username TEXT UNIQUE,
|
||||||
|
mauth_token TEXT,
|
||||||
|
phone TEXT,
|
||||||
|
citizen_id TEXT,
|
||||||
|
is_banned INTEGER DEFAULT 0,
|
||||||
|
updated_at TEXT DEFAULT CURRENT_TIMESTAMP
|
||||||
|
);
|
||||||
|
CREATE TABLE IF NOT EXISTS posts (
|
||||||
|
id TEXT PRIMARY KEY,
|
||||||
|
author_email TEXT NOT NULL,
|
||||||
|
content TEXT NOT NULL,
|
||||||
|
image_url TEXT,
|
||||||
|
like_count INTEGER NOT NULL DEFAULT 0,
|
||||||
|
comment_count INTEGER NOT NULL DEFAULT 0,
|
||||||
|
created_at TEXT DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
updated_at TEXT DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
FOREIGN KEY (author_email) REFERENCES users(email) ON DELETE CASCADE
|
||||||
|
);
|
||||||
|
CREATE TABLE IF NOT EXISTS comments (
|
||||||
|
id TEXT PRIMARY KEY,
|
||||||
|
post_id TEXT NOT NULL,
|
||||||
|
author_email TEXT NOT NULL,
|
||||||
|
content TEXT NOT NULL,
|
||||||
|
created_at TEXT DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
FOREIGN KEY (post_id) REFERENCES posts(id) ON DELETE CASCADE,
|
||||||
|
FOREIGN KEY (author_email) REFERENCES users(email) ON DELETE CASCADE
|
||||||
|
);
|
||||||
|
CREATE TABLE IF NOT EXISTS post_likes (
|
||||||
|
id TEXT PRIMARY KEY,
|
||||||
|
post_id TEXT NOT NULL,
|
||||||
|
user_email TEXT NOT NULL,
|
||||||
|
created_at TEXT DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
FOREIGN KEY (post_id) REFERENCES posts(id) ON DELETE CASCADE,
|
||||||
|
FOREIGN KEY (user_email) REFERENCES users(email) ON DELETE CASCADE,
|
||||||
|
UNIQUE(post_id, user_email)
|
||||||
|
);
|
||||||
|
CREATE TABLE IF NOT EXISTS follows (
|
||||||
|
id TEXT PRIMARY KEY,
|
||||||
|
follower_email TEXT NOT NULL,
|
||||||
|
following_email TEXT NOT NULL,
|
||||||
|
created_at TEXT DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
FOREIGN KEY (follower_email) REFERENCES users(email) ON DELETE CASCADE,
|
||||||
|
FOREIGN KEY (following_email) REFERENCES users(email) ON DELETE CASCADE,
|
||||||
|
UNIQUE(follower_email, following_email)
|
||||||
|
);
|
||||||
|
CREATE TABLE IF NOT EXISTS notifications (
|
||||||
|
id TEXT PRIMARY KEY,
|
||||||
|
recipient_email TEXT NOT NULL,
|
||||||
|
actor_email TEXT NOT NULL,
|
||||||
|
type TEXT NOT NULL,
|
||||||
|
post_id TEXT,
|
||||||
|
read INTEGER NOT NULL DEFAULT 0,
|
||||||
|
created_at TEXT DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
FOREIGN KEY (recipient_email) REFERENCES users(email) ON DELETE CASCADE,
|
||||||
|
FOREIGN KEY (actor_email) REFERENCES users(email) ON DELETE CASCADE,
|
||||||
|
FOREIGN KEY (post_id) REFERENCES posts(id) ON DELETE SET NULL
|
||||||
|
);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_posts_author ON posts(author_email);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_posts_created ON posts(created_at);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_comments_post ON comments(post_id);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_post_likes_post_user ON post_likes(post_id, user_email);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_follows_follower ON follows(follower_email);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_follows_following ON follows(following_email);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_notifications_recipient ON notifications(recipient_email, created_at);
|
||||||
|
CREATE UNIQUE INDEX IF NOT EXISTS idx_users_email ON users(email);
|
||||||
Loading…
Reference in New Issue
Block a user