79 lines
2.5 KiB
Python
79 lines
2.5 KiB
Python
"""Pry — Referrals router (remaining api.py routes).
|
|
|
|
Auto-extracted from api.py during the router-split refactor.
|
|
"""
|
|
|
|
# SPDX-License-Identifier: MIT
|
|
# Copyright (c) 2026 Rug Munch Media LLC
|
|
|
|
from __future__ import annotations
|
|
|
|
import logging
|
|
from typing import Any
|
|
|
|
from fastapi import APIRouter, Body
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
router = APIRouter(tags=["Referrals"])
|
|
|
|
@router.get(
|
|
"/v1/referrals/catalog",
|
|
tags=["Referrals"],
|
|
summary="Get all available referral/affiliate programs",
|
|
)
|
|
async def get_referral_catalog(category: str = "") -> dict[str, Any]:
|
|
"""List all referral programs Pry supports.
|
|
|
|
60+ providers across categories: LLM, hosting, domains, CDN, email,
|
|
monitoring, proxies, voice, media, devtools, search, CAPTCHA.
|
|
"""
|
|
from referrals import ReferralTracker
|
|
|
|
return {"success": True, "data": ReferralTracker().get_catalog(category)}
|
|
|
|
|
|
@router.get(
|
|
"/v1/referrals/stats", tags=["Referrals"], summary="Get referral click and conversion stats"
|
|
)
|
|
async def get_referral_stats(days_back: int = 30) -> dict[str, Any]:
|
|
"""Get referral tracking statistics for the last N days."""
|
|
from referrals import ReferralTracker
|
|
|
|
return {"success": True, "data": ReferralTracker().get_stats(days_back)}
|
|
|
|
|
|
@router.post("/v1/referrals/click", tags=["Referrals"], summary="Record a referral link click")
|
|
async def record_referral_click(
|
|
provider_tag: str = Body(...),
|
|
source: str = Body("api"),
|
|
user_id: str = Body(""),
|
|
) -> dict[str, Any]:
|
|
"""Record when a user clicks a referral link. Returns tracking ID."""
|
|
from referrals import PROVIDER_CATALOG, ReferralTracker
|
|
|
|
url = ""
|
|
for _cat, providers in PROVIDER_CATALOG.items():
|
|
for p in providers:
|
|
if p.get("tag") == provider_tag:
|
|
url = p["url"]
|
|
break
|
|
if url:
|
|
break
|
|
if not url:
|
|
return {"success": False, "error": f"Unknown provider: {provider_tag}"}
|
|
click_id = ReferralTracker().record_click(provider_tag, url, source, user_id)
|
|
return {"success": True, "data": {"click_id": click_id, "url": url}}
|
|
|
|
|
|
@router.post("/v1/referrals/convert", tags=["Referrals"], summary="Record a referral conversion")
|
|
async def record_referral_conversion(
|
|
click_id: str = Body(...),
|
|
revenue_usd: float = Body(0.0),
|
|
notes: str = Body(""),
|
|
) -> dict[str, Any]:
|
|
"""Record that a referral click resulted in a conversion."""
|
|
from referrals import ReferralTracker
|
|
|
|
success = ReferralTracker().record_conversion(click_id, revenue_usd, notes)
|
|
return {"success": success}
|