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:
@@ -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
|
||||
);
|
||||
Reference in New Issue
Block a user