03
Autenticación
La sesión es la de Payload. POST /api/usuarios/login con email y password devuelve el usuario, un JWT y su caducidad (exp), y deja la cookie HttpOnly payload-token. Vale cualquiera de las dos vías: la cookie (navegador, con credentials: include; protegida con CSRF, así que solo se acepta desde el propio origen) o la cabecera Authorization: JWT <token> (servidores, scripts, apps: la vía obligatoria fuera del navegador). El token caduca a las 2 horas; /api/usuarios/refresh-token lo renueva sin volver a pedir la contraseña.
GET /api/usuarios/me devuelve el usuario de la sesión (user: null si no hay). GET /api/access resume, para la sesión actual, qué operaciones y qué campos se permiten en cada colección: es la forma recomendada de construir interfaces que se adapten al rol.
# Iniciar sesión: devuelve el usuario, un JWT y deja la cookie payload-token (HttpOnly)
curl -H "Content-Type: application/json" \
-d '{"email":"media@dwfw.test","password":"dwfw-demo-2026"}' \
"https://dwfw.trabemflex.com/api/usuarios/login"
# → { "user": { … }, "token": "<jwt>", "exp": 1790000000 } (+ cookie payload-token)
# Con la cabecera Authorization: JWT (scripts, servidores, apps)
curl -H "Authorization: JWT <token>" "https://dwfw.trabemflex.com/api/usuarios/me"
# En el navegador basta la cookie (mismo origen; con csrf activo la cookie se ignora sin cabecera Origin propia)
fetch('/api/usuarios/me', { credentials: 'include' })
# Renovar el token antes de que caduque (2 h por defecto)
curl -H "Authorization: JWT <token>" -X POST "https://dwfw.trabemflex.com/api/usuarios/refresh-token"
# Qué puede hacer esta sesión en cada colección y campo
curl -H "Authorization: JWT <token>" "https://dwfw.trabemflex.com/api/access"
# Cerrar sesión
curl -H "Authorization: JWT <token>" -X POST "https://dwfw.trabemflex.com/api/usuarios/logout"05
Consultas: parámetros, filtros y paginación
Todos los listados aceptan los mismos parámetros. Las respuestas de lista vienen paginadas con metadatos (totalDocs, totalPages, nextPage…).
| Parámetro | Uso |
|---|
locale | Idioma del contenido: es (defecto), en, zh, ja. Vale para leer y para escribir. `all` devuelve todas las traducciones. |
fallback-locale | Idioma al que caer si falta la traducción (por defecto es). `none` para no caer. |
depth | Niveles de relaciones que se resuelven (0 = solo ids). Por defecto 2. Cuanto menor, más rápida la respuesta. |
limit · page | Paginación: tamaño de página (defecto 10) y número de página (desde 1). `pagination=false` devuelve todo (úsalo con cuidado). |
sort | Campo de orden; con guion delante es descendente (sort=-createdAt). Varios campos separados por coma. |
where[campo][op]=valor | Filtros. Se anidan con where[and][n][campo][op] / where[or][n][campo][op]. Campos de relaciones con punto: autor.nombre, origen.value. |
select[campo]=true | Limitar los campos devueltos. populate[coleccion][campo]=true elige qué campos se resuelven en las relaciones. |
draft · joins | No aplica en este esquema (no hay borradores ni joins). Se documenta para que no sorprenda en la respuesta de /api/access. |
Operador
| Operador | Significado |
|---|
equals | Igual. Con selects, ids de relación, booleanos y fechas ISO. |
not_equals | Distinto. |
in · not_in | Dentro / fuera de una lista separada por comas. |
contains · like | Texto: contiene (sin distinguir mayúsculas) / patrón con todas las palabras. |
greater_than · greater_than_equal | Mayor / mayor o igual: números y fechas. |
less_than · less_than_equal | Menor / menor o igual. |
exists | exists=true / false: el campo tiene valor o no. |
near · within · intersects | Solo campos de tipo point (no hay en este esquema). |
# Lista paginada y ordenada, contenido en japonés, relaciones resueltas dos niveles
curl "https://dwfw.trabemflex.com/api/obras?locale=ja&depth=2&limit=10&page=1&sort=-updatedAt"
# Filtro simple: obras del archivo (movimiento 7)
curl -g "https://dwfw.trabemflex.com/api/obras?where[estadoCuratorial][equals]=movimiento_7"
# Filtros combinados: and / in / exists
curl -g "https://dwfw.trabemflex.com/api/obras?where[and][0][tipo][in]=modelo_3d,avatar&where[and][1][edicion][exists]=true"
# Relación polimórfica: filtrar por value Y relationTo (los ids se repiten entre colecciones)
curl -g "https://dwfw.trabemflex.com/api/conexiones?where[or][0][origen.value][equals]=1&where[or][0][origen.relationTo][equals]=obras"
# Solo algunos campos (respuestas más ligeras)
curl -g "https://dwfw.trabemflex.com/api/obras?select[titulo]=true&select[estadoCuratorial]=true&depth=0"
# Recuento sin traer documentos
curl -g "https://dwfw.trabemflex.com/api/obras/count?where[estadoCuratorial][equals]=movimiento_7"
{
"docs": [ { "id": 3, "titulo": "Metsä · Micelio v3", "estadoCuratorial": "movimiento_7", "…": "…" } ],
"totalDocs": 1,
"limit": 10,
"totalPages": 1,
"page": 1,
"pagingCounter": 1,
"hasPrevPage": false,
"hasNextPage": false,
"prevPage": null,
"nextPage": null
}07
Escritura
POST crea, PATCH actualiza parcialmente (solo lo enviado), DELETE borra. Las relaciones se envían por id; las polimórficas como { relationTo, value }. Los archivos van a Media por multipart/form-data.
- Validación: los campos obligatorios y los valores de select se comprueban en el servidor; un 400 detalla campo y motivo.
- Hooks de doctrina: procedencia=humano se fuerza en Significados; estadoCuratorial solo cambia con movimiento:avanzar; el creador no puede adjudicarse obras ajenas.
- Idempotencia: PATCH y DELETE son idempotentes; POST no (cada llamada crea un documento).
# Crear (requiere obra:crear). Se guarda en la locale indicada; relaciones por id
curl -H "Authorization: JWT $TOKEN" -H "Content-Type: application/json" -X POST \
-d '{"titulo":"Nueva obra","tipo":"modelo_3d","autor":1,"nodoOrigen":"laboratorio_ia"}' \
"https://dwfw.trabemflex.com/api/obras?locale=es"
# → 201 { "message": "…", "doc": { "id": 4, … } }
# Actualización parcial en OTRA locale: solo los campos localizados; lo demás no cambia
curl -H "Authorization: JWT $TOKEN" -H "Content-Type: application/json" -X PATCH \
-d '{"titulo":"New work","descripcionFormal":{"silueta":"…"}}' \
"https://dwfw.trabemflex.com/api/obras/4?locale=en"
# Relación polimórfica al escribir: { relationTo, value }
curl -H "Authorization: JWT $TOKEN" -H "Content-Type: application/json" -X POST \
-d '{"origen":{"relationTo":"obras","value":4},"destino":{"relationTo":"nodos","value":2},"tipoRelacion":"dialoga_con","procedencia":"humano","estado":"propuesta"}' \
"https://dwfw.trabemflex.com/api/conexiones"
# Confirmar una conexión (requiere conexion:confirmar; si no, 403 con mensaje explícito)
curl -H "Authorization: JWT $TOKEN" -X PATCH -H "Content-Type: application/json" \
-d '{"estado":"confirmada","procedencia":"humano"}' "https://dwfw.trabemflex.com/api/conexiones/1"
# Subir un archivo a Media: multipart con `file` y `_payload` (JSON con los demás campos)
curl -H "Authorization: JWT $TOKEN" -F "file=@look-03.png" -F '_payload={"alt":"Look 03"}' "https://dwfw.trabemflex.com/api/media"
# Borrar (requiere obra:borrar)
curl -H "Authorization: JWT $TOKEN" -X DELETE "https://dwfw.trabemflex.com/api/obras/4"08
Referencia de recursos
Un bloque por colección: ruta, quién lee y quién escribe, campos con tipo y localización, y un ejemplo real tomado de la API pública en el momento de renderizar esta página.
| Recurso | Ruta | Lectura | Escritura (capacidad) |
|---|
| Obras | /api/obras | pública solo el archivo (mov. 7); el resto según capacidades | obra:crear · obra:editar / obra:editar_propia · obra:borrar · movimiento:avanzar (estadoCuratorial) |
| Autores | /api/autores | pública | autor:gestionar |
| Nodos | /api/nodos | pública | nodo:gestionar |
| Conexiones | /api/conexiones | pública | conexion:proponer · conexion:confirmar |
| Significados | /api/significados | pública | significado:asignar |
| Movimientos curatoriales | /api/movimientos | pública | movimiento:avanzar |
| Ediciones | /api/ediciones | pública | edicion:gestionar |
| Capítulos de marca | /api/capitulos | pública | capitulo:gestionar |
| Piezas audiovisuales | /api/piezas | pública | pieza:gestionar |
| Activos técnicos | /api/media | pública solo el archivo (mov. 7); el resto según capacidades | obra:crear (subir) · propio: editar / borrar si no publicado · obra:editar: todo y publicar |
| Usuarios | /api/usuarios | con sesión (cada uno se ve a sí mismo; usuario:gestionar ve a todos) | usuario:gestionar |
Capa 1. La obra como documento cultural: tipo, autor, nodo de origen, estado curatorial (7 movimientos), descripción formal y activos técnicos.
- Lectura
- pública solo el archivo (mov. 7); el resto según capacidades
- Escritura (capacidad)
obra:crear · obra:editar / obra:editar_propia · obra:borrar · movimiento:avanzar (estadoCuratorial)- Operaciones
GET /api/obras GET /api/obras/count GET /api/obras/:id POST /api/obras PATCH /api/obras/:id DELETE /api/obras/:id
Campos
| Campo | Tipo | Obligatorio | Localizado | Valores / destino |
|---|
titulo Título | text | sí | sí | — |
tipo Tipo | select | sí | — | modelo_3davatarcoleccion_digitalprenda_fisicaexperiencia_inmersivacodigo_generativo |
autor Autor | relationship | sí | — | relación a autores |
nodoOrigen Nodo de origen (procedencia) | select | sí | — | academico_investigadorcomunidad_digital_emergentelaboratorio_iainstitucion_archivo |
estadoCuratorial Estado curatorial | select | sí | — | movimiento_1movimiento_2movimiento_3movimiento_4movimiento_5movimiento_6movimiento_7 |
descripcionFormal.silueta Silueta | textarea | — | sí | — |
descripcionFormal.material Material | textarea | — | sí | — |
descripcionFormal.sintaxisVisual Sintaxis visual | textarea | — | sí | — |
activosTecnicos Activos técnicos (vértices, texturas, vídeo) | join | — | — | — |
edicion Edición | relationship | — | — | relación a ediciones |
Ejemplo real (GET, depth=0, vista pública)
GET https://dwfw.trabemflex.com/api/obras?depth=0&locale=es&limit=1
{
"id": 3,
"titulo": "Metsä · Micelio v3",
"tipo": "codigo_generativo",
"autor": 3,
"nodoOrigen": "laboratorio_ia",
"estadoCuratorial": "movimiento_7",
"descripcionFormal": {
"silueta": null,
"material": "Crecimiento de micelio simulado como generador de patrón.",
"sintaxisVisual": "La forma no se dibuja: se cultiva."
},
"activosTecnicos": {
"docs": [],
"hasNextPage": false
},
"edicion": null,
"updatedAt": "2026-08-22T18:29:49.582Z",
"createdAt": "2026-08-21T07:12:39.411Z"
}Capa 2. Diseñadores, colectivos, laboratorios e instituciones. El origen cultural es descriptivo, nunca criterio de orden.
- Lectura
- pública
- Escritura (capacidad)
autor:gestionar- Operaciones
GET /api/autores GET /api/autores/count GET /api/autores/:id POST /api/autores PATCH /api/autores/:id DELETE /api/autores/:id
Campos
| Campo | Tipo | Obligatorio | Localizado | Valores / destino |
|---|
nombre Nombre | text | sí | — | — |
tipo Tipo | select | sí | — | diseñadorinvestigadorartistacolectivolaboratorioinstitucion |
origenCultural Origen cultural | text | — | sí | — |
bio Bio | textarea | — | sí | — |
trayectoria Trayectoria | textarea | — | sí | — |
nodos Nodos | relationship[] | — | — | relación a nodos |
taller.capacidad Capacidad del taller | textarea | — | sí | — |
taller.materiales Materiales que trabaja | select[] | — | — | algodonlanalinosedacueropuntodenimfibras_sinteticasmateriales_biobasadostextil_tecnicosin_material_fisico |
taller.tecnologias Tecnologías | select[] | — | — | patronaje_digitalmodelado_3dsimulacion_textildiseno_generativoimpresion_3dcorte_laserbordado_digitalestampacion_digitaltejido_punto_industrialconfeccion_artesanaltenido_natural |
taller.usaFibrasRecicladas ¿Fibras recicladas? | checkbox | — | — | — |
taller.fibrasRecicladasDetalle Fibras recicladas · detalle | textarea | — | sí | — |
taller.notasSostenibilidad Notas de sostenibilidad | textarea | — | sí | — |
Ejemplo real (GET, depth=0, vista pública)
GET https://dwfw.trabemflex.com/api/autores?depth=0&locale=es&limit=1
{
"id": 3,
"nombre": "Lab Metsä",
"tipo": "laboratorio",
"origenCultural": "Helsinki, Finlandia",
"bio": "Laboratorio de materiales generativos.",
"trayectoria": "Spin-off académico centrado en biotextiles simulados.",
"nodos": [],
"taller": {
"capacidad": null,
"materiales": [],
"tecnologias": [],
"usaFibrasRecicladas": null,
"fibrasRecicladasDetalle": null,
"notasSostenibilidad": null,
"procedencia": "humano"
},
"updatedAt": "2026-08-22T18:29:48.843Z",
"createdAt": "2026-08-21T07:12:36.066Z"
}Capa 3. Vértices de la cartografía: corrientes filosóficas, desarrollos técnicos, comunidades, instituciones, tensiones culturales.
- Lectura
- pública
- Escritura (capacidad)
nodo:gestionar- Operaciones
GET /api/nodos GET /api/nodos/count GET /api/nodos/:id POST /api/nodos PATCH /api/nodos/:id DELETE /api/nodos/:id
Campos
| Campo | Tipo | Obligatorio | Localizado | Valores / destino |
|---|
nombre Nombre | text | sí | sí | — |
tipo Tipo | select | sí | — | corriente_filosoficadesarrollo_tecnologico_previocomunidad_subculturainstituciontension_cultural |
descripcion Descripción | textarea | — | sí | — |
Ejemplo real (GET, depth=0, vista pública)
GET https://dwfw.trabemflex.com/api/nodos?depth=0&locale=es&limit=1
{
"id": 4,
"nombre": "Autoría en la era de los modelos generativos",
"tipo": "tension_cultural",
"descripcion": null,
"updatedAt": "2026-08-22T18:29:49.224Z",
"createdAt": "2026-08-21T07:12:36.120Z"
}Capa 3. Aristas tipadas del grafo. Las de procedencia máquina nacen como propuesta; solo un humano las confirma.
- Lectura
- pública
- Escritura (capacidad)
conexion:proponer · conexion:confirmar- Operaciones
GET /api/conexiones GET /api/conexiones/count GET /api/conexiones/:id POST /api/conexiones PATCH /api/conexiones/:id DELETE /api/conexiones/:id
Campos
| Campo | Tipo | Obligatorio | Localizado | Valores / destino |
|---|
origen Origen | relationship | sí | — | relación a obrasnodos |
destino Destino | relationship | sí | — | relación a obrasnodos |
tipoRelacion Tipo de relación | select | sí | — | dialoga_conposibilitada_porconversacion_paralela_con |
procedencia Procedencia | select | sí | — | maquinahumano |
estado Estado | select | sí | — | propuestaconfirmadadescartada |
confirmadaPor Confirmada por | relationship | — | — | relación a usuarios |
confirmadaEn Confirmada en | date | — | — | — |
nota Nota | textarea | — | sí | — |
Ejemplo real (GET, depth=0, vista pública)
GET https://dwfw.trabemflex.com/api/conexiones?depth=0&locale=es&limit=1
{
"id": 6,
"origen": {
"relationTo": "obras",
"value": 2
},
"destino": {
"relationTo": "obras",
"value": 1
},
"tipoRelacion": "conversacion_paralela_con",
"procedencia": "maquina",
"estado": "propuesta",
"confirmadaPor": null,
"confirmadaEn": null,
"nota": "Coincidencia en el campo silueta: ambas describen la silueta por lo que le falta de sostén estructural. Aguacero 01: \"Volumen inflado, sin punto de apoyo.\" Kata: \"Hombro desestructurado: la autoridad se retira del cuerpo.\" Vocabulario compartido: \"sin punto de apoyo\" / \"desestructurado\" / \"se retira\" — en las dos la forma se define por la ausencia de estructura que la sostenga, no por lo que añade. Divergen en tipo (coleccion_digital vs modelo_3d), nodo de origen (comunidad_digital_emergente vs academico_investigador) y material (plástico de baja poligonización vs lana simulada), y no tienen conexión entre sí en la cartografía. Solo se usa la descripción formal; no se usa el significado asignado a Kata ni el origen cultural de los autores. Evidencia sintáctica, pendiente de lectura curatorial.",
"updatedAt": "2026-09-03T07:10:25.005Z",
"createdAt": "2026-09-03T07:10:25.005Z"
}Capa 4. La pregunta hermenéutica fija y las lecturas. Siempre de procedencia humana (lo fuerza el servidor).
- Lectura
- pública
- Escritura (capacidad)
significado:asignar- Operaciones
GET /api/significados GET /api/significados/count GET /api/significados/:id POST /api/significados PATCH /api/significados/:id DELETE /api/significados/:id
Campos
| Campo | Tipo | Obligatorio | Localizado | Valores / destino |
|---|
obra Obra | relationship | sí | — | relación a obras |
tensionSubyacente ¿A qué tensión de la sociedad contemporánea responde esta creación? | textarea | sí | sí | — |
lectura Lecturas | array | — | — | — |
lectura[].tipo Tipo | select | — | — | antropologicaeticapoetica |
lectura[].texto Texto | textarea | — | sí | — |
textosTeoricos Aparato crítico asociado | textarea | — | sí | — |
curador Curador | relationship | — | — | relación a usuarios |
procedencia Procedencia · solo lectura | text | — | — | — |
Ejemplo real (GET, depth=0, vista pública)
GET https://dwfw.trabemflex.com/api/significados?depth=0&locale=es&limit=1
{
"id": 2,
"obra": 3,
"tensionSubyacente": "jhksjhdkae",
"lectura": [],
"textosTeoricos": null,
"curador": 1,
"procedencia": "humano",
"updatedAt": "2026-09-04T12:02:19.341Z",
"createdAt": "2026-09-04T12:02:19.340Z"
}Recurso
Movimientos curatoriales
/api/movimientosWorkflow curatorial: los siete movimientos por obra, con responsable y procedencia.
- Lectura
- pública
- Escritura (capacidad)
movimiento:avanzar- Operaciones
GET /api/movimientos GET /api/movimientos/count GET /api/movimientos/:id POST /api/movimientos PATCH /api/movimientos/:id DELETE /api/movimientos/:id
Campos
| Campo | Tipo | Obligatorio | Localizado | Valores / destino |
|---|
obra Obra | relationship | sí | — | relación a obras |
movimiento Movimiento | select | sí | — | movimiento_1movimiento_2movimiento_3movimiento_4movimiento_5movimiento_6movimiento_7 |
estado Estado | select | sí | — | pendienteen_cursocompletado |
responsable Responsable | relationship | — | — | relación a usuarios |
procedencia Procedencia | select | sí | — | maquinahumano |
notas Notas | textarea | — | sí | — |
Ejemplo real (GET, depth=0, vista pública)
GET https://dwfw.trabemflex.com/api/movimientos?depth=0&locale=es&limit=1
{
"id": 21,
"obra": 3,
"movimiento": "movimiento_7",
"estado": "en_curso",
"responsable": 2,
"procedencia": "humano",
"updatedAt": "2026-08-21T07:12:40.179Z",
"createdAt": "2026-08-21T07:12:40.179Z"
}Event Stack. Cada edición (fechas, ciudad anfitriona, país en foco).
- Lectura
- pública
- Escritura (capacidad)
edicion:gestionar- Operaciones
GET /api/ediciones GET /api/ediciones/count GET /api/ediciones/:id POST /api/ediciones PATCH /api/ediciones/:id DELETE /api/ediciones/:id
Campos
| Campo | Tipo | Obligatorio | Localizado | Valores / destino |
|---|
nombre Nombre | text | sí | sí | — |
fechaInicio Fecha de inicio | date | sí | — | — |
fechaFin Fecha de fin | date | — | — | — |
ciudadAnfitriona Ciudad anfitriona (Country in Focus) | text | — | sí | — |
paisEnFoco País en foco | text | — | sí | — |
Ejemplo real (GET, depth=0, vista pública)
GET https://dwfw.trabemflex.com/api/ediciones?depth=0&locale=es&limit=1
{
"id": 1,
"nombre": "DWFW · Edición I",
"fechaInicio": "2027-03-12T00:00:00.000Z",
"fechaFin": "2027-03-15T00:00:00.000Z",
"ciudadAnfitriona": "Madrid",
"paisEnFoco": "España",
"updatedAt": "2026-08-22T18:29:48.495Z",
"createdAt": "2026-08-21T07:12:35.921Z",
"fase": "antes",
"cuentaAtras": 14386975
}Recurso
Capítulos de marca
/api/capitulosEvent Stack. Capítulos de marca de una edición: sección, continente, duración, obras.
- Lectura
- pública
- Escritura (capacidad)
capitulo:gestionar- Operaciones
GET /api/capitulos GET /api/capitulos/count GET /api/capitulos/:id POST /api/capitulos PATCH /api/capitulos/:id DELETE /api/capitulos/:id
Campos
| Campo | Tipo | Obligatorio | Localizado | Valores / destino |
|---|
titulo Título | text | sí | sí | — |
edicion Edición | relationship | sí | — | relación a ediciones |
autor Autor | relationship | — | — | relación a autores |
duracionMin Duración (min) | number | — | — | — |
seccion Sección | select | — | — | country_in_focusicons_of_designfuture_labconversaciones |
continente Continente | select | — | — | asiaoceaniaeuropaafricaamerica |
obras Obras | relationship[] | — | — | relación a obras |
Ejemplo real (GET, depth=0, vista pública)
GET https://dwfw.trabemflex.com/api/capitulos?depth=0&locale=es&limit=1
{
"id": 3,
"titulo": "Conversaciones · Autoría y máquina",
"edicion": 1,
"autor": 2,
"duracionMin": 60,
"seccion": "conversaciones",
"continente": "america",
"obras": [
2
],
"updatedAt": "2026-08-22T19:21:09.427Z",
"createdAt": "2026-08-22T19:21:09.303Z"
}Recurso
Piezas audiovisuales
/api/piezasEvent Stack. Piezas audiovisuales (premiere, conversación, making of…) con referencia de streaming.
- Lectura
- pública
- Escritura (capacidad)
pieza:gestionar- Operaciones
GET /api/piezas GET /api/piezas/count GET /api/piezas/:id POST /api/piezas PATCH /api/piezas/:id DELETE /api/piezas/:id
Campos
| Campo | Tipo | Obligatorio | Localizado | Valores / destino |
|---|
titulo Título | text | sí | sí | — |
tipo Tipo | select | — | — | premiereconversacionmaking_ofhero_lookreemisionclip |
capitulo Capítulo | relationship | — | — | relación a capitulos |
obra Obra | relationship | — | — | relación a obras |
urlStreaming URL de streaming | text | — | — | — |
Ejemplo real (GET, depth=0, vista pública)
GET https://dwfw.trabemflex.com/api/piezas?depth=0&locale=es&limit=1
{
"id": 3,
"titulo": "Conversación con Colectivo Aguacero",
"tipo": "conversacion",
"capitulo": 3,
"obra": 2,
"urlStreaming": null,
"updatedAt": "2026-08-22T19:21:09.874Z",
"createdAt": "2026-08-22T19:21:09.764Z"
}Activos técnicos: imágenes (≤50 MB), vídeo (≤2 GB), modelos 3D .glb/.gltf/.usdz/.fbx/.obj (≤500 MB) y PDF (≤20 MB). Privados por defecto (curación a ciegas): los ve quien los subió y curaduría; se publican al llegar la obra al movimiento 7. Almacenados en Cloudflare R2; vídeo y 3D se suben directos al bucket. Ficha: descripción, créditos, materiales, uso de IA, licencia, software.
- Lectura
- pública solo el archivo (mov. 7); el resto según capacidades
- Escritura (capacidad)
obra:crear (subir) · propio: editar / borrar si no publicado · obra:editar: todo y publicar- Operaciones
GET /api/media GET /api/media/count GET /api/media/:id POST /api/media PATCH /api/media/:id DELETE /api/media/:id
Campos
| Campo | Tipo | Obligatorio | Localizado | Valores / destino |
|---|
titulo Título | text | — | sí | — |
alt Texto alternativo | text | — | sí | — |
categoria Categoría · solo lectura | select | — | — | imagenvideomodelo3ddocumento |
obra Obra | relationship | — | — | relación a obras |
publico Público | checkbox | — | — | — |
subidoPor Subido por · solo lectura | relationship | — | — | relación a usuarios |
ficha.descripcion Descripción | textarea | — | sí | — |
ficha.creditos Créditos / autoría | text | — | — | — |
ficha.materiales Materiales / técnica | text | — | sí | — |
ficha.usoIA Uso de IA | select | — | — | ningunoasistidogenerativo |
ficha.licencia Licencia | select | — | — | todos_los_derechoscc_bycc_by_nccc_by_nc_nd |
ficha.software Software / pipeline | text | — | — | — |
Ejemplo real (GET, depth=0, vista pública)
Sin documentos visibles sin sesión.
Cuentas con roles y capacidades extra (concesiones con caducidad) y, opcionalmente, vinculadas a un autor.
- Lectura
- con sesión (cada uno se ve a sí mismo; usuario:gestionar ve a todos)
- Escritura (capacidad)
usuario:gestionar- Operaciones
GET /api/usuarios GET /api/usuarios/count GET /api/usuarios/:id POST /api/usuarios PATCH /api/usuarios/:id DELETE /api/usuarios/:id POST …/login POST …/logout GET …/me POST …/refresh-token
Campos
| Campo | Tipo | Obligatorio | Localizado | Valores / destino |
|---|
nombre Nombre | text | sí | — | — |
roles Roles | select[] | sí | — | direccionfounding_curatorcuradorinvestigadorcreadorpartnermediaadvisory |
concesiones Capacidades extra (temporales o permanentes) | array | — | — | — |
concesiones[].capacidad Capacidad | select | sí | — | obra:leerobra:crearobra:editarobra:editar_propiaobra:borrarautor:leerautor:gestionarautor:editar_tallernodo:leernodo:gestionarconexion:leerconexion:proponerconexion:confirmarsignificado:leersignificado:asignarmovimiento:avanzarindex:leeredicion:leeredicion:gestionarcapitulo:gestionarpieza:gestionarusuario:gestionar |
concesiones[].caduca Caduca | date | — | — | — |
concesiones[].motivo Motivo | text | — | — | — |
scopeEdiciones Acotado a estas ediciones | relationship[] | — | — | relación a ediciones |
autor Autor | relationship | — | — | relación a autores |
enableAPIKey | checkbox | — | — | — |
apiKey | text | — | — | — |
email | email | sí | — | — |
Ejemplo real (GET, depth=0, vista pública)
Sin documentos visibles sin sesión.
10
OpenAPI, tipos e integración
La especificación OpenAPI 3.0 se genera del mismo config: impórtala en Postman, Insomnia, Stoplight o genera un cliente con openapi-generator. Los tipos TypeScript del esquema están en src/payload-types.ts (se regeneran con pnpm generate:types).
Descargar openapi.jsonpayload-types.ts · GitHub
// Cliente mínimo en JavaScript (navegador o Node 18+)
const API = 'https://dwfw.trabemflex.com/api'
const res = await fetch(`${API}/usuarios/login`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ email, password }),
credentials: 'include', // en el navegador basta la cookie; en servidor usa la cabecera
})
const { token } = await res.json()
// Lectura con el JWT en cabecera
const obras = await fetch(`${API}/obras?locale=ja&depth=1&limit=20`, {
headers: { Authorization: `JWT ${token}` },
}).then((r) => r.json())
// Tipos TypeScript del esquema (src/payload-types.ts)
import type { Obra, Autor } from './payload-types'