ovdashboard/api/ovdashboard_api/routers/text.py
2022-09-05 23:30:06 +02:00

100 lines
2 KiB
Python

"""
Router "text" provides:
- listing text files
- finding text files by name prefix
- getting image file content as converted Markdown by name prefix
"""
import re
from typing import Iterator
from fastapi import APIRouter, Depends
from markdown import markdown
from ..config import Config
from ..dav_file import DavFile
from ._common import FileNameLister, PrefixFinder, PrefixUnique
router = APIRouter(prefix="/text", tags=["text"])
_lister = FileNameLister(
remote_path="text",
re=re.compile(
r"\.(txt|md)$",
flags=re.IGNORECASE,
),
)
_finder = PrefixFinder(_lister)
_unique = PrefixUnique(_finder)
async def get_ticker_lines() -> Iterator[str]:
ticker = await DavFile("text/ticker.txt").string
return (
line.strip()
for line in ticker.split("\n")
if line.strip()
)
async def get_ticker_content_lines(
ticker_lines: Iterator[str] = Depends(get_ticker_lines),
) -> Iterator[str]:
return (
line
for line in ticker_lines
if not line.startswith("#")
)
@router.get("/get/ticker")
async def get_ticker_content(
ticker_content_lines: Iterator[str] = Depends(get_ticker_content_lines),
) -> str:
cfg = await Config.get()
ticker_content_lines = ["", *ticker_content_lines, ""]
ticker_content = cfg.ticker_separator.join(ticker_content_lines)
return markdown(
ticker_content.strip()
)
@router.get(
"/list",
response_model=list[str],
responses=_lister.responses,
)
async def list_texts(
names: Iterator[str] = Depends(_lister),
) -> list[str]:
return list(names)
@router.get(
"/find/{prefix}",
response_model=list[str],
responses=_finder.responses,
)
async def find_texts(
names: Iterator[str] = Depends(_finder),
) -> list[str]:
return list(names)
@router.get(
"/get/{prefix}",
response_model=str,
responses=_unique.responses,
)
async def get_text(
name: str = Depends(_unique),
) -> str:
text = await DavFile(f"{_lister.remote_path}/{name}").string
return markdown(
text
)