Comus Party 1.0.0
Application web de mini-jeux en ligne
Chargement...
Recherche...
Aucune correspondance
player.dao.php
Aller à la documentation de ce fichier.
1<?php
9
10namespace ComusParty\Models;
11
12use DateMalformedStringException;
13use DateTime;
14use Exception;
15use PDO;
16use Ramsey\Uuid\Uuid;
17
23{
28 private ?PDO $pdo;
29
34 public function __construct(?PDO $pdo)
35 {
36 $this->pdo = $pdo;
37 }
38
43 public function getPdo(): ?PDO
44 {
45 return $this->pdo;
46 }
47
52 public function setPdo(?PDO $pdo): void
53 {
54 $this->pdo = $pdo;
55 }
56
63 public function findByUuid(string $uuid): ?Player
64 {
65 $stmt = $this->pdo->prepare(
66 'SELECT *
67 FROM ' . DB_PREFIX . 'player
68 WHERE uuid = :uuid');
69 $stmt->bindParam(':uuid', $uuid);
70 $stmt->execute();
71 $stmt->setFetchMode(PDO::FETCH_ASSOC);
72 $playerTab = $stmt->fetch();
73 if ($playerTab === false) {
74 return null;
75 }
76 return $this->hydrate($playerTab);
77 }
78
86 public function hydrate(array $data): Player
87 {
88 $player = new Player();
89 $player->setStatistics(new Statistics());
90 $player->setUuid($data['uuid']);
91 $player->setUsername($data['username']);
92 $player->setCreatedAt(new DateTime($data['created_at']));
93 $player->setUpdatedAt(new DateTime($data['updated_at']));
94 $player->setXp($data['xp']);
95 $player->setElo($data['elo']);
96 $player->setComusCoin($data['comus_coin']);
97 $player->getStatistics()->setPlayerUuid($data['uuid'] ?? null);
98 $player->getStatistics()->setGamesPlayed($data['games_played'] ?? null);
99 $player->getStatistics()->setGamesWon($data['games_won'] ?? null);
100 $player->getStatistics()->setGamesHosted($data['games_hosted'] ?? null);
101 $player->setUserId($data['user_id']);
102 $player->setActivePfp($data['active_pfp'] ?? 'default-pfp.jpg');
103 $player->setActiveBanner($data['active_banner'] ?? 'default-banner.jpg');
104 return $player;
105 }
106
113 public function findByUserId(int $userId): ?Player
114 {
115 $stmt = $this->pdo->prepare(
116 'SELECT *
117 FROM ' . DB_PREFIX . 'player
118 WHERE user_id = :userId');
119 $stmt->bindParam(':userId', $userId);
120 $stmt->execute();
121 $stmt->setFetchMode(PDO::FETCH_ASSOC);
122 $playerTab = $stmt->fetch();
123 if ($playerTab === false) {
124 return null;
125 }
126 return $this->hydrate($playerTab);
127 }
128
135 public function findWithDetailByUuid(string $uuid): ?Player
136 {
137 $stmt = $this->pdo->prepare(
138 'SELECT
139 pr.*,
140 u.email,
141 u.created_at,
142 u.updated_at,
143 (SELECT COUNT(*) FROM ' . DB_PREFIX . 'played WHERE player_uuid = pr.uuid) as games_played,
144 (SELECT COUNT(*) FROM ' . DB_PREFIX . 'won WHERE player_uuid = pr.uuid) as games_won,
145 (SELECT COUNT(*) FROM ' . DB_PREFIX . 'game_record WHERE hosted_by = pr.uuid) as games_hosted,
146 (SELECT a.file_path
147 FROM ' . DB_PREFIX . 'invoice i
148 JOIN ' . DB_PREFIX . 'invoice_row ir ON ir.invoice_id = i.id AND ir.active = 1
149 JOIN ' . DB_PREFIX . 'article a ON ir.article_id = a.id AND a.type = "pfp"
150 WHERE i.player_uuid = pr.uuid
151 ORDER BY i.created_at DESC
152 LIMIT 1) as active_pfp,
153 (SELECT a.file_path
154 FROM ' . DB_PREFIX . 'invoice i
155 JOIN ' . DB_PREFIX . 'invoice_row ir ON ir.invoice_id = i.id AND ir.active = 1
156 JOIN ' . DB_PREFIX . 'article a ON ir.article_id = a.id AND a.type = "banner"
157 WHERE i.player_uuid = pr.uuid
158 ORDER BY i.created_at DESC
159 LIMIT 1) as active_banner
160 FROM ' . DB_PREFIX . 'player pr
161 JOIN ' . DB_PREFIX . 'user u ON pr.user_id = u.id
162 LEFT JOIN ' . DB_PREFIX . 'invoice i ON i.player_uuid = pr.uuid
163 WHERE pr.uuid = :uuid');
164 $stmt->bindParam(':uuid', $uuid);
165 $stmt->execute();
166 $stmt->setFetchMode(PDO::FETCH_ASSOC);
167 $tabPlayer = $stmt->fetch();
168 if ($tabPlayer === false || $tabPlayer['uuid'] === null) {
169 return null;
170 }
171 return $this->hydrate($tabPlayer);
172 }
173
180 public function findWithDetailByUserId(int $userId): ?Player
181 {
182 $stmt = $this->pdo->prepare(
183 'SELECT pr.*, u.email, u.created_at, u.updated_at,
184 (SELECT COUNT(*) FROM ' . DB_PREFIX . 'played WHERE player_uuid = pr.uuid) as games_played,
185 (SELECT COUNT(*) FROM ' . DB_PREFIX . 'won WHERE player_uuid = pr.uuid) as games_won,
186 (SELECT COUNT(*) FROM ' . DB_PREFIX . 'game_record WHERE hosted_by = pr.uuid) as games_hosted
187 FROM ' . DB_PREFIX . 'player pr
188 JOIN ' . DB_PREFIX . 'user u ON pr.user_id = u.id
189 LEFT JOIN ' . DB_PREFIX . 'invoice i ON i.player_uuid = pr.uuid
190 LEFT JOIN ' . DB_PREFIX . 'invoice_row ir ON ir.invoice_id = i.id AND ir.active = 1
191 LEFT JOIN ' . DB_PREFIX . 'article a ON ir.article_id = a.id AND a.type = "pfp"
192 WHERE u.id = :userId');
193 $stmt->bindParam(':userId', $userId);
194 $stmt->execute();
195 $stmt->setFetchMode(PDO::FETCH_ASSOC);
196 $tabPlayer = $stmt->fetch();
197 if ($tabPlayer === false) {
198 return null;
199 }
200 return $this->hydrate($tabPlayer);
201 }
202
209 public function findAll(): ?array
210 {
211 $stmt = $this->pdo->query(
212 'SELECT *
213 FROM ' . DB_PREFIX . 'player');
214 $stmt->setFetchMode(PDO::FETCH_ASSOC);
215 $tabPlayers = $stmt->fetchAll();
216 if ($tabPlayers === false) {
217 return null;
218 }
219 return $this->hydrateMany($tabPlayers);
220 }
221
229 public function hydrateMany(array $data): array
230 {
231 $players = [];
232 foreach ($data as $player) {
233 $players[] = $this->hydrate($player);
234 }
235 return $players;
236 }
237
244 public function findAllWithDetail(): ?array
245 {
246 $stmt = $this->pdo->query(
247 'SELECT pr.*, u.email, u.created_at, u.updated_at,
248 (SELECT COUNT(*) FROM ' . DB_PREFIX . 'played WHERE player_uuid = pr.uuid) as games_played,
249 (SELECT COUNT(*) FROM ' . DB_PREFIX . 'won WHERE player_uuid = pr.uuid) as games_won,
250 (SELECT COUNT(*) FROM ' . DB_PREFIX . 'game_record WHERE hosted_by = pr.uuid) as games_hosted
251 FROM ' . DB_PREFIX . 'player pr
252 JOIN ' . DB_PREFIX . 'user u ON pr.user_id = u.id
253 LEFT JOIN ' . DB_PREFIX . 'invoice i ON i.player_uuid = pr.uuid
254 LEFT JOIN ' . DB_PREFIX . 'invoice_row ir ON ir.invoice_id = i.id AND ir.active = 1
255 LEFT JOIN ' . DB_PREFIX . 'article a ON ir.article_id = a.id AND a.type = "pfp"');
256 $stmt->setFetchMode(PDO::FETCH_ASSOC);
257 $tabPlayers = $stmt->fetchAll();
258 if ($tabPlayers === false) {
259 return null;
260 }
261 return $this->hydrateMany($tabPlayers);
262 }
263
275 public function createPlayer(string $username, string $email): bool
276 {
277 // Genération de l'uuid du joueur
278 $uuid = Uuid::uuid4()->toString();
279
280 $userDao = new UserDAO($this->pdo);
281 $user = $userDao->findByEmail($email);
282 $userId = $user->getId();
283
284 $stmtPlayer = $this->pdo->prepare("INSERT INTO " . DB_PREFIX . "player (uuid, username, user_id) VALUES (:uuid, :username, :user_id)");
285
286 $stmtPlayer->bindParam(':uuid', $uuid);
287 $stmtPlayer->bindParam(':username', $username);
288 $stmtPlayer->bindParam(':user_id', $userId);
289
290 return $stmtPlayer->execute();
291 }
292
299 public function findByUsername(?string $username): ?Player
300 {
301 $stmt = $this->pdo->prepare("SELECT * FROM " . DB_PREFIX . "player WHERE username = :username");
302 $stmt->bindParam(':username', $username);
303 $stmt->execute();
304 $stmt->setFetchMode(PDO::FETCH_ASSOC);
305 $result = $stmt->fetch();
306 if ($result === false) {
307 return null;
308 }
309 return $this->hydrate($result);
310 }
311
318 public function findInRangeOrderByEloDescWithDetails(int $start, int $end): ?array
319 {
320 $limit = $end - $start + 1; // Calculer le nombre d'éléments à récupérer
321 $offset = $start - 1; // Décalage basé sur la position (index commence à 0)
322
323 $stmt = $this->pdo->prepare(
324 'SELECT DISTINCT pr.*, u.email, u.created_at, u.updated_at,
325 (SELECT a.file_path
326 FROM ' . DB_PREFIX . 'invoice i
327 JOIN ' . DB_PREFIX . 'invoice_row ir ON ir.invoice_id = i.id AND ir.active = 1
328 JOIN ' . DB_PREFIX . 'article a ON ir.article_id = a.id AND a.type = "pfp"
329 WHERE i.player_uuid = pr.uuid
330 ORDER BY i.created_at DESC
331 LIMIT 1) as active_pfp,
332 (SELECT COUNT(*) FROM ' . DB_PREFIX . 'played WHERE player_uuid = pr.uuid) as games_played,
333 (SELECT COUNT(*) FROM ' . DB_PREFIX . 'won WHERE player_uuid = pr.uuid) as games_won,
334 (SELECT COUNT(*) FROM ' . DB_PREFIX . 'game_record WHERE hosted_by = pr.uuid) as games_hosted
335 FROM ' . DB_PREFIX . 'player pr
336 JOIN ' . DB_PREFIX . 'user u ON pr.user_id = u.id
337 WHERE u.email_verif_token IS NULL
338 ORDER BY elo DESC
339 LIMIT :limit OFFSET :offset;'
340 );
341
342 $stmt->bindValue(':limit', $limit, PDO::PARAM_INT);
343 $stmt->bindValue(':offset', $offset, PDO::PARAM_INT);
344 $stmt->execute();
345
346 $stmt->setFetchMode(PDO::FETCH_ASSOC);
347 $tabPlayers = $stmt->fetchAll();
348
349 if ($tabPlayers === false) {
350 return null;
351 }
352 return $this->hydrateMany($tabPlayers);
353 }
354
360 public function update(Player $player): void
361 {
362 $stmt = $this->pdo->prepare(
363 'UPDATE ' . DB_PREFIX . 'player
364 SET username = :username, xp = :xp, elo = :elo, comus_coin = :comusCoin
365 WHERE uuid = :uuid');
366 $username = $player->getUsername();
367 $stmt->bindParam(':username', $username);
368 $xp = $player->getXp();
369 $stmt->bindParam(':xp', $xp);
370 $elo = $player->getElo();
371 $stmt->bindParam(':elo', $elo);
372 $comusCoin = $player->getComusCoin();
373 $stmt->bindParam(':comusCoin', $comusCoin);
374 $uuid = $player->getUuid();
375 $stmt->bindParam(':uuid', $uuid);
376 $stmt->execute();
377 }
378
385 public function findWithDetailByUsername(string $username): ?Player
386 {
387 $stmt = $this->pdo->prepare(
388 'SELECT
389 pr.*,
390 u.email,
391 u.created_at,
392 u.updated_at,
393 (SELECT COUNT(*) FROM ' . DB_PREFIX . 'played WHERE player_uuid = pr.uuid) as games_played,
394 (SELECT COUNT(*) FROM ' . DB_PREFIX . 'won WHERE player_uuid = pr.uuid) as games_won,
395 (SELECT COUNT(*) FROM ' . DB_PREFIX . 'game_record WHERE hosted_by = pr.uuid) as games_hosted,
396 (SELECT a.file_path
397 FROM ' . DB_PREFIX . 'invoice i
398 JOIN ' . DB_PREFIX . 'invoice_row ir ON ir.invoice_id = i.id AND ir.active = 1
399 JOIN ' . DB_PREFIX . 'article a ON ir.article_id = a.id AND a.type = "pfp"
400 WHERE i.player_uuid = pr.uuid
401 ORDER BY i.created_at DESC
402 LIMIT 1) as active_pfp,
403 (SELECT a.file_path
404 FROM ' . DB_PREFIX . 'invoice i
405 JOIN ' . DB_PREFIX . 'invoice_row ir ON ir.invoice_id = i.id AND ir.active = 1
406 JOIN ' . DB_PREFIX . 'article a ON ir.article_id = a.id AND a.type = "banner"
407 WHERE i.player_uuid = pr.uuid
408 ORDER BY i.created_at DESC
409 LIMIT 1) as active_banner
410 FROM ' . DB_PREFIX . 'player pr
411 JOIN ' . DB_PREFIX . 'user u ON pr.user_id = u.id
412 LEFT JOIN ' . DB_PREFIX . 'invoice i ON i.player_uuid = pr.uuid
413 WHERE pr.username = :username');
414 $stmt->bindParam(':username', $username);
415 $stmt->execute();
416 $stmt->setFetchMode(PDO::FETCH_ASSOC);
417 $tabPlayer = $stmt->fetch();
418 if ($tabPlayer === false || $tabPlayer['uuid'] === null) {
419 return null;
420 }
421 return $this->hydrate($tabPlayer);
422 }
423}
findByUserId(int $userId)
Retourne un objet Player (ou null) à partir de l'identifiant utilisateur passé en paramètre.
createPlayer(string $username, string $email)
Crée un nouveau joueur dans la base de données.
update(Player $player)
Met à jour les valeurs d'un enregistrement d'un joueur en base de données.
hydrate(array $data)
Hydrate un objet Player avec les valeurs du tableau associatif passé en paramètre.
findInRangeOrderByEloDescWithDetails(int $start, int $end)
Retourne un tableau d'objets Player recensant l'ensemble des joueurs enregistrés dans la base de donn...
getPdo()
Retourne la connexion à la base de données.
findAll()
Retourne un tableau d'objets Player recensant l'ensemble des joueurs enregistrés dans la base de donn...
findWithDetailByUsername(string $username)
Retourne un objet Player (ou null) à partir du nom d'utilisateur passé en paramètre avec les détails ...
findByUuid(string $uuid)
Retourne un objet Player (ou null) à partir de l'UUID passé en paramètre.
findWithDetailByUuid(string $uuid)
Retourne un objet Player (ou null) à partir de l'UUID passé en paramètre avec les détails de l'utilis...
setPdo(?PDO $pdo)
Modifie la connexion à la base de données.
__construct(?PDO $pdo)
Le constructeur de la classe PlayerDAO.
findWithDetailByUserId(int $userId)
Retourne un objet Player (ou null) à partir de l'identifiant utilisateur passé en paramètre avec les ...
findAllWithDetail()
Retourne un tableau d'objets Player recensant l'ensemble des joueurs enregistrés dans la base de donn...
hydrateMany(array $data)
Hydrate un tableau d'objets Player avec les valeurs des tableaux associatifs du tableau passé en para...
findByUsername(?string $username)
Retourne un objet Player (ou null) à partir du nom d'utilisateur passé en paramètre.
getElo()
Retourne l'Elo du joueur.
getUuid()
Retourne l'UUID du joueur.
getUsername()
Retourne le nom d'utilisateur du joueur.
getComusCoin()
Retourne le nombre de Comus Coins possédés par le joueur.
getXp()
Retourne les points d'expérience du joueur.
const DB_PREFIX
Préfixe des tables de la base de données.
Definition db.php:52