This commit is contained in:
2026-05-11 17:22:04 +01:00
parent 60656d77e8
commit 1e38c4ad57
9 changed files with 2386 additions and 484 deletions

108
create_tables.sql Normal file
View File

@@ -0,0 +1,108 @@
-- =====================================================
-- 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();