-- ===================================================== -- GARANTIR QUE A TABELA PROFILES TEM TODAS AS COLUNAS -- ===================================================== -- Verifica e adiciona colunas que podem estar em falta DO $$ BEGIN IF NOT EXISTS ( SELECT 1 FROM information_schema.columns WHERE table_name='profiles' AND column_name='id' ) THEN CREATE TABLE profiles ( id UUID PRIMARY KEY REFERENCES auth.users(id) ON DELETE CASCADE, username VARCHAR(255), full_name VARCHAR(255), avatar_url TEXT, selected_team_id UUID, created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(), updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW() ); END IF; -- Adiciona colunas em falta se necessário IF NOT EXISTS ( SELECT 1 FROM information_schema.columns WHERE table_name='profiles' AND column_name='username' ) THEN ALTER TABLE profiles ADD COLUMN username VARCHAR(255); END IF; IF NOT EXISTS ( SELECT 1 FROM information_schema.columns WHERE table_name='profiles' AND column_name='full_name' ) THEN ALTER TABLE profiles ADD COLUMN full_name VARCHAR(255); END IF; IF NOT EXISTS ( SELECT 1 FROM information_schema.columns WHERE table_name='profiles' AND column_name='avatar_url' ) THEN ALTER TABLE profiles ADD COLUMN avatar_url TEXT; END IF; IF NOT EXISTS ( SELECT 1 FROM information_schema.columns WHERE table_name='profiles' AND column_name='selected_team_id' ) THEN ALTER TABLE profiles ADD COLUMN selected_team_id UUID; END IF; END $$; -- ===================================================== -- CRIAR TABELAS DE COMPARTILHAMENTO DE JOGO -- ===================================================== DROP TABLE IF EXISTS game_sync_events; DROP TABLE IF EXISTS game_sessions; CREATE TABLE game_sessions ( id UUID DEFAULT gen_random_uuid() PRIMARY KEY, game_id UUID NOT NULL REFERENCES games(id) ON DELETE CASCADE, created_by UUID NOT NULL REFERENCES profiles(id) ON DELETE CASCADE, shared_with_user_id UUID REFERENCES profiles(id) ON DELETE SET NULL, share_code VARCHAR(10) UNIQUE NOT NULL, status VARCHAR(20) DEFAULT 'active', created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(), updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW() ); CREATE TABLE game_sync_events ( id UUID DEFAULT gen_random_uuid() PRIMARY KEY, session_id UUID NOT NULL REFERENCES game_sessions(id) ON DELETE CASCADE, action_type VARCHAR(50) NOT NULL, action_data JSONB, triggered_by UUID NOT NULL REFERENCES profiles(id) ON DELETE CASCADE, created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW() ); -- ===================================================== -- CRIAR ÍNDICES PARA PERFORMANCE -- ===================================================== CREATE INDEX IF NOT EXISTS idx_game_sessions_game_id ON game_sessions(game_id); CREATE INDEX IF NOT EXISTS idx_game_sessions_share_code ON game_sessions(share_code); CREATE INDEX IF NOT EXISTS idx_game_sessions_status ON game_sessions(status); CREATE INDEX IF NOT EXISTS idx_game_sync_events_session_id ON game_sync_events(session_id); -- ===================================================== -- CRIAR TRIGGER AUTOMÁTICO PARA NOVOS UTILIZADORES -- ===================================================== CREATE OR REPLACE FUNCTION public.create_profile_for_new_user() RETURNS TRIGGER AS $$ BEGIN INSERT INTO public.profiles (id, username) VALUES (NEW.id, COALESCE(NEW.raw_user_meta_data->>'full_name', NEW.email)) ON CONFLICT (id) DO NOTHING; RETURN NEW; END; $$ LANGUAGE plpgsql SECURITY DEFINER; -- Drop the trigger if it exists and create it DROP TRIGGER IF EXISTS on_auth_user_created ON auth.users; CREATE TRIGGER on_auth_user_created AFTER INSERT ON auth.users FOR EACH ROW EXECUTE FUNCTION public.create_profile_for_new_user();