con = $con; } public function insertAccount(string $name, string $email, string $token, string $hash, string $profilePicture): int { $this->con->exec("INSERT INTO Account(username, hash, email, token,profile_picture) VALUES (:username,:hash,:email,:token,:profilePic)", [ ':username' => [$name, PDO::PARAM_STR], ':hash' => [$hash, PDO::PARAM_STR], ':email' => [$email, PDO::PARAM_STR], ':token' => [$token, PDO::PARAM_STR], ':profilePic' => [$profilePicture, PDO::PARAM_STR], ]); return intval($this->con->lastInsertId()); } /** * promote or demote a user to server administrator * @param int $id * @param bool $isAdmin true to promote, false to demote * @return bool true if the given user exists */ public function setIsAdmin(int $id, bool $isAdmin): bool { $stmnt = $this->con->prepare("UPDATE Account SET is_admin = :is_admin WHERE id = :id"); $stmnt->bindValue(':is_admin', $isAdmin); $stmnt->bindValue(':id', $id); $stmnt->execute(); return $stmnt->rowCount() > 0; } /** * @param string $email * @return array|null */ private function getRowsFromMail(string $email): ?array { return $this->con->fetch("SELECT * FROM Account WHERE email = :email", [':email' => [$email, PDO::PARAM_STR]])[0] ?? null; } /** * @param string $email * @return string|null the hashed user's password, or null if the given mail does not exist */ public function getHash(string $email): ?string { $results = $this->getRowsFromMail($email); if ($results == null) { return null; } return $results['hash']; } /** * @param string $email * @return bool true if the given email exists in the database */ public function exists(string $email): bool { return $this->getRowsFromMail($email) != null; } /** * @param string $email * @return Account|null */ public function getAccountFromMail(string $email): ?Account { $acc = $this->getRowsFromMail($email); if (empty($acc)) { return null; } return new Account($acc["token"], new User($email, $acc["username"], $acc["id"], $acc["profile_picture"], $acc['is_admin'])); } /** * @param string $token get an account from given token * @return Account|null */ public function getAccountFromToken(string $token): ?Account { $stmnt = $this->con->prepare("SELECT * FROM Account WHERE token = :token"); $stmnt->bindValue(':token', $token); return $this->getAccountFrom($stmnt); } /** * @param int $id get an account from given identifier * @return Account|null */ public function getAccount(int $id): ?Account { $stmnt = $this->con->prepare("SELECT * FROM Account WHERE id = :id"); $stmnt->bindValue(':id', $id); return $this->getAccountFrom($stmnt); } private function getAccountFrom(\PDOStatement $stmnt): ?Account { $stmnt->execute(); $acc = $stmnt->fetch(PDO::FETCH_ASSOC); if ($acc == null) { return null; } return new Account($acc["token"], new User($acc["email"], $acc["username"], $acc["id"], $acc["profile_picture"], $acc["is_admin"])); } /** * Return a list containing n accounts from a given starting index * * @param integer $n the number of accounts to retrieve * @param int $start starting index of the list content * @return Account[] */ public function listAccounts(int $start, int $n): ?array { $res = $this->con->fetch( "SELECT * FROM Account ORDER BY email LIMIT :offset, :n", [ ":offset" => [$start, PDO::PARAM_INT], ":n" => [$n, PDO::PARAM_INT], ] ); return array_map(fn(array $acc) => new Account($acc["email"], new User($acc["username"], $acc["token"], $acc["id"], $acc["profile_picture"], $acc["is_admin"])), $res); } }