nomadweb/backend/app/routers/ebook.py
2026-09-04 10:30:11 -05:00

59 lines
1.9 KiB
Python

"""Ebook purchase entitlements + download links (FastAPI only)."""
from __future__ import annotations
from fastapi import APIRouter, Header, HTTPException
from app.services.auth import get_user_by_token
from app.services import social_store
from app.services.payment_service import EBOOK_EPUB_URL, EBOOK_PDF_URL, PAYMENT_EBOOK_AMOUNT
router = APIRouter(prefix="/ebook", tags=["ebook"])
def _user(authorization: str | None) -> dict:
if not authorization or not authorization.startswith("Bearer "):
raise HTTPException(401, "请先登录")
user = get_user_by_token(authorization[7:])
if not user:
raise HTTPException(401, "请先登录")
return user
@router.get("/status")
async def ebook_status(authorization: str | None = Header(None)):
user = _user(authorization)
owned = social_store.has_ebook(user["id"])
has_files = bool(EBOOK_PDF_URL or EBOOK_EPUB_URL)
return {
"owned": owned,
"has_files": has_files,
"amount_fen": PAYMENT_EBOOK_AMOUNT,
"amount_yuan": f"{PAYMENT_EBOOK_AMOUNT / 100:.2f}",
}
@router.get("/product")
async def ebook_product():
"""Public product info — no auth (buy CTA honesty)."""
has_files = bool(EBOOK_PDF_URL or EBOOK_EPUB_URL)
return {
"has_files": has_files,
"amount_fen": PAYMENT_EBOOK_AMOUNT,
"amount_yuan": f"{PAYMENT_EBOOK_AMOUNT / 100:.2f}",
}
@router.get("/downloads")
async def ebook_downloads(authorization: str | None = Header(None)):
user = _user(authorization)
if not social_store.has_ebook(user["id"]):
raise HTTPException(403, "尚未购买电子书下载版")
files = []
if EBOOK_PDF_URL:
files.append({"format": "pdf", "label": "PDF", "url": EBOOK_PDF_URL})
if EBOOK_EPUB_URL:
files.append({"format": "epub", "label": "EPUB", "url": EBOOK_EPUB_URL})
if not files:
files.append({"format": "online", "label": "Online reading", "url": "/book/read"})
return {"owned": True, "files": files, "has_files": bool(EBOOK_PDF_URL or EBOOK_EPUB_URL)}