-- ============================================ -- PILATES PLATFORM - DATABASE SCHEMA -- ============================================ -- Script per creare tutte le tabelle necessarie -- Esegui questo script nel tuo database MySQL -- ============================================ -- Crea il database (se non esiste) CREATE DATABASE IF NOT EXISTS pilates_platform CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; USE pilates_platform; -- ============================================ -- TABELLA UTENTI -- ============================================ -- Memorizza tutti gli utenti registrati (studenti e amministratori) CREATE TABLE IF NOT EXISTS users ( id INT AUTO_INCREMENT PRIMARY KEY, email VARCHAR(255) NOT NULL UNIQUE, password VARCHAR(255) NOT NULL COMMENT 'Password hashata con bcrypt', first_name VARCHAR(100) NOT NULL COMMENT 'Nome', last_name VARCHAR(100) NOT NULL COMMENT 'Cognome', is_admin BOOLEAN DEFAULT FALSE COMMENT 'True se amministratore', is_active BOOLEAN DEFAULT TRUE COMMENT 'Permette di disabilitare account', profile_image VARCHAR(255) DEFAULT NULL COMMENT 'URL immagine profilo', phone VARCHAR(20) DEFAULT NULL COMMENT 'Numero telefono opzionale', created_at DATETIME NOT NULL COMMENT 'Data registrazione', updated_at DATETIME DEFAULT NULL COMMENT 'Data ultimo aggiornamento', last_login DATETIME DEFAULT NULL COMMENT 'Data ultimo accesso', deleted_at DATETIME DEFAULT NULL COMMENT 'Soft delete - se valorizzato, utente cancellato', INDEX idx_email (email), INDEX idx_is_admin (is_admin), INDEX idx_deleted_at (deleted_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Utenti della piattaforma'; -- ============================================ -- TABELLA LEZIONI -- ============================================ -- Memorizza sia videolezioni che lezioni live CREATE TABLE IF NOT EXISTS lessons ( id INT AUTO_INCREMENT PRIMARY KEY, title VARCHAR(255) NOT NULL COMMENT 'Titolo della lezione', description TEXT NOT NULL COMMENT 'Descrizione dettagliata', type ENUM('video', 'live') NOT NULL COMMENT 'Tipo: video registrato o live', -- Informazioni video video_url VARCHAR(500) DEFAULT NULL COMMENT 'URL video (YouTube, Vimeo, S3, o percorso locale)', video_platform VARCHAR(50) DEFAULT 'local' COMMENT 'Piattaforma: local, youtube, vimeo, s3', thumbnail VARCHAR(500) DEFAULT NULL COMMENT 'URL immagine anteprima', duration INT DEFAULT NULL COMMENT 'Durata in minuti', -- Informazioni lezione live live_platform VARCHAR(100) DEFAULT NULL COMMENT 'Piattaforma streaming (Zoom, Google Meet, ecc.)', live_url VARCHAR(500) DEFAULT NULL COMMENT 'Link alla sessione live', live_date DATETIME DEFAULT NULL COMMENT 'Data e ora della lezione live', -- Classificazione level ENUM('principiante', 'intermedio', 'avanzato') NOT NULL COMMENT 'Livello difficoltà', category VARCHAR(100) DEFAULT NULL COMMENT 'Categoria (es: mat, reformer, stretching)', tags VARCHAR(255) DEFAULT NULL COMMENT 'Tag separati da virgola', -- Prezzo e disponibilità price DECIMAL(10, 2) NOT NULL DEFAULT 0.00 COMMENT 'Prezzo in euro', is_demo BOOLEAN DEFAULT FALSE COMMENT 'Se true, lezione gratuita', is_active BOOLEAN DEFAULT TRUE COMMENT 'Se false, lezione non visibile', -- Statistiche view_count INT DEFAULT 0 COMMENT 'Numero visualizzazioni', purchase_count INT DEFAULT 0 COMMENT 'Numero acquisti', -- Metadata created_by INT DEFAULT NULL COMMENT 'ID admin che ha creato', created_at DATETIME NOT NULL COMMENT 'Data creazione', updated_at DATETIME DEFAULT NULL COMMENT 'Data ultimo aggiornamento', deleted_at DATETIME DEFAULT NULL COMMENT 'Soft delete', INDEX idx_type (type), INDEX idx_is_demo (is_demo), INDEX idx_is_active (is_active), INDEX idx_level (level), INDEX idx_live_date (live_date), INDEX idx_deleted_at (deleted_at), FOREIGN KEY (created_by) REFERENCES users(id) ON DELETE SET NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Lezioni video e live'; -- ============================================ -- TABELLA ACQUISTI -- ============================================ -- Traccia tutti gli acquisti effettuati dagli utenti CREATE TABLE IF NOT EXISTS purchases ( id INT AUTO_INCREMENT PRIMARY KEY, user_id INT NOT NULL COMMENT 'Utente che ha acquistato', lesson_id INT NOT NULL COMMENT 'Lezione acquistata', -- Informazioni pagamento amount DECIMAL(10, 2) NOT NULL COMMENT 'Importo pagato', currency VARCHAR(3) DEFAULT 'EUR' COMMENT 'Valuta', payment_method VARCHAR(50) DEFAULT 'paypal' COMMENT 'Metodo pagamento', -- Dettagli transazione PayPal paypal_order_id VARCHAR(100) DEFAULT NULL COMMENT 'ID ordine PayPal', paypal_payer_id VARCHAR(100) DEFAULT NULL COMMENT 'ID pagatore PayPal', paypal_payment_id VARCHAR(100) DEFAULT NULL COMMENT 'ID pagamento PayPal', paypal_status VARCHAR(50) DEFAULT NULL COMMENT 'Status PayPal', -- Status acquisto status ENUM('pending', 'completed', 'failed', 'refunded') DEFAULT 'pending' COMMENT 'Stato acquisto', -- Timestamp purchased_at DATETIME DEFAULT NULL COMMENT 'Data completamento acquisto', created_at DATETIME NOT NULL COMMENT 'Data creazione record', INDEX idx_user_id (user_id), INDEX idx_lesson_id (lesson_id), INDEX idx_status (status), INDEX idx_purchased_at (purchased_at), FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE, FOREIGN KEY (lesson_id) REFERENCES lessons(id) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Acquisti lezioni'; -- ============================================ -- TABELLA RECUPERO PASSWORD -- ============================================ -- Gestisce i token per il reset della password CREATE TABLE IF NOT EXISTS password_resets ( id INT AUTO_INCREMENT PRIMARY KEY, user_id INT NOT NULL COMMENT 'Utente che ha richiesto reset', token VARCHAR(255) NOT NULL UNIQUE COMMENT 'Token univoco per reset', expires_at DATETIME NOT NULL COMMENT 'Scadenza token', used_at DATETIME DEFAULT NULL COMMENT 'Quando il token è stato usato', created_at DATETIME NOT NULL COMMENT 'Data creazione richiesta', INDEX idx_token (token), INDEX idx_user_id (user_id), INDEX idx_expires_at (expires_at), FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Token reset password'; -- ============================================ -- TABELLA LOG ATTIVITÀ (opzionale ma utile) -- ============================================ -- Traccia le azioni importanti per debug e sicurezza CREATE TABLE IF NOT EXISTS activity_log ( id INT AUTO_INCREMENT PRIMARY KEY, user_id INT DEFAULT NULL COMMENT 'Utente che ha eseguito azione', action VARCHAR(100) NOT NULL COMMENT 'Tipo azione (login, purchase, etc.)', description TEXT DEFAULT NULL COMMENT 'Descrizione dettagliata', ip_address VARCHAR(45) DEFAULT NULL COMMENT 'IP utente (supporta IPv6)', user_agent TEXT DEFAULT NULL COMMENT 'Browser/dispositivo', created_at DATETIME NOT NULL COMMENT 'Quando è avvenuta', INDEX idx_user_id (user_id), INDEX idx_action (action), INDEX idx_created_at (created_at), FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE SET NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Log attività utenti'; -- ============================================ -- DATI DI ESEMPIO -- ============================================ -- Inserisci un utente amministratore di default -- Email: admin@pilatesstudio.com -- Password: admin123 (CAMBIALA SUBITO dopo il primo accesso!) INSERT INTO users (email, password, first_name, last_name, is_admin, created_at) VALUES ( 'admin@pilatesstudio.com', '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', -- Hash di 'admin123' 'Admin', 'Pilates', TRUE, NOW() ); -- Inserisci alcune lezioni demo di esempio INSERT INTO lessons (title, description, type, video_url, video_platform, thumbnail, duration, level, category, price, is_demo, is_active, created_at) VALUES ( 'Introduzione al Pilates - Esercizi Base', 'Una lezione introduttiva perfetta per chi inizia. Imparerai i principi fondamentali del Pilates e gli esercizi base per sviluppare forza e flessibilità.', 'video', NULL, 'local', NULL, 30, 'principiante', 'Mat Work', 0.00, TRUE, TRUE, NOW() ), ( 'Pilates Intermedio - Full Body Workout', 'Sessione completa per lavorare su tutto il corpo. Include esercizi di tonificazione, equilibrio e controllo del core.', 'video', NULL, 'local', NULL, 45, 'intermedio', 'Mat Work', 9.99, FALSE, TRUE, NOW() ), ( 'Stretching e Mobilità', 'Lezione dedicata allo stretching profondo e al miglioramento della mobilità articolare. Perfetta per recupero e rilassamento.', 'video', NULL, 'local', NULL, 25, 'principiante', 'Stretching', 0.00, TRUE, TRUE, NOW() ); -- ============================================ -- FINE SCRIPT -- ============================================ -- Verifica che tutte le tabelle siano state create SELECT TABLE_NAME as 'Tabella', TABLE_ROWS as 'Righe', CREATE_TIME as 'Creata il' FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'pilates_platform' ORDER BY TABLE_NAME;