From f27cca08ff786ceff1870147f6d6bad14d71117f Mon Sep 17 00:00:00 2001 From: polo Date: Fri, 23 Oct 2026 00:47:32 +0200 Subject: =?UTF-8?q?dossiers=20avec=20majuscule,=20namespace=20pour=20toute?= =?UTF-8?q?s=20les=20classes,=20autoload=20psr-4,=20UserDataService::creat?= =?UTF-8?q?eZip=20d=C3=A9plac=C3=A9=20dans=20Backup?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Controller/MaintenanceController.php | 152 +++++++++++++++++++++++++++++++ 1 file changed, 152 insertions(+) create mode 100644 src/Controller/MaintenanceController.php (limited to 'src/Controller/MaintenanceController.php') diff --git a/src/Controller/MaintenanceController.php b/src/Controller/MaintenanceController.php new file mode 100644 index 0000000..d3be2a1 --- /dev/null +++ b/src/Controller/MaintenanceController.php @@ -0,0 +1,152 @@ +getRepository(Log::class)->findAll(); + if(empty($data)){ + return new JsonResponse(['success' => false]); + } + else{ + $view = '

Table ' . TABLE_PREFIX . 'log de la base de données

+ + + + + + + + '; + foreach($data as $entry){ + $view .= ' + + + '; + } + $view .= '
date et heure (Greenwich)connexion réussie
' . $entry->getFormatedDate() . '' . ($entry->getSuccess() ? 'oui' : 'non') . '
'; + return new JsonResponse(['success' => true, 'view' => $view]); + } + } + static public function eraseLogs(EntityManager $entityManager): JsonResponse + { + try{ + $table = $entityManager->getClassMetadata(Log::class)->getTableName(); + $entityManager->getConnection()->executeStatement("TRUNCATE TABLE {$table}"); // SQL donné à DBAL + return new JsonResponse(['success' => true]); + } + catch(\Exception $e){ + return new JsonResponse(['success' => false, 'error' => $e->getMessage()]); + } + } + + static public function getLastDump(EntityManager $entityManager): BinaryFileResponse|RedirectResponse + { + try{ + $backup_list = Backup::getBackupList(); + $nb = count($backup_list); + + if($nb <= 0){ // se produit à la première connexion en mode admin pour une raison algorithimque + Backup::mySQLdump($entityManager, 'auto'); + $backup_list = Backup::getBackupList(); + $nb = count($backup_list); + if($nb <= 0){ // improbable, les dossiers devraient déjà avoir été créés + throw new \RuntimeException("Le serveur a rencontré une erreur: aucun backup n'est disponible et ce n'est pas normal."); + } + } + + $file_path = Backup::$backup_dir . '/' . $backup_list[$nb - 1]; + $response = new BinaryFileResponse($file_path); + $response->setContentDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT); // ne pas essayer de l'afficher dans le navigateur + } + catch(\RuntimeException $e){ + $_SESSION['flash_message'] = $e->getMessage(); + $response = new RedirectResponse((string) new URL(['page' => 'maintenance'])); + } + return $response; + } + static public function getAllMedia(): BinaryFileResponse|RedirectResponse + { + try{ + $file_path = '../var/' . Backup::createZip('all_media.zip', ['user_data/assets', 'user_data/images', 'user_data/media']); + $response = new BinaryFileResponse($file_path); + $response->setContentDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT); // ne pas essayer de l'afficher dans le navigateur + } + catch(\RuntimeException $e){ + $_SESSION['flash_message'] = $e->getMessage(); + $response = new RedirectResponse((string) new URL(['page' => 'maintenance'])); + } + return $response; + } + + // parce qu'il faut un contrôleur + static public function handleBackupSelection(EntityManager $entityManager, Request $request): RedirectResponse + { + $selected_file = $request->request->get('selected_sql'); + $url = new URL; + if($request->query->has('from')){ + $url->addParams(['page' => $request->query->get('from')]); + } + + try{ + if(pathinfo($selected_file)['extension'] !== 'sql'){ // pas censé se produire en fait + throw new \Exception("charger un fichier au format SQL"); + } + Backup::restoreDatabase($entityManager, $selected_file, ['user']); + + $_SESSION['flash_message'] = "La base de données a été restaurée avec succès !!"; + } + catch(\Exception $e){ + $_SESSION['flash_message'] = "Une erreur s'est produite: " . $e->getMessage(); + } + + return new RedirectResponse((string)$url); + } + + static public function downloadSQL(EntityManager $entityManager, Request $request): RedirectResponse + { + $uploaded_file = $request->files->get('uploaded_sql'); + $date = new \DateTime; + $server_place = Config::$database . '_' . $date->format('Y-m-d') . '_uploaded.sql'; + $url = new URL; + if($request->query->has('from')){ + $url->addParams(['page' => $request->query->get('from')]); + } + + try{ + if(pathinfo($uploaded_file->getClientOriginalName())['extension'] !== 'sql'){ + throw new \Exception("Charger un fichier au format SQL"); + } + //echo $uploaded_file->getSize(); // à garder de côté au cas où + + // enregistrer le fichier + $uploaded_file->move(Backup::$backup_dir, $server_place); + + // s'en servir + Backup::restoreDatabase($entityManager, $server_place, ['user']); + + $_SESSION['flash_message'] = "La base de données a été restaurée avec succès !!"; + } + catch(\Exception $e){ + $_SESSION['flash_message'] = "Une erreur s'est produite: " . $e->getMessage(); + } + + return new RedirectResponse((string)$url); + } +} \ No newline at end of file -- cgit v1.2.3