Initial commit: VRBattles API
This commit is contained in:
119
migrations/20260119000001_initial_schema.sql
Normal file
119
migrations/20260119000001_initial_schema.sql
Normal file
@@ -0,0 +1,119 @@
|
||||
-- VRBattles Initial Schema Migration
|
||||
-- Converted from MySQL to PostgreSQL
|
||||
-- Compatible with existing vr_battles_tables database
|
||||
|
||||
-- Users table
|
||||
CREATE TABLE IF NOT EXISTS users (
|
||||
id SERIAL PRIMARY KEY,
|
||||
date_registered TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
firstname VARCHAR(100) NOT NULL,
|
||||
lastname VARCHAR(100) NOT NULL,
|
||||
username VARCHAR(50) NOT NULL,
|
||||
email VARCHAR(100) NOT NULL,
|
||||
password VARCHAR(255) NOT NULL, -- Supports both MD5 (legacy) and Argon2
|
||||
is_admin BOOLEAN NOT NULL DEFAULT FALSE,
|
||||
profile VARCHAR(255),
|
||||
password_reset_token VARCHAR(255)
|
||||
);
|
||||
|
||||
-- Index for faster lookups (unique constraints added separately for migration flexibility)
|
||||
CREATE UNIQUE INDEX IF NOT EXISTS idx_users_email ON users(email);
|
||||
CREATE UNIQUE INDEX IF NOT EXISTS idx_users_username ON users(username);
|
||||
|
||||
-- Teams table
|
||||
CREATE TABLE IF NOT EXISTS teams (
|
||||
id SERIAL PRIMARY KEY,
|
||||
date_created TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
name VARCHAR(255) NOT NULL,
|
||||
logo TEXT NOT NULL DEFAULT '',
|
||||
bio TEXT,
|
||||
rank INTEGER NOT NULL DEFAULT 0,
|
||||
mmr REAL NOT NULL DEFAULT 1000.0,
|
||||
is_delete BOOLEAN NOT NULL DEFAULT FALSE
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_teams_name ON teams(name);
|
||||
CREATE INDEX IF NOT EXISTS idx_teams_rank ON teams(rank);
|
||||
|
||||
-- Team players (membership) table
|
||||
CREATE TABLE IF NOT EXISTS team_players (
|
||||
id SERIAL PRIMARY KEY,
|
||||
date_created TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
team_id INTEGER NOT NULL REFERENCES teams(id) ON DELETE CASCADE,
|
||||
player_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
||||
position VARCHAR(20) NOT NULL DEFAULT 'member',
|
||||
status INTEGER NOT NULL DEFAULT 0,
|
||||
UNIQUE(team_id, player_id)
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_team_players_team ON team_players(team_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_team_players_player ON team_players(player_id);
|
||||
|
||||
-- Ladders table
|
||||
CREATE TABLE IF NOT EXISTS ladders (
|
||||
id SERIAL PRIMARY KEY,
|
||||
date_created TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
date_expiration VARCHAR(255) NOT NULL DEFAULT '',
|
||||
date_start VARCHAR(255) NOT NULL DEFAULT '',
|
||||
created_by_id INTEGER NOT NULL DEFAULT 0,
|
||||
name VARCHAR(255) NOT NULL,
|
||||
status INTEGER NOT NULL DEFAULT 0,
|
||||
logo VARCHAR(255)
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_ladders_name ON ladders(name);
|
||||
CREATE INDEX IF NOT EXISTS idx_ladders_status ON ladders(status);
|
||||
|
||||
-- Ladder teams (teams enrolled in ladders)
|
||||
CREATE TABLE IF NOT EXISTS ladder_teams (
|
||||
id SERIAL PRIMARY KEY,
|
||||
date_created TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
ladder_id INTEGER NOT NULL REFERENCES ladders(id) ON DELETE CASCADE,
|
||||
team_id INTEGER NOT NULL REFERENCES teams(id) ON DELETE CASCADE,
|
||||
UNIQUE(ladder_id, team_id)
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_ladder_teams_ladder ON ladder_teams(ladder_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_ladder_teams_team ON ladder_teams(team_id);
|
||||
|
||||
-- Matches table
|
||||
CREATE TABLE IF NOT EXISTS matches (
|
||||
id SERIAL PRIMARY KEY,
|
||||
date_created TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
date_start TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
created_by_id INTEGER NOT NULL DEFAULT 0,
|
||||
challenge_date TIMESTAMPTZ,
|
||||
team_id_1 INTEGER NOT NULL REFERENCES teams(id) ON DELETE CASCADE,
|
||||
team_id_2 INTEGER NOT NULL REFERENCES teams(id) ON DELETE CASCADE,
|
||||
team_1_status INTEGER NOT NULL DEFAULT 0, -- 0=challenging, 1=pending, 2=challenged, 3=rejected, 4=accepted
|
||||
team_2_status INTEGER NOT NULL DEFAULT 0,
|
||||
matche_status INTEGER NOT NULL DEFAULT 0 -- 0=pending, 1=scheduled, 2=in-progress, 3=done, 4=cancelled
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_matches_team1 ON matches(team_id_1);
|
||||
CREATE INDEX IF NOT EXISTS idx_matches_team2 ON matches(team_id_2);
|
||||
CREATE INDEX IF NOT EXISTS idx_matches_status ON matches(matche_status);
|
||||
|
||||
-- Match rounds table
|
||||
CREATE TABLE IF NOT EXISTS match_rounds (
|
||||
id SERIAL PRIMARY KEY,
|
||||
date_created TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
match_id INTEGER NOT NULL REFERENCES matches(id) ON DELETE CASCADE,
|
||||
team_1_score INTEGER NOT NULL DEFAULT 0,
|
||||
team_2_score INTEGER NOT NULL DEFAULT 0,
|
||||
score_posted_by_team_id INTEGER NOT NULL,
|
||||
score_get_by_teamid INTEGER,
|
||||
score_acceptance_status INTEGER NOT NULL DEFAULT 0 -- 0=pending, 1=accepted, 2=rejected
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_match_rounds_match ON match_rounds(match_id);
|
||||
|
||||
-- Featured players table
|
||||
CREATE TABLE IF NOT EXISTS featured_players (
|
||||
id SERIAL PRIMARY KEY,
|
||||
date_created TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
player_id INTEGER NOT NULL UNIQUE REFERENCES users(id) ON DELETE CASCADE,
|
||||
rank INTEGER NOT NULL DEFAULT 0
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_featured_players_rank ON featured_players(rank);
|
||||
88
migrations/20260119000003_seed_original_data.sql
Normal file
88
migrations/20260119000003_seed_original_data.sql
Normal file
@@ -0,0 +1,88 @@
|
||||
-- Seed original VRBattles data from PHP database
|
||||
-- Note: Passwords are MD5 hashed - users will need to reset passwords or we support legacy login
|
||||
|
||||
-- Insert users (preserving original IDs)
|
||||
INSERT INTO users (id, date_registered, firstname, lastname, username, email, password, is_admin, profile) VALUES
|
||||
(2, '2022-01-06 11:17:59', 'Son', 'Goku', 'songoku', 'judithcharisma1978@gmail.com', '827ccb0eea8a706c4c34a16891f84e7b', FALSE, '1647586376.png'),
|
||||
(3, '2022-01-06 11:27:51', 'Game', 'Admin', 'admin', 'admin@gmail.com', '827ccb0eea8a706c4c34a16891f84e7b', TRUE, '1647586388.png'),
|
||||
(8, '2022-02-10 13:02:05', 'Test', 'Player', 'tester', 'test@gmail.com', '827ccb0eea8a706c4c34a16891f84e7b', FALSE, '1647586403.png'),
|
||||
(9, '2022-02-15 20:14:00', 'Demo', 'Player', 'demo', 'demo@gmail.com', '827ccb0eea8a706c4c34a16891f84e7b', FALSE, '1647586441.png'),
|
||||
(10, '2022-02-15 20:18:07', 'Mark', 'Jimenez', 'markjimenez', 'markjimenez@gmail.com', '827ccb0eea8a706c4c34a16891f84e7b', FALSE, '1647586416.png'),
|
||||
(15, '2022-03-14 13:56:56', 'Crysthel', 'Triones', 'crysthel', 'crysthelanndelostrinos1234@gmail.com', '827ccb0eea8a706c4c34a16891f84e7b', FALSE, '1647586426.png'),
|
||||
(16, '2022-03-21 11:56:43', 'crazy', 'coder', 'crazycoder', 'crazycoder09@gmail.com', 'e10adc3949ba59abbe56e057f20f883e', FALSE, NULL),
|
||||
(17, '2022-03-30 17:57:12', 'tony', 'stark', 'mark47', 'mark47@gmail.com', 'e10adc3949ba59abbe56e057f20f883e', FALSE, NULL)
|
||||
ON CONFLICT (id) DO NOTHING;
|
||||
|
||||
-- Reset sequence to continue after max id
|
||||
SELECT setval('users_id_seq', (SELECT MAX(id) FROM users));
|
||||
|
||||
-- Insert teams (preserving original IDs)
|
||||
INSERT INTO teams (id, date_created, name, logo, bio, rank, mmr, is_delete) VALUES
|
||||
(15, '2022-02-11 17:09:16', 'Black Ninja', '1647586615.png', 'Together we stand, Divided we fall!', 1, 1000, FALSE),
|
||||
(16, '2022-02-15 20:19:11', 'Cubers', '1647586637.png', 'Run to death', 2, 1000, FALSE),
|
||||
(40, '2022-02-25 15:30:37', 'Team Warzone', '1647586662.png', 'Best of the best', 3, 1000, FALSE)
|
||||
ON CONFLICT (id) DO NOTHING;
|
||||
|
||||
-- Reset sequence
|
||||
SELECT setval('teams_id_seq', (SELECT MAX(id) FROM teams));
|
||||
|
||||
-- Insert team players (preserving original IDs)
|
||||
INSERT INTO team_players (id, date_created, team_id, player_id, position, status) VALUES
|
||||
(24, '2022-02-15 20:19:12', 16, 10, 'captain', 1),
|
||||
(28, '2022-02-18 18:09:30', 15, 9, 'co-captain', 1),
|
||||
(43, '2022-02-25 15:30:37', 40, 8, 'captain', 1)
|
||||
ON CONFLICT (id) DO NOTHING;
|
||||
|
||||
-- Reset sequence
|
||||
SELECT setval('team_players_id_seq', (SELECT MAX(id) FROM team_players));
|
||||
|
||||
-- Insert ladders (preserving original IDs)
|
||||
INSERT INTO ladders (id, date_created, date_expiration, date_start, created_by_id, name, status, logo) VALUES
|
||||
(10, '2022-02-24 15:46:57', '2022-02-25', '2022-02-25', 0, 'Mighty Worlds', 0, '1647574565.png'),
|
||||
(11, '2022-02-24 15:53:14', '2022-02-25', '2022-02-25', 8, 'Hardcores', 0, '1647574578.png'),
|
||||
(12, '2022-02-24 16:43:41', '2022-02-24', '2022-02-24', 8, 'King of the Hill', 0, '1647574590.png'),
|
||||
(15, '2022-02-25 14:50:28', '2022-02-25', '2022-02-25', 3, 'World Dominator', 0, '1647574600.png'),
|
||||
(16, '2022-02-25 14:51:19', '2022-02-25', '2022-02-25', 3, 'Upcoming Ladder', 0, '1647574613.png'),
|
||||
(19, '2022-02-25 15:06:29', '2022-02-25', '2022-02-25', 3, 'Mighty Kids', 1, NULL),
|
||||
(22, '2022-02-25 15:10:20', '2022-02-25', '2022-02-25', 3, 'The Constructors', 1, NULL),
|
||||
(23, '2022-02-25 15:29:02', '2022-02-25', '2022-02-23', 8, 'Fools', 1, NULL)
|
||||
ON CONFLICT (id) DO NOTHING;
|
||||
|
||||
-- Reset sequence
|
||||
SELECT setval('ladders_id_seq', (SELECT MAX(id) FROM ladders));
|
||||
|
||||
-- Insert ladder_teams (preserving original IDs)
|
||||
INSERT INTO ladder_teams (id, date_created, ladder_id, team_id) VALUES
|
||||
(4, '2022-03-18 17:19:44', 10, 15),
|
||||
(5, '2022-03-18 17:21:17', 11, 15),
|
||||
(6, '2022-03-18 17:21:24', 12, 15),
|
||||
(7, '2022-03-18 17:21:34', 15, 15),
|
||||
(8, '2022-03-18 17:21:53', 10, 16),
|
||||
(9, '2022-03-18 17:21:57', 11, 16),
|
||||
(10, '2022-03-18 17:22:21', 11, 40),
|
||||
(11, '2022-03-18 17:22:25', 12, 40),
|
||||
(12, '2022-03-18 17:22:29', 15, 40),
|
||||
(13, '2022-03-18 17:22:37', 16, 40)
|
||||
ON CONFLICT (id) DO NOTHING;
|
||||
|
||||
-- Reset sequence
|
||||
SELECT setval('ladder_teams_id_seq', (SELECT MAX(id) FROM ladder_teams));
|
||||
|
||||
-- Insert matches (preserving original IDs)
|
||||
INSERT INTO matches (id, date_created, date_start, created_by_id, challenge_date, team_id_1, team_id_2, team_1_status, team_2_status, matche_status) VALUES
|
||||
(53, '2022-03-30 19:02:00', '2022-03-30 19:01:00', 10, '2022-04-07 16:59:00', 40, 16, 3, 3, 0),
|
||||
(54, '2022-04-01 17:51:11', '2022-04-01 17:51:00', 8, '2022-04-01 17:51:00', 15, 40, 0, 1, 0)
|
||||
ON CONFLICT (id) DO NOTHING;
|
||||
|
||||
-- Reset sequence
|
||||
SELECT setval('matches_id_seq', (SELECT MAX(id) FROM matches));
|
||||
|
||||
-- Insert featured_players (preserving original IDs)
|
||||
INSERT INTO featured_players (id, date_created, player_id, rank) VALUES
|
||||
(1, '2022-03-18 15:07:22', 2, 1),
|
||||
(2, '2022-03-18 15:07:22', 8, 2),
|
||||
(3, '2022-03-18 15:07:33', 9, 3)
|
||||
ON CONFLICT (id) DO NOTHING;
|
||||
|
||||
-- Reset sequence
|
||||
SELECT setval('featured_players_id_seq', (SELECT MAX(id) FROM featured_players));
|
||||
22
migrations/20260120000001_add_openskill_fields.sql
Normal file
22
migrations/20260120000001_add_openskill_fields.sql
Normal file
@@ -0,0 +1,22 @@
|
||||
-- Add OpenSkill rating fields to teams and users
|
||||
-- OpenSkill uses mu (mean skill) and sigma (uncertainty)
|
||||
-- ordinal = mu - 3*sigma (display rating)
|
||||
|
||||
-- Add OpenSkill fields to teams
|
||||
ALTER TABLE teams ADD COLUMN IF NOT EXISTS mu REAL NOT NULL DEFAULT 25.0;
|
||||
ALTER TABLE teams ADD COLUMN IF NOT EXISTS sigma REAL NOT NULL DEFAULT 8.333;
|
||||
ALTER TABLE teams ADD COLUMN IF NOT EXISTS ordinal REAL NOT NULL DEFAULT 0.0;
|
||||
|
||||
-- Add OpenSkill fields to users (for individual player ratings)
|
||||
ALTER TABLE users ADD COLUMN IF NOT EXISTS mu REAL NOT NULL DEFAULT 25.0;
|
||||
ALTER TABLE users ADD COLUMN IF NOT EXISTS sigma REAL NOT NULL DEFAULT 8.333;
|
||||
ALTER TABLE users ADD COLUMN IF NOT EXISTS ordinal REAL NOT NULL DEFAULT 0.0;
|
||||
ALTER TABLE users ADD COLUMN IF NOT EXISTS mmr REAL NOT NULL DEFAULT 1000.0;
|
||||
|
||||
-- Update existing ordinal values based on default mu/sigma
|
||||
UPDATE teams SET ordinal = mu - (3.0 * sigma) WHERE ordinal = 0.0;
|
||||
UPDATE users SET ordinal = mu - (3.0 * sigma) WHERE ordinal = 0.0;
|
||||
|
||||
-- Create indexes for faster ranking queries
|
||||
CREATE INDEX IF NOT EXISTS idx_teams_ordinal ON teams(ordinal DESC);
|
||||
CREATE INDEX IF NOT EXISTS idx_users_ordinal ON users(ordinal DESC);
|
||||
Reference in New Issue
Block a user