gds = $this->boot_google_drive_any(); if (!$this->gds) { log_message('error', '[GoogleDrive_model] Aucune classe Google Drive trouvée.'); throw new Exception('Librairie Google Drive introuvable (GoogleDrive / GoogleDriveDocs / …)'); } } /** * Essaie d’inclure et d’instancier une des classes de ta stack. * - Fichiers testés: GoogleDrive.php, GoogleDriveDocs.php, DiagGoogle.php, GoogleServiceJWT.php * - Dossiers testés: application/libraries, application/models, application/ */ private function boot_google_drive_any() { $files = ['GoogleDrive.php','GoogleDriveDocs.php','DiagGoogle.php','GoogleServiceJWT.php']; $dirs = [APPPATH.'libraries/', APPPATH.'models/', APPPATH]; foreach ($dirs as $dir) { foreach ($files as $fn) { $path = $dir.$fn; if (is_file($path)) { require_once $path; } } } // Classes candidates (ajoute ici si ton nom diffère) $classes = ['GoogleDriveService','GoogleDrive','GoogleDriveDocs','DiagGoogle']; foreach ($classes as $cls) { if (class_exists($cls)) { try { // Si l’un de ces constructeurs a besoin de paramètres, adapte ici. return new $cls(); } catch (Throwable $e) { // essaie la suivante } } } return null; } /** * Liste les sous-dossiers d’un parent. * Retour: array [['id'=>..., 'name'=>...], ...] */ public function list_children(string $drive_id, string $parent_id): array { // Méthodes possibles dans ta lib (on tente dans cet ordre) $candidates = [ 'listFolders', 'list_children', 'children', 'listFoldersInParent' ]; $results = null; foreach ($candidates as $m) { if (method_exists($this->gds, $m)) { try { $results = $this->gds->$m($drive_id, $parent_id); } catch (ArgumentCountError $e) { // ordre inversé éventuel $results = $this->gds->$m($parent_id, $drive_id); } catch (Throwable $t) { $results = null; } if (is_array($results)) break; } } if (!is_array($results)) { throw new Exception('Aucune méthode compatible pour lister les sous-dossiers dans la librairie GoogleDrive*.'); } $out = []; foreach ($results as $f) { $id = $f['id'] ?? ($f['fileId'] ?? ($f['gid'] ?? null)); $name = $f['name'] ?? ($f['title'] ?? ($f['nom'] ?? null)); if ($id && $name) { $out[] = ['id'=>$id, 'name'=>$name]; } } usort($out, fn($a,$b)=>strcasecmp($a['name'],$b['name'])); return $out; } /** * Construit la chaîne base->...->final (ou [] si final est hors du sous-arbre). */ public function build_chain_from_base(string $drive_id, string $base_id, string $final_id): array { if ($base_id === $final_id) { $base = $this->get_file($drive_id, $base_id); return [['id'=>$base_id, 'name'=>$base['name'] ?? '(racine)']]; } $nodes = []; $cur = $final_id; $guard = 0; while ($cur && $guard < 100) { $file = $this->get_file($drive_id, $cur); if (!$file) break; $nodes[] = ['id'=>$cur, 'name'=>$file['name'] ?? $cur]; if ($cur === $base_id) break; $parents = $this->get_parents($drive_id, $cur); $cur = $parents[0] ?? null; $guard++; } $foundBase = false; foreach ($nodes as $n) { if ($n['id'] === $base_id) { $foundBase = true; break; } } if (!$foundBase) return []; return array_reverse($nodes); } private function get_file(string $drive_id, string $file_id): ?array { $candidates = ['getFile','get_file','fileGet','get']; foreach ($candidates as $m) { if (method_exists($this->gds, $m)) { try { $res = $this->gds->$m($drive_id, $file_id); } catch (ArgumentCountError $e) { $res = $this->gds->$m($file_id, $drive_id); } catch (Throwable $t) { $res = null; } if (is_array($res)) { $name = $res['name'] ?? ($res['title'] ?? ($res['nom'] ?? null)); return ['id'=>$file_id, 'name'=>$name]; } } } return null; } private function get_parents(string $drive_id, string $file_id): array { $candidates = ['getParents','parents','fileParents']; foreach ($candidates as $m) { if (method_exists($this->gds, $m)) { try { $res = $this->gds->$m($drive_id, $file_id); } catch (ArgumentCountError $e) { $res = $this->gds->$m($file_id, $drive_id); } catch (Throwable $t) { $res = null; } if (is_array($res)) { $ids = []; foreach ($res as $p) { $ids[] = is_array($p) ? ($p['id'] ?? $p['fileId'] ?? $p['gid'] ?? null) : $p; } return array_values(array_filter($ids)); } } } return []; } }