pdo = $pdo; } /** * Conta as tentativas inválidas de um endereço * de e-mail dentro da janela de tempo informada. */ public function contarFalhasPorEmail( string $email, int $janelaMinutos ): int { $janelaMinutos = max( 1, $janelaMinutos ); $sql = " SELECT COUNT(*) FROM tentativas_login WHERE email = :email AND sucesso = 0 AND criado_em >= DATE_SUB( NOW(), INTERVAL {$janelaMinutos} MINUTE ) "; $stmt = $this->pdo->prepare($sql); $stmt->execute([ 'email' => $email ]); return (int)$stmt->fetchColumn(); } /** * Conta as tentativas inválidas de um endereço * IP dentro da janela de tempo informada. */ public function contarFalhasPorIp( string $ip, int $janelaMinutos ): int { $janelaMinutos = max( 1, $janelaMinutos ); $sql = " SELECT COUNT(*) FROM tentativas_login WHERE ip_address = :ip AND sucesso = 0 AND criado_em >= DATE_SUB( NOW(), INTERVAL {$janelaMinutos} MINUTE ) "; $stmt = $this->pdo->prepare($sql); $stmt->execute([ 'ip' => $ip ]); return (int)$stmt->fetchColumn(); } /** * Registra uma tentativa de autenticação * realizada pelo usuário. */ public function registrar( string $email, string $ip, bool $sucesso ): bool { $sql = " INSERT INTO tentativas_login ( email, ip_address, sucesso ) VALUES ( :email, :ip, :sucesso ) "; $stmt = $this->pdo->prepare($sql); return $stmt->execute([ 'email' => $email, 'ip' => $ip, 'sucesso' => $sucesso ? 1 : 0 ]); } }