6.3 KiB
6.3 KiB
🧠 MEMORY.md — Stato Progetto
Goal
- Fix login after fresh install (user created via installer can't authenticate)
- Cross-DB compatibility (MySQL ↔ SQLite) for all migrations
Constraints & Preferences
- Laravel 13, PHP 8.4, AdminLTE 3, MySQL/MariaDB/SQLite
- Comandi Artisan da terminale, nessun wizard web
- Script PHP CLI per installazione interattiva
- Zero placeholder, zero TODO, codice funzionante
Progress
Done
- Fix – RedirectResponse type error: aggiunto
use Illuminate\Http\RedirectResponse;inEmailSettingsController.php - Fix – UrlGenerationException in sender routes: sostituito
route('impostazioni.sender.update', '') + idcon'__ID__'.replace('__ID__', id)inadmin/email-settings/index.blade.php(stessa correzione perimpostazioni.sender.test) - Fix – Messaggi email visibili dopo eliminazione configurazione:
destroy()ora cancella sempre allegati su disco, cartelle email (cascata messaggi/allegati) e poi le impostazioni. Risolto bug che faceva uscire subito seEmailSetting::first()era null - Fix – Tab guida Installazione/Backup/Docker non funzionanti: rimosso
</div>di chiusuratab-contentprematuro (linea 290) inhelp/index.blade.php— i tre tab-pane erano fuori dal container - Guida aggiornata – rimosso wizard web installer: sostituiti tutti i riferimenti alla cartella
installer/con comandi Artisan inhelp/index.blade.phpehelp/pdf.blade.php. Passi 3-6 semplificati in un unicophp install.php - Script install.sh rimosso, sostituito da
install.php(PHP CLI interattivo): modalità Apache/Docker/Restore, preflight,.env+APP_KEY,CREATE DATABASE IF NOT EXISTS, composer,package:discover,migrate --seed, admin via tinker, asset npm, permessi. Docker build + admin nel container - Fix – Migration
app_settingsmancante: creata2026_05_15_000001_create_app_settings_table.phpcon tutte le colonne. Aggiornate 4 migration alter esistenti con guardieSchema::hasTable()+Schema::hasColumn(). AggiuntoSchema::hasTable()inAppSetting::getSetting()per evitare eccezioni su DB fresco - Fix – Database non creato durante install:
install.phpora esegueCREATE DATABASE IF NOT EXISTS - Fix – Remember checkbox mancante
name: aggiuntoname="remember"al checkbox "Ricordami" inresources/views/auth/login.blade.php - Fix – Admin via tinker senza
is_admin/permissions: tutti e 3 i tinker script ininstall.phpora impostanois_admin = true,status = 'active',permissionscompleto (tutti i moduli a livello FULL) - Fix –
2>/dev/nullrimosso da tinker/artisan commands:install.phpnon sopprime più stderr sutinker --execute,package:discover,storage:link,chown,cp. Eventuali errori ora sono visibili all'utente - Fix – Controllo permessi sessione: aggiunto check esplicito
is_writable(storage/framework/sessions/)ininstall.phpcon warning su potenziale errore 419 CSRF - Fix – Migrations non cross-DB: convertiti
enum()astring(50)in tutte le migration delle tabelledocumenti(create + alter) per compatibilità MySQL/SQLite. Rimossa raw SQLALTER TABLE MODIFY COLUMN. AggiuntodropIndex()prima didropColumn('ruolo_id')inchange_ruolo_to_multi.phpper compatibilità SQLite - Fix – ExampleTest: aggiornato per matchare comportamento reale (root
/fa redirect 302 a login) - Nuovo test – Login:
tests/Feature/Auth/LoginTest.phpcon 5 test: seeded admin login, custom admin login, wrong password, suspended user, login page loads
In Progress
- (nessuno)
Blocked
- (nessuno)
Key Decisions
- Script installazione in PHP CLI invece di bash: usa direttamente API Laravel/PDO, gestione errori con try/catch, readline per input, nessun problema di sintassi shell
- Migrazione
app_settings: unica migrationSchema::create()con tutte le colonne + guardiehasColumn()nelle alter esistenti invece di modificare i timestamp - Cleanup email: eseguito sempre (anche se
EmailSettinggià cancellato) per gestire stato orfano enum()rimosso a livello DB in favore distring()+ validazione app-level (consistente con AGENTS.md)dropIndex()esplicito prima didropColumn()per compatibilità SQLite
Next Steps
- (nessuno)
Critical Context
DatabaseSeedercrea adminadmin@glastree.local / passwordconis_admin=true,status='active'Usermodel ha'password' => 'hashed'cast: nessun doppio hashing conbcrypt()+save()Auth::attempt()usaHash::check()che ignora il casthashedSESSION_DRIVER=filein produzione richiede permessi di scrittura sustorage/framework/sessions/APP_ENV=production+APP_DEBUG=falsenascondono errori 419 (CSRF) e 500- Test PHPUnit usano SQLite
:memory:— tutte le migration devono essere cross-DB compatibili - SQLite non supporta:
ALTER TABLE MODIFY COLUMN,ENUMtype,dropColumnsu colonne con indici
Relevant Files
install.php: installer interattivo — Apache/Docker/Restore, tinker scripts admin (3 modalità)resources/views/auth/login.blade.php: fixname="remember"sul checkbox "Ricordami"app/Http/Controllers/Auth/AuthController.php:login()controlla$user->status === 'suspended'app/Models/User.php: cast'password' => 'hashed', metodi isSuperAdmin/isActivedatabase/seeders/DatabaseSeeder.php: crea admin di defaulttests/Feature/Auth/LoginTest.php: NEW — 5 test di loginapp/Http/Controllers/Admin/EmailSettingsController.php: fix destroy cleanupresources/views/admin/email-settings/index.blade.php: fix route sender update/testdatabase/migrations/2026_05_12_000002_change_ruolo_to_multi.php: fix dropIndex + dropColumndatabase/migrations/*documenti*: fix enum → string (5 migration)database/migrations/2026_05_15_000001_create_app_settings_table.php: NEWdatabase/migrations/2026_05_16_000001_add_logo_path_to_app_settings.php: guardie hasColumndatabase/migrations/2026_05_16_000002_add_app_config_to_app_settings.php: guardie hasColumndatabase/migrations/2026_05_27_000003_add_documenti_storage_to_app_settings.php: guardie hasColumndatabase/migrations/2026_06_01_100155_add_backup_settings_to_app_settings.php: guardie hasColumnresources/views/help/index.blade.php: fix tab-pane chiusura, rimosso wizard web installerresources/views/help/pdf.blade.php: rimosso wizard web installer