Saltar a contenido

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.