Files
sqlite_api/app.md
T
Egutierrez a1769a3976 chore: auto-commit (3 archivos)
- app.md
- handlers.go
- events.go

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 00:28:22 +02:00

84 lines
3.6 KiB
Markdown

---
name: sqlite_api
lang: go
domain: infra
description: "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."
tags: [service, api, sqlite, http, registry, fts5]
uses_functions:
- http_json_response_go_infra
uses_types: []
framework: "net/http"
entry_point: "main.go"
dir_path: "projects/fn_monitoring/apps/sqlite_api"
---
## Uso
```bash
# 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 raiz
- `ops:{app}` — operations.db de apps/{app}/ y projects/*/apps/{app}/
Auto-descubre operations.db al arrancar escaneando apps/ y projects/*/apps/.
## Health check
```bash
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/projects` y `GET /api/projects/{id}`. Subqueries con `LEFT JOIN` por `project_id` para conteos nested. Helper `scanAll()` generico para devolver rows como `[][]any`.
- `handlers_mutations.go` (nuevo): `POST /api/reindex` + `POST /api/add/{app,analysis,vault}`. Ejecuta el CLI `fn` via `exec.CommandContext` desde `Server.registryRoot` (timeout 60 s). El binario debe existir en `{registryRoot}/fn` (build local). Validacion de `name` con 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-Token` del `registry_api`). Por ahora bind 127.0.0.1 mitiga.
- `/api/add/function` y `/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`.