# retoor from fastapi import APIRouter, Request from fastapi.responses import RedirectResponse from molodetz.constants import TOPICS from molodetz.database import get_post_by_slug, get_post_by_slug_tail, get_user from molodetz.rendering import content_preview, plain_title from molodetz.responses import respond from molodetz.schemas.posts import PostDetailOut from molodetz.seo import article_schema, base_seo_context from molodetz.utils.auth import get_current_user, is_admin, not_found router = APIRouter() @router.get("/{slug}") async def post_detail(request: Request, slug: str): post = get_post_by_slug(slug) or get_post_by_slug_tail(slug) viewer = get_current_user(request) if post is None or (post["status"] != "published" and not is_admin(viewer)): not_found("Post not found") if slug != post["slug"]: return RedirectResponse(f"/posts/{post['slug']}", status_code=301) author = get_user(post["user_uid"]) topic_title = TOPICS.get(post["topic"], post["topic"]) seo = base_seo_context( request, plain_title(post["title"]), content_preview(post["body"], 160), robots="index,follow" if post["status"] == "published" else "noindex,nofollow", og_type="article", breadcrumbs=[("Molodetz", "/"), (topic_title, f"/{post['topic']}"), (post["title"], f"/posts/{post['slug']}")], schemas=[article_schema(request, post, author)], ) ctx = {"post": post, "author": author, "topic_title": topic_title, "seo": seo} return respond(request, "post.html", ctx, model=PostDetailOut)