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"` }