59 lines
1.9 KiB
Python
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)}
|