aboutsummaryrefslogtreecommitdiff
path: root/src/Controller/MaintenanceController.php
diff options
context:
space:
mode:
Diffstat (limited to 'src/Controller/MaintenanceController.php')
-rw-r--r--src/Controller/MaintenanceController.php152
1 files changed, 152 insertions, 0 deletions
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 @@
1<?php
2// src/Controller/MaintenanceController.php
3
4declare(strict_types=1);
5
6namespace App\Controller;
7
8use Symfony\Component\HttpFoundation\Request;
9use Symfony\Component\HttpFoundation\JsonResponse;
10use Symfony\Component\HttpFoundation\BinaryFileResponse;
11use Symfony\Component\HttpFoundation\ResponseHeaderBag;
12use Symfony\Component\HttpFoundation\RedirectResponse;
13use Doctrine\ORM\EntityManager;
14use App\Entity\log;
15use App\Service\Backup;
16use App\Service\URL;
17use App\Service\Config;
18
19class MaintenanceController
20{
21 static public function getLogs(EntityManager $entityManager): JsonResponse
22 {
23 $data = $entityManager->getRepository(Log::class)->findAll();
24 if(empty($data)){
25 return new JsonResponse(['success' => false]);
26 }
27 else{
28 $view = '<h4>Table ' . TABLE_PREFIX . 'log de la base de données</h4>
29 <table>
30 <thead>
31 <tr>
32 <th>date et heure (Greenwich)</th>
33 <th>connexion réussie</th>
34 </tr>
35 </thead>
36 <tbody>';
37 foreach($data as $entry){
38 $view .= '<tr>
39 <td>' . $entry->getFormatedDate() . '</td>
40 <td>' . ($entry->getSuccess() ? 'oui' : 'non') . '</td>
41 </tr>';
42 }
43 $view .= '</tbody></table>';
44 return new JsonResponse(['success' => true, 'view' => $view]);
45 }
46 }
47 static public function eraseLogs(EntityManager $entityManager): JsonResponse
48 {
49 try{
50 $table = $entityManager->getClassMetadata(Log::class)->getTableName();
51 $entityManager->getConnection()->executeStatement("TRUNCATE TABLE {$table}"); // SQL donné à DBAL
52 return new JsonResponse(['success' => true]);
53 }
54 catch(\Exception $e){
55 return new JsonResponse(['success' => false, 'error' => $e->getMessage()]);
56 }
57 }
58
59 static public function getLastDump(EntityManager $entityManager): BinaryFileResponse|RedirectResponse
60 {
61 try{
62 $backup_list = Backup::getBackupList();
63 $nb = count($backup_list);
64
65 if($nb <= 0){ // se produit à la première connexion en mode admin pour une raison algorithimque
66 Backup::mySQLdump($entityManager, 'auto');
67 $backup_list = Backup::getBackupList();
68 $nb = count($backup_list);
69 if($nb <= 0){ // improbable, les dossiers devraient déjà avoir été créés
70 throw new \RuntimeException("Le serveur a rencontré une erreur: aucun backup n'est disponible et ce n'est pas normal.");
71 }
72 }
73
74 $file_path = Backup::$backup_dir . '/' . $backup_list[$nb - 1];
75 $response = new BinaryFileResponse($file_path);
76 $response->setContentDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT); // ne pas essayer de l'afficher dans le navigateur
77 }
78 catch(\RuntimeException $e){
79 $_SESSION['flash_message'] = $e->getMessage();
80 $response = new RedirectResponse((string) new URL(['page' => 'maintenance']));
81 }
82 return $response;
83 }
84 static public function getAllMedia(): BinaryFileResponse|RedirectResponse
85 {
86 try{
87 $file_path = '../var/' . Backup::createZip('all_media.zip', ['user_data/assets', 'user_data/images', 'user_data/media']);
88 $response = new BinaryFileResponse($file_path);
89 $response->setContentDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT); // ne pas essayer de l'afficher dans le navigateur
90 }
91 catch(\RuntimeException $e){
92 $_SESSION['flash_message'] = $e->getMessage();
93 $response = new RedirectResponse((string) new URL(['page' => 'maintenance']));
94 }
95 return $response;
96 }
97
98 // parce qu'il faut un contrôleur
99 static public function handleBackupSelection(EntityManager $entityManager, Request $request): RedirectResponse
100 {
101 $selected_file = $request->request->get('selected_sql');
102 $url = new URL;
103 if($request->query->has('from')){
104 $url->addParams(['page' => $request->query->get('from')]);
105 }
106
107 try{
108 if(pathinfo($selected_file)['extension'] !== 'sql'){ // pas censé se produire en fait
109 throw new \Exception("charger un fichier au format SQL");
110 }
111 Backup::restoreDatabase($entityManager, $selected_file, ['user']);
112
113 $_SESSION['flash_message'] = "La base de données a été restaurée avec succès !!";
114 }
115 catch(\Exception $e){
116 $_SESSION['flash_message'] = "Une erreur s'est produite: " . $e->getMessage();
117 }
118
119 return new RedirectResponse((string)$url);
120 }
121
122 static public function downloadSQL(EntityManager $entityManager, Request $request): RedirectResponse
123 {
124 $uploaded_file = $request->files->get('uploaded_sql');
125 $date = new \DateTime;
126 $server_place = Config::$database . '_' . $date->format('Y-m-d') . '_uploaded.sql';
127 $url = new URL;
128 if($request->query->has('from')){
129 $url->addParams(['page' => $request->query->get('from')]);
130 }
131
132 try{
133 if(pathinfo($uploaded_file->getClientOriginalName())['extension'] !== 'sql'){
134 throw new \Exception("Charger un fichier au format SQL");
135 }
136 //echo $uploaded_file->getSize(); // à garder de côté au cas où
137
138 // enregistrer le fichier
139 $uploaded_file->move(Backup::$backup_dir, $server_place);
140
141 // s'en servir
142 Backup::restoreDatabase($entityManager, $server_place, ['user']);
143
144 $_SESSION['flash_message'] = "La base de données a été restaurée avec succès !!";
145 }
146 catch(\Exception $e){
147 $_SESSION['flash_message'] = "Une erreur s'est produite: " . $e->getMessage();
148 }
149
150 return new RedirectResponse((string)$url);
151 }
152} \ No newline at end of file