from typing import Annotated from fastapi import Request from fastapi.params import Form, Param from fastapi.responses import HTMLResponse from folkugat_web.api import router from folkugat_web.fragments import tema, temes from folkugat_web.model import temes as model from folkugat_web.services import auth from folkugat_web.services.temes import write as temes_w from folkugat_web.services.temes.links import guess_link_type from folkugat_web.templates import templates @router.get("/tema/{tema_id}") def page(request: Request, logged_in: auth.LoggedIn, tema_id: int): return templates.TemplateResponse( "index.html", { "request": request, "page_title": "Folkugat", "content": f"/api/tema/{tema_id}", "logged_in": logged_in, } ) @router.get("/api/tema/{tema_id}") def contingut(request: Request, logged_in: auth.LoggedIn, tema_id: int): return temes.tema(request, tema_id, logged_in) @router.get("/api/tema/{tema_id}/title") def title(request: Request, logged_in: auth.LoggedIn, tema_id: int): return tema.title(request=request, tema_id=tema_id, logged_in=logged_in) @router.put("/api/tema/{tema_id}/title") def set_title( request: Request, logged_in: auth.RequireLogin, tema_id: int, title: Annotated[str, Form()], ): new_tema = temes_w.update_title(tema_id=tema_id, title=title) return tema.title(request=request, tema=new_tema, logged_in=logged_in) @router.get("/api/tema/{tema_id}/lyric/{lyric_id}") def lyric(request: Request, logged_in: auth.LoggedIn, tema_id: int, lyric_id: int): return tema.lyric(request=request, logged_in=logged_in, tema_id=tema_id, lyric_id=lyric_id) @router.put("/api/tema/{tema_id}/lyric/{lyric_id}") def set_lyric( request: Request, logged_in: auth.RequireLogin, tema_id: int, lyric_id: int, title: Annotated[str, Form()], lyric: Annotated[str, Form()], ): new_lyric = model.Lyrics(id=lyric_id, title=title, content=lyric.strip()) temes_w.update_lyric(tema_id=tema_id, lyric_id=lyric_id, lyric=new_lyric) return tema.lyric(request=request, logged_in=logged_in, tema_id=tema_id, lyric_id=lyric_id) @router.post("/api/tema/{tema_id}/lyric") def add_lyric( request: Request, logged_in: auth.RequireLogin, tema_id: int, ): new_tema = temes_w.add_lyric(tema_id=tema_id) lyric_id = new_tema.lyrics[-1].id if lyric_id is None: raise RuntimeError("Invalid lyric_id on newly created lyric!") return tema.lyric_editor( request=request, logged_in=logged_in, tema_id=tema_id, lyric_id=lyric_id, ) @router.delete("/api/tema/{tema_id}/lyric/{lyric_id}") def delete_lyric( tema_id: int, lyric_id: int, ): temes_w.delete_lyric(tema_id=tema_id, lyric_id=lyric_id) return HTMLResponse() @router.get("/api/tema/{tema_id}/link/{link_id}") def link(request: Request, logged_in: auth.LoggedIn, tema_id: int, link_id: int): return tema.link(request=request, logged_in=logged_in, tema_id=tema_id, link_id=link_id) @router.put("/api/tema/{tema_id}/link/{link_id}") def set_link( request: Request, logged_in: auth.RequireLogin, tema_id: int, link_id: int, content_type: Annotated[model.ContentType, Form()], url: Annotated[str, Form()] = "", title: Annotated[str, Form()] = "", ): link_type = guess_link_type(url) new_link = model.Link( id=link_id, content_type=content_type, link_type=link_type, url=url, title=title, ) temes_w.update_link(tema_id=tema_id, link_id=link_id, link=new_link) return tema.link(request=request, logged_in=logged_in, tema_id=tema_id, link_id=link_id) @router.post("/api/tema/{tema_id}/link") def add_link( request: Request, logged_in: auth.RequireLogin, tema_id: int, ): new_tema = temes_w.add_link(tema_id=tema_id) link_id = new_tema.links[-1].id if link_id is None: raise RuntimeError("Invalid link_id on newly created link!") return tema.link_editor( request=request, logged_in=logged_in, tema_id=tema_id, link_id=link_id, ) @router.delete("/api/tema/{tema_id}/link/{link_id}") def delete_link( _: auth.RequireLogin, tema_id: int, link_id: int, ): temes_w.delete_link(tema_id=tema_id, link_id=link_id) return HTMLResponse() @router.get("/api/tema/{tema_id}/link/{link_id}/icon") def link_icon( request: Request, logged_in: auth.LoggedIn, tema_id: int, link_id: int, content_type: Annotated[model.ContentType, Param()], url: Annotated[str, Param()], ): return tema.link_icon( request=request, logged_in=logged_in, tema_id=tema_id, link_id=link_id, url=url, content_type=content_type, )