200 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			200 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| /*
 | |
|  * Copyright (c) 2022. Micha Espey <tracer@24unix.net>
 | |
|  *
 | |
|  * For the full copyright and license information, please view the LICENSE
 | |
|  * file that was distributed with this source code.
 | |
|  *
 | |
|  */
 | |
| 
 | |
| namespace App\Repository;
 | |
| 
 | |
| use App\Service\DatabaseConnection;
 | |
| use App\Entity\User;
 | |
| use PDO;
 | |
| use PDOException;
 | |
| 
 | |
| /**
 | |
|  * Handles CRUD of User class.
 | |
|  */
 | |
| class UserRepository
 | |
| {
 | |
|     public function __construct(private readonly DatabaseConnection $databaseConnection)
 | |
|     {
 | |
|         // empty body
 | |
|     }
 | |
| 
 | |
|     public function findAll(string $orderBy = 'nick'): array
 | |
|     {
 | |
|         $users = [];
 | |
|         $sql = "
 | |
|             SELECT id, nick, password, first, last, is_admin
 | |
|             FROM " . DatabaseConnection::TABLE_USERS . "
 | |
|             ORDER BY :order";
 | |
| 
 | |
|         try {
 | |
|             $statement = $this->databaseConnection->getConnection()->prepare(query: $sql);
 | |
|             $statement->bindParam(param: ':order', var: $orderBy);
 | |
| 
 | |
|             $statement->execute();
 | |
|             while ($result = $statement->fetch(mode: PDO::FETCH_ASSOC)) {
 | |
|                 $user = new User(
 | |
|                     nick: htmlspecialchars(string: $result['nick']),
 | |
|                     password: $result['password'],
 | |
|                     first: htmlspecialchars(string: $result['first']),
 | |
|                     last: htmlspecialchars(string: $result['last']),
 | |
|                     id: $result['id'],
 | |
|                     isAdmin: $result['is_admin']);
 | |
|                 $users[] = $user;
 | |
|             }
 | |
|             return $users;
 | |
|         } catch (PDOException $e) {
 | |
|             exit($e->getMessage());
 | |
|         }
 | |
|     }
 | |
| 
 | |
| 
 | |
|     public function findByID(int $id): ?User
 | |
|     {
 | |
|         $sql = "
 | |
|             SELECT id, nick, password, first, last, is_admin
 | |
|             FROM " . DatabaseConnection::TABLE_USERS . "
 | |
|             WHERE id = :id";
 | |
| 
 | |
|         try {
 | |
|             $statement = $this->databaseConnection->getConnection()->prepare(query: $sql);
 | |
|             $statement->bindParam(param: ':id', var: $id);
 | |
|             $statement->execute();
 | |
|             if ($result = $statement->fetch(mode: PDO::FETCH_ASSOC)) {
 | |
|                 return new User(
 | |
|                     nick: htmlspecialchars(string: $result['nick']),
 | |
|                     password: $result['password'],
 | |
|                     first: htmlspecialchars(string: $result['first']),
 | |
|                     last: htmlspecialchars(string: $result['last']),
 | |
|                     id: $result['id'],
 | |
|                     isAdmin: $result['is_admin']);
 | |
|             } else {
 | |
|                 return null;
 | |
|             }
 | |
|         } catch (PDOException $e) {
 | |
|             exit($e->getMessage());
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     public function findByNick(string $nick): ?User
 | |
|     {
 | |
|         $nick = strtolower(string: $nick);
 | |
| 
 | |
|         $sql = "
 | |
|             SELECT id, nick, password, first, last, is_admin
 | |
|             FROM " . DatabaseConnection::TABLE_USERS . "
 | |
|             WHERE nick = :nick";
 | |
| 
 | |
|         try {
 | |
|             $statement = $this->databaseConnection->getConnection()->prepare(query: $sql);
 | |
|             $statement->bindParam(param: ':nick', var: $nick);
 | |
|             $statement->execute();
 | |
|             if ($result = $statement->fetch(mode: PDO::FETCH_ASSOC)) {
 | |
|                 return new User(
 | |
|                     nick: htmlspecialchars(string: $result['nick']),
 | |
|                     password: $result['password'],
 | |
|                     first: htmlspecialchars(string: $result['first']),
 | |
|                     last: htmlspecialchars(string: $result['last']),
 | |
|                     id: $result['id'],
 | |
|                     isAdmin: $result['is_admin']);
 | |
|             } else {
 | |
|                 return null;
 | |
|             }
 | |
|         } catch (PDOException $e) {
 | |
|             exit($e->getMessage());
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     public function insert(User $user): bool|string
 | |
|     {
 | |
|         $sql = "
 | |
|             INSERT INTO " . DatabaseConnection::TABLE_USERS . " (nick, password, first, last, is_admin)
 | |
|             VALUES (:nick, :password, :first, :last, :is_admin)";
 | |
| 
 | |
|         try {
 | |
|             $nick = $user->getNick();
 | |
|             $password = $user->getPassword();
 | |
|             $first = $user->getFirst();
 | |
|             $last = $user->getLast();
 | |
|             $isAdmin = $user->isAdmin() ? 1 : 0;
 | |
|             $statement = $this->databaseConnection->getConnection()->prepare(query: $sql);
 | |
|             $statement->bindParam(param: ':nick', var: $nick);
 | |
|             $statement->bindParam(param: ':password', var: $password);
 | |
|             $statement->bindParam(param: ':first', var: $first);
 | |
|             $statement->bindParam(param: ':last', var: $last);
 | |
|             $statement->bindParam(param: ':is_admin', var: $isAdmin);
 | |
|             $statement->execute();
 | |
| 
 | |
|             return $this->databaseConnection->getConnection()->lastInsertId();
 | |
|         } catch (PDOException $e) {
 | |
|             exit($e->getMessage());
 | |
|         }
 | |
|     }
 | |
| 
 | |
| 
 | |
|     public function update(User $user): bool|int
 | |
|     {
 | |
|         $id = $user->getId();
 | |
|         $nick = $user->getNick();
 | |
|         $first = $user->getFirst();
 | |
|         $last = $user->getLast();
 | |
|         $isAdmin = $user->isAdmin() ? 1 : 0;
 | |
| 
 | |
|         if ($user->getPassword()) {
 | |
|             $password = $user->getPassword();
 | |
|         } else {
 | |
|             $current = $this->findByID(id: $id);
 | |
|             $password = $current->getPassword();
 | |
|         }
 | |
| 
 | |
|         $sql = "
 | |
| 			UPDATE " . DatabaseConnection::TABLE_USERS . " SET
 | |
| 				nick = :nick,
 | |
| 				password = :password,
 | |
| 				first = :first,
 | |
| 				last = :last,
 | |
| 				is_admin = :is_admin
 | |
|             WHERE id = :id";
 | |
| 
 | |
|         try {
 | |
|             $statement = $this->databaseConnection->getConnection()->prepare(query: $sql);
 | |
|             $statement->bindParam(param: 'id', var: $id);
 | |
|             $statement->bindParam(param: 'nick', var: $nick);
 | |
|             $statement->bindParam(param: 'password', var: $password);
 | |
|             $statement->bindParam(param: 'first', var: $first);
 | |
|             $statement->bindParam(param: 'last', var: $last);
 | |
|             $statement->bindParam(param: 'is_admin', var: $isAdmin);
 | |
|             $statement->execute();
 | |
| 
 | |
|             return $statement->rowCount();
 | |
|         } catch (PDOException $e) {
 | |
|             echo $e->getMessage();
 | |
|             return false;
 | |
|         }
 | |
|     }
 | |
| 
 | |
| 
 | |
|     public function delete(User $user): int
 | |
|     {
 | |
|         $sql = "
 | |
|             DELETE FROM " . DatabaseConnection::TABLE_USERS . "
 | |
|             WHERE id = :id";
 | |
| 
 | |
|         try {
 | |
|             $statement = $this->databaseConnection->getConnection()->prepare(query: $sql);
 | |
|             $id = $user->getId();
 | |
|             $statement->bindParam(param: 'id', var: $id);
 | |
|             $statement->execute();
 | |
| 
 | |
|             return $statement->rowCount();
 | |
|         } catch (PDOException $e) {
 | |
|             exit($e->getMessage());
 | |
|         }
 | |
|     }
 | |
| 
 | |
| } |