mirror of
https://github.com/DeNNiiInc/Connect-5.git
synced 2026-04-18 13:55:59 +00:00
- Added @supabase/supabase-js client library - Rewrote database.js to use Supabase API - Updated server.js health check for Supabase - Updated db.config.example.js with Supabase format - Created comprehensive SUPABASE_SETUP.md guide - Added SQL schema files for easy deployment - Updated README_DB_CONFIG.md for Supabase Benefits: - Managed PostgreSQL database - Built-in Row Level Security - Real-time capabilities - Easy monitoring via dashboard - Free tier for development
115 lines
3.7 KiB
PL/PgSQL
115 lines
3.7 KiB
PL/PgSQL
-- Complete Supabase Schema for Connect-5
|
|
-- Copy and paste this entire file into Supabase SQL Editor and run it
|
|
|
|
-- Create players table
|
|
CREATE TABLE IF NOT EXISTS players (
|
|
id BIGSERIAL PRIMARY KEY,
|
|
username VARCHAR(50) UNIQUE NOT NULL,
|
|
total_wins INT DEFAULT 0,
|
|
total_losses INT DEFAULT 0,
|
|
total_draws INT DEFAULT 0,
|
|
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
|
|
);
|
|
CREATE INDEX IF NOT EXISTS idx_username ON players(username);
|
|
|
|
-- Create active sessions table
|
|
CREATE TABLE IF NOT EXISTS active_sessions (
|
|
session_id VARCHAR(100) PRIMARY KEY,
|
|
player_id BIGINT NOT NULL,
|
|
username VARCHAR(50) NOT NULL,
|
|
connected_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
|
|
last_heartbeat TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
|
|
FOREIGN KEY (player_id) REFERENCES players(id) ON DELETE CASCADE
|
|
);
|
|
|
|
-- Create game state enum type
|
|
DO $$ BEGIN
|
|
CREATE TYPE game_state_enum AS ENUM ('pending', 'active', 'completed', 'abandoned');
|
|
EXCEPTION
|
|
WHEN duplicate_object THEN null;
|
|
END $$;
|
|
|
|
-- Create games table
|
|
CREATE TABLE IF NOT EXISTS games (
|
|
id BIGSERIAL PRIMARY KEY,
|
|
player1_id BIGINT NOT NULL,
|
|
player2_id BIGINT NOT NULL,
|
|
player1_username VARCHAR(50) NOT NULL,
|
|
player2_username VARCHAR(50) NOT NULL,
|
|
board_size INT DEFAULT 15,
|
|
winner_id BIGINT,
|
|
game_state game_state_enum DEFAULT 'pending',
|
|
started_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
|
|
completed_at TIMESTAMP WITH TIME ZONE,
|
|
FOREIGN KEY (player1_id) REFERENCES players(id),
|
|
FOREIGN KEY (player2_id) REFERENCES players(id),
|
|
FOREIGN KEY (winner_id) REFERENCES players(id)
|
|
);
|
|
|
|
-- Create game moves table
|
|
CREATE TABLE IF NOT EXISTS game_moves (
|
|
id BIGSERIAL PRIMARY KEY,
|
|
game_id BIGINT NOT NULL,
|
|
player_id BIGINT NOT NULL,
|
|
row_position INT NOT NULL,
|
|
col_position INT NOT NULL,
|
|
move_number INT NOT NULL,
|
|
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
|
|
FOREIGN KEY (game_id) REFERENCES games(id) ON DELETE CASCADE,
|
|
FOREIGN KEY (player_id) REFERENCES players(id)
|
|
);
|
|
CREATE INDEX IF NOT EXISTS idx_game ON game_moves(game_id);
|
|
|
|
-- Enable Row Level Security (RLS)
|
|
ALTER TABLE players ENABLE ROW LEVEL SECURITY;
|
|
ALTER TABLE active_sessions ENABLE ROW LEVEL SECURITY;
|
|
ALTER TABLE games ENABLE ROW LEVEL SECURITY;
|
|
ALTER TABLE game_moves ENABLE ROW LEVEL SECURITY;
|
|
|
|
-- Create policies to allow all operations (adjust based on your security needs)
|
|
DROP POLICY IF EXISTS "Allow all operations on players" ON players;
|
|
CREATE POLICY "Allow all operations on players" ON players FOR ALL USING (true);
|
|
|
|
DROP POLICY IF EXISTS "Allow all operations on active_sessions" ON active_sessions;
|
|
CREATE POLICY "Allow all operations on active_sessions" ON active_sessions FOR ALL USING (true);
|
|
|
|
DROP POLICY IF EXISTS "Allow all operations on games" ON games;
|
|
CREATE POLICY "Allow all operations on games" ON games FOR ALL USING (true);
|
|
|
|
DROP POLICY IF EXISTS "Allow all operations on game_moves" ON game_moves;
|
|
CREATE POLICY "Allow all operations on game_moves" ON game_moves FOR ALL USING (true);
|
|
|
|
-- Helper Functions
|
|
CREATE OR REPLACE FUNCTION increment_wins(player_id BIGINT)
|
|
RETURNS void AS $$
|
|
BEGIN
|
|
UPDATE players
|
|
SET total_wins = total_wins + 1
|
|
WHERE id = player_id;
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
CREATE OR REPLACE FUNCTION increment_losses(player_id BIGINT)
|
|
RETURNS void AS $$
|
|
BEGIN
|
|
UPDATE players
|
|
SET total_losses = total_losses + 1
|
|
WHERE id = player_id;
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
CREATE OR REPLACE FUNCTION increment_draws(player_id BIGINT)
|
|
RETURNS void AS $$
|
|
BEGIN
|
|
UPDATE players
|
|
SET total_draws = total_draws + 1
|
|
WHERE id = player_id;
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
-- Success message
|
|
DO $$
|
|
BEGIN
|
|
RAISE NOTICE '✅ Connect-5 database schema created successfully!';
|
|
END $$;
|