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, active_nav: str = "", **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 nav = active_nav or template_name.replace(".html", "").replace("-", "_") return templates.TemplateResponse(request=request, name=template_name, context={"show_nav": True, "active_nav": nav, **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, active_nav="watchlist") @router.get("/pipeline", response_class=HTMLResponse) async def pipeline_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("pipeline.html", request, active_nav="pipeline") @router.get("/chat", response_class=HTMLResponse) async def chat_page(request: Request): user, redirect = require_page_user(request) if redirect: return redirect return render_page("chat.html", request, active_nav="chat") @router.get("/llm-insights", response_class=HTMLResponse) async def llm_insights_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("llm_insights.html", request, active_nav="llm_insights") @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, active_nav="cron") @router.get("/operations", response_class=HTMLResponse) async def operations_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 templates.TemplateResponse(request=request, name="operations.html", context={"show_nav": False, "active_nav": "operations"}) @router.get("/config", response_class=HTMLResponse) async def config_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("config.html", request, active_nav="config") @router.get("/system-logs", response_class=HTMLResponse) async def system_logs_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("system_logs.html", request, active_nav="system_logs") @router.get("/logs", response_class=HTMLResponse) async def logs_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("logs.html", request, active_nav="logs") @router.get("/data-export", response_class=HTMLResponse) async def data_export_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("data_export.html", request, active_nav="data_export") @router.get("/chat-logs", response_class=HTMLResponse) async def chat_logs_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("chat_logs.html", request, active_nav="chat_logs") @router.get("/paper-trading", response_class=HTMLResponse) async def paper_trading_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("paper_trading.html", request, active_nav="paper_trading") @router.get("/live-trading", response_class=HTMLResponse) async def live_trading_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("live_trading.html", request, active_nav="live_trading") @router.get("/review-center", response_class=HTMLResponse) async def review_center_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("review_center.html", request, active_nav="review_center") @router.get("/strategy", response_class=HTMLResponse) async def strategy_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("strategy.html", request, active_nav="strategy") @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, active_nav="subscription") @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, active_nav="referral") @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, "active_nav": "app"}) resp.headers["Cache-Control"] = "no-cache, no-store, must-revalidate" resp.headers["Pragma"] = "no-cache" resp.headers["Expires"] = "0" return resp @router.get("/opportunity", response_class=HTMLResponse) async def opportunity_page(request: Request): user, redirect = require_page_user(request) if redirect: return redirect return render_page("opportunity_detail.html", request, active_nav="app") @router.get("/market", response_class=HTMLResponse) async def market_page(request: Request): user, redirect = require_page_user(request) if redirect: return redirect return render_page("market.html", request, active_nav="market") @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, active_nav="sentiment") @router.get("/onchain", response_class=HTMLResponse) async def onchain_page(request: Request): user, redirect = require_page_user(request) if redirect: return redirect return render_page("onchain.html", request, active_nav="onchain") @router.get("/iteration", response_class=HTMLResponse) async def iteration_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("iteration.html", request, active_nav="iteration") @router.get("/stock-report", response_class=HTMLResponse) async def stock_report_page(): return HTMLResponse(content=stock_report_template) return router