1.0.6 fix modifica install.php
This commit is contained in:
@@ -1,32 +1,29 @@
|
||||
# 🧠 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
|
||||
- Risolvere login non funzionante dopo fresh install (causa: tinker senza escaping + `2>/dev/null`)
|
||||
- Sostituire tinker per creazione admin con PDO prepared statement + SQL file per schema
|
||||
|
||||
## 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
|
||||
- Laravel 13, PHP 8.4, AdminLTE 4, MySQL/MariaDB (install.sql solo MySQL)
|
||||
- Zero placeholder, zero TODO, codice funzionante
|
||||
- Compatibilità cross-DB MySQL ↔ SQLite (fallback migration per SQLite)
|
||||
|
||||
## 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
|
||||
- **Creazione `database/install.sql`** — schema MySQL completo + seed data (~1059 righe):
|
||||
- Tutte le 45 tabelle nello stato finale (consolidate da 58 migration)
|
||||
- Seed: 119 diocesi, 54 comuni, 8 tipologie documenti, 8 tipologie eventi, 8 ruoli, 23 permessi Spatie, 2 ruoli Spatie, 3 role preset, 5 email folders, 1 riga app_settings
|
||||
- **NON contiene l'admin** (creato via PDO da install.php)
|
||||
- `SET FOREIGN_KEY_CHECKS=0` per ordine tabelle, riattivato alla fine
|
||||
- **Riscritto `install.php`** — eliminata dipendenza da tinker per la creazione admin:
|
||||
- Aggiunta funzione `createAdminUser()`: PDO prepared statement + `password_hash()` + Spatie role assignment
|
||||
- Fresh Install Apache: importa `install.sql` via `mysql` CLI, poi crea admin via PDO
|
||||
- Fresh Install Docker: copia `install.sql` nel container, importa via mysql CLI, crea admin via script PHP temporaneo con `var_export()` (safe)
|
||||
- Restore: crea admin via PDO se non esiste
|
||||
- Fallback SQLite: mantiene `php artisan migrate --seed` + tinker ma con `var_export()` per escaping
|
||||
- Step 5 rinominato da "MIGRATION E SEED" a "SCHEMA DATABASE E DATI BASE"
|
||||
- Step 6 usa PDO invece di tinker (MySQL)
|
||||
|
||||
### In Progress
|
||||
- *(nessuno)*
|
||||
@@ -35,39 +32,21 @@
|
||||
- *(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
|
||||
- **PDO > tinker**: `createAdminUser()` usa PDO prepared statement con `password_hash()`, niente interpolazione PHP in stringhe shell → zero escaping issues
|
||||
- **`install.sql` > migration sequenziali**: unico file SQL per fresh install, più veloce e debuggabile (si può lanciare `mysql < install.sql` a mano)
|
||||
- **`var_export()` per tinker fallback**: nei rari casi SQLite, si usa `var_export()` che produce stringhe PHP valide con escaping automatico
|
||||
- **`2>/dev/null` rimosso** dal MySQL main path (non serve più, non c'è tinker)
|
||||
- **Docker MySQL credenziali**: hardcoded `mysql:glastree:secret:glastree` (dal docker-compose.mysql.yml)
|
||||
|
||||
## 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
|
||||
- `install.sql` è solo per MySQL. SQLite usa `php artisan migrate --seed` + `DatabaseSeeder`
|
||||
- `DatabaseSeeder` crea ancora admin `admin@glastree.local / password` ma per MySQL viene cancellato dal PDO script
|
||||
- `createAdminUser()` setta `is_admin=1`, `status='active'`, `permissions` completo, `role_preset_id=1`, e Spatie `model_has_roles` con role_id=1
|
||||
- `password_hash($pass, PASSWORD_BCRYPT)` produce hash `$2y$...` compatibile con `Hash::check()` di Laravel
|
||||
|
||||
## 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
|
||||
- `database/install.sql`: NEW — schema MySQL completo + seed data (1059 righe)
|
||||
- `install.php`: MODIFIED — `createAdminUser()` function + SQL import + PDO admin + Docker/restore adattati
|
||||
|
||||
Reference in New Issue
Block a user