Extender la API¶
Lo generado se reescribe en cada generate. Lo propio va en dos sitios que generate no toca y
que la API monta sola.
Tus endpoints: routers/custom/¶
# api/routers/custom/__init__.py
from fastapi import APIRouter, Depends
from ..auth import requires_permissions
custom_router = APIRouter(prefix="/informes", tags=["Informes"])
@custom_router.get("/resumen", dependencies=[Depends(requires_permissions("read", "pedido"))])
async def resumen():
...
La carpeta la creas tú, y lo que se monta es custom_router. Se decide al generar: si creas la
carpeta después, hace falta un tai-api generate para que routers/__init__.py la incluya. Si
existe pero no define custom_router, generate avisa.
Dentro puedes usar el cliente de tai-sql de api/database/<schema>/ y las mismas dependencias de
autenticación que los endpoints generados. Para que una consulta filtre por fila como el CRUD, pasa
al DAO rls=rls_for(token, "<schema>") (de ..auth); para comprobar el permiso de una tabla,
can(token, "read", "lote") o require_permission(token, "delete", "lote"), con la misma regla que
el CRUD: ver Filtrado por fila.
No dentro de routers/database/
Un router propio dentro de routers/database/<schema>/ sobrevive a generate —no borra lo que
no reconoce— pero no se monta, y generate avisa de que lo muevas.
Lo del arranque: extensions/¶
# api/extensions/__init__.py
from ..app import health
def setup(app):
app.add_middleware(MiMiddleware)
health.CHECKS["redis"] = comprobar_redis # async def comprobar_redis() -> None
create_app() llama a extensions.setup(app) al final, si el módulo existe: middlewares,
eventos, comprobaciones de salud, montar otra app. Si el módulo existe y falla al importar algo
suyo, el error se ve: no se confunde con que no exista.
Lo que se hace al arrancar y al parar —abrir un pool, cargar un modelo— va en el lifespan de
config.py.
Lo que no conviene tocar¶
| Fichero | Qué pasa si lo editas |
|---|---|
Endpoints, app/, routers/auth/ |
Se reescriben: pierdes el cambio |
__main__.py, __dev__.py, routers/__init__.py |
Si quitas la marca de «Generado por tai-api», generate lo deja como está y avisa, pero deja de actualizarlo: una versión nueva de tai-api no llegará a ese fichero |
resources/ |
Es tuyo: se copió una vez y ninguna versión lo actualiza |
Si algo generado está mal, lo que se arregla es el schema o tai-api, no el fichero.