109 lines
3.7 KiB
PL/PgSQL
109 lines
3.7 KiB
PL/PgSQL
-- =====================================================
|
|
-- 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();
|