58 lines
1.9 KiB
Python
58 lines
1.9 KiB
Python
"""Page routes for the EPUB search web UI."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import logging
|
|
|
|
from fastapi import APIRouter, Request
|
|
from fastapi.responses import HTMLResponse
|
|
from sqlalchemy import select
|
|
from sqlalchemy.orm import Session
|
|
|
|
from python.ebook_search.api.web import templates
|
|
from python.orm.richie import EbookSource
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
router = APIRouter()
|
|
|
|
|
|
@router.get("/", response_class=HTMLResponse)
|
|
def index(request: Request) -> HTMLResponse:
|
|
"""Render the search page."""
|
|
return templates.TemplateResponse(request, "search.html", {"config": request.app.state.config})
|
|
|
|
|
|
@router.get("/books", response_class=HTMLResponse)
|
|
def books(request: Request) -> HTMLResponse:
|
|
"""Render the indexed books page."""
|
|
with Session(request.app.state.engine) as session:
|
|
sources = list(session.scalars(select(EbookSource).order_by(EbookSource.title)).all())
|
|
logger.info("ebook_books_page_loaded count=%s", len(sources))
|
|
return templates.TemplateResponse(request, "books.html", {"sources": sources})
|
|
|
|
|
|
@router.get("/books/{source_id}", response_class=HTMLResponse)
|
|
def book_detail(source_id: int, request: Request) -> HTMLResponse:
|
|
"""Render details for one indexed book."""
|
|
with Session(request.app.state.engine) as session:
|
|
source = session.get(EbookSource, source_id)
|
|
if source is not None:
|
|
chapter_count = len(source.chapters)
|
|
chunk_count = len(source.chunks)
|
|
else:
|
|
chapter_count = 0
|
|
chunk_count = 0
|
|
logger.info(
|
|
"ebook_book_detail_loaded source_id=%s found=%s chapters=%s chunks=%s",
|
|
source_id,
|
|
source is not None,
|
|
chapter_count,
|
|
chunk_count,
|
|
)
|
|
return templates.TemplateResponse(
|
|
request,
|
|
"book_detail.html",
|
|
{"chapter_count": chapter_count, "chunk_count": chunk_count, "source": source},
|
|
)
|