37494a7192
将 web/routes.py 拆分为模块化 router + service 架构
- 新增 web/app_factory.py 集中注册 7 个域名 router
- 新增 web/routers/ 薄壳路由层(auth/city/system/scan/ops/payments/analytics)
- 新增 web/services/ 业务函数下沉(每域独立 service 文件)
- web/routes.py 缩减为 city_runtime 的兼容重导出 facade
- analysis_service.py/app.py 适配新入口并清理冗余导入
Scope-risk: LOW — 全量 170 测试通过,router 注册顺序与原路由一致
Tested: python -m pytest -q (170 passed), ruff check . (All checks passed)
@
109 lines
4.5 KiB
Python
109 lines
4.5 KiB
Python
"""Authentication API service functions."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from typing import Any, Dict
|
|
|
|
from fastapi import Request
|
|
|
|
import web.routes as legacy_routes
|
|
|
|
|
|
def get_auth_me_payload(request: Request) -> Dict[str, Any]:
|
|
legacy_routes._assert_entitlement(request)
|
|
legacy_routes._bind_optional_supabase_identity(request)
|
|
|
|
user_id = getattr(request.state, "auth_user_id", None)
|
|
subscription_required = bool(
|
|
legacy_routes.SUPABASE_ENTITLEMENT.enabled
|
|
and legacy_routes.SUPABASE_ENTITLEMENT.require_subscription
|
|
)
|
|
subscription_active = None
|
|
subscription_plan_code = None
|
|
subscription_starts_at = None
|
|
subscription_expires_at = None
|
|
subscription_total_expires_at = None
|
|
subscription_queued_days = 0
|
|
subscription_queued_count = 0
|
|
|
|
if legacy_routes.SUPABASE_ENTITLEMENT.enabled and user_id:
|
|
try:
|
|
latest_subscription = legacy_routes.SUPABASE_ENTITLEMENT.ensure_signup_trial(
|
|
user_id,
|
|
created_at=getattr(request.state, "auth_created_at", None),
|
|
)
|
|
if not latest_subscription:
|
|
latest_subscription = (
|
|
legacy_routes.SUPABASE_ENTITLEMENT.get_latest_active_subscription(
|
|
user_id,
|
|
respect_requirement=False,
|
|
)
|
|
)
|
|
|
|
latest_known_subscription = latest_subscription
|
|
if not latest_known_subscription:
|
|
latest_known_subscription = (
|
|
legacy_routes.SUPABASE_ENTITLEMENT.get_latest_subscription_any_status(
|
|
user_id
|
|
)
|
|
)
|
|
subscription_window = legacy_routes.SUPABASE_ENTITLEMENT.get_subscription_window(
|
|
user_id,
|
|
respect_requirement=False,
|
|
)
|
|
subscription_active = bool(latest_subscription)
|
|
if isinstance(latest_subscription, dict):
|
|
subscription_plan_code = latest_subscription.get("plan_code")
|
|
subscription_starts_at = latest_subscription.get("starts_at")
|
|
subscription_expires_at = latest_subscription.get("expires_at")
|
|
elif isinstance(latest_known_subscription, dict):
|
|
subscription_plan_code = latest_known_subscription.get("plan_code")
|
|
subscription_starts_at = latest_known_subscription.get("starts_at")
|
|
subscription_expires_at = latest_known_subscription.get("expires_at")
|
|
if isinstance(subscription_window, dict):
|
|
subscription_total_expires_at = subscription_window.get("total_expires_at")
|
|
subscription_queued_days = int(subscription_window.get("queued_days") or 0)
|
|
subscription_queued_count = int(subscription_window.get("queued_count") or 0)
|
|
except Exception:
|
|
subscription_active = None
|
|
subscription_plan_code = None
|
|
subscription_starts_at = None
|
|
subscription_expires_at = None
|
|
subscription_total_expires_at = None
|
|
subscription_queued_days = 0
|
|
subscription_queued_count = 0
|
|
|
|
points = legacy_routes._resolve_auth_points(request)
|
|
weekly_profile = legacy_routes._resolve_weekly_profile(request)
|
|
|
|
return {
|
|
"authenticated": bool(user_id),
|
|
"user_id": user_id,
|
|
"email": getattr(request.state, "auth_email", None),
|
|
"points": points,
|
|
"weekly_points": weekly_profile["weekly_points"],
|
|
"weekly_rank": weekly_profile["weekly_rank"],
|
|
"entitlement_mode": (
|
|
"supabase_required"
|
|
if legacy_routes.SUPABASE_ENTITLEMENT.enabled
|
|
and legacy_routes._SUPABASE_AUTH_REQUIRED
|
|
else "supabase_optional"
|
|
if legacy_routes.SUPABASE_ENTITLEMENT.enabled
|
|
else "legacy_token"
|
|
if legacy_routes._ENTITLEMENT_GUARD_ENABLED
|
|
else "disabled"
|
|
),
|
|
"auth_required": bool(
|
|
legacy_routes.SUPABASE_ENTITLEMENT.enabled
|
|
and legacy_routes._SUPABASE_AUTH_REQUIRED
|
|
),
|
|
"subscription_required": subscription_required,
|
|
"subscription_active": subscription_active,
|
|
"subscription_plan_code": subscription_plan_code,
|
|
"subscription_starts_at": subscription_starts_at,
|
|
"subscription_expires_at": subscription_expires_at,
|
|
"subscription_total_expires_at": subscription_total_expires_at,
|
|
"subscription_queued_days": subscription_queued_days,
|
|
"subscription_queued_count": subscription_queued_count,
|
|
}
|