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): array { $stmt = $this->pdo->prepare('INSERT INTO users (email) VALUES (:email)'); $stmt->execute(['email' => $email]); /** @var UserRow $user */ $user = $this->findById((int) $this->pdo->lastInsertId()); return $user; } /** * The user for this address, creating one (unverified) if it doesn't exist * yet -- this is the only "sign up". * * @return UserRow */ public function findOrCreateByEmail(string $email): array { $existing = $this->findByEmail($email); if ($existing !== null) { return $existing; } try { return $this->create($email); } catch (PDOException $e) { // Lost a race with a concurrent request for the same address. $row = $this->findByEmail($email); if ($row === null) { throw $e; } return $row; } } public function markEmailVerified(int $id): void { $now = Database::nowExpr(); $this->pdo->prepare( "UPDATE users SET email_verified_at = {$now}, updated_at = {$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 { $now = Database::nowExpr(); $this->pdo->prepare( "UPDATE users SET email = :email, email_verified_at = {$now}, updated_at = {$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 = ' . Database::nowExpr() . ' 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; } }