Paaxio 1.0
Plateforme de streaming musical - SAE IUT Bayonne
Chargement...
Recherche...
Aucune correspondance
controller_utilisateur.class.php
Aller à la documentation de ce fichier.
1<?php
2
27{
34 public function __construct(\Twig\Environment $twig, \Twig\Loader\FilesystemLoader $loader)
35 {
36 parent::__construct($loader, $twig);
37 }
38
48 public function signin()
49 {
50 if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
51 $this->show405();
52 return;
53 }
54
55 header('Content-Type: application/json');
56
57 $post = $this->getPost();
58 $email = trim($post['email'] ?? '');
59 $password = $post['password'] ?? '';
60
61 // Validation via la classe Validator
62 $signinRules = [
63 'email' => [
64 'obligatoire' => true,
65 'type' => 'string',
66 'format' => FILTER_VALIDATE_EMAIL
67 ],
68 'password' => [
69 'obligatoire' => true,
70 'type' => 'string',
71 ]
72 ];
73
74 $validator = new Validator($signinRules);
75 $signinData = [
76 'email' => $email,
77 'password' => $password
78 ];
79
80 if (!$validator->valider($signinData)) {
81 echo json_encode([
82 'success' => false,
83 'message' => implode(' ', $validator->getMessagesErreurs())
84 ]);
85 return;
86 }
87
88 try {
89 $utilisateurDAO = new UtilisateurDAO($this->getPDO());
90 $utilisateur = $utilisateurDAO->find($email);
91
92 if (!$utilisateur) {
93 echo json_encode([
94 'success' => false,
95 'message' => 'Adresse e-mail ou mot de passe incorrect.'
96 ]);
97 return;
98 }
99
100 $hashedPassword = $utilisateur->getMotDePasseUtilisateur();
101
102 if (!password_verify($password, $hashedPassword)) {
103 echo json_encode([
104 'success' => false,
105 'message' => 'Adresse e-mail ou mot de passe incorrect.'
106 ]);
107 return;
108 }
109
110 $statut = $utilisateur->getStatutUtilisateur();
111 // Vérification que le compte est actif
112 if ($statut && $statut !== StatutUtilisateur::Actif) {
113 echo json_encode([
114 'success' => false,
115 'message' => 'Votre compte est ' . ($statut === StatutUtilisateur::Suspendu ? 'suspendu' : 'supprimé') . '.'
116 ]);
117 return;
118 }
119
120 // Connexion réussie : initialisation de la session
121 $_SESSION['user_email'] = $utilisateur->getEmailUtilisateur();
122 $_SESSION['user_pseudo'] = $utilisateur->getPseudoUtilisateur();
123 $_SESSION['user_role'] = $utilisateur->getRoleUtilisateur()?->getRoleEnum();
124 $_SESSION['user_logged_in'] = true;
125
126 // Réponse de succès
127 echo json_encode([
128 'success' => true,
129 'message' => 'Connexion réussie!',
130 'user' => [
131 'email' => $utilisateur->getEmailUtilisateur(),
132 'pseudo' => $utilisateur->getPseudoUtilisateur()
133 ]
134 ]);
135 } catch (Exception $e) {
136 header('Content-Type: application/json');
137 echo json_encode([
138 'success' => false,
139 'message' => 'Une erreur est survenue lors de la connexion. Veuillez réessayer plus tard (' . $e->getMessage() . ').'
140 ]);
141 }
142 }
143
155 public function signup()
156 {
157
158 if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
159 $this->show405();
160 return;
161 }
162
163 header('Content-Type: application/json');
164
165 $post = $this->getPost() ?? [];
166
167 // Types de profils autorisés
168 $allowedTypes = [
169 'artiste' => 'artiste',
170 'auditeur' => 'auditeur',
171 'producteur' => 'producteur'
172 ];
173
174 $userType = strtolower(trim($post['type'] ?? ''));
175 $nom = trim($post['nom'] ?? '');
176 $pseudo = trim($post['pseudo'] ?? '');
177 $description = trim($post['description'] ?? '');
178 $website = trim($post['website'] ?? '');
179 $email = strtolower(trim($post['email'] ?? ''));
180 $birthdate = trim($post['birthdate'] ?? '');
181 $password = $post['password'] ?? '';
182 $passwordRepeat = $post['password_repeat'] ?? '';
183 $genreId = isset($post['genre_id']) ? (int)$post['genre_id'] : null;
184
185 $errors = [];
186
187 // Validation préalable du type d'utilisateur (non dans les règles Validator)
188 if (!array_key_exists($userType, $allowedTypes)) {
189 $errors[] = 'Le type de profil sélectionné est invalide.';
190 }
191
192 // Règles de validation des données pour l'inscription
193 $signupRules = [
194 'nom' => [
195 'obligatoire' => true,
196 'type' => 'string',
197 'longueur_min' => 1,
198 'longueur_max' => 255
199 ],
200 'pseudo' => [
201 'obligatoire' => true,
202 'type' => 'string',
203 'longueur_min' => 3,
204 'longueur_max' => 50,
205 'pseudo_format' => true
206 ],
207 'description' => [
208 'obligatoire' => true,
209 'type' => 'string',
210 'longueur_min' => 10,
211 'longueur_max' => 1000
212 ],
213 'website' => [
214 'obligatoire' => false,
215 'format' => FILTER_VALIDATE_URL
216 ],
217 'email' => [
218 'obligatoire' => true,
219 'type' => 'string',
220 'longueur_min' => 5,
221 'longueur_max' => 320,
222 'format' => FILTER_VALIDATE_EMAIL
223 ],
224 'birthdate' => [
225 'obligatoire' => true,
226 'type' => 'string',
227 'age_minimum' => 13
228 ],
229 'password' => [
230 'obligatoire' => true,
231 'type' => 'string',
232 'longueur_min' => 8,
233 'longueur_max' => 128,
234 'mot_de_passe_fort' => true
235 ]
236 ];
237
238 $signupData = [
239 'nom' => $nom,
240 'pseudo' => $pseudo,
241 'description' => $description,
242 'website' => $website,
243 'email' => $email,
244 'birthdate' => $birthdate,
245 'password' => $password
246 ];
247
248 $validator = new Validator($signupRules);
249 if (!$validator->valider($signupData)) {
250 $errors = array_merge($errors, $validator->getMessagesErreurs());
251 }
252
253 // Vérification supplémentaire : confirmation du mot de passe
254 if ($password !== $passwordRepeat) {
255 $errors[] = 'Les mots de passe ne correspondent pas.';
256 }
257
258 // Pour les artistes/producteurs, vérifier la sélection d'un genre
259 if ($userType != 'auditeur') {
260 if (!$genreId) {
261 $errors[] = 'Veuillez sélectionner un genre musical.';
262 } else {
263 $genreDao = new GenreDAO($this->getPDO());
264 try {
265 $genre = $genreDao->find((int)$genreId);
266 } catch (Exception $e) {
267 $genre = null;
268 }
269 if (!$genre) {
270 $errors[] = 'Le genre sélectionné est invalide.';
271 }
272 }
273 }
274
275 // Vérification unicité de l'email et du pseudo
276 $utilisateurDAO = new UtilisateurDAO($this->getPDO());
277
278 if ($email !== '' && $utilisateurDAO->existsByEmail($email)) {
279 $errors[] = 'Un compte existe déjà avec cette adresse e-mail.';
280 }
281
282 if ($pseudo !== '' && $utilisateurDAO->existsByPseudo($pseudo)) {
283 $errors[] = 'Ce nom ou pseudonyme est déjà utilisé.';
284 }
285
286 if (!empty($errors)) {
287 echo json_encode([
288 'success' => false,
289 'message' => implode(' ', $errors)
290 ]);
291 return;
292 }
293
294 // Analyse de la date de naissance
295 $birthDateTime = DateTime::createFromFormat('Y-m-d', $birthdate);
296
297 $roleDao = new RoleDAO($this->getPDO());
298 $role = $roleDao->findByType($allowedTypes[$userType]);
299
300 if (!$role) {
301 echo json_encode([
302 'success' => false,
303 'message' => 'Impossible de déterminer le rôle à attribuer à ce compte.'
304 ]);
305 return;
306 }
307
308 $hashedPassword = password_hash($password, PASSWORD_ARGON2ID);
309 $createdAt = (new DateTime())->format('Y-m-d H:i:s');
310 $pdo = $this->getPDO();
311
312 try {
313 $utilisateur = new Utilisateur();
314 // Affectation des différents attributs de l'utilisateur
315 $utilisateur->setEmailUtilisateur($email);
316 $utilisateur->setNomUtilisateur($nom);
317 $utilisateur->setPseudoUtilisateur($pseudo);
318 $utilisateur->setMotDePasseUtilisateur($hashedPassword);
319 $dateNaissance = !empty($birthdate) ? DateTime::createFromFormat('Y-m-d', $birthdate) : null;
320 $utilisateur->setDateDeNaissanceUtilisateur($dateNaissance);
321 $utilisateur->setDateInscriptionUtilisateur(DateTime::createFromFormat('Y-m-d H:i:s', $createdAt));
322 $utilisateur->setStatutUtilisateur(\StatutUtilisateur::Actif);
323 $utilisateur->setGenreUtilisateur(isset($genre) ? $genre : null);
324 $utilisateur->setEstAbonnee(false);
325 $utilisateur->setDescriptionUtilisateur($description ?? null);
326 $utilisateur->setSiteWebUtilisateur((isset($website) && $website !== '') ? $website : null);
327 $utilisateur->setStatutAbonnement(\StatutAbonnement::Inactif);
328 $utilisateur->setDateDebutAbonnement(null);
329 $utilisateur->setDateFinAbonnement(null);
330 $utilisateur->setPointsDeRenommeeArtiste(null);
331 $utilisateur->setNbAbonnesArtiste(null);
332 $utilisateur->seturlPhotoUtilisateur(null);
333 $utilisateur->setRoleUtilisateur($role);
334
335 $creationReussie = $utilisateurDAO->create($utilisateur);
336
337 if ($creationReussie) {
338
339 $emailSender = new Email($this->getTwig());
340 $emailSender->sendWelcomeEmail(
341 $utilisateur->getEmailUtilisateur(),
342 $utilisateur->getPseudoUtilisateur(),
343 $userType
344 );
345
346 echo json_encode([
347 'success' => true,
348 'message' => 'Votre compte a été créé! Vérifiez vos e-mails pour confirmer votre inscription.',
349 'user' => [
350 'email' => $utilisateur->getEmailUtilisateur(),
351 'pseudo' => $utilisateur->getPseudoUtilisateur(),
352 'type' => $userType
353 ]
354 ]);
355 } else {
356 echo json_encode([
357 'success' => false,
358 'message' => 'Impossible de créer votre compte pour le moment.'
359 ]);
360 }
361 } catch (Exception $e) {
362 echo json_encode([
363 'success' => false,
364 'message' => 'Impossible de créer votre compte pour le moment (' . $e->getMessage() . ').'
365 ]);
366 }
367 }
368
384 public function inscription()
385 {
386 // On vérifie que l'utilisateur courant est bien un administrateur
387 $this->requireRole(RoleEnum::Admin);
388
389 $error = null;
390
391 if ($_SERVER['REQUEST_METHOD'] === 'POST') {
392 $pseudo = trim($_POST['pseudo'] ?? '');
393 $email = trim($_POST['email'] ?? '');
394 $password = $_POST['mdp'] ?? '';
395 $roleType = $_POST['role'] ?? 'auditeur';
396
397 $pdo = $this->getPDO();
398 $utilisateurDAO = new UtilisateurDAO($pdo);
399
400 // Vérification si l'e-mail ou le pseudo existe déjà
401 if ($utilisateurDAO->existsByEmail($email)) {
402 $error = "Cet email est déjà utilisé.";
403 } elseif ($utilisateurDAO->existsByPseudo($pseudo)) {
404 $error = "Ce pseudo est déjà pris.";
405 } else {
406 try {
407 $roleDao = new RoleDAO($pdo);
408 $role = $roleDao->findByType($roleType);
409
410 if ($role) {
411 $user = new Utilisateur();
412 $user->setPseudoUtilisateur($pseudo);
413 $user->setNomUtilisateur($pseudo);
414 $user->setEmailUtilisateur($email);
415 $user->setMotDePasseUtilisateur(password_hash($password, PASSWORD_ARGON2ID));
416 $user->setRoleUtilisateur($role);
417
418 $user->setDateInscriptionUtilisateur(new DateTime());
419 $user->setDateDeNaissanceUtilisateur(new DateTime('2000-01-01'));
420
421 $user->setStatutUtilisateur(\StatutUtilisateur::Actif);
422 $user->setEstAbonnee(false);
423 $user->setStatutAbonnement(\StatutAbonnement::Inactif);
424
425 $user->setGenreUtilisateur(null);
426 $user->setDescriptionUtilisateur("Compte créé par admin");
427 $user->setSiteWebUtilisateur(null);
428 $user->seturlPhotoUtilisateur(null);
429 $user->setDateDebutAbonnement(null);
430 $user->setDateFinAbonnement(null);
431 $user->setPointsDeRenommeeArtiste(0);
432 $user->setNbAbonnesArtiste(0);
433
434 if ($utilisateurDAO->create($user)) {
435 $this->redirectTo('admin', 'afficher', ['success' => 1]);
436 exit();
437 } else {
438 $error = "Erreur lors de la création en base de données.";
439 }
440 } else {
441 $error = "Rôle introuvable.";
442 }
443 } catch (Exception $e) {
444 $error = "Erreur système: " . $e->getMessage();
445 }
446 }
447 }
448
449 $template = $this->getTwig()->load('utilisateur_ajout.html.twig');
450 echo $template->render([
451 'page' => ['title' => 'Ajouter Utilisateur'],
452 'session' => $_SESSION,
453 'error' => $error
454 ]);
455 }
456
465 public function logout()
466 {
467 $_SESSION = [];
468 if (ini_get("session.use_cookies")) {
469 $params = session_get_cookie_params();
470 setcookie(
471 session_name(),
472 '',
473 time() - 42000,
474 $params["path"],
475 $params["domain"],
476 $params["secure"],
477 $params["httponly"]
478 );
479 }
480 session_destroy();
481
482 // Redirection vers la page d'accueil (controller=home, method=afficher)
483 $this->redirectTo('home', 'afficher');
484 }
485
495 public function afficherMesLikes()
496 {
497 // Vérification de la connexion de l'utilisateur
498 $this->requireAuth();
499
500 $emailUtilisateur = $_SESSION['user_email'] ?? null;
501
502 // DAO : récupération des chansons likées par l'utilisateur courant
503 $managerLike = new ChansonDAO($this->getPdo());
504 $chansonsLikees = $managerLike->findChansonsLikees($emailUtilisateur);
505
506 // Marquer toutes les chansons chargées comme étant likées
507 foreach ($chansonsLikees as $chanson) {
508 $chanson->setIsLiked(true);
509 }
510
511 // Création d'un "album virtuel" pour la page d'affichage
512 $albumVirtuel = (object) [
513 "getTitreAlbum" => function () {
514 return "Chansons Likées";
515 },
516 "getUrlImageAlbum" => function () {
517 return "public/assets/like_default.png";
518 },
519 "getArtisteAlbum" => function () {
520 return "Moi";
521 },
522 "getDateSortieAlbum" => function () {
523 return null;
524 },
525 ];
526
527 // Chargement du template Twig et affichage
528 $template = $this->getTwig()->load('chanson_album.html.twig');
529
530 echo $template->render([
531 'page' => [
532 'title' => "Chansons likées",
533 'name' => "musique_likee",
534 'description' => "Chansons likées par l'utilisateur"
535 ],
536 'album' => $albumVirtuel,
537 'chansons' => $chansonsLikees
538 ]);
539 }
540
549 public function afficherProfilArtiste()
550 {
551 // Récupération du pseudo dans la query string
552 $pseudo = $_GET['pseudo'] ?? null;
553
554 if (!$pseudo) {
555 $this->redirectTo('home', 'afficher');
556 }
557
558 $utilisateurDAO = new UtilisateurDAO($this->getPDO());
559 $albumDAO = new AlbumDAO($this->getPDO());
560
561 // Recherche de l'artiste via son pseudo
562 $utilisateur = $utilisateurDAO->findByPseudo($pseudo);
563
564 // Vérification de l'abonnement si connecté
565 $estAbonneAArtiste = false;
566 if (isset($_SESSION['user_email'])) {
567 $estAbonneAArtiste = $utilisateurDAO->estAbonneAArtiste($_SESSION['user_email'], $utilisateur->getEmailUtilisateur());
568 }
569
570 if (!$utilisateur) {
571 $this->redirectTo('home', 'afficher');
572 }
573
574 // Récupération des albums de cet artiste par son e-mail
575 $emailArtiste = $utilisateur->getEmailUtilisateur();
576
577 $albums = $albumDAO->findAllByArtistEmail($emailArtiste);
578
579 $template = $this->getTwig()->load('artiste_profil.html.twig');
580 echo $template->render([
581 'session' => $_SESSION,
582 'utilisateur' => $utilisateur,
583 'albums' => $albums,
584 'estAbonneAArtiste' => $estAbonneAArtiste
585 ]);
586 }
587
596 public function suivreArtiste()
597 {
598 header('Content-Type: application/json');
599
600 // Vérification de la connexion
601 if (!isset($_SESSION['user_email'])) {
602 echo json_encode(['success' => false, 'message' => 'Non connecté']);
603 return;
604 }
605
606 $emailArtiste = $_POST['emailArtiste'] ?? null;
607 $emailAbonne = $_SESSION['user_email'];
608
609 // --- SÉCURITÉ : Empêcher l'auto-abonnement ---
610 if ($emailAbonne === $emailArtiste) {
611 echo json_encode([
612 'success' => false,
613 'message' => 'Vous ne pouvez pas vous abonner à votre propre profil.'
614 ]);
615 return;
616 }
617
618 // Traitement de l'abonnement/désabonnement
619 if ($emailArtiste) {
620 $dao = new UtilisateurDAO($this->getPDO());
621 $result = $dao->basculerAbonnement($emailAbonne, $emailArtiste);
622
623 $increment = ($result === 'followed') ? 1 : -1;
624 $dao->updateNbAbonnes($emailArtiste, $increment);
625
626 $artisteAJour = $dao->find($emailArtiste);
627 $nouveauNombre = $artisteAJour ? $artisteAJour->getNbAbonnesArtiste() : 0;
628
629 echo json_encode([
630 'success' => true,
631 'action' => $result,
632 'newText' => ($result === 'followed') ? 'Abonné(e)' : 'S\'abonner',
633 'nbAbonnes' => $nouveauNombre
634 ]);
635 } else {
636 echo json_encode(['success' => false, 'message' => 'Email artiste manquant']);
637 }
638 }
639
648 public function afficherMotDePasseOublie()
649 {
650 $template = $this->getTwig()->load('forgot_password.html.twig');
651 echo $template->render([
652 'page' => [
653 'title' => 'Mot de passe oublié - Paaxio',
654 'name' => 'forgot_password',
655 'description' => 'Réinitialiser votre mot de passe Paaxio'
656 ],
657 'session' => $_SESSION
658 ]);
659 }
660
675 public function demanderReinitialisation()
676 {
677
678 if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
679 $this->show405();
680 return;
681 }
682
683 header('Content-Type: application/json');
684
685 $post = $this->getPost();
686 $email = strtolower(trim($post['email'] ?? ''));
687
688 // Validation de l'email
689 $rules = [
690 'email' => [
691 'obligatoire' => true,
692 'type' => 'string',
693 'format' => FILTER_VALIDATE_EMAIL
694 ]
695 ];
696
697 $validator = new Validator($rules);
698 if (!$validator->valider(['email' => $email])) {
699 echo json_encode([
700 'success' => false,
701 'message' => 'Veuillez fournir une adresse email valide.'
702 ]);
703 return;
704 }
705
706 try {
707 $utilisateurDAO = new UtilisateurDAO($this->getPDO());
708 $utilisateur = $utilisateurDAO->find($email);
709
710 // Message de succès identique dans tous les cas (sécurité)
711 $messageSucces = 'Si cette adresse email est associée à un compte, vous recevrez un email de réinitialisation dans quelques instants.';
712
713 // Si l'utilisateur n'existe pas, on retourne quand même un succès
714 // pour éviter l'énumération des adresses email
715 if (!$utilisateur) {
716 echo json_encode([
717 'success' => true,
718 'message' => $messageSucces
719 ]);
720 return;
721 }
722
723 // Vérification que le compte est actif
724 $statut = $utilisateur->getStatutUtilisateur();
725 if ($statut && $statut !== StatutUtilisateur::Actif) {
726 echo json_encode([
727 'success' => true,
728 'message' => $messageSucces
729 ]);
730 return;
731 }
732
733 // Création du token de réinitialisation
734 $tokenDAO = new PasswordResetTokenDAO($this->getPDO());
735 $token = $tokenDAO->create($email);
736
737 if (!$token) {
738 echo json_encode([
739 'success' => false,
740 'message' => 'Une erreur est survenue. Veuillez réessayer plus tard.'
741 ]);
742 return;
743 }
744
745 // Envoi de l'email de réinitialisation
746 $emailSender = new Email($this->getTwig());
747 $emailSender->sendPasswordResetEmail(
748 $utilisateur->getEmailUtilisateur(),
749 $utilisateur->getPseudoUtilisateur(),
750 $token->getToken()
751 );
752
753 echo json_encode([
754 'success' => true,
755 'message' => $messageSucces
756 ]);
757 } catch (Exception $e) {
758 error_log('Erreur réinitialisation mot de passe: ' . $e->getMessage());
759 echo json_encode([
760 'success' => false,
761 'message' => 'Une erreur est survenue. Veuillez réessayer plus tard.'
762 ]);
763 }
764 }
765
775 public function resetPassword()
776 {
777 $get = $this->getGet();
778 $tokenValue = $get['token'] ?? '';
779
780 if (empty($tokenValue)) {
781 $this->afficherErreurToken('Lien de réinitialisation invalide.');
782 return;
783 }
784
785 try {
786 $tokenDAO = new PasswordResetTokenDAO($this->getPDO());
787 $token = $tokenDAO->findValidToken($tokenValue);
788
789 if (!$token) {
790 $this->afficherErreurToken('Ce lien de réinitialisation est invalide ou a expiré. Veuillez faire une nouvelle demande.');
791 return;
792 }
793
794 // Récupérer les informations de l'utilisateur
795 $utilisateurDAO = new UtilisateurDAO($this->getPDO());
796 $utilisateur = $utilisateurDAO->find($token->getEmailUtilisateur());
797
798 $template = $this->getTwig()->load('reset_password.html.twig');
799 echo $template->render([
800 'page' => [
801 'title' => 'Nouveau mot de passe - Paaxio',
802 'name' => 'reset_password',
803 'description' => 'Définir un nouveau mot de passe pour votre compte Paaxio'
804 ],
805 'session' => $_SESSION,
806 'token' => $tokenValue,
807 'pseudo' => $utilisateur ? $utilisateur->getPseudoUtilisateur() : ''
808 ]);
809 } catch (Exception $e) {
810 error_log('Erreur affichage reset password: ' . $e->getMessage());
811 $this->afficherErreurToken('Une erreur est survenue. Veuillez réessayer.');
812 }
813 }
814
826 public function traiterReinitialisation()
827 {
828
829 if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
830 $this->show405();
831 return;
832 }
833
834 header('Content-Type: application/json');
835
836 $post = $this->getPost();
837 $tokenValue = trim($post['token'] ?? '');
838 $password = $post['password'] ?? '';
839 $passwordRepeat = $post['password_repeat'] ?? '';
840
841 // Validation des données
842 $errors = [];
843
844 if (empty($tokenValue)) {
845 $errors[] = 'Token de réinitialisation manquant.';
846 }
847
848 // Règles de validation du mot de passe
849 $passwordRules = [
850 'password' => [
851 'obligatoire' => true,
852 'type' => 'string',
853 'longueur_min' => 8,
854 'longueur_max' => 128,
855 'mot_de_passe_fort' => true
856 ]
857 ];
858
859 $validator = new Validator($passwordRules);
860 if (!$validator->valider(['password' => $password])) {
861 $errors = array_merge($errors, $validator->getMessagesErreurs());
862 }
863
864 // Vérification de la confirmation du mot de passe
865 if ($password !== $passwordRepeat) {
866 $errors[] = 'Les mots de passe ne correspondent pas.';
867 }
868
869 if (!empty($errors)) {
870 echo json_encode([
871 'success' => false,
872 'message' => implode(' ', $errors)
873 ]);
874 return;
875 }
876
877 try {
878 $tokenDAO = new PasswordResetTokenDAO($this->getPDO());
879 $token = $tokenDAO->findValidToken($tokenValue);
880
881 if (!$token) {
882 echo json_encode([
883 'success' => false,
884 'message' => 'Ce lien de réinitialisation est invalide ou a expiré. Veuillez faire une nouvelle demande.'
885 ]);
886 return;
887 }
888
889 // Mettre à jour le mot de passe
890 $updateResult = $tokenDAO->updatePassword($token->getEmailUtilisateur(), $password);
891
892 if (!$updateResult) {
893 echo json_encode([
894 'success' => false,
895 'message' => 'Une erreur est survenue lors de la mise à jour du mot de passe.'
896 ]);
897 return;
898 }
899
900 // Marquer le token comme utilisé
901 $tokenDAO->markAsUsed($tokenValue);
902
903 // Invalider tous les autres tokens de cet utilisateur
904 $tokenDAO->invalidateTokensForUser($token->getEmailUtilisateur());
905
906 echo json_encode([
907 'success' => true,
908 'message' => 'Votre mot de passe a été réinitialisé avec succès. Vous pouvez maintenant vous connecter.'
909 ]);
910 } catch (Exception $e) {
911 error_log('Erreur traitement réinitialisation: ' . $e->getMessage());
912 echo json_encode([
913 'success' => false,
914 'message' => 'Une erreur est survenue. Veuillez réessayer plus tard.'
915 ]);
916 }
917 }
918
928 private function afficherErreurToken(string $message): void
929 {
930 $template = $this->getTwig()->load('reset_password_error.html.twig');
931 echo $template->render([
932 'page' => [
933 'title' => 'Lien expiré - Paaxio',
934 'name' => 'reset_password_error',
935 'description' => 'Lien de réinitialisation invalide'
936 ],
937 'session' => $_SESSION,
938 'error_message' => $message
939 ]);
940 }
941}
Contrôleur dédié à la gestion des utilisateurs.
afficherMotDePasseOublie()
Affiche le formulaire de mot de passe oublié.
demanderReinitialisation()
Traite la demande de réinitialisation de mot de passe.
afficherErreurToken(string $message)
Affiche une page d'erreur pour les tokens invalides.
afficherProfilArtiste()
Affiche le profil public d'un artiste.
signup()
Gère l'inscription d'un nouvel utilisateur.
logout()
Déconnecte l'utilisateur et détruit la session.
__construct(\Twig\Environment $twig, \Twig\Loader\FilesystemLoader $loader)
Constructeur du contrôleur utilisateur.
resetPassword()
Affiche le formulaire de réinitialisation de mot de passe.
inscription()
Gère la création d'un nouvel utilisateur par l'administrateur.
traiterReinitialisation()
Traite la réinitialisation du mot de passe.
afficherMesLikes()
Affiche la page des chansons aimées (likées) par l'utilisateur connecté.
suivreArtiste()
Gère l'abonnement/désabonnement à un artiste via une requête AJAX.
signin()
Gère la connexion (authentification) d'un utilisateur.
Classe de base pour tous les contrôleurs de l'application.
getPost()
Récupère les données POST.
Twig Environment $twig
requireRole($requiredRole)
Exige que l'utilisateur ait un rôle spécifique.
show405()
Affiche une erreur 405 Méthode non autorisée.
redirectTo(string $controller, string $method, array $params=[])
Redirige vers un contrôleur et une méthode donnés.
getGet()
Récupère les données GET.
requireAuth(string $controller='', string $method='', array $params=[])
Exige que l'utilisateur soit authentifié.
Twig Loader FilesystemLoader $loader
getPDO()
Récupère la connexion PDO.
getTwig()
Récupère l'environnement Twig.
Classe de gestion des emails pour Paaxio Utilise PHPMailer pour l'envoi d'emails via SMTP.
Data Access Object pour les tokens de réinitialisation de mot de passe.
Permet de valider des données selon des règles spécifiées.