feat(phase4): rich profiles, badges DB, block list

This commit is contained in:
2026-06-30 11:04:32 -04:00
parent 368172e3d6
commit 58ce09cc18
7 changed files with 375 additions and 11 deletions
+36
View File
@@ -344,6 +344,42 @@ ALTER TABLE channels ADD COLUMN IF NOT EXISTS message_count INTEGER NOT NULL DEF
ALTER TABLE channels ADD COLUMN IF NOT EXISTS last_message_at TIMESTAMPTZ;
CREATE INDEX IF NOT EXISTS idx_channels_parent ON channels(parent_channel_id);
ALTER TABLE users ADD COLUMN IF NOT EXISTS banner_url TEXT;
ALTER TABLE users ADD COLUMN IF NOT EXISTS tagline VARCHAR(128);
ALTER TABLE users ADD COLUMN IF NOT EXISTS social_links JSONB DEFAULT '[]';
ALTER TABLE users ADD COLUMN IF NOT EXISTS pronouns VARCHAR(40);
-- Badges
CREATE TABLE IF NOT EXISTS badges (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
server_id UUID REFERENCES servers(id) ON DELETE CASCADE,
name VARCHAR(64) NOT NULL,
icon TEXT,
description TEXT,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE INDEX IF NOT EXISTS idx_badges_server ON badges(server_id);
CREATE TABLE IF NOT EXISTS user_badges (
user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
badge_id UUID NOT NULL REFERENCES badges(id) ON DELETE CASCADE,
granted_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
granted_by UUID REFERENCES users(id) ON DELETE SET NULL,
PRIMARY KEY (user_id, badge_id)
);
-- Block list
CREATE TABLE IF NOT EXISTS blocks (
blocker_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
blocked_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
PRIMARY KEY (blocker_id, blocked_id)
);
CREATE INDEX IF NOT EXISTS idx_blocks_blocker ON blocks(blocker_id);
CREATE INDEX IF NOT EXISTS idx_blocks_blocked ON blocks(blocked_id);
-- Message full-text search
ALTER TABLE messages ADD COLUMN IF NOT EXISTS search_vector tsvector;
CREATE INDEX IF NOT EXISTS idx_messages_search ON messages USING GIN(search_vector);