Files
glastree/MEMORY.md
T

74 lines
6.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 🧠 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;` in `EmailSettingsController.php`
- **Fix UrlGenerationException in sender routes**: sostituito `route('impostazioni.sender.update', '') + id` con `'__ID__'.replace('__ID__', id)` in `admin/email-settings/index.blade.php` (stessa correzione per `impostazioni.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 se `EmailSetting::first()` era null
- **Fix Tab guida Installazione/Backup/Docker non funzionanti**: rimosso `</div>` di chiusura `tab-content` prematuro (linea 290) in `help/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 in `help/index.blade.php` e `help/pdf.blade.php`. Passi 3-6 semplificati in un unico `php 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_settings` mancante**: creata `2026_05_15_000001_create_app_settings_table.php` con tutte le colonne. Aggiornate 4 migration alter esistenti con guardie `Schema::hasTable()` + `Schema::hasColumn()`. Aggiunto `Schema::hasTable()` in `AppSetting::getSetting()` per evitare eccezioni su DB fresco
- **Fix Database non creato durante install**: `install.php` ora esegue `CREATE DATABASE IF NOT EXISTS`
- **Fix Remember checkbox mancante `name`**: aggiunto `name="remember"` al checkbox "Ricordami" in `resources/views/auth/login.blade.php`
- **Fix Admin via tinker senza `is_admin`/`permissions`**: tutti e 3 i tinker script in `install.php` ora impostano `is_admin = true`, `status = 'active'`, `permissions` completo (tutti i moduli a livello FULL)
- **Fix `2>/dev/null` rimosso da tinker/artisan commands**: `install.php` non sopprime più stderr su `tinker --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/)` in `install.php` con warning su potenziale errore 419 CSRF
- **Fix Migrations non cross-DB**: convertiti `enum()` a `string(50)` in tutte le migration delle tabelle `documenti` (create + alter) per compatibilità MySQL/SQLite. Rimossa raw SQL `ALTER TABLE MODIFY COLUMN`. Aggiunto `dropIndex()` prima di `dropColumn('ruolo_id')` in `change_ruolo_to_multi.php` per compatibilità SQLite
- **Fix ExampleTest**: aggiornato per matchare comportamento reale (root `/` fa redirect 302 a login)
- **Nuovo test Login**: `tests/Feature/Auth/LoginTest.php` con 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 migration `Schema::create()` con tutte le colonne + guardie `hasColumn()` nelle alter esistenti invece di modificare i timestamp
- Cleanup email: eseguito sempre (anche se `EmailSetting` già cancellato) per gestire stato orfano
- `enum()` rimosso a livello DB in favore di `string()` + validazione app-level (consistente con AGENTS.md)
- `dropIndex()` esplicito prima di `dropColumn()` per compatibilità SQLite
## Next Steps
- *(nessuno)*
## Critical Context
- `DatabaseSeeder` crea admin `admin@glastree.local / password` con `is_admin=true`, `status='active'`
- `User` model ha `'password' => 'hashed'` cast: nessun doppio hashing con `bcrypt()` + `save()`
- `Auth::attempt()` usa `Hash::check()` che ignora il cast `hashed`
- `SESSION_DRIVER=file` in produzione richiede permessi di scrittura su `storage/framework/sessions/`
- `APP_ENV=production` + `APP_DEBUG=false` nascondono 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`, `ENUM` type, `dropColumn` su colonne con indici
## Relevant Files
- `install.php`: installer interattivo — Apache/Docker/Restore, tinker scripts admin (3 modalità)
- `resources/views/auth/login.blade.php`: fix `name="remember"` sul checkbox "Ricordami"
- `app/Http/Controllers/Auth/AuthController.php`: `login()` controlla `$user->status === 'suspended'`
- `app/Models/User.php`: cast `'password' => 'hashed'`, metodi isSuperAdmin/isActive
- `database/seeders/DatabaseSeeder.php`: crea admin di default
- `tests/Feature/Auth/LoginTest.php`: NEW — 5 test di login
- `app/Http/Controllers/Admin/EmailSettingsController.php`: fix destroy cleanup
- `resources/views/admin/email-settings/index.blade.php`: fix route sender update/test
- `database/migrations/2026_05_12_000002_change_ruolo_to_multi.php`: fix dropIndex + dropColumn
- `database/migrations/*documenti*`: fix enum → string (5 migration)
- `database/migrations/2026_05_15_000001_create_app_settings_table.php`: NEW
- `database/migrations/2026_05_16_000001_add_logo_path_to_app_settings.php`: guardie hasColumn
- `database/migrations/2026_05_16_000002_add_app_config_to_app_settings.php`: guardie hasColumn
- `database/migrations/2026_05_27_000003_add_documenti_storage_to_app_settings.php`: guardie hasColumn
- `database/migrations/2026_06_01_100155_add_backup_settings_to_app_settings.php`: guardie hasColumn
- `resources/views/help/index.blade.php`: fix tab-pane chiusura, rimosso wizard web installer
- `resources/views/help/pdf.blade.php`: rimosso wizard web installer