50 if ($_SERVER[
'REQUEST_METHOD'] !==
'POST') {
55 header(
'Content-Type: application/json');
58 $email = trim(
$post[
'email'] ??
'');
59 $password =
$post[
'password'] ??
'';
64 'obligatoire' =>
true,
66 'format' => FILTER_VALIDATE_EMAIL
69 'obligatoire' =>
true,
77 'password' => $password
80 if (!$validator->valider($signinData)) {
83 'message' => implode(
' ', $validator->getMessagesErreurs())
90 $utilisateur = $utilisateurDAO->find($email);
95 'message' =>
'Adresse e-mail ou mot de passe incorrect.'
100 $hashedPassword = $utilisateur->getMotDePasseUtilisateur();
102 if (!password_verify($password, $hashedPassword)) {
105 'message' =>
'Adresse e-mail ou mot de passe incorrect.'
110 $statut = $utilisateur->getStatutUtilisateur();
112 if ($statut && $statut !== StatutUtilisateur::Actif) {
115 'message' =>
'Votre compte est ' . ($statut === StatutUtilisateur::Suspendu ?
'suspendu' :
'supprimé') .
'.'
121 $_SESSION[
'user_email'] = $utilisateur->getEmailUtilisateur();
122 $_SESSION[
'user_pseudo'] = $utilisateur->getPseudoUtilisateur();
123 $_SESSION[
'user_role'] = $utilisateur->getRoleUtilisateur()?->getRoleEnum();
124 $_SESSION[
'user_photo'] = $utilisateur->geturlPhotoUtilisateur();
125 $_SESSION[
'user_logged_in'] =
true;
130 'message' =>
'Connexion réussie!',
132 'email' => $utilisateur->getEmailUtilisateur(),
133 'pseudo' => $utilisateur->getPseudoUtilisateur()
136 }
catch (Exception $e) {
137 header(
'Content-Type: application/json');
140 'message' =>
'Une erreur est survenue lors de la connexion. Veuillez réessayer plus tard (' . $e->getMessage() .
').'
159 if ($_SERVER[
'REQUEST_METHOD'] !==
'POST') {
164 header(
'Content-Type: application/json');
170 'artiste' =>
'artiste',
171 'auditeur' =>
'auditeur',
172 'producteur' =>
'producteur'
175 $userType = strtolower(trim(
$post[
'type'] ??
''));
176 $nom = trim(
$post[
'nom'] ??
'');
177 $pseudo = trim(
$post[
'pseudo'] ??
'');
178 $description = trim(
$post[
'description'] ??
'');
179 $website = trim(
$post[
'website'] ??
'');
180 $email = strtolower(trim(
$post[
'email'] ??
''));
181 $birthdate = trim(
$post[
'birthdate'] ??
'');
182 $password =
$post[
'password'] ??
'';
183 $passwordRepeat =
$post[
'password_repeat'] ??
'';
184 $genreId = isset(
$post[
'genre_id']) ? (int)
$post[
'genre_id'] :
null;
189 if (!array_key_exists($userType, $allowedTypes)) {
190 $errors[] =
'Le type de profil sélectionné est invalide.';
196 'obligatoire' =>
true,
199 'longueur_max' => 255
202 'obligatoire' =>
true,
205 'longueur_max' => 50,
206 'pseudo_format' => true
209 'obligatoire' =>
true,
211 'longueur_min' => 10,
212 'longueur_max' => 1000
215 'obligatoire' =>
false,
216 'format' => FILTER_VALIDATE_URL
219 'obligatoire' =>
true,
222 'longueur_max' => 320,
223 'format' => FILTER_VALIDATE_EMAIL
226 'obligatoire' =>
true,
231 'obligatoire' =>
true,
234 'longueur_max' => 128,
235 'mot_de_passe_fort' => true
242 'description' => $description,
243 'website' => $website,
245 'birthdate' => $birthdate,
246 'password' => $password
249 $validator =
new Validator($signupRules);
250 if (!$validator->valider($signupData)) {
251 $errors = array_merge($errors, $validator->getMessagesErreurs());
255 if ($password !== $passwordRepeat) {
256 $errors[] =
'Les mots de passe ne correspondent pas.';
260 if ($userType !=
'auditeur') {
262 $errors[] =
'Veuillez sélectionner un genre musical.';
266 $genre = $genreDao->find((
int)$genreId);
267 }
catch (Exception $e) {
271 $errors[] =
'Le genre sélectionné est invalide.';
279 if ($email !==
'' && $utilisateurDAO->existsByEmail($email)) {
280 $errors[] =
'Un compte existe déjà avec cette adresse e-mail.';
283 if ($pseudo !==
'' && $utilisateurDAO->existsByPseudo($pseudo)) {
284 $errors[] =
'Ce nom ou pseudonyme est déjà utilisé.';
287 if (!empty($errors)) {
290 'message' => implode(
' ', $errors)
296 $birthDateTime = DateTime::createFromFormat(
'Y-m-d', $birthdate);
299 $role = $roleDao->findByType($allowedTypes[$userType]);
304 'message' =>
'Impossible de déterminer le rôle à attribuer à ce compte.'
309 $hashedPassword = password_hash($password, PASSWORD_ARGON2ID);
310 $createdAt = (
new DateTime())->format(
'Y-m-d H:i:s');
316 $utilisateur->setEmailUtilisateur($email);
317 $utilisateur->setNomUtilisateur($nom);
318 $utilisateur->setPseudoUtilisateur($pseudo);
319 $utilisateur->setMotDePasseUtilisateur($hashedPassword);
320 $dateNaissance = !empty($birthdate) ? DateTime::createFromFormat(
'Y-m-d', $birthdate) :
null;
321 $utilisateur->setDateDeNaissanceUtilisateur($dateNaissance);
322 $utilisateur->setDateInscriptionUtilisateur(DateTime::createFromFormat(
'Y-m-d H:i:s', $createdAt));
323 $utilisateur->setStatutUtilisateur(\StatutUtilisateur::Actif);
324 $utilisateur->setGenreUtilisateur(isset($genre) ? $genre :
null);
325 $utilisateur->setEstAbonnee(
false);
326 $utilisateur->setDescriptionUtilisateur($description ??
null);
327 $utilisateur->setSiteWebUtilisateur((isset($website) && $website !==
'') ? $website :
null);
329 $utilisateur->setDateDebutAbonnement(
null);
330 $utilisateur->setDateFinAbonnement(
null);
331 $utilisateur->setPointsDeRenommeeArtiste(
null);
332 $utilisateur->setNbAbonnesArtiste(
null);
333 $utilisateur->seturlPhotoUtilisateur(
null);
334 $utilisateur->setRoleUtilisateur($role);
336 $creationReussie = $utilisateurDAO->create($utilisateur);
338 if ($creationReussie) {
341 $emailSender->sendWelcomeEmail(
342 $utilisateur->getEmailUtilisateur(),
343 $utilisateur->getPseudoUtilisateur(),
349 'message' =>
'Votre compte a été créé! Vérifiez vos e-mails pour confirmer votre inscription.',
351 'email' => $utilisateur->getEmailUtilisateur(),
352 'pseudo' => $utilisateur->getPseudoUtilisateur(),
359 'message' =>
'Impossible de créer votre compte pour le moment.'
362 }
catch (Exception $e) {
365 'message' =>
'Impossible de créer votre compte pour le moment (' . $e->getMessage() .
').'
392 if ($_SERVER[
'REQUEST_METHOD'] ===
'POST') {
393 $pseudo = trim($_POST[
'pseudo'] ??
'');
394 $email = trim($_POST[
'email'] ??
'');
395 $password = $_POST[
'mdp'] ??
'';
396 $roleType = $_POST[
'role'] ??
'auditeur';
402 if ($utilisateurDAO->existsByEmail($email)) {
403 $error =
"Cet email est déjà utilisé.";
404 } elseif ($utilisateurDAO->existsByPseudo($pseudo)) {
405 $error =
"Ce pseudo est déjà pris.";
409 $role = $roleDao->findByType($roleType);
413 $user->setPseudoUtilisateur($pseudo);
414 $user->setNomUtilisateur($pseudo);
415 $user->setEmailUtilisateur($email);
416 $user->setMotDePasseUtilisateur(password_hash($password, PASSWORD_ARGON2ID));
417 $user->setRoleUtilisateur($role);
419 $user->setDateInscriptionUtilisateur(
new DateTime());
420 $user->setDateDeNaissanceUtilisateur(
new DateTime(
'2000-01-01'));
422 $user->setStatutUtilisateur(\StatutUtilisateur::Actif);
423 $user->setEstAbonnee(
false);
426 $user->setGenreUtilisateur(
null);
427 $user->setDescriptionUtilisateur(
"Compte créé par admin");
428 $user->setSiteWebUtilisateur(
null);
429 $user->seturlPhotoUtilisateur(
null);
430 $user->setDateDebutAbonnement(
null);
431 $user->setDateFinAbonnement(
null);
432 $user->setPointsDeRenommeeArtiste(0);
433 $user->setNbAbonnesArtiste(0);
435 if ($utilisateurDAO->create($user)) {
436 $this->
redirectTo(
'admin',
'afficher', [
'success' => 1]);
439 $error =
"Erreur lors de la création en base de données.";
442 $error =
"Rôle introuvable.";
444 }
catch (Exception $e) {
445 $error =
"Erreur système: " . $e->getMessage();
450 $template = $this->
getTwig()->load(
'utilisateur_ajout.html.twig');
451 echo $template->render([
452 'page' => [
'title' =>
'Ajouter Utilisateur'],
453 'session' => $_SESSION,
553 $pseudo = $_GET[
'pseudo'] ??
null;
563 $utilisateur = $utilisateurDAO->findByPseudo($pseudo);
566 $estAbonneAArtiste =
false;
567 if (isset($_SESSION[
'user_email'])) {
568 $estAbonneAArtiste = $utilisateurDAO->estAbonneAArtiste($_SESSION[
'user_email'], $utilisateur->getEmailUtilisateur());
576 $emailArtiste = $utilisateur->getEmailUtilisateur();
578 $albums = $albumDAO->findAllByArtistEmail($emailArtiste);
580 $template = $this->
getTwig()->load(
'artiste_profil.html.twig');
581 echo $template->render([
582 'session' => $_SESSION,
583 'utilisateur' => $utilisateur,
585 'estAbonneAArtiste' => $estAbonneAArtiste
599 header(
'Content-Type: application/json');
602 if (!isset($_SESSION[
'user_email'])) {
603 echo json_encode([
'success' =>
false,
'message' =>
'Non connecté']);
607 $emailArtiste = $_POST[
'emailArtiste'] ??
null;
608 $emailAbonne = $_SESSION[
'user_email'];
611 if ($emailAbonne === $emailArtiste) {
614 'message' =>
'Vous ne pouvez pas vous abonner à votre propre profil.'
622 $result = $dao->basculerAbonnement($emailAbonne, $emailArtiste);
624 $increment = ($result ===
'followed') ? 1 : -1;
625 $dao->updateNbAbonnes($emailArtiste, $increment);
627 $artisteAJour = $dao->find($emailArtiste);
628 $nouveauNombre = $artisteAJour ? $artisteAJour->getNbAbonnesArtiste() : 0;
633 'newText' => ($result ===
'followed') ?
'Abonné(e)' :
'S\'abonner',
634 'nbAbonnes' => $nouveauNombre
637 echo json_encode([
'success' =>
false,
'message' =>
'Email artiste manquant']);
679 if ($_SERVER[
'REQUEST_METHOD'] !==
'POST') {
684 header(
'Content-Type: application/json');
687 $email = strtolower(trim(
$post[
'email'] ??
''));
692 'obligatoire' =>
true,
694 'format' => FILTER_VALIDATE_EMAIL
699 if (!$validator->valider([
'email' => $email])) {
702 'message' =>
'Veuillez fournir une adresse email valide.'
709 $utilisateur = $utilisateurDAO->find($email);
712 $messageSucces =
'Si cette adresse email est associée à un compte, vous recevrez un email de réinitialisation dans quelques instants.';
719 'message' => $messageSucces
725 $statut = $utilisateur->getStatutUtilisateur();
726 if ($statut && $statut !== StatutUtilisateur::Actif) {
729 'message' => $messageSucces
736 $token = $tokenDAO->create($email);
741 'message' =>
'Une erreur est survenue. Veuillez réessayer plus tard.'
748 $emailSender->sendPasswordResetEmail(
749 $utilisateur->getEmailUtilisateur(),
750 $utilisateur->getPseudoUtilisateur(),
756 'message' => $messageSucces
758 }
catch (Exception $e) {
759 error_log(
'Erreur réinitialisation mot de passe: ' . $e->getMessage());
762 'message' =>
'Une erreur est survenue. Veuillez réessayer plus tard.'
830 if ($_SERVER[
'REQUEST_METHOD'] !==
'POST') {
835 header(
'Content-Type: application/json');
838 $tokenValue = trim(
$post[
'token'] ??
'');
839 $password =
$post[
'password'] ??
'';
840 $passwordRepeat =
$post[
'password_repeat'] ??
'';
845 if (empty($tokenValue)) {
846 $errors[] =
'Token de réinitialisation manquant.';
852 'obligatoire' =>
true,
855 'longueur_max' => 128,
856 'mot_de_passe_fort' => true
860 $validator =
new Validator($passwordRules);
861 if (!$validator->valider([
'password' => $password])) {
862 $errors = array_merge($errors, $validator->getMessagesErreurs());
866 if ($password !== $passwordRepeat) {
867 $errors[] =
'Les mots de passe ne correspondent pas.';
870 if (!empty($errors)) {
873 'message' => implode(
' ', $errors)
880 $token = $tokenDAO->findValidToken($tokenValue);
885 'message' =>
'Ce lien de réinitialisation est invalide ou a expiré. Veuillez faire une nouvelle demande.'
891 $updateResult = $tokenDAO->updatePassword($token->getEmailUtilisateur(), $password);
893 if (!$updateResult) {
896 'message' =>
'Une erreur est survenue lors de la mise à jour du mot de passe.'
902 $tokenDAO->markAsUsed($tokenValue);
905 $tokenDAO->invalidateTokensForUser($token->getEmailUtilisateur());
909 'message' =>
'Votre mot de passe a été réinitialisé avec succès. Vous pouvez maintenant vous connecter.'
911 }
catch (Exception $e) {
912 error_log(
'Erreur traitement réinitialisation: ' . $e->getMessage());
915 'message' =>
'Une erreur est survenue. Veuillez réessayer plus tard.'
993 if ($_SERVER[
'REQUEST_METHOD'] !==
'POST' || !isset($_SESSION[
'user_email'])) {
998 $emailActuel = $_SESSION[
'user_email'];
999 $user = $uDAO->find($emailActuel);
1006 $user->setPseudoUtilisateur($_POST[
'pseudo'] ?? $user->getPseudoUtilisateur());
1007 $user->setDescriptionUtilisateur($_POST[
'description'] ?? $user->getDescriptionUtilisateur());
1008 $user->setNomUtilisateur($_POST[
'nom'] ?? $user->getNomUtilisateur());
1009 $user->setEmailUtilisateur($_POST[
'email'] ?? $user->getEmailUtilisateur());
1012 $birthdate = $_POST[
'birthdate'] ??
'';
1013 if (!empty($birthdate)) {
1015 $dateObj =
new DateTime($birthdate);
1017 if ($dateObj->format(
'Y') > 1920) {
1018 $user->setDateDeNaissanceUtilisateur($dateObj);
1020 }
catch (Exception $e) {
1026 if (isset($_POST[
'genre_id'])) {
1028 $genre =
$genreDAO->find((
int)$_POST[
'genre_id']);
1030 $user->setGenreUtilisateur($genre);
1035 if (isset($_FILES[
'photo']) && $_FILES[
'photo'][
'error'] === UPLOAD_ERR_OK) {
1036 $uploadDir =
'assets/images/profile_pictures/';
1038 if (!is_dir($uploadDir)) {
1039 mkdir($uploadDir, 0777,
true);
1042 $extension = pathinfo($_FILES[
'photo'][
'name'], PATHINFO_EXTENSION);
1043 $nomFichier =
'profile_' . uniqid() .
'.' . $extension;
1044 $cheminCible = $uploadDir . $nomFichier;
1046 if (move_uploaded_file($_FILES[
'photo'][
'tmp_name'], $cheminCible)) {
1047 $anciennePhoto = $user->geturlPhotoUtilisateur();
1049 if ($anciennePhoto && strpos($anciennePhoto,
'default.png') ===
false && file_exists($anciennePhoto)) {
1050 @unlink($anciennePhoto);
1052 $user->seturlPhotoUtilisateur($cheminCible);
1057 if ($uDAO->update($user, $emailActuel)) {
1059 $_SESSION[
'user_pseudo'] = $user->getPseudoUtilisateur();
1060 $_SESSION[
'user_photo'] = $user->geturlPhotoUtilisateur();
1063 $_SESSION[
'user_email'] = $user->getEmailUtilisateur();
1066 $this->
redirectTo(
'utilisateur',
'afficherGestionProfil', [
'success' => 1]);
1099 if ($_SERVER[
'REQUEST_METHOD'] !==
'POST' || !isset($_SESSION[
'user_email'])) {
1104 $user = $uDAO->find($_SESSION[
'user_email']);
1111 $actuel = $_POST[
'ancien_mdp'] ??
'';
1112 $nouveau = $_POST[
'nouveau_mdp'] ??
'';
1113 $repeter = $_POST[
'repeter_mdp'] ??
'';
1116 if (!password_verify($actuel, $user->getMotDePasseUtilisateur())) {
1117 $this->
redirectTo(
'utilisateur',
'afficherSecurite', [
'error' =>
'actuel']);
1121 if ($nouveau !== $repeter) {
1122 $this->
redirectTo(
'utilisateur',
'afficherSecurite', [
'error' =>
'match']);
1126 $regex =
'/^(?=.*[a-zA-Z])(?=.*[0-9!@#$%^&*(),.?":{}|<>]).{10,}$/';
1127 if (!preg_match($regex, $nouveau)) {
1128 $this->
redirectTo(
'utilisateur',
'afficherSecurite', [
'error' =>
'force']);
1132 $user->setMotDePasseUtilisateur(password_hash($nouveau, PASSWORD_ARGON2ID));
1134 if ($uDAO->update($user)) {
1137 $this->
redirectTo(
'home',
'afficher', [
'success_psw' => 1]);
1139 $this->
redirectTo(
'utilisateur',
'afficherSecurite', [
'error' =>
'db']);