import os import psycopg2 from psycopg2.extras import RealDictCursor from typing import Optional, Dict from dotenv import load_dotenv load_dotenv() def get_db_connection(): return psycopg2.connect( host=os.getenv("DB_HOST", "localhost"), port=os.getenv("DB_PORT", "5432"), database=os.getenv("DB_NAME", "postgres"), user=os.getenv("DB_USER", "postgres"), password=os.getenv("DB_PASSWORD", ""), cursor_factory=RealDictCursor ) def get_latest_proxy() -> Optional[Dict]: try: conn = get_db_connection() cursor = conn.cursor() cursor.execute(""" SELECT id, ip_address, port, protocol, username, password, country_code, country_name, city, is_active, is_anonymous, response_time_ms, last_checked_at, last_successful_at, failure_count, success_count, usage, source, notes, created_at, updated_at FROM proxies WHERE is_active = TRUE ORDER BY last_successful_at DESC NULLS LAST, response_time_ms ASC NULLS LAST, (CASE WHEN success_count + failure_count > 0 THEN CAST(success_count AS FLOAT) / (success_count + failure_count) ELSE 0 END) DESC, created_at DESC LIMIT 1 """) proxy = cursor.fetchone() cursor.close() conn.close() return dict(proxy) if proxy else None except Exception as e: print(f"Erro ao buscar proxy: {e}") return None def delete_proxy(proxy_id: int) -> bool: try: conn = get_db_connection() cursor = conn.cursor() cursor.execute(""" UPDATE proxies SET is_active = FALSE, failure_count = failure_count + 1, last_checked_at = NOW(), updated_at = NOW() WHERE id = %s """, (proxy_id,)) conn.commit() updated = cursor.rowcount > 0 cursor.close() conn.close() print(f"Proxy {proxy_id} desativado: {updated}") return updated except Exception as e: print(f"Erro ao desativar proxy {proxy_id}: {e}") return False def format_proxy_url(proxy: Dict) -> str: protocol = proxy.get('protocol', 'http').lower() ip_address = proxy.get('ip_address') port = proxy.get('port') username = proxy.get('username') password = proxy.get('password') if username and password: return f"{protocol}://{username}:{password}@{ip_address}:{port}" else: return f"{protocol}://{ip_address}:{port}" def mark_proxy_success(proxy_id: int) -> bool: try: conn = get_db_connection() cursor = conn.cursor() cursor.execute(""" UPDATE proxies SET success_count = success_count + 1, last_successful_at = NOW(), last_checked_at = NOW(), updated_at = NOW(), is_active = TRUE WHERE id = %s """, (proxy_id,)) conn.commit() updated = cursor.rowcount > 0 cursor.close() conn.close() print(f"Proxy (id {proxy_id}) marcado como sucesso") return updated except Exception as e: print(f"Erro ao marcar proxy {proxy_id} como sucesso: {e}") return False