58 lines
2.1 KiB
MySQL
58 lines
2.1 KiB
MySQL
|
|
-- Migration for Social Features: Posts, Comments, Likes
|
||
|
|
|
||
|
|
-- Create PostType enum if not exists (simulated with check constraint or text)
|
||
|
|
-- We'll use TEXT for simplicity as per models.go
|
||
|
|
|
||
|
|
CREATE TABLE IF NOT EXISTS posts (
|
||
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||
|
|
user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
||
|
|
content TEXT,
|
||
|
|
type VARCHAR(50) DEFAULT 'status',
|
||
|
|
|
||
|
|
track_id UUID REFERENCES tracks(id) ON DELETE SET NULL,
|
||
|
|
playlist_id UUID REFERENCES playlists(id) ON DELETE SET NULL,
|
||
|
|
|
||
|
|
like_count INT DEFAULT 0,
|
||
|
|
comment_count INT DEFAULT 0,
|
||
|
|
|
||
|
|
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
|
||
|
|
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
|
||
|
|
deleted_at TIMESTAMP WITH TIME ZONE
|
||
|
|
);
|
||
|
|
|
||
|
|
CREATE INDEX IF NOT EXISTS idx_posts_user_id ON posts(user_id);
|
||
|
|
CREATE INDEX IF NOT EXISTS idx_posts_deleted_at ON posts(deleted_at);
|
||
|
|
CREATE INDEX IF NOT EXISTS idx_posts_created_at ON posts(created_at DESC);
|
||
|
|
|
||
|
|
-- Comments
|
||
|
|
CREATE TABLE IF NOT EXISTS comments (
|
||
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||
|
|
user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
||
|
|
target_id UUID NOT NULL,
|
||
|
|
target_type VARCHAR(50) NOT NULL,
|
||
|
|
content TEXT NOT NULL,
|
||
|
|
|
||
|
|
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
|
||
|
|
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
|
||
|
|
deleted_at TIMESTAMP WITH TIME ZONE
|
||
|
|
);
|
||
|
|
|
||
|
|
CREATE INDEX IF NOT EXISTS idx_comments_user_id ON comments(user_id);
|
||
|
|
CREATE INDEX IF NOT EXISTS idx_comments_target ON comments(target_type, target_id);
|
||
|
|
CREATE INDEX IF NOT EXISTS idx_comments_deleted_at ON comments(deleted_at);
|
||
|
|
|
||
|
|
-- Likes
|
||
|
|
CREATE TABLE IF NOT EXISTS likes (
|
||
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||
|
|
user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
||
|
|
target_id UUID NOT NULL,
|
||
|
|
target_type VARCHAR(50) NOT NULL,
|
||
|
|
|
||
|
|
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
|
||
|
|
|
||
|
|
UNIQUE(user_id, target_id, target_type)
|
||
|
|
);
|
||
|
|
|
||
|
|
CREATE INDEX IF NOT EXISTS idx_likes_user_id ON likes(user_id);
|
||
|
|
CREATE INDEX IF NOT EXISTS idx_likes_target ON likes(target_type, target_id);
|