Files
fn_registry/functions/infra/crud_resource.go
T
egutierrez 4c88adc183 feat(crud): tipos y generador de DDL para recursos CRUD
Anade los tipos CRUDResource, CRUDField, CRUDListParams y CRUDListResult
que modelan un recurso CRUD sobre SQLite, junto con dos funciones puras:
- crud_define_resource valida nombre, tabla y campos (tipos SQLite validos,
  nombres reservados, duplicados) antes de retornar el CRUDResource.
- crud_generate_table_sql genera el DDL CREATE TABLE IF NOT EXISTS con
  id TEXT PRIMARY KEY, timestamps estandar y, si aplica, deleted_at para
  soft delete.

Primera capa de 0021 — el resto (handlers + registro de rutas) se apoya
sobre estas estructuras.
2026-04-18 17:15:21 +02:00

50 lines
2.4 KiB
Go

package infra
// CRUDResource define un recurso CRUD completo para generar handlers HTTP.
// Name es el nombre singular del recurso en snake_case (ej: "project").
// Table es el nombre de la tabla SQLite asociada (ej: "projects").
// Fields son las columnas del recurso sin contar id, created_at, updated_at y deleted_at.
// SoftDelete si es true, el handler delete hace UPDATE deleted_at en vez de DELETE real.
type CRUDResource struct {
Name string // nombre del recurso (singular, snake_case)
Table string // nombre de la tabla SQLite
Fields []CRUDField // campos del recurso (sin id ni timestamps)
SoftDelete bool // si true, usa deleted_at en vez de DELETE
}
// CRUDField define un campo de un recurso CRUD.
// Type debe ser uno de: TEXT, INTEGER, REAL, BLOB.
// Required fuerza NOT NULL en la tabla y validacion en create.
// Unique anade un UNIQUE constraint en la tabla.
// Default es el valor SQL por defecto (vacio = sin default).
// Validations define reglas de validacion: min_length, max_length, pattern, min, max, enum.
type CRUDField struct {
Name string // nombre del campo (snake_case)
Type string // tipo SQLite: TEXT, INTEGER, REAL, BLOB
Required bool // NOT NULL + validacion en create
Unique bool // UNIQUE constraint
Default string // valor por defecto en CREATE TABLE
Validations map[string]string // reglas: min_length, max_length, pattern, min, max, enum
}
// CRUDListParams agrupa los parametros de paginacion, orden y filtro del endpoint list.
// Page es 1-based (default 1). PerPage tiene default 20 y max 100.
// SortBy es el nombre del campo por el que ordenar. SortDir es "asc" o "desc".
// Filters contiene pares campo -> valor para filtros exactos en WHERE.
type CRUDListParams struct {
Page int // pagina actual (1-based, default 1)
PerPage int // items por pagina (default 20, max 100)
SortBy string // campo por el que ordenar
SortDir string // "asc" o "desc"
Filters map[string]string // campo -> valor para WHERE exacto
}
// CRUDListResult resultado paginado de una lista CRUD, serializable a JSON.
type CRUDListResult struct {
Items []map[string]any `json:"items"`
Total int `json:"total"`
Page int `json:"page"`
PerPage int `json:"per_page"`
TotalPages int `json:"total_pages"`
}