pdo->prepare('SELECT * FROM users WHERE email = :email'); $stmt->execute(['email' => $email]); $row = $stmt->fetch(); return $row === false ? null : $this->cast($row); } /** * @return UserRow|null */ public function findById(int $id): ?array { $stmt = $this->pdo->prepare('SELECT * FROM users WHERE id = :id'); $stmt->execute(['id' => $id]); $row = $stmt->fetch(); return $row === false ? null : $this->cast($row); } /** * @return UserRow */ public function create(string $email, string $passwordHash): array { $stmt = $this->pdo->prepare( 'INSERT INTO users (email, password_hash) VALUES (:email, :password_hash)' ); $stmt->execute([ 'email' => $email, 'password_hash' => $passwordHash, ]); /** @var UserRow $user */ $user = $this->findById((int) $this->pdo->lastInsertId()); return $user; } public function markEmailVerified(int $id): void { $this->pdo->prepare( "UPDATE users SET email_verified_at = strftime('%Y-%m-%dT%H:%M:%SZ', 'now'), updated_at = strftime('%Y-%m-%dT%H:%M:%SZ', 'now') WHERE id = :id" )->execute(['id' => $id]); } /** * Apply a confirmed email change: set the address and mark it verified. */ public function updateEmail(int $id, string $email): void { $this->pdo->prepare( "UPDATE users SET email = :email, email_verified_at = strftime('%Y-%m-%dT%H:%M:%SZ', 'now'), updated_at = strftime('%Y-%m-%dT%H:%M:%SZ', 'now') WHERE id = :id" )->execute(['email' => $email, 'id' => $id]); } public function markVerificationEmailSent(int $id): void { $this->pdo->prepare( "UPDATE users SET verification_email_sent_at = strftime('%Y-%m-%dT%H:%M:%SZ', 'now') WHERE id = :id" )->execute(['id' => $id]); } /** * @param array $row * @return UserRow */ private function cast(array $row): array { $row['id'] = (int) $row['id']; /** @var UserRow $row */ return $row; } }