v3: follows, notifications, invite-only registration, unread markers
This commit is contained in:
@@ -21,7 +21,8 @@ CREATE TABLE users (
|
||||
password_hash TEXT NOT NULL,
|
||||
is_admin INTEGER NOT NULL DEFAULT 0,
|
||||
created_at TEXT NOT NULL,
|
||||
avatar_mime TEXT
|
||||
avatar_mime TEXT,
|
||||
invited_by TEXT REFERENCES users(id)
|
||||
);
|
||||
|
||||
CREATE TABLE votes (
|
||||
@@ -33,7 +34,6 @@ CREATE TABLE votes (
|
||||
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
|
||||
);
|
||||
|
||||
-- v2: playlists
|
||||
CREATE TABLE playlists (
|
||||
id TEXT PRIMARY KEY,
|
||||
user_id TEXT NOT NULL,
|
||||
@@ -55,7 +55,6 @@ CREATE TABLE playlist_dumps (
|
||||
FOREIGN KEY (dump_id) REFERENCES dumps(id) ON DELETE CASCADE
|
||||
);
|
||||
|
||||
-- v3: comments
|
||||
CREATE TABLE comments (
|
||||
id TEXT PRIMARY KEY,
|
||||
dump_id TEXT NOT NULL,
|
||||
@@ -75,3 +74,52 @@ CREATE INDEX idx_playlists_user ON playlists(user_id);
|
||||
CREATE INDEX idx_playlist_dumps_order ON playlist_dumps(playlist_id, position);
|
||||
CREATE INDEX idx_playlist_dumps_dump ON playlist_dumps(dump_id);
|
||||
CREATE INDEX idx_comments_dump ON comments(dump_id, created_at);
|
||||
|
||||
CREATE TABLE follows (
|
||||
id TEXT PRIMARY KEY,
|
||||
follower_id TEXT NOT NULL,
|
||||
followed_user_id TEXT,
|
||||
followed_playlist_id TEXT,
|
||||
created_at TEXT NOT NULL,
|
||||
FOREIGN KEY (follower_id) REFERENCES users(id) ON DELETE CASCADE,
|
||||
FOREIGN KEY (followed_user_id) REFERENCES users(id) ON DELETE CASCADE,
|
||||
FOREIGN KEY (followed_playlist_id) REFERENCES playlists(id) ON DELETE CASCADE,
|
||||
CHECK (
|
||||
(followed_user_id IS NOT NULL AND followed_playlist_id IS NULL)
|
||||
OR
|
||||
(followed_user_id IS NULL AND followed_playlist_id IS NOT NULL)
|
||||
)
|
||||
);
|
||||
|
||||
CREATE UNIQUE INDEX idx_follows_user
|
||||
ON follows(follower_id, followed_user_id)
|
||||
WHERE followed_user_id IS NOT NULL;
|
||||
|
||||
CREATE UNIQUE INDEX idx_follows_playlist
|
||||
ON follows(follower_id, followed_playlist_id)
|
||||
WHERE followed_playlist_id IS NOT NULL;
|
||||
|
||||
CREATE INDEX idx_follows_follower ON follows(follower_id);
|
||||
|
||||
CREATE TABLE invites (
|
||||
token TEXT PRIMARY KEY,
|
||||
inviter_id TEXT NOT NULL,
|
||||
used_at TEXT,
|
||||
created_at TEXT NOT NULL,
|
||||
FOREIGN KEY (inviter_id) REFERENCES users(id) ON DELETE CASCADE
|
||||
);
|
||||
|
||||
CREATE TABLE notifications (
|
||||
id TEXT PRIMARY KEY,
|
||||
user_id TEXT NOT NULL,
|
||||
type TEXT NOT NULL,
|
||||
data TEXT NOT NULL,
|
||||
read INTEGER NOT NULL DEFAULT 0,
|
||||
created_at TEXT NOT NULL,
|
||||
source_key TEXT,
|
||||
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
|
||||
);
|
||||
CREATE INDEX idx_notifications_user ON notifications(user_id, created_at);
|
||||
CREATE UNIQUE INDEX idx_notifications_dedup
|
||||
ON notifications(user_id, source_key)
|
||||
WHERE source_key IS NOT NULL;
|
||||
|
||||
Reference in New Issue
Block a user