query( 'SELECT sf.id, sf.title, sf.sender, sf.date_processing, a.username, GROUP_CONCAT(f.id, ":", f.file_name, ":", f.path ORDER BY f.id SEPARATOR "|") as files FROM source_file sf LEFT JOIN accounts a ON sf.account_id = a.id LEFT JOIN files f ON sf.id = f.source_file_id GROUP BY sf.id ORDER BY sf.date_processing DESC' )->fetchAll(); $toDelete = []; // source_file ids à supprimer foreach ($rows as $key => &$r) { $r['files_list'] = []; if ($r['files']) { $allGone = true; foreach (explode('|', $r['files']) as $f) { [$fid, $fname, $fpath] = array_pad(explode(':', $f, 3), 3, ''); if (file_exists($fpath)) { $allGone = false; $r['files_list'][] = ['id' => (int)$fid, 'name' => $fname, 'exists' => true]; } else { // Fichier supprimé du SMB — retire l'entrée files en BDD db()->prepare('DELETE FROM files WHERE id = ?')->execute([(int)$fid]); } } // Si tous les fichiers ont disparu, supprime la ligne source if ($allGone) { $toDelete[] = $r['id']; unset($rows[$key]); continue; } } else { // Pas de fichiers associés — supprime la ligne source aussi $toDelete[] = $r['id']; unset($rows[$key]); continue; } unset($r['files']); } // Supprime les source_file orphelins foreach ($toDelete as $id) { db()->prepare('DELETE FROM source_file WHERE id = ?')->execute([$id]); } echo json_encode(array_values($rows));