This commit is contained in:
JiriUhlir
2026-07-20 07:36:55 +02:00
parent 496104f65a
commit a7cb53e0e6
16 changed files with 1856 additions and 19 deletions
+57
View File
@@ -0,0 +1,57 @@
"""Runtime configuration read from environment variables.
AppFactory injects variables/secrets as environment variables (see AGENTS.md).
This module holds only NON-secret infrastructure configuration. Per-request
credentials are never stored here - they arrive in X- headers (see
``app.credentials``).
"""
import os
# Public app metadata
APP_NAME = os.getenv("APP_NAME", "Meta services")
APP_VERSION = os.getenv("APP_VERSION", "1.0.0")
# Reverse-proxy prefix injected by AppFactory (e.g. "/apps/meta").
# Empty when running locally at the domain root.
ROOT_PATH = os.getenv("ROOT_PATH", "")
# --- Meta Graph / Marketing API ----------------------------------------------
# Base URL is configurable so we can point at a staging/mock endpoint, but
# defaults to the production Graph endpoint.
META_GRAPH_BASE_URL = os.getenv("META_GRAPH_BASE_URL", "https://graph.facebook.com")
# Default Graph API version. Meta ships a new version every few months and
# deprecates old ones after ~2 years, so the version lives in an env var (same
# reasoning as GOOGLE_ADS_API_VERSION in the sibling `analytics` service).
# Callers may additionally override it per request via X-Meta-Api-Version.
META_API_VERSION = os.getenv("META_API_VERSION", "v25.0")
# Optional comma-separated allowlist of versions accepted in X-Meta-Api-Version.
# Empty (default) = accept any well-formed "vNN.N" value, so upgrading the Graph
# version never needs a deploy on our side. Set it to lock the service down to
# versions that have actually been tested.
META_ALLOWED_API_VERSIONS = tuple(
v.strip()
for v in os.getenv("META_ALLOWED_API_VERSIONS", "").split(",")
if v.strip()
)
# Safety cap for cursor-paged reads. Auto-paging is the default (all_pages), so
# this is the backstop that keeps a runaway edge from looping forever. Mirrors
# the Sklik report page cap in `analytics`: a truncated result says so
# explicitly instead of silently looking complete.
# Graph's own page size defaults to 25, so 100 pages ~ 2500 rows; pass a larger
# `limit` to cover more rows in fewer round trips.
META_MAX_PAGES = int(os.getenv("META_MAX_PAGES", "100"))
# --- Async insights jobs ------------------------------------------------------
# Large insights reports are run as async jobs on Meta's side (start job ->
# poll -> read results). These bound the convenience "run and wait" endpoint.
META_ASYNC_POLL_INTERVAL_SECONDS = float(
os.getenv("META_ASYNC_POLL_INTERVAL_SECONDS", "2")
)
META_ASYNC_MAX_WAIT_SECONDS = float(os.getenv("META_ASYNC_MAX_WAIT_SECONDS", "120"))
# --- HTTP ---------------------------------------------------------------------
# Upstream request timeout in seconds.
HTTP_TIMEOUT_SECONDS = float(os.getenv("HTTP_TIMEOUT_SECONDS", "60"))