Paaxio 1.0
Plateforme de streaming musical - SAE IUT Bayonne
Chargement...
Recherche...
Aucune correspondance
utilisateur.dao.php
Aller à la documentation de ce fichier.
1<?php
2
9{
13 private ?PDO $pdo;
14
19 public function __construct(?PDO $pdo)
20 {
21 $this->pdo = $pdo;
22 }
23
30 public function rechercher(string $term): array{
31 $sql = "SELECT u.*
32 FROM utilisateur u
33 JOIN role r ON u.roleUtilisateur = r.idRole
34 WHERE r.typeRole = 'artiste'
35 AND u.pseudoUtilisateur LIKE :term
36 ORDER BY u.pointsDeRenommeeArtiste DESC, u.nbAbonnesArtiste DESC
37 LIMIT 3";
38
39 $stmt = $this->pdo->prepare($sql);
40 $stmt->execute([':term' => '%' . $term . '%']);
41
42 return $this->hydrateAll($stmt->fetchAll(PDO::FETCH_ASSOC));
43 }
44
45
46 public function find(?string $emailUtilisateur): ?Utilisateur
47 {
48 $sql = "SELECT * FROM utilisateur WHERE emailUtilisateur = :emailUtilisateur";
49 $stmt = $this->pdo->prepare($sql);
50 $stmt->execute([':emailUtilisateur' => $emailUtilisateur]);
51 $row = $stmt->fetch(PDO::FETCH_ASSOC);
52 if ($row) {
53 return $this->hydrate($row);
54 }
55 return null;
56 }
57
63 public function findByPseudo(?string $pseudoUtilisateur): ?Utilisateur
64 {
65 $sql = "SELECT * FROM utilisateur WHERE pseudoUtilisateur = :pseudoUtilisateur";
66 $stmt = $this->pdo->prepare($sql);
67 $stmt->execute([':pseudoUtilisateur' => $pseudoUtilisateur]);
68 $row = $stmt->fetch(PDO::FETCH_ASSOC);
69 if ($row) {
70 return $this->hydrate($row);
71 }
72 return null;
73 }
74
80 public function existsByEmail(string $emailUtilisateur): bool
81 {
82 $sql = "SELECT COUNT(*) FROM utilisateur WHERE emailUtilisateur = :emailUtilisateur";
83 $stmt = $this->pdo->prepare($sql);
84 $stmt->execute([':emailUtilisateur' => $emailUtilisateur]);
85 return (bool)$stmt->fetchColumn();
86 }
87
94 public function findTrending(int $limit = 8, int $daysAgo = 7): array
95 {
96 /*
97 Requête SQL pour récupérer les artistes en tendance sur la plateforme
98 Les artistes sont classés selon un "score de tendance" basé sur :
99 - le nombre de nouveaux abonnés (pondéré 5)
100 - les utilisateurs ayant liké leurs chansons (pondéré 1)
101 - les votes reçus lors des battles (pondéré 3)
102 Le calcul s'effectue sur les 7 derniers jours uniquement
103 On ne retient que les artistes actifs (statut = 'actif' et rôle = 2)
104 Seuls les artistes avec un score de tendance strictement positif sont affichés (HAVING)
105 La requête retourne au maximum 8 artistes, triés par leur score de tendance décroissant
106 */
107
108 $sql = "SELECT
109 u.*,
110 -- Nombre d'abonnés récents (sur les X derniers jours)
111 COUNT(DISTINCT aa.emailAbonne) AS nouveaux_abonnes,
112 -- Nombre d'utilisateurs ayant liké une chanson de cet artiste (sur X jours)
113 COUNT(DISTINCT lc.emailUtilisateur) AS nouveaux_likes_chansons,
114 -- Nombre de votes reçus lors des battles (sur X jours)
115 COUNT(DISTINCT v.emailVotant) AS nouveaux_votes_battle,
116 -- Score de tendance global calculé avec pondération
117 (COUNT(DISTINCT aa.emailAbonne) * 5) +
118 (COUNT(DISTINCT lc.emailUtilisateur) * 1) +
119 (COUNT(DISTINCT v.emailVotant) * 3) AS score_tendence
120
121 FROM utilisateur u
122
123 /* Jointure avec les abonnements artistes : uniquement ceux très récents */
124 LEFT JOIN abonnementArtiste aa
125 ON u.emailUtilisateur = aa.emailArtiste
126 AND aa.dateAbonnement >= DATE_SUB(NOW(), INTERVAL :daysAgo DAY)
127
128 /* Jointure avec les chansons publiées par l'artiste */
129 LEFT JOIN chanson c
130 ON u.emailUtilisateur = c.emailPublicateur
131 /* Jointure pour récupérer les likes sur les chansons (sur les X derniers jours) */
132 LEFT JOIN likeChanson lc
133 ON c.idChanson = lc.idChanson
134 AND lc.dateLike >= DATE_SUB(NOW(), INTERVAL :daysAgo DAY)
135
136 /* Jointure pour les votes de battle reçus par l'artiste (sur X jours) */
137 LEFT JOIN vote v
138 ON u.emailUtilisateur = v.emailVotee
139 AND v.dateVote >= DATE_SUB(NOW(), INTERVAL :daysAgo DAY)
140
141 WHERE u.statutUtilisateur = 'actif' -- Seulement les utilisateurs actifs
142 AND u.roleUtilisateur = 2 -- Seulement les artistes
143
144 GROUP BY u.emailUtilisateur, u.pseudoUtilisateur, u.urlPhotoUtilisateur
145 HAVING score_tendence > 0 -- Seulement les artistes ayant un score positif
146 ORDER BY score_tendence DESC -- Tri par score décroissant
147 LIMIT :limit; -- Limite à N résultats
148 ";
149
150 if ($limit < 1) {
151 $limit = 8;
152 }
153
154 $stmt = $this->pdo->prepare($sql);
155 $stmt->bindValue(':daysAgo', $daysAgo, PDO::PARAM_INT);
156 $stmt->bindValue(':limit', $limit, PDO::PARAM_INT);
157 $stmt->execute();
158 $artistes = $stmt->fetchAll(PDO::FETCH_ASSOC);
159 $stmt->closeCursor();
160 if ($artistes) {
161 return $this->hydrateAll($artistes);
162 }
163 return [];
164 }
165
171 public function existsByPseudo(string $pseudoUtilisateur): bool
172 {
173 $sql = "SELECT COUNT(*) FROM utilisateur WHERE pseudoUtilisateur = :pseudoUtilisateur";
174 $stmt = $this->pdo->prepare($sql);
175 $stmt->execute([':pseudoUtilisateur' => $pseudoUtilisateur]);
176 return (bool)$stmt->fetchColumn();
177 }
178
184 private function hydrate(array $row): Utilisateur
185 {
186 $dateDeNaissance = $row['dateDeNaissanceUtilisateur'] ? new DateTime($row['dateDeNaissanceUtilisateur']) : null;
187 $dateInscription = $row['dateInscriptionUtilisateur'] ? new DateTime($row['dateInscriptionUtilisateur']) : null;
188 $dateDebutAbonnement = $row['dateDebutAbonnement'] ? new DateTime($row['dateDebutAbonnement']) : null;
189 $dateFinAbonnement = $row['dateFinAbonnement'] ? new DateTime($row['dateFinAbonnement']) : null;
190
191 $statutUtilisateur = $row['statutUtilisateur'] ? StatutUtilisateur::from($row['statutUtilisateur']) : null;
192 $statutAbonnement = $row['statutAbonnement'] ? StatutAbonnement::from($row['statutAbonnement']) : null;
193
194 $role = null;
195 if ($row['roleUtilisateur']) {
196 $roleDAO = new RoleDAO($this->pdo);
197 $role = $roleDAO->find((int)$row['roleUtilisateur']);
198 }
199
200 $genre = null;
201 if ($row['genreUtilisateur']) {
202 $genreDAO = new GenreDAO($this->pdo);
203 $genre = $genreDAO->find((int)$row['genreUtilisateur']);
204 }
205
206 return new Utilisateur(
207 $row['emailUtilisateur'],
208 $row['nomUtilisateur'],
209 $row['pseudoUtilisateur'],
210 $row['motDePasseUtilisateur'],
211 $dateDeNaissance,
212 $dateInscription,
213 $statutUtilisateur,
214 $genre,
215 (bool)$row['estAbonnee'],
216 $row['descriptionUtilisateur'],
217 $row['siteWebUtilisateur'],
218 $statutAbonnement,
219 $dateDebutAbonnement,
220 $dateFinAbonnement,
221 (int)$row['pointsDeRenommeeArtiste'],
222 (int)$row['nbAbonnesArtiste'],
223 $row['urlPhotoUtilisateur'],
224 $role,
225 );
226 }
227
232 public function findAll(): array
233 {
234 $sql = "SELECT * FROM utilisateur";
235 $stmt = $this->pdo->prepare($sql);
236 $stmt->execute();
237 return $this->hydrateAll($stmt->fetchAll(PDO::FETCH_ASSOC));
238 }
239
245 private function hydrateAll(array $rows): array
246 {
247 $utilisateurs = [];
248 foreach ($rows as $row) {
249 $utilisateurs[] = $this->hydrate($row);
250 }
251 return $utilisateurs;
252 }
253
259 public function create(Utilisateur $utilisateur): bool
260 {
261 $sql = "INSERT INTO utilisateur (emailUtilisateur, pseudoUtilisateur, motDePasseUtilisateur, dateDeNaissanceUtilisateur, dateInscriptionUtilisateur, statutUtilisateur, estAbonnee, statutAbonnement, dateDebutAbonnement, dateFinAbonnement, pointsDeRenommeeArtiste, nbAbonnesArtiste, urlPhotoUtilisateur, roleUtilisateur, descriptionUtilisateur, siteWebUtilisateur, genreUtilisateur, nomUtilisateur) VALUES (:emailUtilisateur, :pseudoUtilisateur, :motDePasseUtilisateur, :dateDeNaissanceUtilisateur, :dateInscriptionUtilisateur, :statutUtilisateur, :estAbonnee, :statutAbonnement, :dateDebutAbonnement, :dateFinAbonnement, :pointsDeRenommeeArtiste, :nbAbonnesArtiste, :urlPhotoUtilisateur, :roleUtilisateur, :descriptionUtilisateur, :siteWebUtilisateur, :genreUtilisateur, :nomUtilisateur)";
262 $stmt = $this->pdo->prepare($sql);
263
264 $dateDeNaissance = $utilisateur->getDateDeNaissanceUtilisateur()?->format('Y-m-d');
265 $dateInscription = $utilisateur->getDateInscriptionUtilisateur()?->format('Y-m-d H:i:s');
266 $dateDebutAbonnement = $utilisateur->getDateDebutAbonnement()?->format('Y-m-d');
267 $dateFinAbonnement = $utilisateur->getDateFinAbonnement()?->format('Y-m-d');
268 $statutUtilisateur = $utilisateur->getStatutUtilisateur()?->value;
269 $statutAbonnement = $utilisateur->getStatutAbonnement()?->value;
270 $roleId = $utilisateur->getRoleUtilisateur()?->getIdRole();
271 $genreId = $utilisateur->getGenreUtilisateur()?->getIdGenre();
272
273 return $stmt->execute([
274 ':emailUtilisateur' => $utilisateur->getEmailUtilisateur(),
275 ':pseudoUtilisateur' => $utilisateur->getPseudoUtilisateur(),
276 ':motDePasseUtilisateur' => $utilisateur->getMotDePasseUtilisateur(),
277 ':dateDeNaissanceUtilisateur' => $dateDeNaissance,
278 ':dateInscriptionUtilisateur' => $dateInscription,
279 ':statutUtilisateur' => $statutUtilisateur,
280 ':estAbonnee' => $utilisateur->getEstAbonnee() ? 1 : 0,
281 ':statutAbonnement' => $statutAbonnement,
282 ':dateDebutAbonnement' => $dateDebutAbonnement,
283 ':dateFinAbonnement' => $dateFinAbonnement,
284 ':pointsDeRenommeeArtiste' => $utilisateur->getPointsDeRenommeeArtiste(),
285 ':nbAbonnesArtiste' => $utilisateur->getNbAbonnesArtiste(),
286 ':urlPhotoUtilisateur' => $utilisateur->geturlPhotoUtilisateur(),
287 ':roleUtilisateur' => $roleId,
288 ':descriptionUtilisateur' => $utilisateur->getDescriptionUtilisateur(),
289 ':siteWebUtilisateur' => $utilisateur->getSiteWebUtilisateur(),
290 ':genreUtilisateur' => $genreId,
291 ':nomUtilisateur' => $utilisateur->getNomUtilisateur(),
292 ]);
293 }
294
301 public function update(Utilisateur $utilisateur, string $emailActuel): bool
302 {
303 // Changement ici : on cherche par :emailActuel (l'ancien email)
304 $sql = "UPDATE utilisateur SET
305 emailUtilisateur = :emailUtilisateur,
306 pseudoUtilisateur = :pseudoUtilisateur,
307 motDePasseUtilisateur = :motDePasseUtilisateur,
308 dateDeNaissanceUtilisateur = :dateDeNaissanceUtilisateur,
309 dateInscriptionUtilisateur = :dateInscriptionUtilisateur,
310 statutUtilisateur = :statutUtilisateur,
311 estAbonnee = :estAbonnee,
312 statutAbonnement = :statutAbonnement,
313 dateDebutAbonnement = :dateDebutAbonnement,
314 dateFinAbonnement = :dateFinAbonnement,
315 pointsDeRenommeeArtiste = :pointsDeRenommeeArtiste,
316 nbAbonnesArtiste = :nbAbonnesArtiste,
317 urlPhotoUtilisateur = :urlPhotoUtilisateur,
318 roleUtilisateur = :roleUtilisateur,
319 descriptionUtilisateur = :descriptionUtilisateur,
320 siteWebUtilisateur = :siteWebUtilisateur,
321 genreUtilisateur = :genreUtilisateur,
322 nomUtilisateur = :nomUtilisateur
323 WHERE emailUtilisateur = :emailActuel";
324
325 $stmt = $this->pdo->prepare($sql);
326
327 $dateDeNaissance = $utilisateur->getDateDeNaissanceUtilisateur()?->format('Y-m-d');
328 $dateInscription = $utilisateur->getDateInscriptionUtilisateur()?->format('Y-m-d H:i:s');
329 $dateDebutAbonnement = $utilisateur->getDateDebutAbonnement()?->format('Y-m-d');
330 $dateFinAbonnement = $utilisateur->getDateFinAbonnement()?->format('Y-m-d');
331 $statutUtilisateur = $utilisateur->getStatutUtilisateur()?->value;
332 $statutAbonnement = $utilisateur->getStatutAbonnement()?->value;
333 $roleId = $utilisateur->getRoleUtilisateur()?->getIdRole();
334 $genreId = $utilisateur->getGenreUtilisateur()?->getIdGenre();
335
336 return $stmt->execute([
337 ':emailUtilisateur' => $utilisateur->getEmailUtilisateur(),
338 ':pseudoUtilisateur' => $utilisateur->getPseudoUtilisateur(),
339 ':motDePasseUtilisateur' => $utilisateur->getMotDePasseUtilisateur(),
340 ':dateDeNaissanceUtilisateur' => $dateDeNaissance,
341 ':dateInscriptionUtilisateur' => $dateInscription,
342 ':statutUtilisateur' => $statutUtilisateur,
343 ':estAbonnee' => $utilisateur->getEstAbonnee() ? 1 : 0,
344 ':statutAbonnement' => $statutAbonnement,
345 ':dateDebutAbonnement' => $dateDebutAbonnement,
346 ':dateFinAbonnement' => $dateFinAbonnement,
347 ':pointsDeRenommeeArtiste' => $utilisateur->getPointsDeRenommeeArtiste(),
348 ':nbAbonnesArtiste' => $utilisateur->getNbAbonnesArtiste(),
349 ':urlPhotoUtilisateur' => $utilisateur->geturlPhotoUtilisateur(),
350 ':roleUtilisateur' => $roleId,
351 ':descriptionUtilisateur' => $utilisateur->getDescriptionUtilisateur(),
352 ':siteWebUtilisateur' => $utilisateur->getSiteWebUtilisateur(),
353 ':genreUtilisateur' => $genreId,
354 ':nomUtilisateur' => $utilisateur->getNomUtilisateur(),
355 ':emailActuel' => $emailActuel,
356 ]);
357 }
363 public function delete(?string $emailUtilisateur): bool
364 {
365 $sql = "DELETE FROM utilisateur WHERE emailUtilisateur = :emailUtilisateur";
366 $stmt = $this->pdo->prepare($sql);
367 return $stmt->execute([':emailUtilisateur' => $emailUtilisateur]);
368 }
369
374 public function getPdo(): ?PDO
375 {
376 return $this->pdo;
377 }
378
384 public function setPdo($pdo): void
385 {
386 $this->pdo = $pdo;
387 }
388
395 public function findAllArtistes(string $excludeEmail): array
396 {
397 // First, get the current user to find their genre
398 $currentUser = $this->find($excludeEmail);
399 $genreId = $currentUser?->getGenreUtilisateur()?->getIdGenre();
400
401 $params = [':excludeEmail' => $excludeEmail];
402
403 // Prioritize artists from the same genre if the current user has a genre
404 if ($genreId) {
405 $sql = "SELECT u.*
406 FROM utilisateur u
407 JOIN role r ON u.roleUtilisateur = r.idRole
408 WHERE r.typeRole = 'artiste'
409 AND u.emailUtilisateur != :excludeEmail
410 AND u.genreUtilisateur = :genreId
411 ORDER BY u.pointsDeRenommeeArtiste DESC, u.dateInscriptionUtilisateur DESC
412 LIMIT 10";
413 $params[':genreId'] = $genreId;
414
415 try {
416 $requete = $this->pdo->prepare($sql);
417 $requete->execute($params);
418 $artistes = $this->hydrateAll($requete->fetchAll(PDO::FETCH_ASSOC));
419 if (!empty($artistes)) {
420 return $artistes;
421 }
422 } catch (PDOException $e) {
423 error_log('Erreur DAO lors de la récupération des artistes : ' . $e->getMessage());
424 }
425 }
426
427 // Fallback:
428 $sql = "SELECT u.*
429 FROM utilisateur u
430 JOIN role r ON u.roleUtilisateur = r.idRole
431 WHERE r.typeRole = 'artiste'
432 AND u.emailUtilisateur != :excludeEmail
433 ORDER BY u.pointsDeRenommeeArtiste DESC, u.dateInscriptionUtilisateur DESC
434 LIMIT 10";
435
436 try {
437 $requete = $this->pdo->prepare($sql);
438 $requete->execute([':excludeEmail' => $excludeEmail]);
439 return $this->hydrateAll($requete->fetchAll(PDO::FETCH_ASSOC));
440 } catch (PDOException $e) {
441 error_log('Erreur DAO lors de la récupération des artistes populaires : ' . $e->getMessage());
442 return [];
443 }
444 }
445
451 public function countFollowers(string $emailArtiste): int
452 {
453 $sql = "SELECT COUNT(*) FROM abonnementArtiste WHERE emailArtiste = :email";
454 $stmt = $this->pdo->prepare($sql);
455 $stmt->execute([':email' => $emailArtiste]);
456 return (int)$stmt->fetchColumn();
457 }
458
464 public function estAbonneAArtiste(string $emailAbonne, string $emailArtiste): bool
465 {
466 $sql = "SELECT COUNT(*) FROM abonnementArtiste WHERE emailAbonne = :abonne AND emailArtiste = :artiste";
467 $stmt = $this->pdo->prepare($sql);
468 $stmt->execute([':abonne' => $emailAbonne, ':artiste' => $emailArtiste]);
469 return (bool)$stmt->fetchColumn();
470 }
471
478 public function basculerAbonnement(string $emailAbonne, string $emailArtiste): string
479 {
480 if ($this->estAbonneAArtiste($emailAbonne, $emailArtiste)) {
481 $sql = "DELETE FROM abonnementArtiste WHERE emailAbonne = :abonne AND emailArtiste = :artiste";
482 $this->pdo->prepare($sql)->execute([':abonne' => $emailAbonne, ':artiste' => $emailArtiste]);
483 return 'unfollowed';
484 } else {
485 $sql = "INSERT INTO abonnementArtiste (emailAbonne, emailArtiste) VALUES (:abonne, :artiste)";
486 $this->pdo->prepare($sql)->execute([':abonne' => $emailAbonne, ':artiste' => $emailArtiste]);
487 return 'followed';
488 }
489 }
490
497 public function updateNbAbonnes(string $emailArtiste, int $increment): bool
498 {
499 $sql = "UPDATE utilisateur
500 SET nbAbonnesArtiste = nbAbonnesArtiste + :increment
501 WHERE emailUtilisateur = :emailArtiste";
502
503 $stmt = $this->pdo->prepare($sql);
504 return $stmt->execute([
505 ':increment' => $increment,
506 ':emailArtiste' => $emailArtiste
507 ]);
508 }
509}
existsByEmail(string $emailUtilisateur)
Vérifie si un utilisateur existe par son adresse email.
hydrate(array $row)
Hydrate un tableau de données en une instance de Utilisateur.
update(Utilisateur $utilisateur, string $emailActuel)
Met à jour un utilisateur dans la base de données.
find(?string $emailUtilisateur)
rechercher(string $term)
Récupère un utilisateur par son adresse email.
existsByPseudo(string $pseudoUtilisateur)
Vérifie si un utilisateur existe par son pseudo.
estAbonneAArtiste(string $emailAbonne, string $emailArtiste)
Vérifie si un utilisateur est abonné à un artiste.
findTrending(int $limit=8, int $daysAgo=7)
Récupère les artistes en tendance sur la plateforme.
updateNbAbonnes(string $emailArtiste, int $increment)
Met à jour le compteur d'abonnés d'un artiste.
countFollowers(string $emailArtiste)
Compte le nombre d'abonnés d'un artiste.
setPdo($pdo)
Setter pour la pdo.
findByPseudo(?string $pseudoUtilisateur)
Récupère un utilisateur par son pseudo.
create(Utilisateur $utilisateur)
Crée un nouvel utilisateur dans la base de données.
findAllArtistes(string $excludeEmail)
Récupère une liste d'artistes populaires, en priorisant ceux du même genre que l'utilisateur donné.
findAll()
Récupère tous les utilisateurs de la base de données.
getPdo()
Getter pour la pdo.
hydrateAll(array $rows)
Hydrate plusieurs utilisateurs à partir d'un tableau de données.
__construct(?PDO $pdo)
Constructeur de la classe UtilisateurDAO.
basculerAbonnement(string $emailAbonne, string $emailArtiste)
Bascule l'état d'abonnement d'un utilisateur à un artiste.
getNbAbonnesArtiste()
Getter pour nbAbonnesArtiste.
getStatutAbonnement()
Getter pour statutAbonnement.
getNomUtilisateur()
Getter pour le nom de l'utilisateur.
getDateInscriptionUtilisateur()
Getter pour la date d'inscription de l'utilisateur.
getPointsDeRenommeeArtiste()
Getter pour pointsDeRenommeeArtiste.
getDateDeNaissanceUtilisateur()
Getter pour la date de naissance de l'utilisateur.
getPseudoUtilisateur()
Getter pour le pseudo de l'utilisateur.
getDescriptionUtilisateur()
Getter pour descriptionUtilisateur.
geturlPhotoUtilisateur()
Getter pour urlPhotoUtilisateur.
getDateFinAbonnement()
Getter pour dateFinAbonnement.
getSiteWebUtilisateur()
Getter pour siteWebUtilisateur.
getMotDePasseUtilisateur()
Getter pour le mot de passe de l'utilisateur.
getEmailUtilisateur()
Getter pour l'email de l'utilisateur.
getRoleUtilisateur()
Getter pour roleUtilisateur.
getDateDebutAbonnement()
Getter pour dateDebutAbonnement.
getEstAbonnee()
Getter pour estAbonnee.
getGenreUtilisateur()
Getter pour le genre musical préféré
getStatutUtilisateur()
Getter pour le statut de l'utilisateur.
$pdo
Classe de gestion de la connexion MySQL.
Definition include.php:328
$genreDAO
Definition include.php:329