aboutsummaryrefslogtreecommitdiff
path: root/src/service
diff options
context:
space:
mode:
authorpolo <ordipolo@gmx.fr>2026-06-10 20:56:25 +0200
committerpolo <ordipolo@gmx.fr>2026-06-10 20:56:25 +0200
commitae217a6e4b0c29346381e2a410fd7810cb33ce3f (patch)
tree206f604c9297deabf78bb33f31a1e6b9303d2258 /src/service
parent99d2616a08c98e7067cdb12f0bcbd4ac0cffaeb0 (diff)
downloadcms-ae217a6e4b0c29346381e2a410fd7810cb33ce3f.tar.gz
cms-ae217a6e4b0c29346381e2a410fd7810cb33ce3f.tar.bz2
cms-ae217a6e4b0c29346381e2a410fd7810cb33ce3f.zip
Tous les contrôleurs retournent une Response!
Diffstat (limited to 'src/service')
-rw-r--r--src/service/Router.php515
-rw-r--r--src/service/User.php23
2 files changed, 247 insertions, 291 deletions
diff --git a/src/service/Router.php b/src/service/Router.php
index ee6d25d..110512e 100644
--- a/src/service/Router.php
+++ b/src/service/Router.php
@@ -3,442 +3,375 @@
3// 3//
4/* fonctionnement: 4/* fonctionnement:
5=> 1er test, méthode http GET? POST? 5=> 1er test, méthode http GET? POST?
6=> 2ème test, type de contenu (méthode POST uniquement): 6=> 2ème test, type de contenu:
7"application/x-www-form-urlencoded" = formulaire 7"application/x-www-form-urlencoded" = formulaire
8"application/json" = requête AJAX avec fetch() 8"application/json" = requête AJAX avec fetch()
9"multipart/form-data" = upload d'image par tinymce 9"multipart/form-data" = upload d'image par tinymce
10$_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest' requête AJAX xhs, non utilisée 10$_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest' requête AJAX xhs, non utilisée
11=> 3ème test, comme le 2ème test mais uniquement si IS_ADMIN est vrai 11=> 3ème test, comme le 2ème test mais uniquement si IS_ADMIN est vrai */
12*/ 12
13/* classes de réponses pour les contrôleurs
14Response($html, Response::HTTP_OK) page html
15JsonResponse(['success' => true, 'data' => $data]) ajax
16RedirectResponse('index.php?page=login') redirection
17BinaryFileResponse($filePath) téléchargement
18StreamedResponse(function () {echo "ligne 1\n";echo "ligne 2\n";}) gros fichier */
19
20// relire ça à l'occaz:
21// https://symfony.com/doc/current/introduction/from_flat_php_to_symfony.html
13 22
14declare(strict_types=1); 23declare(strict_types=1);
15 24
16use Symfony\Component\HttpFoundation\Request; 25use Symfony\Component\HttpFoundation\Request;
17use Doctrine\ORM\EntityManager; 26use Doctrine\ORM\EntityManager;
27use Symfony\Component\HttpFoundation\JsonResponse;
28use Symfony\Component\HttpFoundation\RedirectResponse;
29use Symfony\Component\HttpFoundation\Response;
18 30
19class Router{ 31class Router{
20 // boulot = faire que TOUS les contrôleurs retournent une Response (et faire retourner une réponse par dispatch) 32 private Request $request;
33 private EntityManager $entityManager;
34 private string $route = ''; // défaut page d'accueil
21 35
22 // exemple de méthode dispatch 36 public function __construct(Request $request, EntityManager $entityManager){
23 /*public static function dispatch(Request $request): Response 37 $this->request = $request;
24 { 38 $this->entityManager = $entityManager;
25 if ($request->getMethod() === 'GET') {
26 return PageController::home($request);
27 }
28 39
29 if ($request->getMethod() === 'POST') { 40 if(!User::existUsers($entityManager)){ // table "user" vide
30 return UserController::login($request); 41 $this->route = 'no_user';
31 } 42 }
43 }
32 44
33 return new RedirectResponse('/'); 45 public function dispatch(): Response
34 }*/ 46 {
35 47 if($this->request->getMethod() === 'GET'){
36 /* classes de réponses pour les contrôleurs
37 Response($html, Response::HTTP_OK) page html
38 JsonResponse(['success' => true, 'data' => $data]) ajax
39 RedirectResponse('index.php?page=login') redirection
40 BinaryFileResponse($filePath) téléchargement
41 StreamedResponse(function () {echo "ligne 1\n";echo "ligne 2\n";}) gros fichier
42 */
43
44 static public function dispatch(Request $request, EntityManager $entityManager){
45 if($request->getMethod() === 'GET'){
46 // table "user" vide 48 // table "user" vide
47 if(!UserController::existUsers($entityManager)){ 49 if($this->route === 'no_user'){
50 ob_start();
48 require AbstractBuilder::VIEWS_PATH . 'user_create.php'; 51 require AbstractBuilder::VIEWS_PATH . 'user_create.php';
49 die; 52 return new Response(ob_get_clean());
50 } 53 }
51 54
52 // bouton déconnexion (méthode GET parce que l'utilisateur ne modifie plus de données à partir de là) 55 // bouton déconnexion (méthode GET parce que l'utilisateur ne modifie plus de données à partir de là)
53 if($request->query->has('action') && $request->query->get('action') === 'deconnection'){ 56 if($this->request->query->get('action') === 'deconnection'){
54 UserController::disconnect($entityManager); 57 return UserController::disconnect(); // retourne un RedirectResponse
55 } 58 }
56 59
57 // articles suivants 60 // articles suivants
58 if($request->query->has('fetch') && $request->query->get('fetch') === 'next_articles'){ 61 if($this->request->query->get('fetch') === 'next_articles'){
59 ArticleController::fetch($entityManager, $request); 62 return ArticleController::fetch($this->entityManager, $this->request); // retourne un JsonResponse
60 } 63 }
61 64
62 // données du calendrier 65 // données du calendrier
63 // création du calendrier et changement de dates affichées (boutons flèches mais pas changement de vue) 66 // création du calendrier ou changement de dates affichées (boutons flèches mais pas changement de vue)
64 if($request->query->has('action') && $request->query->get('action') === 'get_events' 67 if($this->request->query->get('action') === 'get_events'
65 && $request->query->has('start') && $request->query->has('end') && empty($request->getPayload()->all())) // getPayload ne récupère pas que des POST 68 && $this->request->query->has('start') && $this->request->query->has('end') && empty($this->request->getPayload()->all())){ // getPayload ne récupère pas que des POST
66 { 69 return CalendarController::getData($this->entityManager);
67 CalendarController::getData($entityManager);
68 } 70 }
69 71
70 // pages interdites 72 // pages interdites
71 if(!IS_ADMIN && in_array(CURRENT_PAGE, ['menu_paths', 'new_page', 'user_edit', 'emails', 'maintenance'])){ 73 if(!IS_ADMIN && in_array(CURRENT_PAGE, ['menu_paths', 'new_page', 'user_edit', 'emails', 'maintenance'])){
72 header('Location: ' . new URL); 74 return new RedirectResponse((string)new URL);
73 die;
74 } 75 }
75 76
76 if(IS_ADMIN){ 77 if(IS_ADMIN){
77 if($request->query->has('action') && $request->query->get('action') === 'get_mysqldump'){ 78 if($this->request->query->get('action') === 'get_mysqldump'){
78 MaintenanceController::getLastDump($entityManager); 79 return MaintenanceController::getLastDump($this->entityManager);
79 die;
80 } 80 }
81 if($request->query->has('action') && $request->query->get('action') === 'get_all_media'){ 81 if($this->request->query->get('action') === 'get_all_media'){
82 MaintenanceController::getAllMedia(); 82 return MaintenanceController::getAllMedia();
83 die;
84 } 83 }
85 } 84 }
86 85
87 // construction d'une page 86 // construction d'une page
88 $response = (new ViewDirector)->buildView($entityManager, $request); // utilise Model 87 return (new ViewDirector)->buildView($this->entityManager, $this->request); // utilise Model
89 // parenthèses nécéssaires autour de l'instanciation pour PHP < 8.4 88 // parenthèses nécéssaires autour de l'instanciation pour PHP < 8.4
90 } 89 }
91 90
92 91
93 elseif($request->getMethod() === 'POST'){ 92 elseif($this->request->getMethod() === 'POST'){
94 /* -- contrôleurs appellables par tout le monde -- */ 93 /* -- contrôleurs appelables par tout le monde -- */
95 94
96 // table "user" vide 95 // table "user" vide
97 if(!UserController::existUsers($entityManager)){ 96 if($this->route === 'no_user'){
98 UserController::createAdminUser($entityManager); 97 return UserController::createAdminUser($this->entityManager);
99 } 98 }
100 99
101 // requêtes JSON avec fetch() 100 // requête JSON avec fetch()
102 if($request->headers->get('Content-Type') === 'application/json') 101 if($this->request->headers->get('Content-Type') === 'application/json')
103 { 102 {
104 $json = json_decode($request->getContent(), true); // = json_decode(file_get_contents('php://input'), true); 103 $json = json_decode($this->request->getContent(), true); // = json_decode(file_get_contents('php://input'), true);
105 104
106 if(isset($_GET['action'])) 105 // formulaire de contact
107 { 106 if($this->request->query->get('action') === 'send_email'){
108 // formulaire de contact 107 return ContactFormController::sendVisitorEmail($this->entityManager, $json);
109 if($_GET['action'] === 'send_email'){
110 ContactFormController::sendVisitorEmail($entityManager, $json);
111 }
112 } 108 }
109 /*else{
110 return new JsonResponse(['success' => false, 'error' => 'tu fais quoi là mec?']);
111 }*/
113 } 112 }
114 113
115 // envoi formulaire HTML 114 // envoi formulaire HTML
116 elseif($request->headers->get('Content-Type') === 'application/x-www-form-urlencoded'){ 115 elseif($this->request->headers->get('Content-Type') === 'application/x-www-form-urlencoded'){
117 // tentative de connexion 116 // tentative de connexion
118 if($request->query->has('action') && $request->query->get('action') === 'connection'){ 117 if($this->request->query->get('action') === 'connection'){
119 //$response = 118 return UserController::connect($this->entityManager);
120 UserController::connect($entityManager);
121 } 119 }
120 /*else{
121 return new RedirectResponse((string)new URL(['error' => 'tu fais quoi là mec?']));
122 }*/
122 } 123 }
123 124
124 if(IS_ADMIN) 125 if(IS_ADMIN){
125 {
126 /* -- requêtes AJAX -- */ 126 /* -- requêtes AJAX -- */
127 127
128 // requêtes JSON avec fetch() 128 // requêtes JSON avec fetch()
129 if($request->headers->get('Content-Type') === 'application/json') 129 if($this->request->headers->get('Content-Type') === 'application/json'){
130 { 130 $json = json_decode($this->request->getContent(), true); // = json_decode(file_get_contents('php://input'), true);
131 $json = json_decode($request->getContent(), true); // = json_decode(file_get_contents('php://input'), true);
132 131
133 if($request->query->has('action')) 132 if($this->request->query->has('action')){
134 {
135 /* -- manipulation des articles -- */ 133 /* -- manipulation des articles -- */
136 if($_GET['action'] === 'editor_submit' && isset($json['id']) && isset($json['content'])){ 134 if($this->request->query->get('action') === 'editor_submit' && isset($json['id']) && isset($json['content'])){
137 ArticleController::editorSubmit($entityManager, $json); 135 return ArticleController::editorSubmit($this->entityManager, $json);
138 }
139 elseif($_GET['action'] === 'delete_article' && isset($json['id'])){
140 $response = ArticleController::deleteArticle($entityManager, $json); // version AJAX
141 }
142 elseif($_GET['action'] === 'switch_positions' && isset($json['id1']) && isset($json['id2'])){
143 ArticleController::switchPositions($entityManager, $json);
144 }
145 elseif($_GET['action'] === 'date_submit' && isset($json['id']) && isset($json['date'])){
146 ArticleController::dateSubmit($entityManager, $json);
147 }
148
149 /* -- bloc Formulaire -- */
150 elseif($_GET['action'] === 'keep_emails'){
151 ContactFormController::keepEmails($entityManager, $json);
152 }
153 elseif($_GET['action'] === 'set_retention_period'){
154 ContactFormController::setEmailsRetentionPeriod($entityManager, $json);
155 }
156 elseif($_GET['action'] === 'set_email_param'){
157 ContactFormController::setEmailParam($entityManager, $json);
158 }
159 elseif($_GET['action'] === 'test_email'){
160 ContactFormController::sendTestEmail($entityManager, $json);
161 }
162
163 /* -- page emails -- */
164 elseif($_GET['action'] === 'delete_email'){
165 ContactFormController::deleteEmail($entityManager, $json);
166 }
167 elseif($_GET['action'] === 'toggle_sensitive_email'){
168 ContactFormController::toggleSensitiveEmail($entityManager, $json);
169 }
170
171 /* -- upload d'image dans tinymce par copier-coller -- */
172 // collage de HTML contenant une ou plusieurs balises <img>
173 elseif($request->query->get('action') === 'upload_image_url'){
174 ImageUploadController::uploadImageHtml();
175 }
176 // collage d'une image (code base64 dans le presse-papier) non encapsulée dans du HTML
177 elseif($request->query->get('action') === 'upload_image_base64'){
178 ImageUploadController::uploadImageBase64();
179 } 136 }
180 137 elseif($this->request->query->get('action') === 'delete_article' && isset($json['id'])){
181 138 return ArticleController::deleteArticle($this->entityManager, $this->request); // version AJAX
182 /* -- requêtes spécifiques au calendrier -- */
183 elseif($request->query->get('action') === 'new_event'){
184 CalendarController::newEvent($json, $entityManager);
185 } 139 }
186 elseif($request->query->get('action') === 'update_event'){ 140 elseif($this->request->query->get('action') === 'switch_positions' && isset($json['id1']) && isset($json['id2'])){
187 CalendarController::updateEvent($json, $entityManager); 141 return ArticleController::switchPositions($this->entityManager, $json);
188 } 142 }
189 elseif($request->query->get('action') === 'remove_event'){ 143 elseif($this->request->query->get('action') === 'date_submit' && isset($json['id']) && isset($json['date'])){
190 CalendarController::removeEvent($json, $entityManager); 144 return ArticleController::dateSubmit($this->entityManager, $json);
191 } 145 }
192 146
193 /* -- mode maintenance -- */ 147 switch($this->request->query->get('action')){
194 elseif($request->query->get('action') === 'get_logs'){ 148 /* -- bloc Formulaire -- */
195 MaintenanceController::getLogs($entityManager); 149 case 'keep_emails':
196 die; 150 return ContactFormController::keepEmails($this->entityManager, $json);
197 } 151 case 'set_retention_period':
198 elseif($request->query->get('action') === 'erase_logs'){ 152 return ContactFormController::setEmailsRetentionPeriod($this->entityManager, $json);
199 MaintenanceController::eraseLogs($entityManager); 153 case 'set_email_param':
200 die; 154 return ContactFormController::setEmailParam($this->entityManager, $json);
201 } 155 case 'test_email':
202 else{ 156 return ContactFormController::sendTestEmail($this->entityManager, $json);
203 echo json_encode(['success' => false]); 157
204 die; 158 /* -- page emails -- */
159 case 'delete_email':
160 return ContactFormController::deleteEmail($this->entityManager, $json);
161 case 'toggle_sensitive_email':
162 return ContactFormController::toggleSensitiveEmail($this->entityManager, $json);
163
164 /* -- upload d'image dans tinymce par copier-coller -- */
165 // collage de HTML contenant une ou plusieurs balises <img>
166 case 'upload_image_url':
167 return ImageUploadController::uploadImageHtml();
168 // collage d'une image (code base64 dans le presse-papier) non encapsulée dans du HTML
169 case 'upload_image_base64':
170 return ImageUploadController::uploadImageBase64();
171
172 /* -- requêtes spécifiques au calendrier -- */
173 case 'new_event':
174 return CalendarController::newEvent($json, $this->entityManager);
175 case 'update_event':
176 return CalendarController::updateEvent($json, $this->entityManager);
177 case 'remove_event':
178 return CalendarController::removeEvent($json, $this->entityManager);
179
180 /* -- mode maintenance -- */
181 case 'get_logs':
182 return MaintenanceController::getLogs($this->entityManager);
183 case 'erase_logs':
184 return MaintenanceController::eraseLogs($this->entityManager);
185
186 default:
187 return new JsonResponse(['success' => false]);
205 } 188 }
206 } 189 }
207 190
208 /* -- site entier (header, footer, favicon) -- */ 191 /* -- site entier (header, footer, favicon) -- */
209 elseif($request->query->has('head_foot_text')){ 192 elseif($this->request->query->has('head_foot_text')){
210 HeadFootController::setTextData($entityManager, $request->query->get('head_foot_text'), $json); 193 return HeadFootController::setTextData($this->entityManager, $this->request->query->get('head_foot_text'), $json);
211 } 194 }
212 elseif($request->query->has('head_foot_social_check')){ 195 elseif($this->request->query->has('head_foot_social_check')){
213 HeadFootController::displaySocialNetwork($entityManager, $request->query->get('head_foot_social_check'), $json); 196 return HeadFootController::displaySocialNetwork($this->entityManager, $this->request->query->get('head_foot_social_check'), $json);
214 } 197 }
215 198
216 /* -- page Menu et chemins -- */ 199 /* -- page Menu et chemins -- */
217 elseif(isset($_GET['menu_edit'])) 200 elseif($this->request->query->has('menu_edit')){
218 {
219 // ne suit pas la règle, faire ça dans un contrôleur? 201 // ne suit pas la règle, faire ça dans un contrôleur?
220 Model::$menu = new Menu($entityManager); // récupération des données 202 Model::$menu = new Menu($this->entityManager); // récupération des données
221 203
222 // flèche gauche <=: position = position du parent + 1, parent = grand-parent, recalculer les positions 204 // flèche gauche <=: position = position du parent + 1, parent = grand-parent, recalculer les positions
223 if($_GET['menu_edit'] === 'move_one_level_up' && isset($json['id'])){ 205 if($this->request->query->get('menu_edit') === 'move_one_level_up' && isset($json['id'])){
224 MenuAndPathsController::MoveOneLevelUp($entityManager, $json); 206 return MenuAndPathsController::MoveOneLevelUp($this->entityManager, $json);
207 }
208 // flèche droite =>: position (léments de a fraterie + 1, l'élément précédent devient le parent
209 elseif($this->request->query->get('menu_edit') === 'move_one_level_down' && isset($json['id'])){
210 return MenuAndPathsController::MoveOneLevelDown($this->entityManager, $json);
225 } 211 }
226 // flèche droite =>: position = nombre d'éléments de la fraterie + 1, l'élément précédent devient le parent 212 elseif($this->request->query->get('menu_edit') === 'switch_positions' && isset($json['id1']) && isset($json['id2'])){
227 elseif($_GET['menu_edit'] === 'move_one_level_down' && isset($json['id'])){ 213 return MenuAndPathsController::switchPositions($this->entityManager, $json);
228 MenuAndPathsController::MoveOneLevelDown($entityManager, $json);
229 } 214 }
230 elseif($_GET['menu_edit'] === 'switch_positions' && isset($json['id1']) && isset($json['id2'])){ 215 elseif($this->request->query->get('menu_edit') === 'display_in_menu' && isset($json['id']) && isset($json['checked'])){
231 MenuAndPathsController::switchPositions($entityManager, $json); 216 return MenuAndPathsController::displayInMenu($this->entityManager, $json);
232 } 217 }
233 elseif($_GET['menu_edit'] === 'display_in_menu' && isset($json['id']) && isset($json['checked'])){ 218 elseif($this->request->query->get('menu_edit') === 'url_edit' && isset($json['id']) && isset($json['field']) && isset($json['input_data'])){
234 MenuAndPathsController::displayInMenu($entityManager, $json); 219 return MenuAndPathsController::editUrl($this->entityManager, $json);
235 } 220 }
236 elseif($_GET['menu_edit'] === 'url_edit' && isset($json['id']) && isset($json['field']) && isset($json['input_data'])){ 221 else{
237 MenuAndPathsController::editUrl($entityManager, $json); 222 return new JsonResponse(['success' => false, 'error' => 'bad parameters'], JsonResponse::HTTP_BAD_REQUEST); // code 400
238 } 223 }
239 } 224 }
240 225
241 /* -- mode Modification d'une page -- */ 226 /* -- mode Modification d'une page -- */
242 // partie "page" 227 // partie "page"
243 elseif(isset($_GET['page_edit'])) 228 elseif($this->request->query->has('page_edit')){
244 { 229 switch($this->request->query->get('page_edit')){
245 // titre de la page 230 case 'page_title':
246 if($_GET['page_edit'] === 'page_title'){ 231 return PageManagementController::setPageTitle($this->entityManager, $json);
247 PageManagementController::setPageTitle($entityManager, $json); 232 case 'page_description':
248 } 233 return PageManagementController::setPageDescription($this->entityManager, $json);
249 // description dans les métadonnées 234 default:
250 elseif($_GET['page_edit'] === 'page_description'){ 235 return new JsonResponse(['success' => false, 'error' => 'bad parameters'], JsonResponse::HTTP_BAD_REQUEST); // code 400
251 PageManagementController::setPageDescription($entityManager, $json);
252 } 236 }
253 } 237 }
254 238
255 // partie "blocs" 239 // partie "blocs"
256 elseif($request->query->has('bloc_edit')) 240 elseif($this->request->query->has('bloc_edit')){
257 { 241 switch($this->request->query->get('bloc_edit')){
258 if($request->query->get('bloc_edit') === 'rename_page_bloc'){ 242 case 'rename_page_bloc':
259 PageManagementController::renameBloc($entityManager, $json); 243 return PageManagementController::renameBloc($this->entityManager, $json);
260 } 244 case 'switch_blocs_positions':
261 elseif($request->query->get('bloc_edit') === 'switch_blocs_positions'){ 245 return PageManagementController::SwitchBlocsPositions($this->entityManager, $json, $this->request->query->get('page'));
262 PageManagementController::SwitchBlocsPositions($entityManager, $json); 246 case 'change_articles_order':
263 } 247 return PageManagementController::changeArticlesOrder($this->entityManager, $json);
264 elseif($request->query->get('bloc_edit') === 'change_articles_order'){ 248 case 'change_presentation':
265 PageManagementController::changeArticlesOrder($entityManager, $json); 249 return PageManagementController::changePresentation($this->entityManager, $json);
266 } 250 case 'change_cols_min_width':
267 elseif($request->query->get('bloc_edit') === 'change_presentation'){ 251 return PageManagementController::changeColsMinWidth($this->entityManager, $json);
268 PageManagementController::changePresentation($entityManager, $json); 252 case 'change_pagination_limit':
269 } 253 return PageManagementController::changePaginationLimit($this->entityManager, $json);
270 elseif($request->query->get('bloc_edit') === 'change_cols_min_width'){ 254 default:
271 PageManagementController::changeColsMinWidth($entityManager, $json); 255 return new JsonResponse(['success' => false, 'error' => 'bad parameters'], JsonResponse::HTTP_BAD_REQUEST); // code 400
272 }
273 elseif($request->query->get('bloc_edit') === 'change_pagination_limit'){
274 PageManagementController::changePaginationLimit($entityManager, $json);
275 } 256 }
276 } 257 }
258
259 else{
260 return new JsonResponse(['success' => false, 'error' => 'bad parameters'], JsonResponse::HTTP_BAD_REQUEST); // code 400
261 }
277 } 262 }
278 263
279 /* -- upload avec FormData OU formulaire HTML AVEC fichier -- */ 264 /* -- upload avec FormData OU formulaire HTML avec fichier -- */
280 elseif(str_starts_with($request->headers->get('Content-Type'), 'multipart/form-data')) // = $_SERVER['CONTENT_TYPE'] 265 elseif(str_starts_with($this->request->headers->get('Content-Type'), 'multipart/form-data')){ // = $_SERVER['CONTENT_TYPE']
281 {
282 // dans tinymce avec le plugin (bouton "insérer une image" de l'éditeur ou glisser-déposer) 266 // dans tinymce avec le plugin (bouton "insérer une image" de l'éditeur ou glisser-déposer)
283 if($request->query->has('action') && $request->query->get('action') === 'upload_image_tinymce'){ 267 if($this->request->query->get('action') === 'upload_image_tinymce'){
284 ImageUploadController::imageUploadTinyMce(); 268 return ImageUploadController::imageUploadTinyMce();
285 } 269 }
286 // dans tinymce, des quatre méthodes: bouton "link", drag & drop, html, base64 270 // dans tinymce, des quatre méthodes: bouton "link", drag & drop, html, base64
287 elseif($request->query->has('action') && $request->query->get('action') === 'upload_file_tinymce'){ 271 elseif($this->request->query->get('action') === 'upload_file_tinymce'){
288 FileUploadController::fileUploadTinyMce(); 272 return FileUploadController::fileUploadTinyMce();
289 } 273 }
290 elseif($request->query->has('head_foot_image')){ 274 elseif($this->request->query->has('head_foot_image')){
291 HeadFootController::uploadAsset($entityManager, $request->query->get('head_foot_image')); 275 return HeadFootController::uploadAsset($this->entityManager, $this->request->query->get('head_foot_image'));
292 } 276 }
293 277
294 /* -- page Maintenance -- */ 278 /* -- page Maintenance -- */
295 elseif($request->query->has('action') && $request->query->get('action') === 'restore_database' 279 elseif($this->request->query->get('action') === 'restore_database' && $this->request->request->get('hidden') === ''
296 && $request->request->has('hidden') && $request->get('hidden') === '' 280 && $this->request->files->has('uploaded_sql')){
297 && $request->files->has('uploaded_sql')) 281 return MaintenanceController::downloadSQL($entityManager, $request);
298 { 282 }
299 MaintenanceController::downloadSQL($entityManager, $request); 283 else{
284 // choix ici entre répondre en JSON ou par une redirection, choix du JSON pour pouvoir passer un message
285 return new JsonResponse(['success' => false, 'error' => 'bad parameters'], JsonResponse::HTTP_BAD_REQUEST); // code 400
300 } 286 }
301 } 287 }
302 288
303 // requêtes XMLHttpRequest 289 /* -- formulaire HTML sans fichier -- */
304 elseif(isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') 290 elseif($this->request->headers->get('Content-Type') === 'application/x-www-form-urlencoded'){
305 { 291 if($this->request->query->get('action') === 'delete_article' && $this->request->query->has('id')){
306 echo json_encode(['success' => false]); // noyer le poisson en laissant penser que le site gère les requêtes XHR 292 return ArticleController::deleteArticle($this->entityManager, $this->request); // version formulaire
307 die;
308 }
309
310 /* -- formulaire HTML SANS fichier -- */
311 elseif($request->headers->get('Content-Type') === 'application/x-www-form-urlencoded')
312 {
313 if($request->query->has('action') && $request->query->get('action') === 'delete_article' && isset($_GET['id'])){
314 $response = ArticleController::deleteArticle($entityManager, $_GET); // version formulaire
315 } 293 }
316 294
317 /* -- nouvelle page -- */ 295 /* -- nouvelle page -- */
318 elseif(isset($_POST['page_name']) && $_POST['page_name'] !== null 296 elseif($this->request->request->get('page_name') !== null
319 && isset($_POST['page_name_path']) && $_POST['page_name_path'] !== null 297 && $this->request->request->get('page_name_path') !== null
320 && isset($_POST['page_location']) && $_POST['page_location'] !== null 298 && $this->request->request->get('page_location') !== null
321 && isset($_POST['page_description']) && $_POST['page_description'] !== null 299 && $this->request->request->get('page_description') !== null
322 && isset($_POST['new_page_hidden']) && $_POST['new_page_hidden'] === '') 300 && $this->request->request->get('new_page_hidden') === ''){
323 { 301 return PageManagementController::newPage($this->entityManager, $this->request->request);
324 PageManagementController::newPage($entityManager, $_POST);
325 } 302 }
326 303
327 /* -- suppression d'une page -- */ 304 /* -- suppression d'une page -- */
328 elseif(isset($_POST['page_id']) && $_POST['page_id'] !== null 305 elseif($this->request->request->get('page_id') !== null
329 && isset($_POST['submit_hidden']) && $_POST['submit_hidden'] === '') 306 && $this->request->request->get('submit_hidden') === ''){
330 { 307 return PageManagementController::deletePage($this->entityManager, $this->request->request->get('page_id'));
331 PageManagementController::deletePage($entityManager);
332 } 308 }
333 309
334 310
335 /* -- mode Modification d'une page -- */ 311 /* -- mode Modification d'une page -- */
336 // modification du chemins en snake_case 312 // modification du chemins en snake_case
337 elseif(isset($_POST['page_menu_path']) && $_POST['page_menu_path'] !== null 313 elseif($this->request->request->get('page_menu_path') !== null
338 && isset($_POST['page_id']) && $_POST['page_id'] !== null 314 && $this->request->request->get('page_id') !== null
339 && isset($_POST['page_name_path_hidden']) && $_POST['page_name_path_hidden'] === '') 315 && $this->request->request->get('page_name_path_hidden') === ''){
340 { 316 return PageManagementController::updatePageMenuPath($this->entityManager, $this->request->request->get('page_menu_path'));
341 PageManagementController::updatePageMenuPath($entityManager);
342 } 317 }
343 // ajout d'un bloc dans une page 318 // ajout d'un bloc dans une page
344 elseif(isset($_POST['bloc_title']) && $_POST['bloc_title'] !== null 319 elseif($this->request->request->get('bloc_title') !== null
345 && isset($_POST['bloc_select']) && $_POST['bloc_select'] !== null 320 && $this->request->request->get('bloc_select') !== null
346 && isset($_POST['bloc_title_hidden']) && $_POST['bloc_title_hidden'] === '') // contrôle anti-robot avec input hidden 321 && $this->request->request->get('bloc_title_hidden') === ''){ // contrôle anti-robot avec input hidden
347 { 322 return PageManagementController::addBloc($this->entityManager, $this->request);
348 PageManagementController::addBloc($entityManager);
349 } 323 }
350 // suppression d'un bloc de page 324 // suppression d'un bloc de page
351 elseif(isset($_POST['delete_bloc_id']) && $_POST['delete_bloc_id'] !== null 325 elseif($this->request->request->get('delete_bloc_id') !== null
352 && isset($_POST['delete_bloc_hidden']) && $_POST['delete_bloc_hidden'] === '') // contrôle anti-robot avec input hidden 326 && $this->request->request->get('delete_bloc_hidden') === ''){ // contrôle anti-robot avec input hidden
353 { 327 return PageManagementController::deleteBloc($this->entityManager, $this->request);
354 PageManagementController::deleteBloc($entityManager);
355 } 328 }
356 329
357 330
358 /* -- page Menu et chemins -- */ 331 /* -- page Menu et chemins -- */
359 // création d'une entrée de menu avec une URL 332 // création d'une entrée de menu avec une URL
360 elseif(isset($_POST["label_input"]) && isset($_POST["url_input"]) && isset($_POST["location"])){ 333 elseif($this->request->request->has("label_input") && $this->request->request->has("url_input") && $this->request->request->has("location")){
361 MenuAndPathsController::newUrlMenuEntry($entityManager); 334 return MenuAndPathsController::newUrlMenuEntry($this->entityManager);
362 } 335 }
363 // suppression d'une entrée de menu avec une URL 336 // suppression d'une entrée de menu avec une URL
364 elseif(isset($_POST['delete']) && isset($_POST['x']) && isset($_POST['y'])){ // 2 params x et y sont là parce qu'on a cliqué sur une image 337 elseif($this->request->request->has('delete') && $this->request->request->has('x') && $this->request->request->has('y')){ // 2 params x et y sont là parce qu'on a cliqué sur une image
365 MenuAndPathsController::deleteUrlMenuEntry($entityManager); 338 return MenuAndPathsController::deleteUrlMenuEntry($this->entityManager);
366 } 339 }
367 340
368 341
369 /* -- page Mon compte -- */ 342 /* -- page Mon compte -- */
370 elseif($request->query->has('action') && $request->query->get('action') === 'update_username') 343 elseif($this->request->query->get('action') === 'update_username'){
371 { 344 return UserController::updateUsername($this->entityManager);
372 UserController::updateUsername($entityManager);
373 } 345 }
374 elseif($request->query->has('action') && $request->query->get('action') === 'update_password') 346 elseif($this->request->query->get('action') === 'update_password'){
375 { 347 return UserController::updatePassword($this->entityManager);
376 UserController::updatePassword($entityManager);
377 } 348 }
378 349
379 /* -- page Maintenance -- */ 350 /* -- page Maintenance -- */
380 elseif($request->query->has('action') && $request->query->get('action') === 'restore_database' 351 elseif($this->request->query->get('action') === 'restore_database' && $this->request->get('hidden') === '' && $this->request->request->has('selected_sql')){
381 && $request->request->has('hidden') && $request->get('hidden') === '' 352 return MaintenanceController::handleBackupSelection($this->entityManager, $this->request);
382 && $request->request->has('selected_sql'))
383 {
384 MaintenanceController::handleBackupSelection($entityManager, $request);
385 } 353 }
386 354
387 // redirection page d'accueil 355 // redirection page d'accueil
388 else{ 356 return new RedirectResponse((string)new URL(['error' => 'paramètres inconnus']));
389 header("Location: " . new URL(['error' => 'paramètres inconnus']));
390 die;
391 }
392 } 357 }
393 358
394 // POST admin ne matchant pas 359 // requêtes XMLHttpRequest
395 else{ 360 elseif($this->request->isXmlHttpRequest()){
396 echo json_encode(['success' => false]); 361 return new JsonResponse(['success' => false]); // noyer le poisson en laissant penser que le site gère les requêtes XHR
397 die;
398 } 362 }
363
364 // POST admin ne matchant pas
365 return new Response('bad parameters', Response::HTTP_BAD_REQUEST); // code 400
399 } 366 }
400 // POST non admin ne matchant pas
401 else{
402 echo json_encode(['success' => false]);
403 die;
404 }
405 }
406 367
407 // méthode inconnue 368 // POST non-admin ne matchant pas
408 else{ 369 return new Response('bad parameters', Response::HTTP_BAD_REQUEST); // code 400
409 header("Location: " . new URL(['error' => 'tu fais quoi là mec?']));
410 die;
411 } 370 }
412 371
413 372 // méthode HTTP inconnue
414
415 /* -- utilisation de la réponse -- */
416 if(isset($response)){
417 // cas gérés (d'autres sont à prévoir): mauvais id de la page article, accès page création d'article sans être admin
418 if($request->isMethod('GET') && $response->getStatusCode() == 302){ // 302 redirection temporaire
419 header('Location: ' . new URL(['page' => $_GET['from'] ?? '']));
420 }
421 // redirection après traitement de formulaires HTTP
422 elseif($request->getMethod() === 'POST' && $request->headers->get('Content-Type') === 'application/x-www-form-urlencoded'){
423 $response_data = json_decode(($response)->getContent(), true);
424 $url = new URL(['page' => $_GET['from'] ?? '']);
425 $url->addParams(['success' => $response_data['success'], 'message' => $response_data['message']]);
426 header('Location: ' . $url);
427 }
428 // affichage d'une page OU requête AJAX
429 else{
430 $response->send();
431 }
432 }
433 // pas utilisation de RESPONSE (cas destiné à disparaître)
434 else{ 373 else{
435 if($request->getMethod() === 'POST' && $request->headers->get('Content-Type') === 'application/x-www-form-urlencoded'){ 374 return new RedirectResponse((string)new URL(['error' => 'tu fais quoi là mec?']));
436 header("Location: " . new URL(['error' => 'erreur côté serveur']));
437 }
438 else{
439 http_response_code(500);
440 echo "erreur côté serveur";
441 }
442 } 375 }
443 } 376 }
444} \ No newline at end of file 377} \ No newline at end of file
diff --git a/src/service/User.php b/src/service/User.php
new file mode 100644
index 0000000..bd17dce
--- /dev/null
+++ b/src/service/User.php
@@ -0,0 +1,23 @@
1<?php
2// src/service/User.php
3
4declare(strict_types=1);
5
6use Doctrine\ORM\EntityManager;
7
8class User{
9 static public function existUsers(EntityManager $entityManager): bool
10 {
11 if(!$entityManager // table vide
12 ->createQuery("SELECT u FROM App\Entity\User u")
13 ->setMaxResults(1)
14 ->getOneOrNullResult())
15 {
16 unset($_SESSION['user']);
17 return false;
18 }
19 else{
20 return true;
21 }
22 }
23} \ No newline at end of file