250 lines
9.9 KiB
SQL
250 lines
9.9 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 pilatesplatform CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
|
USE pilatesplatform;
|
|
|
|
-- ============================================
|
|
-- 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',
|
|
email_verified BOOLEAN DEFAULT FALSE COMMENT 'True se email verificata',
|
|
email_token VARCHAR(64) DEFAULT NULL COMMENT 'Token per verifica email',
|
|
email_token_expires DATETIME DEFAULT NULL COMMENT 'Scadenza token verifica email',
|
|
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_email_verified (email_verified),
|
|
INDEX idx_email_token (email_token),
|
|
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',
|
|
video_converted BOOLEAN DEFAULT FALSE COMMENT 'True se il video è stato convertito in MP4 H.264',
|
|
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 = 'pilatesplatform'
|
|
ORDER BY TABLE_NAME;
|