32 lines
1.5 KiB
SQL
32 lines
1.5 KiB
SQL
-- Migration: Create room_members table
|
|
-- Description: Members of chat rooms
|
|
|
|
CREATE TABLE IF NOT EXISTS room_members (
|
|
id BIGSERIAL PRIMARY KEY,
|
|
room_id BIGINT NOT NULL,
|
|
user_id BIGINT NOT NULL,
|
|
role VARCHAR(50) NOT NULL DEFAULT 'member', -- 'admin', 'moderator', 'member'
|
|
joined_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
|
last_read_at TIMESTAMP WITH TIME ZONE,
|
|
is_muted BOOLEAN DEFAULT false,
|
|
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
|
deleted_at TIMESTAMP WITH TIME ZONE,
|
|
|
|
CONSTRAINT fk_room_members_room_id FOREIGN KEY (room_id) REFERENCES rooms(id) ON DELETE CASCADE,
|
|
CONSTRAINT fk_room_members_user_id FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
|
|
CONSTRAINT unique_room_member UNIQUE (room_id, user_id)
|
|
);
|
|
|
|
-- Indexes
|
|
CREATE INDEX IF NOT EXISTS idx_room_members_room_id ON room_members(room_id);
|
|
CREATE INDEX IF NOT EXISTS idx_room_members_user_id ON room_members(user_id);
|
|
CREATE INDEX IF NOT EXISTS idx_room_members_role ON room_members(role);
|
|
CREATE INDEX IF NOT EXISTS idx_room_members_deleted_at ON room_members(deleted_at);
|
|
|
|
-- Comments
|
|
COMMENT ON TABLE room_members IS 'Members of chat rooms with roles and permissions';
|
|
COMMENT ON COLUMN room_members.role IS 'Member role: admin, moderator, or member';
|
|
COMMENT ON COLUMN room_members.last_read_at IS 'Timestamp of last message read by user';
|
|
COMMENT ON COLUMN room_members.is_muted IS 'Whether notifications are muted for this user';
|
|
|