a1769a3976
- app.md - handlers.go - events.go Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
3.6 KiB
3.6 KiB
name, lang, domain, description, tags, uses_functions, uses_types, framework, entry_point, dir_path
| name | lang | domain | description | tags | uses_functions | uses_types | framework | entry_point | dir_path | |||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| sqlite_api | go | infra | API REST HTTP read-only sobre registry.db y operations.db de cada app. Permite consultas SQL (solo SELECT/PRAGMA), busqueda FTS5, exploracion de tablas y schema. Bind por defecto a localhost:8484. |
|
|
net/http | main.go | projects/fn_monitoring/apps/sqlite_api |
Uso
# Arrancar (default: 127.0.0.1:8484)
cd apps/sqlite_api && go run -tags fts5 .
# Bind personalizado
go run -tags fts5 . --bind 0.0.0.0:8484
Endpoints
| Metodo | Path | Descripcion |
|---|---|---|
| GET | /health |
Health check |
| GET | /api/databases |
Lista DBs disponibles (registry + ops:*) |
| GET | /api/databases/:db/tables |
Tablas y vistas de una DB |
| GET | /api/databases/:db/schema |
Schema SQL completo |
| POST | /api/databases/:db/query |
Ejecuta query SQL read-only |
| GET | /api/databases/:db/fts?q=...&table=... |
Busqueda FTS5 directa |
| GET | /api/projects |
Lista proyectos con conteos nested + orphans [v0.2] |
| GET | /api/projects/{id} |
Detalle apps/analyses/vaults; id="orphans" para huerfanas [v0.2] |
| POST | /api/reindex |
Ejecuta fn index server-side, devuelve {ok, output} [v0.2] |
| POST | /api/add/app |
Body {name, lang, domain, project, description} → scaffold + reindex [v0.2] |
| POST | /api/add/analysis |
Body {name, project, packages[], description} → invoca fn run init_jupyter_analysis [v0.2] |
| POST | /api/add/vault |
Body {name, project, path, description} → crea dir/symlink + entry en vault.yaml [v0.2] |
Seguridad
- Solo queries SELECT, PRAGMA, WITH y EXPLAIN
- SQLite abierto con
?mode=ro(read-only a nivel driver) - Timeout de 5 segundos por query
- Bind a localhost por defecto
- CORS habilitado para acceso desde frontends
Bases de datos
registry— registry.db de la raizops:{app}— operations.db de apps/{app}/ y projects/*/apps/{app}/
Auto-descubre operations.db al arrancar escaneando apps/ y projects/*/apps/.
Health check
curl http://localhost:8484/health
# {"status":"ok"}
Puerto
8484 (no colisiona con Metabase 3000, Jupyter 8888, deploy_server 9090).
Estado actual
v0.2 — projects view + mutaciones [done 2026-04-25]
El servicio pasa de read-only puro a soportar mutaciones. Split de handlers:
handlers.go: read-only sobre BDs SQLite (queries SELECT/PRAGMA). Sin cambios.handlers_projects.go(nuevo):GET /api/projectsyGET /api/projects/{id}. Subqueries conLEFT JOINporproject_idpara conteos nested. HelperscanAll()generico para devolver rows como[][]any.handlers_mutations.go(nuevo):POST /api/reindex+POST /api/add/{app,analysis,vault}. Ejecuta el CLIfnviaexec.CommandContextdesdeServer.registryRoot(timeout 60 s). El binario debe existir en{registryRoot}/fn(build local). Validacion denamecon regex implicito a-z0-9_.
Server gana campo registryRoot string. NewServer(pool, root) en lugar de NewServer(pool). El root se resuelve en main.go con findRegistryRoot() (env FN_REGISTRY_ROOT o cwd).
Lo siguiente que pega
- Permisos/auth: ahora cualquier cliente local puede escribir. Para deploy a un VPS habria que anadir token header (similar a
X-Registry-Tokendelregistry_api). Por ahora bind 127.0.0.1 mitiga. /api/add/functiony/api/add/type(kinds que hoy no se exponen via HTTP). El CLI ya lo soporta; el endpoint seria casi paralelo a/api/add/app.