You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
139 lines
4.4 KiB
139 lines
4.4 KiB
<?php
|
|
|
|
namespace IQBall\Core\Gateway;
|
|
|
|
use Cassandra\PreparedStatement;
|
|
use IQBall\Core\Connection;
|
|
use IQBall\Core\Data\Account;
|
|
use IQBall\Core\Data\User;
|
|
use PDO;
|
|
|
|
class AccountGateway {
|
|
private Connection $con;
|
|
|
|
/**
|
|
* @param Connection $con
|
|
*/
|
|
public function __construct(Connection $con) {
|
|
$this->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<string, mixed>|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);
|
|
}
|
|
|
|
}
|