modifica - da terminare gestioen doc remoti - resto ok
This commit is contained in:
@@ -5,6 +5,14 @@ Laravel 13 / PHP 8.4 project for parish management (Glastree). Full codebase exi
|
||||
|
||||
---
|
||||
|
||||
## Issues Open
|
||||
1. **Drive-Segreteria-ADIM (#3)**: Root ha 0 elementi. Verificare root_folder_id nelle impostazioni repository.
|
||||
2. **Nextcloud_MB (#4)**: Connessione "Unauthorized" dopo fix authType — credenziali da verificare.
|
||||
|
||||
---
|
||||
|
||||
|
||||
|
||||
## System Status
|
||||
|
||||
### ✅ FUNZIONANTE (Stable)
|
||||
@@ -895,3 +903,82 @@ php artisan route:list --name=email
|
||||
- `resources/views/documenti/index.blade.php`: 10 onclick con `json_encode` invece di `addslashes`
|
||||
- `resources/views/documenti/_folder_tree.blade.php`: 3 onclick con `json_encode` invece di `addslashes`
|
||||
- **Stato**: ✅ 18/19 test pass. `php -l` OK. `php artisan view:cache` OK. JS braces 182/182.
|
||||
|
||||
### 28 Maggio 2026 - Fix Google Drive Repository: credenziali mancanti + wipe su update
|
||||
|
||||
- **Problema**: Drive-Segreteria (repo #1) mostrava 0 file nonostante l'account Google Drive avesse 2 cartelle e 1 file. Il test connessione diceva "Connessione riuscita. 0 elementi trovati nella root." — falso positivo.
|
||||
- **Cause** (2 bug):
|
||||
1. **Credenziali OAuth mancanti**: `client_secret` e `refresh_token` erano entrambi `null` nel DB. La Google API falliva silenziosamente dentro `fetchDirectory()` (catch vuoto → 0 risultati).
|
||||
2. **Update wipe credenziali**: `StorageRepositoryController@update()` chiamava `encryptSensitiveConfig()` che criptava solo campi NON vuoti. Quando il form edit veniva salvato con `client_secret=''` e `refresh_token=''` (placeholder), i vecchi valori criptati venivano sovrascritti con stringhe vuote.
|
||||
- **Fix**:
|
||||
1. `StorageRepositoryService::encryptSensitiveConfig()`: aggiunto parametro `$existingConfig`. Se un campo sensibile è vuoto nel nuovo config ma presente in `$existingConfig`, lo preserva.
|
||||
2. `StorageRepositoryController@update()`: passa `$storageRepository->config` come existing config a `encryptSensitiveConfig()`.
|
||||
3. `StorageRepositoryService::buildGoogleDrive()`: validazione esplicita — lancia `InvalidArgumentException` se mancano `client_id`, `client_secret` o `refresh_token`.
|
||||
4. `testConnection()` e `listContents()`: check preventivo credenziali Google Drive complete prima di chiamare `buildFilesystem()`, con messaggio chiaro.
|
||||
- **Files modificati**:
|
||||
- `app/Services/StorageRepositoryService.php`: encryptSensitiveConfig() con existingConfig, buildGoogleDrive() validation, testConnection() credential check, listContents() credential check
|
||||
- `app/Http/Controllers/StorageRepositoryController.php`: update() passa existing config
|
||||
- **Per risolvere**: l'utente deve reinserire `client_secret` e `refresh_token` nella modale di modifica del repository (Impostazioni → Repository Remoti → Drive-Segreteria → Modifica). Dopo il fix, questi campi non verranno più persi al prossimo salvataggio.
|
||||
- **Stato**: ✅ 18/19 test pass (solo ExampleTest pre-esistente). `php -l` OK. `php artisan view:cache` OK.
|
||||
|
||||
### 28 Maggio 2026 - OAuth Google Drive integrato nell'app
|
||||
|
||||
- **Implementazione**: Flusso OAuth 2.0 completo senza passare dall'OAuth Playground
|
||||
- **Route nuove**:
|
||||
- `GET /auth/google-drive/redirect` → reindirizza a Google OAuth
|
||||
- `GET /auth/google-drive/callback` → riceve il token, lo salva nel repository
|
||||
- **Controller**: `StorageRepositoryController@oauthRedirect()` e `oauthCallback()`
|
||||
- **Flusso UX**:
|
||||
1. Utente seleziona Google Drive → compila Client ID, Client Secret, Nome
|
||||
2. Click "Autorizza con Google" → reindirizzato a Google
|
||||
3. Login con account Google e autorizzazione
|
||||
4. Callback salva automaticamente refresh_token + campi form nella sessione
|
||||
5. Redirect a `/impostazioni#repository` → modale si riapre con tutti i campi preservati
|
||||
- **Fix preservazione campi**: `oauthRedirect()` salva in sessione anche `nome`, `is_active`, `root_folder_id`. Il callback li restituisce nel flash `google_drive_new_token`. JS ripristina tutti i campi nel modal (non chiama più `resetRepoForm()` che svuotava tutto).
|
||||
- **Status visivo**: ✅ badge verde "Autorizzato" se refresh_token presente, ❌ "Non autorizzato" altrimenti
|
||||
- **Files modificati**:
|
||||
- `routes/web.php`: 2 nuove route OAuth
|
||||
- `app/Http/Controllers/StorageRepositoryController.php`: oauthRedirect(), oauthCallback()
|
||||
- `app/Http/Controllers/ImpostazioniController.php`: passa `$googleDriveNewToken` alla view
|
||||
- `resources/views/impostazioni/index.blade.php`: pulsante + status + JS auto-ripristino campi
|
||||
- **Config necessaria una tantum**: aggiungere `{APP_URL}/auth/google-drive/callback` come Authorized Redirect URI in Google Cloud Console
|
||||
- **Stato**: ✅ 18/19 test pass. `php -l` OK. `php artisan view:cache` OK. JS braces 176/176.
|
||||
|
||||
### 28 Maggio 2026 - Fix Google Drive: normalizePath() root path
|
||||
|
||||
- **Problema**: Google Drive non visualizzava file e cartelle (repository remoto mostrava 0 elementi).
|
||||
- **Causa**: `normalizePath('/')` in `StorageRepositoryService.php` restituiva `'/'` invece di `''`. L'adapter `as247/flysystem-google-drive` non accetta `'/'` come root path, causando fallimento silenzioso di `listContents()` → `[]`.
|
||||
- **Contraddizione**: MEMORY.md del 28 Maggio documentava `normalizePath()` come "converte `/` → `''`" ma l'implementazione effettiva a riga 122 faceva `return '/'`.
|
||||
- **Fix**: Cambiato `return '/'` in `return ''` in `normalizePath()`.
|
||||
- **Files modificati**:
|
||||
- `app/Services/StorageRepositoryService.php`: riga 122, `'/'` → `''`
|
||||
- **Stato**: ✅ 10/10 StorageRepository test pass. `php -l` OK.
|
||||
|
||||
### 28 Maggio 2026 - Fix browseRepo ReferenceError: getRepoIcon inesistente
|
||||
|
||||
- **Problema**: Cliccando "Drive-Segreteria" nella sidebar documenti non succedeva nulla (contenuto remoto non caricato).
|
||||
- **Causa**: `updateRemoteBreadcrumb()` chiamava `getRepoIcon(repoIconFromId(...))` ma `getRepoIcon()` non è mai stata definita. Il `ReferenceError` bloccava l'esecuzione di `browseRepo()` prima che `loadRemoteContents()` venisse chiamato — nessuna fetch AJAX, nessun contenuto caricato.
|
||||
- **Fix**: Rimossa chiamata a `getRepoIcon()`, `repoIconFromId()` già restituisce il `className` completo (es. `"fab fa-google-drive text-danger"`). Rimosso anche `fab` hardcoded dal template (duplicato).
|
||||
- **Files modificati**:
|
||||
- `resources/views/documenti/index.blade.php`: riga 1383, `getRepoIcon(...)` → diretto
|
||||
- **Stato**: ✅ JS braces 206/206 OK. `php -l` OK. `php artisan view:cache` OK.
|
||||
|
||||
### 28 Maggio 2026 - CAUSA RADICE: SweetAlert2 mancante in layout
|
||||
|
||||
- **Problema**: Tutte le icone azioni cartelle (Rinomina, Sposta, Elimina) non funzionavano — click senza effetto. Anche il pulsante "+ Nuova cartella" nel modal upload non funzionava.
|
||||
- **Causa**: SweetAlert2 (`Swal`) **non era incluso nel layout** `adminlte.blade.php`. Le funzioni `renameFolder()`, `moveFolder()`, `deleteFolder()` e il listener `massMoveNewFolderBtn` chiamano `Swal.fire()`, che lanciava `ReferenceError: Swal is not defined`.
|
||||
- **SweetAlert2 assente**: Non presente né via CDN, né via NPM (`package.json` non ha sweetalert2), né via Vite. L'unica dipendenza JS era jQuery + Bootstrap + AdminLTE via CDN.
|
||||
- **Perché i fix precedenti sembravano non funzionare**: Anche dopo le correzioni a `getRepoIcon()` e `normalizePath()`, la view cache conteneva ancora il vecchio codice JS. SweetAlert2 mancante bloccava indipendentemente le azioni cartelle.
|
||||
- **Fix**: Aggiunto CDN SweetAlert2 11 nel layout `adminlte.blade.php` subito dopo AdminLTE JS, prima di `@yield('scripts')`.
|
||||
- **Files modificati**:
|
||||
- `resources/views/layouts/adminlte.blade.php`: riga 259, aggiunto `<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>`
|
||||
- **Stato**: ✅ view cache pulita (`php artisan view:clear`), tutti i file lint OK. `php artisan view:cache` OK.
|
||||
|
||||
### 28 Maggio 2026 - Fix authType WebDAV (Nextcloud)
|
||||
- **Problema**: Test connessione Nextcloud dava "Unsupported operand types: string & int"
|
||||
- **Causa**: `buildWebDAV()` passava `'authType' => 'basic'` (stringa) a `Sabre\DAV\Client`, che esegue bitwise AND (`'basic' & AUTH_BASIC`) — incompatibile
|
||||
- **Soluzione**: Convertito stringa → int tramite `match`: `'basic' → WebDAVClient::AUTH_BASIC (1)`, `'digest' → AUTH_DIGEST (2)`, `'ntlm' → AUTH_NTLM (4)`
|
||||
- **Stato test Nextcloud**: AuthType non dà più errore. Ora fallisce con "Unauthorized" — le credenziali Nextcloud effettive non sono corrette.
|
||||
- **Drive-Segreteria-ADIM**: Credenziali OK, connessione OK, ma 0 elementi nella root. Verificare `root_folder_id`.
|
||||
|
||||
(Last updated: 28 Maggio 2026 - Fix authType WebDAV + verify Drive state)
|
||||
|
||||
Reference in New Issue
Block a user