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
29 public function find(?string $emailUtilisateur): ?Utilisateur
30 {
31 $sql = "SELECT * FROM utilisateur WHERE emailUtilisateur = :emailUtilisateur";
32 $stmt = $this->pdo->prepare($sql);
33 $stmt->execute([':emailUtilisateur' => $emailUtilisateur]);
34 $row = $stmt->fetch(PDO::FETCH_ASSOC);
35 if ($row) {
36 return $this->hydrate($row);
37 }
38 return null;
39 }
40
46 public function findByPseudo(?string $pseudoUtilisateur): ?Utilisateur
47 {
48 $sql = "SELECT * FROM utilisateur WHERE pseudoUtilisateur = :pseudoUtilisateur";
49 $stmt = $this->pdo->prepare($sql);
50 $stmt->execute([':pseudoUtilisateur' => $pseudoUtilisateur]);
51 $row = $stmt->fetch(PDO::FETCH_ASSOC);
52 if ($row) {
53 return $this->hydrate($row);
54 }
55 return null;
56 }
57
63 public function existsByEmail(string $emailUtilisateur): bool
64 {
65 $sql = "SELECT COUNT(*) FROM utilisateur WHERE emailUtilisateur = :emailUtilisateur";
66 $stmt = $this->pdo->prepare($sql);
67 $stmt->execute([':emailUtilisateur' => $emailUtilisateur]);
68 return (bool)$stmt->fetchColumn();
69 }
70
77 public function findTrending(int $limit = 8, int $daysAgo = 7): array
78 {
79 /*
80 Requête SQL pour récupérer les artistes en tendance sur la plateforme
81 Les artistes sont classés selon un "score de tendance" basé sur :
82 - le nombre de nouveaux abonnés (pondéré 5)
83 - les utilisateurs ayant liké leurs chansons (pondéré 1)
84 - les votes reçus lors des battles (pondéré 3)
85 Le calcul s'effectue sur les 7 derniers jours uniquement
86 On ne retient que les artistes actifs (statut = 'actif' et rôle = 2)
87 Seuls les artistes avec un score de tendance strictement positif sont affichés (HAVING)
88 La requête retourne au maximum 8 artistes, triés par leur score de tendance décroissant
89 */
90
91 $sql = "SELECT
92 u.*,
93 -- Nombre d'abonnés récents (sur les X derniers jours)
94 COUNT(DISTINCT aa.emailAbonne) AS nouveaux_abonnes,
95 -- Nombre d'utilisateurs ayant liké une chanson de cet artiste (sur X jours)
96 COUNT(DISTINCT lc.emailUtilisateur) AS nouveaux_likes_chansons,
97 -- Nombre de votes reçus lors des battles (sur X jours)
98 COUNT(DISTINCT v.emailVotant) AS nouveaux_votes_battle,
99 -- Score de tendance global calculé avec pondération
100 (COUNT(DISTINCT aa.emailAbonne) * 5) +
101 (COUNT(DISTINCT lc.emailUtilisateur) * 1) +
102 (COUNT(DISTINCT v.emailVotant) * 3) AS score_tendence
103
104 FROM utilisateur u
105
106 /* Jointure avec les abonnements artistes : uniquement ceux très récents */
107 LEFT JOIN abonnementArtiste aa
108 ON u.emailUtilisateur = aa.emailArtiste
109 AND aa.dateAbonnement >= DATE_SUB(NOW(), INTERVAL :daysAgo DAY)
110
111 /* Jointure avec les chansons publiées par l'artiste */
112 LEFT JOIN chanson c
113 ON u.emailUtilisateur = c.emailPublicateur
114 /* Jointure pour récupérer les likes sur les chansons (sur les X derniers jours) */
115 LEFT JOIN likeChanson lc
116 ON c.idChanson = lc.idChanson
117 AND lc.dateLike >= DATE_SUB(NOW(), INTERVAL :daysAgo DAY)
118
119 /* Jointure pour les votes de battle reçus par l'artiste (sur X jours) */
120 LEFT JOIN vote v
121 ON u.emailUtilisateur = v.emailVotee
122 AND v.dateVote >= DATE_SUB(NOW(), INTERVAL :daysAgo DAY)
123
124 WHERE u.statutUtilisateur = 'actif' -- Seulement les utilisateurs actifs
125 AND u.roleUtilisateur = 2 -- Seulement les artistes
126
127 GROUP BY u.emailUtilisateur, u.pseudoUtilisateur, u.urlPhotoUtilisateur
128 HAVING score_tendence > 0 -- Seulement les artistes ayant un score positif
129 ORDER BY score_tendence DESC -- Tri par score décroissant
130 LIMIT :limit; -- Limite à N résultats
131 ";
132
133 if ($limit < 1) {
134 $limit = 8;
135 }
136
137 $stmt = $this->pdo->prepare($sql);
138 $stmt->bindValue(':daysAgo', $daysAgo, PDO::PARAM_INT);
139 $stmt->bindValue(':limit', $limit, PDO::PARAM_INT);
140 $stmt->execute();
141 $artistes = $stmt->fetchAll(PDO::FETCH_ASSOC);
142 $stmt->closeCursor();
143 if ($artistes) {
144 return $this->hydrateAll($artistes);
145 }
146 return [];
147 }
148
154 public function existsByPseudo(string $pseudoUtilisateur): bool
155 {
156 $sql = "SELECT COUNT(*) FROM utilisateur WHERE pseudoUtilisateur = :pseudoUtilisateur";
157 $stmt = $this->pdo->prepare($sql);
158 $stmt->execute([':pseudoUtilisateur' => $pseudoUtilisateur]);
159 return (bool)$stmt->fetchColumn();
160 }
161
167 private function hydrate(array $row): Utilisateur
168 {
169 $dateDeNaissance = $row['dateDeNaissanceUtilisateur'] ? new DateTime($row['dateDeNaissanceUtilisateur']) : null;
170 $dateInscription = $row['dateInscriptionUtilisateur'] ? new DateTime($row['dateInscriptionUtilisateur']) : null;
171 $dateDebutAbonnement = $row['dateDebutAbonnement'] ? new DateTime($row['dateDebutAbonnement']) : null;
172 $dateFinAbonnement = $row['dateFinAbonnement'] ? new DateTime($row['dateFinAbonnement']) : null;
173
174 $statutUtilisateur = $row['statutUtilisateur'] ? StatutUtilisateur::from($row['statutUtilisateur']) : null;
175 $statutAbonnement = $row['statutAbonnement'] ? StatutAbonnement::from($row['statutAbonnement']) : null;
176
177 $role = null;
178 if ($row['roleUtilisateur']) {
179 $roleDAO = new RoleDAO($this->pdo);
180 $role = $roleDAO->find((int)$row['roleUtilisateur']);
181 }
182
183 $genre = null;
184 if ($row['genreUtilisateur']) {
185 $genreDAO = new GenreDAO($this->pdo);
186 $genre = $genreDAO->find((int)$row['genreUtilisateur']);
187 }
188
189 return new Utilisateur(
190 $row['emailUtilisateur'],
191 $row['nomUtilisateur'],
192 $row['pseudoUtilisateur'],
193 $row['motDePasseUtilisateur'],
194 $dateDeNaissance,
195 $dateInscription,
196 $statutUtilisateur,
197 $genre,
198 (bool)$row['estAbonnee'],
199 $row['descriptionUtilisateur'],
200 $row['siteWebUtilisateur'],
201 $statutAbonnement,
202 $dateDebutAbonnement,
203 $dateFinAbonnement,
204 (int)$row['pointsDeRenommeeArtiste'],
205 (int)$row['nbAbonnesArtiste'],
206 $row['urlPhotoUtilisateur'],
207 $role,
208 );
209 }
210
215 public function findAll(): array
216 {
217 $sql = "SELECT * FROM utilisateur";
218 $stmt = $this->pdo->prepare($sql);
219 $stmt->execute();
220 return $this->hydrateAll($stmt->fetchAll(PDO::FETCH_ASSOC));
221 }
222
228 private function hydrateAll(array $rows): array
229 {
230 $utilisateurs = [];
231 foreach ($rows as $row) {
232 $utilisateurs[] = $this->hydrate($row);
233 }
234 return $utilisateurs;
235 }
236
242 public function create(Utilisateur $utilisateur): bool
243 {
244 $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)";
245 $stmt = $this->pdo->prepare($sql);
246
247 $dateDeNaissance = $utilisateur->getDateDeNaissanceUtilisateur()?->format('Y-m-d');
248 $dateInscription = $utilisateur->getDateInscriptionUtilisateur()?->format('Y-m-d H:i:s');
249 $dateDebutAbonnement = $utilisateur->getDateDebutAbonnement()?->format('Y-m-d');
250 $dateFinAbonnement = $utilisateur->getDateFinAbonnement()?->format('Y-m-d');
251 $statutUtilisateur = $utilisateur->getStatutUtilisateur()?->value;
252 $statutAbonnement = $utilisateur->getStatutAbonnement()?->value;
253 $roleId = $utilisateur->getRoleUtilisateur()?->getIdRole();
254 $genreId = $utilisateur->getGenreUtilisateur()?->getIdGenre();
255
256 return $stmt->execute([
257 ':emailUtilisateur' => $utilisateur->getEmailUtilisateur(),
258 ':pseudoUtilisateur' => $utilisateur->getPseudoUtilisateur(),
259 ':motDePasseUtilisateur' => $utilisateur->getMotDePasseUtilisateur(),
260 ':dateDeNaissanceUtilisateur' => $dateDeNaissance,
261 ':dateInscriptionUtilisateur' => $dateInscription,
262 ':statutUtilisateur' => $statutUtilisateur,
263 ':estAbonnee' => $utilisateur->getEstAbonnee() ? 1 : 0,
264 ':statutAbonnement' => $statutAbonnement,
265 ':dateDebutAbonnement' => $dateDebutAbonnement,
266 ':dateFinAbonnement' => $dateFinAbonnement,
267 ':pointsDeRenommeeArtiste' => $utilisateur->getPointsDeRenommeeArtiste(),
268 ':nbAbonnesArtiste' => $utilisateur->getNbAbonnesArtiste(),
269 ':urlPhotoUtilisateur' => $utilisateur->geturlPhotoUtilisateur(),
270 ':roleUtilisateur' => $roleId,
271 ':descriptionUtilisateur' => $utilisateur->getDescriptionUtilisateur(),
272 ':siteWebUtilisateur' => $utilisateur->getSiteWebUtilisateur(),
273 ':genreUtilisateur' => $genreId,
274 ':nomUtilisateur' => $utilisateur->getNomUtilisateur(),
275 ]);
276 }
277
283 public function update(Utilisateur $utilisateur): bool
284 {
285 $sql = "UPDATE utilisateur SET pseudoUtilisateur = :pseudoUtilisateur, motDePasseUtilisateur = :motDePasseUtilisateur, dateDeNaissanceUtilisateur = :dateDeNaissanceUtilisateur, dateInscriptionUtilisateur = :dateInscriptionUtilisateur, statutUtilisateur = :statutUtilisateur, estAbonnee = :estAbonnee, statutAbonnement = :statutAbonnement, dateDebutAbonnement = :dateDebutAbonnement, dateFinAbonnement = :dateFinAbonnement, pointsDeRenommeeArtiste = :pointsDeRenommeeArtiste, nbAbonnesArtiste = :nbAbonnesArtiste, urlPhotoUtilisateur = :urlPhotoUtilisateur, roleUtilisateur = :roleUtilisateur, descriptionUtilisateur = :descriptionUtilisateur, siteWebUtilisateur = :siteWebUtilisateur, genreUtilisateur = :genreUtilisateur, nomUtilisateur = :nomUtilisateur WHERE emailUtilisateur = :emailUtilisateur";
286 $stmt = $this->pdo->prepare($sql);
287
288 $dateDeNaissance = $utilisateur->getDateDeNaissanceUtilisateur()?->format('Y-m-d');
289 $dateInscription = $utilisateur->getDateInscriptionUtilisateur()?->format('Y-m-d H:i:s');
290 $dateDebutAbonnement = $utilisateur->getDateDebutAbonnement()?->format('Y-m-d');
291 $dateFinAbonnement = $utilisateur->getDateFinAbonnement()?->format('Y-m-d');
292 $statutUtilisateur = $utilisateur->getStatutUtilisateur()?->value;
293 $statutAbonnement = $utilisateur->getStatutAbonnement()?->value;
294 $roleId = $utilisateur->getRoleUtilisateur()?->getIdRole();
295 $genreId = $utilisateur->getGenreUtilisateur()?->getIdGenre();
296
297 return $stmt->execute([
298 ':emailUtilisateur' => $utilisateur->getEmailUtilisateur(),
299 ':pseudoUtilisateur' => $utilisateur->getPseudoUtilisateur(),
300 ':motDePasseUtilisateur' => $utilisateur->getMotDePasseUtilisateur(),
301 ':dateDeNaissanceUtilisateur' => $dateDeNaissance,
302 ':dateInscriptionUtilisateur' => $dateInscription,
303 ':statutUtilisateur' => $statutUtilisateur,
304 ':estAbonnee' => $utilisateur->getEstAbonnee() ? 1 : 0,
305 ':statutAbonnement' => $statutAbonnement,
306 ':dateDebutAbonnement' => $dateDebutAbonnement,
307 ':dateFinAbonnement' => $dateFinAbonnement,
308 ':pointsDeRenommeeArtiste' => $utilisateur->getPointsDeRenommeeArtiste(),
309 ':nbAbonnesArtiste' => $utilisateur->getNbAbonnesArtiste(),
310 ':urlPhotoUtilisateur' => $utilisateur->geturlPhotoUtilisateur(),
311 ':roleUtilisateur' => $roleId,
312 ':descriptionUtilisateur' => $utilisateur->getDescriptionUtilisateur(),
313 ':siteWebUtilisateur' => $utilisateur->getSiteWebUtilisateur(),
314 ':genreUtilisateur' => $genreId,
315 ':nomUtilisateur' => $utilisateur->getNomUtilisateur(),
316 ]);
317 }
318
324 public function delete(?string $emailUtilisateur): bool
325 {
326 $sql = "DELETE FROM utilisateur WHERE emailUtilisateur = :emailUtilisateur";
327 $stmt = $this->pdo->prepare($sql);
328 return $stmt->execute([':emailUtilisateur' => $emailUtilisateur]);
329 }
330
335 public function getPdo(): ?PDO
336 {
337 return $this->pdo;
338 }
339
345 public function setPdo($pdo): void
346 {
347 $this->pdo = $pdo;
348 }
349
356 public function findAllArtistes(string $excludeEmail): array
357 {
358 // First, get the current user to find their genre
359 $currentUser = $this->find($excludeEmail);
360 $genreId = $currentUser?->getGenreUtilisateur()?->getIdGenre();
361
362 $params = [':excludeEmail' => $excludeEmail];
363
364 // Prioritize artists from the same genre if the current user has a genre
365 if ($genreId) {
366 $sql = "SELECT u.*
367 FROM utilisateur u
368 JOIN role r ON u.roleUtilisateur = r.idRole
369 WHERE r.typeRole = 'artiste'
370 AND u.emailUtilisateur != :excludeEmail
371 AND u.genreUtilisateur = :genreId
372 ORDER BY u.pointsDeRenommeeArtiste DESC, u.dateInscriptionUtilisateur DESC
373 LIMIT 10";
374 $params[':genreId'] = $genreId;
375
376 try {
377 $requete = $this->pdo->prepare($sql);
378 $requete->execute($params);
379 $artistes = $this->hydrateAll($requete->fetchAll(PDO::FETCH_ASSOC));
380 if (!empty($artistes)) {
381 return $artistes;
382 }
383 } catch (PDOException $e) {
384 error_log('Erreur DAO lors de la récupération des artistes : ' . $e->getMessage());
385 }
386 }
387
388 // Fallback:
389 $sql = "SELECT u.*
390 FROM utilisateur u
391 JOIN role r ON u.roleUtilisateur = r.idRole
392 WHERE r.typeRole = 'artiste'
393 AND u.emailUtilisateur != :excludeEmail
394 ORDER BY u.pointsDeRenommeeArtiste DESC, u.dateInscriptionUtilisateur DESC
395 LIMIT 10";
396
397 try {
398 $requete = $this->pdo->prepare($sql);
399 $requete->execute([':excludeEmail' => $excludeEmail]);
400 return $this->hydrateAll($requete->fetchAll(PDO::FETCH_ASSOC));
401 } catch (PDOException $e) {
402 error_log('Erreur DAO lors de la récupération des artistes populaires : ' . $e->getMessage());
403 return [];
404 }
405 }
406
412 public function countFollowers(string $emailArtiste): int
413 {
414 $sql = "SELECT COUNT(*) FROM abonnementArtiste WHERE emailArtiste = :email";
415 $stmt = $this->pdo->prepare($sql);
416 $stmt->execute([':email' => $emailArtiste]);
417 return (int)$stmt->fetchColumn();
418 }
419
425 public function estAbonneAArtiste(string $emailAbonne, string $emailArtiste): bool
426 {
427 $sql = "SELECT COUNT(*) FROM abonnementArtiste WHERE emailAbonne = :abonne AND emailArtiste = :artiste";
428 $stmt = $this->pdo->prepare($sql);
429 $stmt->execute([':abonne' => $emailAbonne, ':artiste' => $emailArtiste]);
430 return (bool)$stmt->fetchColumn();
431 }
432
439 public function basculerAbonnement(string $emailAbonne, string $emailArtiste): string
440 {
441 if ($this->estAbonneAArtiste($emailAbonne, $emailArtiste)) {
442 $sql = "DELETE FROM abonnementArtiste WHERE emailAbonne = :abonne AND emailArtiste = :artiste";
443 $this->pdo->prepare($sql)->execute([':abonne' => $emailAbonne, ':artiste' => $emailArtiste]);
444 return 'unfollowed';
445 } else {
446 $sql = "INSERT INTO abonnementArtiste (emailAbonne, emailArtiste) VALUES (:abonne, :artiste)";
447 $this->pdo->prepare($sql)->execute([':abonne' => $emailAbonne, ':artiste' => $emailArtiste]);
448 return 'followed';
449 }
450 }
451
458 public function updateNbAbonnes(string $emailArtiste, int $increment): bool
459 {
460 $sql = "UPDATE utilisateur
461 SET nbAbonnesArtiste = nbAbonnesArtiste + :increment
462 WHERE emailUtilisateur = :emailArtiste";
463
464 $stmt = $this->pdo->prepare($sql);
465 return $stmt->execute([
466 ':increment' => $increment,
467 ':emailArtiste' => $emailArtiste
468 ]);
469 }
470}
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.
find(?string $emailUtilisateur)
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.
update(Utilisateur $utilisateur)
Met à jour un utilisateur dans la base de données.
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.
$genreDAO
Definition include.php:307