feat: add compatibility table endpoint and rendering for game libraries
This commit is contained in:
49
ams/api/routes/compat.py
Normal file
49
ams/api/routes/compat.py
Normal file
@@ -0,0 +1,49 @@
|
||||
"""Catalog-wide compatibility table, grouped by library name, as a downloadable file.
|
||||
|
||||
GET /compat?format=md -> Markdown table (attachment compat.md)
|
||||
GET /compat?format=json -> structured JSON (attachment compat.json)
|
||||
|
||||
Builds `ams.compat` entries from every catalogued snapshot, labelling each by its game (or
|
||||
'(bez gry)' when unlinked). Same engine library name across games clusters into surface variants,
|
||||
so divergent copies get an asterisk — exactly what the docs table needs.
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from fastapi import APIRouter, Depends, Query
|
||||
from fastapi.responses import Response
|
||||
from sqlalchemy import select
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from ...compat import Entry, compatibility_table, render_json, render_markdown
|
||||
from ...snapshot import Snapshot as Surface
|
||||
from .. import models
|
||||
from ..db import get_db
|
||||
|
||||
router = APIRouter(tags=["compat"])
|
||||
|
||||
_NO_GAME = "(bez gry)"
|
||||
|
||||
|
||||
@router.get("/compat")
|
||||
def get_compat(
|
||||
format: str = Query("md", pattern="^(md|json)$", description="md = Markdown, json = structured"),
|
||||
db: Session = Depends(get_db),
|
||||
) -> Response:
|
||||
entries = [
|
||||
Entry(game=snap.game.name if snap.game else _NO_GAME, snapshot=Surface(snap.data))
|
||||
for snap in db.scalars(select(models.Snapshot).order_by(models.Snapshot.id))
|
||||
]
|
||||
table = compatibility_table(entries)
|
||||
|
||||
if format == "json":
|
||||
return Response(
|
||||
content=render_json(table),
|
||||
media_type="application/json",
|
||||
headers={"Content-Disposition": 'attachment; filename="compat.json"'},
|
||||
)
|
||||
return Response(
|
||||
content=render_markdown(table),
|
||||
media_type="text/markdown; charset=utf-8",
|
||||
headers={"Content-Disposition": 'attachment; filename="compat.md"'},
|
||||
)
|
||||
Reference in New Issue
Block a user