Files
philip b239ae3e5f Initial commit: Flutter app + PHP/MySQL backend on Hostinger
Replaces Firebase with a self-hosted PHP/MySQL API served from
winded.prymsolutions.com. Includes full backend (schema, auth, events,
teams, brackets, suggestions, stats, media, file upload) and updated
Flutter repositories and domain models.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 20:13:57 -07:00

122 lines
4.7 KiB
SQL
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- Winded MySQL schema
-- Run this once in your Hostinger MySQL database panel (phpMyAdmin or CLI).
CREATE TABLE IF NOT EXISTS users (
id VARCHAR(36) PRIMARY KEY,
email VARCHAR(255) UNIQUE NOT NULL,
password_hash VARCHAR(255) NOT NULL,
display_name VARCHAR(255) DEFAULT '',
role ENUM('player','manager','admin') DEFAULT 'player',
bio TEXT DEFAULT '',
photo_url VARCHAR(500) DEFAULT NULL,
position VARCHAR(50) DEFAULT NULL,
team_id VARCHAR(36) DEFAULT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
CREATE TABLE IF NOT EXISTS events (
id VARCHAR(36) PRIMARY KEY,
title VARCHAR(255) NOT NULL,
description TEXT DEFAULT '',
category ENUM('tournament','pickup') DEFAULT 'pickup',
event_date DATETIME NOT NULL,
location VARCHAR(500) DEFAULT '',
registration_deadline DATETIME DEFAULT NULL,
max_teams INT DEFAULT 0,
is_cancelled TINYINT(1) DEFAULT 0,
image_url VARCHAR(500) DEFAULT NULL,
created_by VARCHAR(36) DEFAULT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
CREATE TABLE IF NOT EXISTS event_registrations (
id VARCHAR(36) PRIMARY KEY,
event_id VARCHAR(36) NOT NULL,
user_id VARCHAR(36) NOT NULL,
registered_at DATETIME DEFAULT CURRENT_TIMESTAMP,
UNIQUE KEY unique_reg (event_id, user_id)
);
CREATE TABLE IF NOT EXISTS teams (
id VARCHAR(36) PRIMARY KEY,
name VARCHAR(255) NOT NULL,
description TEXT DEFAULT NULL,
logo_url VARCHAR(500) DEFAULT NULL,
primary_color VARCHAR(20) DEFAULT NULL,
status ENUM('pending','approved','rejected') DEFAULT 'pending',
manager_id VARCHAR(36) DEFAULT NULL,
manager_email VARCHAR(255) DEFAULT '',
manager_phone VARCHAR(50) DEFAULT NULL,
wins INT DEFAULT 0,
draws INT DEFAULT 0,
losses INT DEFAULT 0,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
CREATE TABLE IF NOT EXISTS players (
id VARCHAR(36) PRIMARY KEY,
team_id VARCHAR(36) NOT NULL,
user_id VARCHAR(36) DEFAULT NULL,
name VARCHAR(255) NOT NULL,
number INT DEFAULT NULL,
position VARCHAR(50) DEFAULT NULL,
goals_scored INT DEFAULT 0,
assists INT DEFAULT 0,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE IF NOT EXISTS join_requests (
id VARCHAR(36) PRIMARY KEY,
team_id VARCHAR(36) NOT NULL,
team_name VARCHAR(255) DEFAULT '',
player_id VARCHAR(36) NOT NULL,
player_name VARCHAR(255) DEFAULT '',
player_email VARCHAR(255) DEFAULT '',
status ENUM('pending','approved','rejected') DEFAULT 'pending',
requested_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
-- Brackets store rounds+matches as a JSON blob for MVP simplicity.
CREATE TABLE IF NOT EXISTS brackets (
id VARCHAR(36) PRIMARY KEY,
name VARCHAR(255) NOT NULL,
event_id VARCHAR(36) DEFAULT NULL,
status ENUM('draft','active','completed') DEFAULT 'draft',
rounds_json LONGTEXT DEFAULT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
CREATE TABLE IF NOT EXISTS suggestions (
id VARCHAR(36) PRIMARY KEY,
user_id VARCHAR(36) DEFAULT NULL,
display_name VARCHAR(255) DEFAULT NULL,
text TEXT NOT NULL,
is_anonymous TINYINT(1) DEFAULT 0,
status ENUM('pending','reviewed','implemented') DEFAULT 'pending',
submitted_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE IF NOT EXISTS media_links (
id VARCHAR(36) PRIMARY KEY,
platform VARCHAR(100) NOT NULL,
handle VARCHAR(255) DEFAULT '',
url VARCHAR(500) NOT NULL,
display_name VARCHAR(255) DEFAULT '',
sort_order INT DEFAULT 0
);
CREATE TABLE IF NOT EXISTS highlights (
id VARCHAR(36) PRIMARY KEY,
title VARCHAR(255) NOT NULL,
description TEXT DEFAULT '',
youtube_url VARCHAR(500) NOT NULL,
thumbnail_url VARCHAR(500) DEFAULT NULL,
published_at DATE DEFAULT NULL,
sort_order INT DEFAULT 0
);