Files
mixmaker/backend/migrations/001_initial.sql
lemintare 1239fcee08
Some checks failed
CI / backend (push) Has been cancelled
CI / frontend (push) Has been cancelled
CI / compose (push) Has been cancelled
Initialize project with basic structure, including Docker configuration, backend and frontend setup, environment configuration, and essential files for development.
2026-07-19 00:17:31 +03:00

109 lines
3.4 KiB
SQL

-- +mixmaker Up
CREATE TABLE IF NOT EXISTS schema_migrations (
version text PRIMARY KEY,
applied_at timestamptz NOT NULL DEFAULT now()
);
CREATE TABLE accounts (
id text PRIMARY KEY,
discord_id text NOT NULL UNIQUE,
username text NOT NULL,
avatar_url text NOT NULL DEFAULT '',
role text NOT NULL CHECK (role IN ('admin', 'player')),
created_at timestamptz NOT NULL
);
CREATE TABLE players (
id text PRIMARY KEY,
account_id text NOT NULL UNIQUE REFERENCES accounts(id),
display_name text NOT NULL,
tank_rating smallint NOT NULL CHECK (tank_rating BETWEEN 1 AND 40),
damage_rating smallint NOT NULL CHECK (damage_rating BETWEEN 1 AND 40),
support_rating smallint NOT NULL CHECK (support_rating BETWEEN 1 AND 40),
preferred_roles jsonb NOT NULL DEFAULT '[]'::jsonb,
preferred_player_ids jsonb NOT NULL DEFAULT '[]'::jsonb,
created_at timestamptz NOT NULL,
updated_at timestamptz NOT NULL
);
CREATE TABLE sessions (
token_hash text PRIMARY KEY,
account_id text NOT NULL REFERENCES accounts(id) ON DELETE CASCADE,
expires_at timestamptz NOT NULL
);
CREATE INDEX sessions_expiry_idx ON sessions(expires_at);
CREATE TABLE events (
id text PRIMARY KEY,
name text NOT NULL,
description text NOT NULL DEFAULT '',
starts_at timestamptz NOT NULL,
ends_at timestamptz NOT NULL,
registration_deadline timestamptz NOT NULL,
created_by text NOT NULL REFERENCES accounts(id),
created_at timestamptz NOT NULL,
updated_at timestamptz NOT NULL,
CHECK (ends_at > starts_at),
CHECK (registration_deadline <= starts_at)
);
CREATE TABLE rsvps (
event_id text NOT NULL REFERENCES events(id) ON DELETE CASCADE,
player_id text NOT NULL REFERENCES players(id) ON DELETE CASCADE,
status text NOT NULL CHECK (status IN ('Going', 'Maybe', 'NotGoing')),
actor_account_id text NOT NULL REFERENCES accounts(id),
source text NOT NULL CHECK (source IN ('player', 'admin')),
updated_at timestamptz NOT NULL,
PRIMARY KEY(event_id, player_id)
);
CREATE TABLE teams (
id text PRIMARY KEY,
event_id text NOT NULL REFERENCES events(id) ON DELETE CASCADE,
name text NOT NULL,
captain_player_id text REFERENCES players(id),
slots jsonb NOT NULL
);
CREATE TABLE rulesets (
id text PRIMARY KEY,
name text NOT NULL,
body jsonb NOT NULL,
created_at timestamptz NOT NULL DEFAULT now()
);
CREATE TABLE series (
id text PRIMARY KEY,
tournament_id text NOT NULL DEFAULT '',
body jsonb NOT NULL,
version integer NOT NULL DEFAULT 0
);
CREATE TABLE tournaments (
id text PRIMARY KEY,
event_id text NOT NULL REFERENCES events(id) ON DELETE CASCADE,
body jsonb NOT NULL
);
CREATE TABLE draft_states (
id text PRIMARY KEY,
kind text NOT NULL CHECK (kind IN ('map', 'hero', 'coin')),
body jsonb NOT NULL,
version integer NOT NULL DEFAULT 0,
updated_at timestamptz NOT NULL DEFAULT now()
);
CREATE TABLE audit_log (
id bigserial PRIMARY KEY,
actor_account_id text NOT NULL REFERENCES accounts(id),
action text NOT NULL,
subject_id text NOT NULL,
payload jsonb NOT NULL,
created_at timestamptz NOT NULL DEFAULT now()
);
CREATE INDEX audit_subject_idx ON audit_log(subject_id, created_at);
-- +mixmaker Down
DROP TABLE IF EXISTS audit_log, draft_states, tournaments, series, rulesets, teams,
rsvps, events, sessions, players, accounts, schema_migrations CASCADE;