4.3 KiB
4.3 KiB
🧠 MEMORY.md — Stato Progetto
Goal
- 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 4, MySQL/MariaDB (install.sql solo MySQL)
- Zero placeholder, zero TODO, codice funzionante
- Compatibilità cross-DB MySQL ↔ SQLite (fallback migration per SQLite)
Progress
Done
- 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=0per 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.sqlviamysqlCLI, poi crea admin via PDO - Fresh Install Docker: copia
install.sqlnel container, importa via mysql CLI, crea admin via script PHP temporaneo convar_export()(safe) - Restore: crea admin via PDO se non esiste
- Fallback SQLite: mantiene
php artisan migrate --seed+ tinker ma convar_export()per escaping - Step 5 rinominato da "MIGRATION E SEED" a "SCHEMA DATABASE E DATI BASE"
- Step 6 usa PDO invece di tinker (MySQL)
- Aggiunta funzione
- Unified MySQL setup: singolo tentativo PDO con
dbnamenel DSN — se fallisce (1044/1045/1049), passa automaticamente in root-mode: chiede password root, crea database + utente + GRANT ALL sulocalhoste% - Sostituito loop 30-retry con connessione singola PDO (timeout 5s)
- Fix parse error:
\$adminName→$adminNameinvar_export()nel ramo SQLite - Fix composer: rimosso
sudo -u www-datada composer (causa git dubious ownership + permission denied), aggiuntoCOMPOSER_ROOT_VERSION=dev-main;vendoraggiunto al chown finale
In Progress
- (nessuno)
Blocked
- (nessuno)
Key Decisions
- PDO > tinker:
createAdminUser()usa PDO prepared statement conpassword_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ò lanciaremysql < install.sqla mano)var_export()per tinker fallback: nei rari casi SQLite, si usavar_export()che produce stringhe PHP valide con escaping automatico2>/dev/nullrimosso dal MySQL main path (non serve più, non c'è tinker)- Docker MySQL credenziali: hardcoded
mysql:glastree:secret:glastree(dal docker-compose.mysql.yml) - Composer senza sudo:
COMPOSER_ROOT_VERSION=dev-mainper evitare git dubious ownership; composer eseguito come utente corrente (root), non più come www-data — dopo,chown -R www-data vendorper permessi lettura webserver - Unified MySQL setup: PDO connect con
dbnamenel DSN → se fallisce 1044/1045/1049, root-mode: crea DB + utente + GRANT ALL sulocalhoste%+ FLUSH
Next Steps
- (nessuno)
Critical Context
install.sqlè solo per MySQL. SQLite usaphp artisan migrate --seed+DatabaseSeederDatabaseSeedercrea ancora adminadmin@glastree.local / passwordma per MySQL viene cancellato dal PDO scriptcreateAdminUser()settais_admin=1,status='active',permissionscompleto,role_preset_id=1, e Spatiemodel_has_rolescon role_id=1password_hash($pass, PASSWORD_BCRYPT)produce hash$2y$...compatibile conHash::check()di Laravel- Composer ora eseguito come utente corrente (root) con
COMPOSER_ROOT_VERSION=dev-mainper evitare git dubious ownership e permission denied suvendor/ vendor/aggiunto alchownfinale in entrambi i modi (Apache e Restore) per garantire leggibilità da www-dataensureMysqlUserAndDb()sanitizza input (rimuove' " \0 \) prima di passarli a SQL exec
Relevant Files
database/install.sql: NEW — schema MySQL completo + seed data (1059 righe)install.php: MODIFIED —createAdminUser()+ensureMysqlUserAndDb()+ composer fix + auto-create MySQL user