Applicazione Laravel + Vue/Inertia per la gestione workshop con ruoli, iscrizioni, waiting list FIFO, reminder email e statistiche admin in tempo reale (polling).
- Ruoli utente:
admineemployee - CRUD workshop (admin)
- Iscrizione workshop (employee)
- Waiting list con promozione automatica FIFO
- Vincolo No Ubiquity: un utente non puo iscriversi a due workshop nello stesso slot orario
- Reminder email ai partecipanti dei workshop del giorno successivo (
academy:remind) - Dashboard admin con:
- workshop piu popolare
- contatore registrazioni live via polling
- PHP 8.3+
- Laravel 13
- Vue 3 + Inertia.js + Vite
- MySQL (runtime)
- PHPUnit (test unit/feature)
- PHP 8.3+
- Composer
- Node.js 18+ e npm
- MySQL 8+ (o compatibile)
- Docker (opzionale, consigliato per Mailpit)
- Clona il repository e entra nella cartella progetto.
- Installa dipendenze backend e frontend.
- Configura l'ambiente.
- Esegui migrazioni e seed.
- Avvia applicazione.
Comandi:
composer install
npm install
cp .env.example .env
php artisan key:generateConfigura DB in .env (esempio MySQL):
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=workshop_app
DB_USERNAME=root
DB_PASSWORD=Poi esegui:
php artisan migrate
php artisan db:seedAvvio sviluppo (server + queue + log + vite):
composer run devIn alternativa, avvio separato minimo:
php artisan serve
npm run devSeeder utenti (password per tutti: password):
admin@workshop.testemployee@workshop.testemployee2@workshop.testemployee3@workshop.testemployee4@workshop.testemployee5@workshop.test
Esegui tutti i test:
php artisan testEsegui gruppi specifici:
php artisan test --filter=WorkshopFlowTest
php artisan test --filter=AdminDashboardStats
php artisan test --filter=AcademyRemindCommandTestNota: in ambiente test viene usato SQLite in-memory (configurato in phpunit.xml).
Seeder principali:
DatabaseSeeder-> esegueUserRoleSeeder+WorkshopSeederReminderDemoSeeder-> crea workshop di domani + iscritti per test reminder
Comandi utili:
# Seeder base (utenti + workshop)
php artisan db:seed
# Solo utenti ruolo
php artisan db:seed --class=UserRoleSeeder
# Solo workshop
php artisan db:seed --class=WorkshopSeeder
# Dataset demo reminder (workshop domani + registrazioni)
php artisan db:seed --class=ReminderDemoSeederIl comando academy:remind invia un'email di promemoria a tutti i partecipanti iscritti ai workshop in programma il giorno successivo.
php artisan academy:remind
# output: Reminder inviati: 3In locale non è necessario un server SMTP reale. Le opzioni consigliate sono due.
Mailpit è uno strumento che intercetta tutte le email in uscita e le mostra in una inbox web. Non recapita mai nulla a destinatari reali: è completamente sicuro.
1. Avvia il container:
docker run -d --name workshop-mailpit \
-p 1025:1025 \
-p 8025:8025 \
--restart unless-stopped \
axllent/mailpit| Porta | Funzione |
|---|---|
1025 |
Server SMTP (MAIL_PORT) |
8025 |
Inbox web → http://127.0.0.1:8025 |
2. Configura .env:
MAIL_MAILER=smtp
MAIL_HOST=127.0.0.1
MAIL_PORT=1025
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS="hello@workshop.test"
MAIL_FROM_NAME="${APP_NAME}"3. Applica la configurazione e invia i reminder:
php artisan config:clear
php artisan db:seed --class=UserRoleSeeder
php artisan db:seed --class=ReminderDemoSeeder
php artisan academy:remindApri http://127.0.0.1:8025 per vedere le email nella inbox Mailpit.
Fermare/riavviare il container:
docker stop workshop-mailpit # ferma
docker start workshop-mailpit # riavvia (i dati vengono persi al riavvio)
docker rm -f workshop-mailpit # rimuovi completamenteSe non hai Docker, puoi usare il driver log di Laravel: le email vengono scritte nel file di log invece di essere inviate.
MAIL_MAILER=logLe email appariranno in storage/logs/laravel.log:
php artisan academy:remind
tail -f storage/logs/laravel.log | grep -A 20 "Message-ID"Accedi come admin e vai su /dashboard.
Sezioni disponibili:
Future WorkshopsTotal Registrations (Live)aggiornato automaticamente (polling)Most Popular Workshop
npm run build
php artisan optimizeSe non vedi la UI aggiornata:
npm run build
php artisan optimize:clear
php artisan view:clearPoi fai hard refresh del browser (Ctrl+Shift+R).