from pathlib import Path from fastapi import APIRouter, Cookie, HTTPException, Request from fastapi.responses import HTMLResponse from app.db import auth_db from app.web.shared import require_admin, require_page_user def build_router(templates, repo_root: Path, stock_report_template: str): router = APIRouter() def render_page(template_name: str, request: Request, **kwargs): try: user = auth_db.get_user_by_session_token(request.cookies.get("altcoin_session", "")) if user: auth_db.log_user_activity( user["id"], "page_view", template_name.replace(".html", ""), ip=request.client.host if request.client else "", ) except Exception: pass return templates.TemplateResponse(request=request, name=template_name, context={"show_nav": True, **kwargs}) @router.get("/", response_class=HTMLResponse) async def index(): with open(repo_root / "static" / "index.html", "r", encoding="utf-8") as f: return HTMLResponse(content=f.read()) @router.get("/auth", response_class=HTMLResponse) async def auth_page(): with open(repo_root / "static" / "auth.html", "r", encoding="utf-8") as f: return HTMLResponse(content=f.read()) @router.get("/watchlist", response_class=HTMLResponse) async def watchlist_page(request: Request): user, redirect = require_page_user(request) if redirect: return redirect return render_page("watchlist.html", request) @router.get("/pipeline", response_class=HTMLResponse) async def pipeline_page(request: Request): user, redirect = require_page_user(request) if redirect: return redirect return render_page("pipeline.html", request) @router.get("/llm-insights", response_class=HTMLResponse) async def llm_insights_page(request: Request): user, redirect = require_page_user(request) if redirect: return redirect return render_page("llm_insights.html", request) @router.get("/cron", response_class=HTMLResponse) async def cron_page(request: Request): user, redirect = require_page_user(request) if redirect: return redirect try: require_admin(request.cookies.get("altcoin_session", "")) except HTTPException as exc: return HTMLResponse(content=f"
{exc.detail}
返回看板", status_code=exc.status_code) return render_page("cron.html", request) @router.get("/strategy", response_class=HTMLResponse) async def strategy_page(request: Request): user, redirect = require_page_user(request) if redirect: return redirect return render_page("strategy.html", request) @router.get("/subscription", response_class=HTMLResponse) async def subscription_page(request: Request): user, redirect = require_page_user(request, require_subscription=False) if redirect: return redirect return render_page("subscription.html", request) @router.get("/referral", response_class=HTMLResponse) async def referral_page(request: Request, altcoin_session: str = Cookie(default="")): user, redirect = require_page_user(request) if redirect: return redirect return render_page("referral.html", request) @router.get("/app", response_class=HTMLResponse) async def app_page(altcoin_session: str = Cookie(default=""), request: Request = None): user, redirect = require_page_user(request) if redirect: return redirect try: auth_db.log_user_activity(user["id"], "page_view", "app", ip=request.client.host if request and request.client else "") except Exception: pass resp = templates.TemplateResponse(request=request, name="app.html", context={"show_nav": True}) resp.headers["Cache-Control"] = "no-cache, no-store, must-revalidate" resp.headers["Pragma"] = "no-cache" resp.headers["Expires"] = "0" return resp @router.get("/sentiment", response_class=HTMLResponse) async def sentiment_page(request: Request): user, redirect = require_page_user(request) if redirect: return redirect return render_page("sentiment.html", request) @router.get("/iteration", response_class=HTMLResponse) async def iteration_page(request: Request): user, redirect = require_page_user(request) if redirect: return redirect return render_page("iteration.html", request) @router.get("/stock-report", response_class=HTMLResponse) async def stock_report_page(): return HTMLResponse(content=stock_report_template) return router