"""FlowDeck — API v2 : helpers partagés des modules de routes (A28).""" from __future__ import annotations import hashlib import logging from fastapi import HTTPException, Request from app.services.api_v2_helpers import ( # noqa: F401 — require_scope est utilisé par les handlers audit_log, check_idempotency, check_v2_rate_limit, get_bearer_user, has_scope, paginate_headers, parse_pagination, require_scope, row_to_dict, store_idempotency, to_iso8601, validate_scopes_input, ) logger = logging.getLogger(__name__) def _hash(token: str) -> str: return hashlib.sha256(token.encode()).hexdigest() def _v2_rate_check(request: Request, user: dict) -> None: ip = request.client.host if request.client else "unknown" th = user.get("_token_hash") if not check_v2_rate_limit(th, ip): raise HTTPException(status_code=429, detail="Rate limit exceeded: 300 req/min per token") # ── Tokens ────────────────────────────────────────────────────────────────