Documentazione
Panoramica del Progetto
UnlimitedDB.net è un database non ufficiale per il gioco di carte collezionabili Star Wars: Unlimited sviluppato da Fantasy Flight Games. Il sito è hostato tramite Altervista.org e offre una piattaforma completa per la ricerca di carte, la gestione di mazzi e collezioni, con funzionalità avanzate di analisi e statistiche.
Caratteristiche Principali
- Database completo di tutte le carte di Star Wars: Unlimited
- Sistema di ricerca avanzato con filtri multipli
- Gestione mazzi con statistiche dettagliate e grafici
- Collezione personale per tracciare le carte possedute
- Aggiornamento automatico del database tramite webscraping
- API RESTful per sviluppatori terzi
- Sistema multilingue (Italiano/Inglese)
- Interfaccia responsive ottimizzata per mobile e desktop
Architettura e Tecnologie
Stack Tecnologico
- Backend: Laravel 12 (PHP 8.1+)
- Frontend: Blade Templates + Livewire 3
- Database: MySQL
- Hosting: Altervista.org
- Styling: Bootstrap 5.3
- JavaScript: Vanilla JS + Chart.js per grafici
- Build Tools: Vite + NPM
- Deployment: FTP automatizzato
Struttura del Database
Tabelle Principali
cards: Informazioni complete delle cartedecks: Mazzi degli utenticompositions: Relazione carte-mazzi con quantitàusers: Utenti registratifailed_jobs: Gestione errori job asincroni
Modelli Eloquent
Card: Gestione carte con attributi completiDeck: Mazzi pubblici e privatiComposition: Composizione mazziUser: Utenti con ruoli admin
Funzionalità Principali
1. Ricerca e Filtri Carte
Il sistema di ricerca utilizza un componente Livewire avanzato (SearchFilter) che offre:
- Filtri multipli: Nome, titolo, espansione, tipo, aspetti, rarità
- Range numerici: Costo, potenza, vita con valori min/max dinamici
- Filtri testuali: Tratti, arena, artista
- Filtri booleani: Carta unica
- Ricerca in tempo reale con debounce
- Risultati istantanei senza ricaricamento pagina
2. Gestione Mazzi
Creazione e Modifica
- Deck builder interattivo con popup di aggiunta carte
- Validazione automatica delle regole del gioco
- Salvataggio in tempo reale delle modifiche
- Mazzi pubblici e privati
Statistiche Avanzate
- Distribuzione per costo con grafici a barre
- Analisi tratti (divisi e completi)
- Curve di costo e statistiche vita/potenza
- Distribuzione per tipo e aspetto
- Grafici interattivi con Chart.js
3. Collezione Personale
- Mazzo speciale "Collezione" auto-creato per ogni utente
- Tracciamento quantità carte possedute
- Stessi filtri utilizzati nel resto del sito
- Statistiche collezione con valori di mercato (futuro)
4. Sistema di Aggiornamento
Integrazione API Ufficiale
- API diretta: Connessione all'API ufficiale di Star Wars Unlimited
- Endpoint carte singole:
https://admin.starwarsunlimited.com/api/card/{cid}?locale=it - Endpoint lista carte:
https://admin.starwarsunlimited.com/api/card-list?locale=it&filters[variantOf][id][$null]=true&pagination[page]={page}&pagination[pageSize]=10
- Endpoint carte singole:
- Scansione intelligente: Rilevamento automatico nuove carte
- Validazione dati: Controllo integrità prima dell'inserimento
- Gestione duplicati: Prevenzione inserimenti multipli con controllo CID
Sistema di Notifiche Avanzato
- Telegram integrato: Messaggi di stato in tempo reale con aggiornamento progressivo
- Email automatiche:
- Notifiche a tutti gli utenti per nuove carte aggiunte
- Notifiche agli admin per carte con errori o già presenti
- Template dedicati con snippet carte e link diretti
- Logging dettagliato: File di log timestampati (formato:
scansione ANNO MESE GIORNO ORE:MINUTI.log)
Gestione Errori Avanzata
- Pagina admin errori: Interfaccia dedicata per visualizzare e gestire errori
- Categorizzazione errori: Classificazione per tipo e gravità
- Risoluzione tracking: Possibilità di segnare errori come risolti
- Notifiche multiple: Telegram, email e logging per ogni errore
Performance e Affidabilità
- Job asincroni: Operazioni lunghe gestite in background con JobController
- Thread management: Gestione processi paralleli per evitare timeout
- Checkpoint system: Ripristino automatico in caso di interruzioni
- Rate limiting: Rispetto limiti API ufficiale
Processo di Aggiornamento
- Scansione API: Controllo nuove carte dall'API ufficiale
- Validazione: Verifica integrità dati e controllo duplicati
- Processing asincrono: Import batch con gestione parallela
- Notifiche: Invio messaggi Telegram e email agli utenti
- Logging: Registrazione dettagliata di tutte le operazioni
- Cleanup: Aggiornamento cache e pulizia file temporanei
5. Funzionalità Avanzate Mazzi
Export/Import Mazzi
- Esportazione multipla: Formati TXT e JSON supportati
- Formato ufficiale: Compatibile con tutti i programmi Star Wars Unlimited
- Importazione da file: Upload di file locali TXT/JSON
- Importazione da URL: Import diretto da link esterni o altri siti SWUDB
- Validazione automatica: Controllo formato e carte esistenti durante l'import
Sistema di Versionamento
- Cronologia completa: Tracciamento di tutte le modifiche al mazzo
- Versioni automatiche: Salvataggio automatico ad ogni modifica significativa
- Ripristino versioni: Possibilità di tornare a qualsiasi versione precedente
- Confronto versioni: Visualizzazione differenze tra versioni (futuro)
- Metadati versioni: Timestamp e descrizione modifiche
Gestione Avanzata
- Toggle visibilità: Cambio pubblico/privato con un click
- Rinomina rapida: Modifica nome direttamente dalla lista mazzi
- Eliminazione sicura: Conferma prima della cancellazione definitiva
- Link permanenti: URL diretti per condivisione mazzi pubblici
Statistiche in Tempo Reale
- Aggiornamento automatico: Statistiche che si aggiornano durante la modifica
- Grafici interattivi: Visualizzazioni Chart.js per analisi avanzate
- Curve di costo: Distribuzione carte per costo con grafici a barre
- Analisi aspetti: Distribuzione con colori reali degli aspetti Star Wars
- Tratti separati: Analisi tratti divisi e completi in tabelle separate
- Esclusione automatica: Basi e leader esclusi dai calcoli statistici
6. Gestione Utenti e Admin
Pannello Amministrazione
- Gestione utenti: Visualizzazione, modifica e eliminazione utenti
- Controlli admin: Promozione/retrocessione privilegi amministratore
- Pagina errori: Interfaccia dedicata per gestione errori di sistema
- Query database: Accesso diretto al database per operazioni avanzate
Sistema di Notifiche
- Email automatiche: Template dedicati per diverse tipologie di notifiche
- Telegram integrato: Bot per notifiche in tempo reale agli admin
- Logging avanzato: File di log dettagliati per tutte le operazioni
7. API RESTful
Endpoints Disponibili
GET /api/carta/{espansione}/{numero} # Dettagli carta singola
GET /api/carte/{espansione} # Carte per espansione
GET /api/mazzi/{user}/{nome}/{public} # Dettagli mazzo (ricerca con LIKE, nomi parziali supportati)
Formato Risposte
- JSON strutturato con metadati completi
- CORS abilitato per sviluppo frontend
- Rate limiting per prevenire abusi
- Documentazione OpenAPI (da implementare)
Installazione e Configurazione
Requisiti di Sistema
- PHP 8.1 o superiore
- Composer 2.x
- Node.js 18+ e NPM
- MySQL 8.0+
- Estensioni PHP: mbstring, openssl, PDO, Tokenizer, XML, cURL, zip
Setup Locale
# Clone del repository
git clone https://github.com/RickyMandich/SWUDB.git
cd SWUDB
# Installazione dipendenze PHP
composer install
# Installazione dipendenze JavaScript
npm install
# Configurazione ambiente
cp .env.example .env
php artisan key:generate
# Setup database
php artisan migrate
php artisan db:seed
# Build assets
npm run build
# Avvio server di sviluppo
php artisan serve
Configurazione Ambiente
File .env Essenziale
APP_NAME=UnlimitedDB
APP_DOMAIN=unlimiteddb.net
APP_ENV=production
APP_DEBUG=false
APP_URL=https://unlimiteddb.net
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=swudb
DB_USERNAME=username
DB_PASSWORD=password
MAIL_MAILER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
[email protected]
MAIL_PASSWORD=your-app-password
JOB_TOKEN=your-secure-token
RESEND_API_KEY=your-resend-key
Configurazione Produzione
Ottimizzazioni Laravel
php artisan config:cache
php artisan route:cache
php artisan view:cache
php artisan optimize
Setup Cron Job
* * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1
Deployment
Processo Automatizzato
Il progetto include diversi script bash per il deployment e la gestione del codice:
# Commit, push su GitHub e upload/cancellazione di tutti i file modificati/eliminati sul server
bash/all.sh
# Opzioni di versionamento per all.sh:
bash/all.sh -v # Incrementa APP_VERSION_PRIMARY e azzera APP_VERSION_TERTIARY
bash/all.sh -p # Incrementa APP_VERSION_SECONDARY e azzera APP_VERSION_TERTIARY
# Solo commit e push su GitHub (include APP_VERSION nel messaggio di commit)
bash/cmt.sh
# Upload di tutti i file della cartella corrente sul server
bash/ftp.sh
# Upload/cancellazione sul server solo dei file inclusi nell'ultimo commit
bash/onlyFtpOfLastCmt.sh
# Pull da GitHub e mostra il nome dell'ultimo commit
bash/pull.sh
Sistema di Versionamento Automatico
Gli script di deployment includono un sistema di versionamento automatico:
- APP_VERSION_PRIMARY: Versione principale (incrementata con
-v) - APP_VERSION_SECONDARY: Versione secondaria (incrementata con
-p) - APP_VERSION_TERTIARY: Versione terziaria (azzerata con
-vo-p) - Commit automatici: Il messaggio di commit include sempre la versione corrente
Configurazione FTP
Gli script utilizzano credenziali FTP configurate per Altervista:
- Host: ftp.swudb.altervista.org
- Porta: 21
- Modalità: PASV con creazione directory automatica
Checklist Pre-Deploy
- Test locali completati
- Database migrato
- Assets compilati (
npm run build) - Cache Laravel pulita
- Backup database effettuato
- Variabili ambiente configurate
- SSL certificato valido
Documentazione del Codice
Standard PHPDoc
Il progetto implementa una documentazione PHPDoc completa per tutti i metodi non nativi e non ovvi, seguendo questi principi:
Caratteristiche della Documentazione
- Formato PHPDoc standard con tag
@param,@return,@throws - Commenti bilingue: Inglese (tecnico) + Italiano (comprensibile)
- Livello di dettaglio proporzionale alla complessità del metodo
- Spiegazioni contestuali per ambienti non esclusivamente tecnici
Struttura Commenti
/**
* English technical description of the method
* Descrizione italiana "alla buona" del metodo
*
* Detailed explanation of functionality, use cases, and important notes.
* Complex methods include comprehensive documentation of algorithms and logic.
*
* @param Type $parameter Description of parameter
* @param array $options Optional configuration array
* @return ReturnType Description of return value
* @throws ExceptionType When this exception occurs
*/
public function methodName($parameter, $options = [])
Classi Documentate
Models (app/Models/)
- Card.php: Attributi personalizzati, cache management, eventi
- Deck.php: Gestione mazzi base (metodi nativi Laravel)
- Composition.php: Relazioni carte-mazzi (metodi nativi Laravel)
- User.php: Autenticazione utenti (metodi nativi Laravel)
Controllers (app/Http/Controllers/)
- CardsController.php: Algoritmi complessi di ordinamento e import
- DecksController.php: CRUD mazzi, export/import, statistiche
- HomeController.php: Dashboard utenti autenticati
- JobController.php: Operazioni asincrone e integrazioni esterne
Livewire Components (app/Livewire/)
- SearchFilter.php: Sistema filtri avanzato con cache
- DeckManager.php: Gestione mazzi con statistiche real-time
- DeckBuildManager.php: Confronto mazzo/collezione per la pagina "Build", con lista TXT generata selezionabile tra carte mancanti e carte possedute
- CollezioneManager.php: Supporto alla gestione della collezione personale
Jobs, Events, Listeners (app/Jobs/, app/Events/, app/Listeners/)
- ExecuteArtisanCommand.php: Job per comandi Artisan asincroni
- CardReceived.php: Evento ricezione nuove carte
- MessageCreated.php: Evento creazione messaggi sistema
- AddCard.php: Listener per aggiunta carte
- SendMessage.php: Listener per invio messaggi Telegram
Mail Classes (app/Mail/)
- NewCardsEmail.php: Email notifica nuove carte
- WelcomeEmail.php: Email benvenuto nuovi utenti
Providers (app/Providers/)
- AppServiceProvider.php: Configurazione servizi applicazione
Metodi Complessi Documentati
Algoritmi di Ordinamento
// CardsController::compareElements()
// Algoritmo complesso per ordinamento carte con 7 criteri gerarchici
// Documentazione dettagliata di ogni fase di confronto
// CardsController::mergeSort()
// Implementazione merge sort per Laravel Collections
// Spiegazione ricorsione e integrazione con compareElements
Gestione Import Asincrono
// CardsController::startImport()
// Processo completo import carte da API esterna
// Gestione batch, email notifiche, error handling
// CardsController::sendBatch() / dispatchBatch()
// Sistema batch processing per evitare timeout
// Documentazione del flusso asincrono
Statistiche Mazzi Real-time
// DeckManager::calcolaStatistiche()
// Calcolo statistiche complete mazzi
// Analisi tratti, costi, tipi, aspetti con esclusioni specifiche
Sistema Fire-and-Forget
// JobController::fireAndForgetGet() / fireAndForgetPost()
// Richieste HTTP asincrone con socket raw
// Documentazione implementazione low-level
Componenti Livewire
DeckBuildManager
Percorso: app/Livewire/DeckBuildManager.php (vista: resources/views/livewire/deck-build-manager.blade.php, pagina /mazzo/{user}/{mazzo}/build)
Confronta un mazzo con la collezione dell'utente loggato e offre:
- KPI (totale carte, in collezione, mancanti, % completamento) e tabella mazzo vs collezione con +/- sulla collezione, filtrabile con
$filtro(tutte,mancanti,possedute) e ricerca testuale - una lista testuale generata (textarea, copia negli appunti, export TXT) che l'utente sceglie con il toggle
$tipoLista:mancanti(default): copie del mazzo non coperte dalla collezionepossedute: copie del mazzo coperte dalla collezione, cioèmin(copie mazzo, copie collezione)(solo carte con quantità > 0)
Formato riga, uguale per entrambe le liste: {qty}x {espansione} {numero} {nome} ({rarità}), ordinata con CardsController::mergeSort.
Il toggle $tipoLista è indipendente dal filtro $filtro della tabella. L'export TXT è servito da DecksController::exportBuildTxt() (route mazzo.build.export), che riceve il tipo di lista con il parametro query ?tipo=mancanti|possedute (default mancanti, qualunque altro valore è trattato come mancanti); il file scaricato si chiama {mazzo}_carte_mancanti.txt oppure {mazzo}_carte_possedute.txt.
SearchFilter
Percorso: app/Livewire/SearchFilter.php
Componente principale per la ricerca e filtro carte con:
- Filtri multipli in tempo reale
- Validazione input
- Gestione stato filtri
- Integrazione con popup e pagine
DeckManager
Percorso: app/Livewire/DeckManager.php
Gestione completa mazzi con:
- Aggiunta/rimozione carte
- Calcolo statistiche in tempo reale
- Validazione regole gioco
- Integrazione grafici JavaScript
Nota architetturale importante: questo componente NON tiene mai il catalogo completo
delle carte come proprietà pubblica. Livewire re-invia ogni proprietà pubblica ad ogni
interazione, quindi tenere l'intero catalogo qui (come avveniva in una versione precedente)
faceva sì che ogni singolo click (anche solo un +/-) re-inviasse l'intero catalogo al
server, superando il limite di dimensione richiesta del webserver (413 Request Entity Too
Large). Il componente riceve invece i dati completi della singola carta aggiunta tramite
l'evento browser cardAdded (dispatchato da Livewire.dispatchTo('deck-manager', 'cardAdded', {card, copies}) nella pagina resources/views/livewire/deck-manager.blade.php),
e tiene solo lo stato del mazzo in lavorazione ($mazzo, $aggiunte, $rimosse), la cui
dimensione è sempre limitata a quella di un mazzo, mai al catalogo intero.
La sezione "Aggiungi carte" della pagina del mazzo usa il componente SearchFilter (in
modalità popup) per la ricerca, e una griglia di carte generata via JavaScript puro (non
un componente Livewire) per mostrare i risultati e gestire l'aggiunta — stesso pattern già
usato in carte/index.blade.php e collezione/index.blade.php. In questo modo nessun
componente Livewire della pagina tiene mai il catalogo carte come stato.
Sicurezza
Autenticazione e Autorizzazione
- Laravel Sanctum per API authentication
- Middleware personalizzato per controllo admin
- CSRF protection su tutte le form
- Rate limiting su API endpoints
Sistema di Verifica Email
Il sistema implementa un meccanismo di verifica email personalizzato per garantire la validità degli account utente:
Funzionalità Principali
- Token di verifica: Ogni utente riceve un token univoco di 60 caratteri
- Email automatica: Invio automatico dell'email di verifica alla registrazione
- Middleware di protezione: Accesso limitato per utenti non verificati
- Gestione admin: Gli amministratori possono gestire lo stato di verifica
Flusso di Verifica
- Registrazione: L'utente si registra e riceve un'email di verifica
- Verifica: Click sul link nell'email per attivare l'account
- Accesso: Solo utenti verificati possono accedere alle funzionalità protette
- Reinvio: Possibilità di richiedere un nuovo link di verifica
Gestione Amministrativa
Gli amministratori possono:
- Visualizzare lo stato di verifica di tutti gli utenti
- Marcare manualmente utenti come verificati/non verificati
- Reinviare email di verifica per utenti specifici
- Utilizzare il comando
php artisan users:verify-existingper verificare utenti esistenti
Implementazione Tecnica
// Verifica se un utente ha l'email verificata
$user->isEmailVerified()
// Marca un utente come verificato
$user->markEmailAsVerified()
// Genera un nuovo token di verifica
$user->generateEmailVerificationToken()
Validazione Input
- Form Request per validazione complessa
- Sanitizzazione input utente
- Escape output per prevenire XSS
- SQL injection protection via Eloquent ORM
Best Practices Implementate
- Password hashing con bcrypt
- Session security configurata
- Headers di sicurezza HTTP
- Validazione file upload
- Logging errori e accessi
Implementazioni Tecniche Avanzate
Componente SearchFilter
Il componente SearchFilter rappresenta una delle implementazioni più avanzate del progetto:
Architettura
- Livewire 3: Utilizzo delle funzionalità più moderne per reattività
- Caching intelligente: Cache delle opzioni filtro per 1 ora
- Debounce ottimizzato: 300ms per input testuali, immediato per select
- Event-driven: Comunicazione tramite eventi Livewire
Caratteristiche Tecniche
// Gestione dinamica valori massimi
public function loadFilterOptions() {
$this->maxCostoDb = Cache::remember('cards_max_costo', 3600,
fn() => Card::max('costo') ?? 999);
}
// Filtri con gestione null values
if ($this->vitaMin !== null || ($this->vitaMax !== null && $this->vitaMax < $this->maxVitaDb)) {
$query->where(function($q) use ($minVita, $maxVita) {
$q->whereNull('vita')->orWhereBetween('vita', [$minVita, $maxVita]);
});
}
Integrazione URL Parameters
- GET parameter support: URL con
?nome=pre-popola automaticamente il filtro - Livewire mount: Gestione parametri iniziali nel metodo mount
- Reattività mantenuta: Il filtro rimane reattivo anche con valori pre-popolati
Sistema di Import/Export Mazzi
Formati Supportati
- TXT: Formato standard Star Wars Unlimited compatibile con tutti i programmi
- JSON: Formato strutturato per API e backup
- URL Import: Parsing automatico da link esterni e altri siti SWUDB
Validazione Import
- Controllo formato: Validazione struttura file prima del processing
- Verifica carte: Controllo esistenza carte nel database
- Gestione errori: Report dettagliato di carte non trovate o errori formato
Sistema API Ufficiale
Integrazione Diretta
- Endpoint ufficiali: Connessione diretta all'API di Star Wars Unlimited
- Paginazione automatica: Gestione automatica delle pagine API
- Rate limiting: Rispetto dei limiti di richiesta dell'API ufficiale
- Retry logic: Gestione automatica di errori temporanei
Performance
Ottimizzazioni Database
- Indici ottimizzati su colonne di ricerca frequente
- Query eager loading per ridurre N+1 queries
- Database connection pooling
- Query caching per dati statici
Frontend Performance
- Asset minification con Vite
- Lazy loading immagini carte
- Debounce su input di ricerca
- Component caching Livewire
Monitoring
- Laravel Telescope per debug (dev)
- Error logging con stack traces
- Performance metrics custom
- Database query monitoring
Limiti di dimensione delle richieste (nginx / Livewire)
Il file docker/nginx/default.conf imposta client_max_body_size 20m;. Questo limite
esiste principalmente a protezione dei payload delle richieste Livewire (/livewire/update),
che serializzano tutte le proprietà pubbliche dei componenti coinvolti ad ogni interazione.
Per questo motivo nessun componente Livewire del progetto dovrebbe tenere il catalogo
completo delle carte (o altre collezioni potenzialmente grandi) come proprietà pubblica: se
in futuro se ne presenta la necessità, preferire di interrogare il database al bisogno, o
passare solo i dati della singola carta interessata tramite eventi browser (vedi la nota
architetturale su DeckManager più sopra).
Contribuire al Progetto
Workflow di Sviluppo
- Fork del repository
- Branch feature per nuove funzionalità
- Commit con messaggi descrittivi
- Pull Request con descrizione dettagliata
- Code review e testing
- Merge dopo approvazione
Standard di Codice
- PSR-12 per PHP
- ESLint per JavaScript
- Blade formatting consistente
- PHPDoc completo per tutti i metodi non nativi
- Documentazione bilingue (EN/IT) per accessibilità
- Test coverage per nuove feature
Pattern di Documentazione
Metodi Semplici
/**
* Simple method description
* Descrizione semplice del metodo
*
* @param Type $param Parameter description
* @return Type Return description
*/
Metodi Complessi
/**
* Complex method with detailed algorithm explanation
* Metodo complesso con spiegazione dettagliata dell'algoritmo
*
* This method handles multiple complex operations:
* 1. Data validation and preprocessing
* 2. Algorithm execution with specific rules
* 3. Result formatting and error handling
*
* @param array $data Input data with specific format requirements
* @param bool $verbose Enable detailed output for debugging
* @return Collection Processed results with metadata
* @throws InvalidArgumentException When data format is invalid
*/
Componenti Livewire
/**
* Livewire component for specific functionality
* Componente Livewire per funzionalità specifica
*
* This component provides comprehensive functionality including:
* - Real-time data processing
* - Event-driven communication
* - State management and validation
*/
class ComponentName extends Component
Testing
# Test PHP
php artisan test
# Test JavaScript
npm run test
# Test E2E
php artisan dusk
Supporto e Community
Contatti
- Email: [email protected]
- Sviluppatore: Riccardo Mandich ([email protected])
- Repository: https://github.com/RickyMandich/SWUDB
Segnalazione Bug
Utilizzare il sistema di Issues GitHub con:
- Descrizione dettagliata del problema
- Steps per riprodurre
- Screenshot se applicabile
- Informazioni browser/dispositivo
Richieste Feature
Le nuove funzionalità possono essere richieste tramite:
- GitHub Issues con label "enhancement"
- Email con proposta dettagliata
- Pull Request per implementazioni dirette
Disclaimer: UnlimitedDB.net è un sito fan-made non ufficiale. Star Wars: Unlimited è un marchio di Fantasy Flight Games e Lucasfilm Ltd. Tutti i diritti sui contenuti originali appartengono ai rispettivi proprietari.