fix
This commit is contained in:
243
database/schema.sql
Normal file
243
database/schema.sql
Normal file
@@ -0,0 +1,243 @@
|
||||
-- ============================================
|
||||
-- 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;
|
||||
Reference in New Issue
Block a user