from __future__ import annotations import os from urllib.parse import quote from shared.config import config def _get_app_url(app_name: str) -> str: env_key = f"APP_URL_{app_name.upper()}" env_val = os.getenv(env_key) if env_val: return env_val.rstrip("/") return config()["app_urls"][app_name].rstrip("/") def app_url(app_name: str, path: str = "/") -> str: base = _get_app_url(app_name) if not path.startswith("/"): path = "/" + path return base + path def blog_url(path: str = "/") -> str: return app_url("blog", path) def market_url(path: str = "/") -> str: return app_url("market", path) def cart_url(path: str = "/") -> str: return app_url("cart", path) def events_url(path: str = "/") -> str: return app_url("events", path) def federation_url(path: str = "/") -> str: return app_url("federation", path) def page_cart_url(page_slug: str, path: str = "/") -> str: if not path.startswith("/"): path = "/" + path return cart_url(f"/{page_slug}{path}") def market_product_url(product_slug: str, suffix: str = "", market_place=None) -> str: """Build a market product URL with the correct page/market prefix. Resolves the prefix from: - market app context: g.post_slug + g.market_slug - cart app context: g.page_slug + market_place.slug """ from quart import g page_slug = getattr(g, "post_slug", None) or getattr(g, "page_slug", None) ms = getattr(g, "market_slug", None) or ( getattr(market_place, "slug", None) if market_place else None ) prefix = f"/{page_slug}/{ms}" if page_slug and ms else "" tail = f"/{suffix}" if suffix else "/" return market_url(f"{prefix}/product/{product_slug}{tail}") def login_url(next_url: str = "") -> str: # Auth lives in blog for now. Set AUTH_APP=federation to switch. from quart import session as qsession auth_app = os.getenv("AUTH_APP", "blog") base = app_url(auth_app, "/auth/login/") params: list[str] = [] if next_url: params.append(f"next={quote(next_url, safe='')}") # Pass anonymous cart session so the auth app can adopt it on login cart_sid = qsession.get("cart_sid") if cart_sid: params.append(f"cart_sid={quote(cart_sid, safe='')}") if params: return f"{base}?{'&'.join(params)}" return base