JOGO
This commit is contained in:
108
create_tables.sql
Normal file
108
create_tables.sql
Normal 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();
|
||||
Reference in New Issue
Block a user