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_logged_in'] =
true;
129 'message' =>
'Connexion réussie!',
131 'email' => $utilisateur->getEmailUtilisateur(),
132 'pseudo' => $utilisateur->getPseudoUtilisateur()
135 }
catch (Exception $e) {
136 header(
'Content-Type: application/json');
139 'message' =>
'Une erreur est survenue lors de la connexion. Veuillez réessayer plus tard (' . $e->getMessage() .
').'
158 if ($_SERVER[
'REQUEST_METHOD'] !==
'POST') {
163 header(
'Content-Type: application/json');
169 'artiste' =>
'artiste',
170 'auditeur' =>
'auditeur',
171 'producteur' =>
'producteur'
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;
188 if (!array_key_exists($userType, $allowedTypes)) {
189 $errors[] =
'Le type de profil sélectionné est invalide.';
195 'obligatoire' =>
true,
198 'longueur_max' => 255
201 'obligatoire' =>
true,
204 'longueur_max' => 50,
205 'pseudo_format' => true
208 'obligatoire' =>
true,
210 'longueur_min' => 10,
211 'longueur_max' => 1000
214 'obligatoire' =>
false,
215 'format' => FILTER_VALIDATE_URL
218 'obligatoire' =>
true,
221 'longueur_max' => 320,
222 'format' => FILTER_VALIDATE_EMAIL
225 'obligatoire' =>
true,
230 'obligatoire' =>
true,
233 'longueur_max' => 128,
234 'mot_de_passe_fort' => true
241 'description' => $description,
242 'website' => $website,
244 'birthdate' => $birthdate,
245 'password' => $password
248 $validator =
new Validator($signupRules);
249 if (!$validator->valider($signupData)) {
250 $errors = array_merge($errors, $validator->getMessagesErreurs());
254 if ($password !== $passwordRepeat) {
255 $errors[] =
'Les mots de passe ne correspondent pas.';
259 if ($userType !=
'auditeur') {
261 $errors[] =
'Veuillez sélectionner un genre musical.';
265 $genre = $genreDao->find((
int)$genreId);
266 }
catch (Exception $e) {
270 $errors[] =
'Le genre sélectionné est invalide.';
278 if ($email !==
'' && $utilisateurDAO->existsByEmail($email)) {
279 $errors[] =
'Un compte existe déjà avec cette adresse e-mail.';
282 if ($pseudo !==
'' && $utilisateurDAO->existsByPseudo($pseudo)) {
283 $errors[] =
'Ce nom ou pseudonyme est déjà utilisé.';
286 if (!empty($errors)) {
289 'message' => implode(
' ', $errors)
295 $birthDateTime = DateTime::createFromFormat(
'Y-m-d', $birthdate);
298 $role = $roleDao->findByType($allowedTypes[$userType]);
303 'message' =>
'Impossible de déterminer le rôle à attribuer à ce compte.'
308 $hashedPassword = password_hash($password, PASSWORD_ARGON2ID);
309 $createdAt = (
new DateTime())->format(
'Y-m-d H:i:s');
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);
328 $utilisateur->setDateDebutAbonnement(
null);
329 $utilisateur->setDateFinAbonnement(
null);
330 $utilisateur->setPointsDeRenommeeArtiste(
null);
331 $utilisateur->setNbAbonnesArtiste(
null);
332 $utilisateur->seturlPhotoUtilisateur(
null);
333 $utilisateur->setRoleUtilisateur($role);
335 $creationReussie = $utilisateurDAO->create($utilisateur);
337 if ($creationReussie) {
340 $emailSender->sendWelcomeEmail(
341 $utilisateur->getEmailUtilisateur(),
342 $utilisateur->getPseudoUtilisateur(),
348 'message' =>
'Votre compte a été créé! Vérifiez vos e-mails pour confirmer votre inscription.',
350 'email' => $utilisateur->getEmailUtilisateur(),
351 'pseudo' => $utilisateur->getPseudoUtilisateur(),
358 'message' =>
'Impossible de créer votre compte pour le moment.'
361 }
catch (Exception $e) {
364 'message' =>
'Impossible de créer votre compte pour le moment (' . $e->getMessage() .
').'
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';
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.";
408 $role = $roleDao->findByType($roleType);
412 $user->setPseudoUtilisateur($pseudo);
413 $user->setNomUtilisateur($pseudo);
414 $user->setEmailUtilisateur($email);
415 $user->setMotDePasseUtilisateur(password_hash($password, PASSWORD_ARGON2ID));
416 $user->setRoleUtilisateur($role);
418 $user->setDateInscriptionUtilisateur(
new DateTime());
419 $user->setDateDeNaissanceUtilisateur(
new DateTime(
'2000-01-01'));
421 $user->setStatutUtilisateur(\StatutUtilisateur::Actif);
422 $user->setEstAbonnee(
false);
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);
434 if ($utilisateurDAO->create($user)) {
435 $this->
redirectTo(
'admin',
'afficher', [
'success' => 1]);
438 $error =
"Erreur lors de la création en base de données.";
441 $error =
"Rôle introuvable.";
443 }
catch (Exception $e) {
444 $error =
"Erreur système: " . $e->getMessage();
449 $template = $this->
getTwig()->load(
'utilisateur_ajout.html.twig');
450 echo $template->render([
451 'page' => [
'title' =>
'Ajouter Utilisateur'],
452 'session' => $_SESSION,
552 $pseudo = $_GET[
'pseudo'] ??
null;
562 $utilisateur = $utilisateurDAO->findByPseudo($pseudo);
565 $estAbonneAArtiste =
false;
566 if (isset($_SESSION[
'user_email'])) {
567 $estAbonneAArtiste = $utilisateurDAO->estAbonneAArtiste($_SESSION[
'user_email'], $utilisateur->getEmailUtilisateur());
575 $emailArtiste = $utilisateur->getEmailUtilisateur();
577 $albums = $albumDAO->findAllByArtistEmail($emailArtiste);
579 $template = $this->
getTwig()->load(
'artiste_profil.html.twig');
580 echo $template->render([
581 'session' => $_SESSION,
582 'utilisateur' => $utilisateur,
584 'estAbonneAArtiste' => $estAbonneAArtiste
598 header(
'Content-Type: application/json');
601 if (!isset($_SESSION[
'user_email'])) {
602 echo json_encode([
'success' =>
false,
'message' =>
'Non connecté']);
606 $emailArtiste = $_POST[
'emailArtiste'] ??
null;
607 $emailAbonne = $_SESSION[
'user_email'];
610 if ($emailAbonne === $emailArtiste) {
613 'message' =>
'Vous ne pouvez pas vous abonner à votre propre profil.'
621 $result = $dao->basculerAbonnement($emailAbonne, $emailArtiste);
623 $increment = ($result ===
'followed') ? 1 : -1;
624 $dao->updateNbAbonnes($emailArtiste, $increment);
626 $artisteAJour = $dao->find($emailArtiste);
627 $nouveauNombre = $artisteAJour ? $artisteAJour->getNbAbonnesArtiste() : 0;
632 'newText' => ($result ===
'followed') ?
'Abonné(e)' :
'S\'abonner',
633 'nbAbonnes' => $nouveauNombre
636 echo json_encode([
'success' =>
false,
'message' =>
'Email artiste manquant']);
678 if ($_SERVER[
'REQUEST_METHOD'] !==
'POST') {
683 header(
'Content-Type: application/json');
686 $email = strtolower(trim(
$post[
'email'] ??
''));
691 'obligatoire' =>
true,
693 'format' => FILTER_VALIDATE_EMAIL
698 if (!$validator->valider([
'email' => $email])) {
701 'message' =>
'Veuillez fournir une adresse email valide.'
708 $utilisateur = $utilisateurDAO->find($email);
711 $messageSucces =
'Si cette adresse email est associée à un compte, vous recevrez un email de réinitialisation dans quelques instants.';
718 'message' => $messageSucces
724 $statut = $utilisateur->getStatutUtilisateur();
725 if ($statut && $statut !== StatutUtilisateur::Actif) {
728 'message' => $messageSucces
735 $token = $tokenDAO->create($email);
740 'message' =>
'Une erreur est survenue. Veuillez réessayer plus tard.'
747 $emailSender->sendPasswordResetEmail(
748 $utilisateur->getEmailUtilisateur(),
749 $utilisateur->getPseudoUtilisateur(),
755 'message' => $messageSucces
757 }
catch (Exception $e) {
758 error_log(
'Erreur réinitialisation mot de passe: ' . $e->getMessage());
761 'message' =>
'Une erreur est survenue. Veuillez réessayer plus tard.'
829 if ($_SERVER[
'REQUEST_METHOD'] !==
'POST') {
834 header(
'Content-Type: application/json');
837 $tokenValue = trim(
$post[
'token'] ??
'');
838 $password =
$post[
'password'] ??
'';
839 $passwordRepeat =
$post[
'password_repeat'] ??
'';
844 if (empty($tokenValue)) {
845 $errors[] =
'Token de réinitialisation manquant.';
851 'obligatoire' =>
true,
854 'longueur_max' => 128,
855 'mot_de_passe_fort' => true
859 $validator =
new Validator($passwordRules);
860 if (!$validator->valider([
'password' => $password])) {
861 $errors = array_merge($errors, $validator->getMessagesErreurs());
865 if ($password !== $passwordRepeat) {
866 $errors[] =
'Les mots de passe ne correspondent pas.';
869 if (!empty($errors)) {
872 'message' => implode(
' ', $errors)
879 $token = $tokenDAO->findValidToken($tokenValue);
884 'message' =>
'Ce lien de réinitialisation est invalide ou a expiré. Veuillez faire une nouvelle demande.'
890 $updateResult = $tokenDAO->updatePassword($token->getEmailUtilisateur(), $password);
892 if (!$updateResult) {
895 'message' =>
'Une erreur est survenue lors de la mise à jour du mot de passe.'
901 $tokenDAO->markAsUsed($tokenValue);
904 $tokenDAO->invalidateTokensForUser($token->getEmailUtilisateur());
908 'message' =>
'Votre mot de passe a été réinitialisé avec succès. Vous pouvez maintenant vous connecter.'
910 }
catch (Exception $e) {
911 error_log(
'Erreur traitement réinitialisation: ' . $e->getMessage());
914 'message' =>
'Une erreur est survenue. Veuillez réessayer plus tard.'