"""首页平台级展示数据 endpoint(全平台门面数字,**不鉴权**——登录前首页也要展示)。 路由前缀 `/api/v1/platform`: GET /stats 首页三统计(帮助用户 / 完成比价 / 累计节省),按运营后台配的模式算。 GET /flags 客户端运营 feature flag(比价/领券期广告开关等),客户端拉取后缓存。 展示模式(real/manual/random,每指标独立)与计算逻辑见 app/repositories/ops_stat.py。 """ from __future__ import annotations import logging from fastapi import APIRouter, Query from app.api.deps import DbSession from app.repositories import app_config from app.repositories import ops_marquee as marquee_crud from app.repositories import ops_stat as crud from app.schemas.platform import ( AppFlagsOut, PlatformStatsOut, SavingsFeedItem, SavingsFeedOut, ) logger = logging.getLogger("shagua.platform") router = APIRouter(prefix="/api/v1/platform", tags=["platform"]) @router.get("/stats", response_model=PlatformStatsOut, summary="首页三统计(全平台门面数字)") def stats(db: DbSession) -> PlatformStatsOut: v = crud.get_display_values(db) return PlatformStatsOut( help_users=v["help_users"], total_compares=v["total_compares"], total_saved_cents=v["total_saved"], ) @router.get("/savings-feed", response_model=SavingsFeedOut, summary="首页轮播 feed(真实+种子混播)") def savings_feed(db: DbSession, limit: int = Query(8, ge=1, le=30)) -> SavingsFeedOut: items = marquee_crud.get_feed(db, limit=limit) return SavingsFeedOut(items=[SavingsFeedItem(**it) for it in items]) @router.get("/flags", response_model=AppFlagsOut, summary="客户端运营 feature flag(不鉴权)") def flags(db: DbSession) -> AppFlagsOut: """客户端拉取运营开关并缓存(app 启动 / 每场比价开始时刷新)。不鉴权:开关非敏感, 且比价无障碍服务取值时未必有登录态。值来自 app_config(admin 可改),空库回退默认。""" return AppFlagsOut( comparing_ad_enabled=bool(app_config.get_value(db, "comparing_ad_enabled")), )