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>
This commit is contained in:
2026-05-14 20:13:57 -07:00
commit b239ae3e5f
208 changed files with 19187 additions and 0 deletions
+121
View File
@@ -0,0 +1,121 @@
-- 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
);