96 lines
4 KiB
SQL
96 lines
4 KiB
SQL
-- Migration 005: Nexus Cross-Platform Integration
|
|
-- Adds friend system, game sessions, lobbies, and enhanced Nexus features
|
|
|
|
-- Extend nexus_integrations table with session and overlay config
|
|
ALTER TABLE nexus_integrations
|
|
ADD COLUMN IF NOT EXISTS current_game_session_id UUID,
|
|
ADD COLUMN IF NOT EXISTS game_state JSONB,
|
|
ADD COLUMN IF NOT EXISTS auto_mute_enabled BOOLEAN DEFAULT true,
|
|
ADD COLUMN IF NOT EXISTS overlay_enabled BOOLEAN DEFAULT true,
|
|
ADD COLUMN IF NOT EXISTS overlay_position VARCHAR(20) DEFAULT 'top-right';
|
|
|
|
-- Friend requests table
|
|
CREATE TABLE IF NOT EXISTS friend_requests (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
from_user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
to_user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
status VARCHAR(20) DEFAULT 'pending', -- pending, accepted, rejected
|
|
created_at TIMESTAMP DEFAULT NOW(),
|
|
responded_at TIMESTAMP,
|
|
UNIQUE(from_user_id, to_user_id)
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_friend_requests_to ON friend_requests(to_user_id, status);
|
|
CREATE INDEX IF NOT EXISTS idx_friend_requests_from ON friend_requests(from_user_id, status);
|
|
|
|
-- Friendships table
|
|
CREATE TABLE IF NOT EXISTS friendships (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
user1_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
user2_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
created_at TIMESTAMP DEFAULT NOW(),
|
|
CHECK (user1_id < user2_id), -- Prevent duplicates
|
|
UNIQUE(user1_id, user2_id)
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_friendships_user1 ON friendships(user1_id);
|
|
CREATE INDEX IF NOT EXISTS idx_friendships_user2 ON friendships(user2_id);
|
|
|
|
-- Game sessions table
|
|
CREATE TABLE IF NOT EXISTS game_sessions (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
nexus_player_id VARCHAR(100) NOT NULL,
|
|
game_id VARCHAR(100) NOT NULL, -- Nexus game identifier
|
|
game_name VARCHAR(200),
|
|
session_state VARCHAR(20) DEFAULT 'active', -- active, paused, ended
|
|
started_at TIMESTAMP DEFAULT NOW(),
|
|
ended_at TIMESTAMP,
|
|
duration_seconds INTEGER,
|
|
metadata JSONB -- {mapName, gameMode, score, etc.}
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_game_sessions_user ON game_sessions(user_id, started_at DESC);
|
|
CREATE INDEX IF NOT EXISTS idx_game_sessions_active ON game_sessions(user_id, session_state);
|
|
CREATE INDEX IF NOT EXISTS idx_game_sessions_nexus_player ON game_sessions(nexus_player_id);
|
|
|
|
-- Game lobbies table
|
|
CREATE TABLE IF NOT EXISTS game_lobbies (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
game_id VARCHAR(100) NOT NULL,
|
|
lobby_code VARCHAR(50) UNIQUE,
|
|
host_user_id UUID NOT NULL REFERENCES users(id),
|
|
conversation_id UUID REFERENCES conversations(id), -- Auto-created chat
|
|
max_players INTEGER DEFAULT 8,
|
|
is_public BOOLEAN DEFAULT false,
|
|
status VARCHAR(20) DEFAULT 'open', -- open, full, in-progress, closed
|
|
created_at TIMESTAMP DEFAULT NOW(),
|
|
started_at TIMESTAMP,
|
|
ended_at TIMESTAMP
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_game_lobbies_game ON game_lobbies(game_id, status);
|
|
CREATE INDEX IF NOT EXISTS idx_game_lobbies_host ON game_lobbies(host_user_id);
|
|
CREATE INDEX IF NOT EXISTS idx_game_lobbies_code ON game_lobbies(lobby_code);
|
|
|
|
-- Game lobby participants table
|
|
CREATE TABLE IF NOT EXISTS game_lobby_participants (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
lobby_id UUID NOT NULL REFERENCES game_lobbies(id) ON DELETE CASCADE,
|
|
user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
team_id VARCHAR(20), -- For team-based games
|
|
ready BOOLEAN DEFAULT false,
|
|
joined_at TIMESTAMP DEFAULT NOW(),
|
|
left_at TIMESTAMP,
|
|
UNIQUE(lobby_id, user_id)
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_lobby_participants_lobby ON game_lobby_participants(lobby_id);
|
|
CREATE INDEX IF NOT EXISTS idx_lobby_participants_user ON game_lobby_participants(user_id);
|
|
|
|
-- Add foreign key constraint for current_game_session_id
|
|
ALTER TABLE nexus_integrations
|
|
ADD CONSTRAINT fk_current_game_session
|
|
FOREIGN KEY (current_game_session_id)
|
|
REFERENCES game_sessions(id)
|
|
ON DELETE SET NULL;
|