Files
pilates-platform/database/schema.sql
Francesco Picone 4e41ca9bf7 fix
2025-12-03 18:35:21 +01:00

244 lines
9.5 KiB
SQL

-- ============================================
-- 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;