Appi · Referencia

Social

Comentarios en hilos sobre tu contenido y foros con temas y respuestas.

Los comentarios se asocian a un recurso comentable (por ahora, posts del módulo Content) y admiten un nivel de respuestas mediante parent_id.

Los temas (topics) funcionan como un foro: se agrupan libremente con el campo group y reciben respuestas (replies).

Moderación: los comentarios y temas nuevos se crean inactivos y solo aparecen en los listados públicos cuando el owner del sitio los aprueba.

Comentarios

GET/social/comments Público

Listar comentarios de un recurso

Devuelve los comentarios raíz aprobados, en orden cronológico, con sus respuestas aprobadas en children.

Query string
commentable_typerequerido'ContentPost'Tipo de recurso comentado.
commentable_idrequeridouuidID del recurso (por ejemplo, el id del post).
pagenumberPágina a consultar (por defecto 1).
per_pagenumberResultados por página (por defecto 10).
Ejemplo de respuesta
{
  "meta": {
    "total": 15,
    "perPage": 10,
    "currentPage": 1,
    "lastPage": 2,
    "firstPage": 1
  },
  "data": [
    {
      "id": "uuid",
      "content": "¡Muy buen artículo!",
      "parentId": null,
      "isEdited": false,
      "active": true,
      "createdAt": "2026-01-01T00:00:00.000Z",
      "user": { "id": "uuid", "fullName": "Ada Lovelace", "avatar": "https://…" },
      "children": []
    }
  ]
}
GET/social/comments/:id Público

Obtener un comentario con su padre y respuestas

Parámetros de ruta
idrequeridostringID del comentario.
Ejemplo de respuesta
{
  "id": "uuid",
  "content": "¡Muy buen artículo!",
  "parentId": null,
  "isEdited": false,
  "active": true,
  "createdAt": "2026-01-01T00:00:00.000Z",
  "user": { "id": "uuid", "fullName": "Ada Lovelace", "avatar": "https://…" },
  "children": []
}
POST/social/comments Autenticado

Crear un comentario

Cuerpo (JSON)
commentable_typerequerido'ContentPost'Tipo de recurso.
commentable_idrequeridouuidID del recurso.
contentrequeridostringTexto del comentario.
parent_iduuid | nullID del comentario al que responde.
Ejemplo de petición
{
  "commentable_type": "ContentPost",
  "commentable_id": "uuid-del-post",
  "content": "¡Muy buen artículo!"
}
Ejemplo de respuesta
{
  "id": "uuid",
  "content": "¡Muy buen artículo!",
  "parentId": null,
  "isEdited": false,
  "active": true,
  "createdAt": "2026-01-01T00:00:00.000Z",
  "user": { "id": "uuid", "fullName": "Ada Lovelace", "avatar": "https://…" },
  "children": []
}
  • Queda pendiente de moderación (active: false) hasta que el owner lo apruebe.
PUT/social/comments/:id Autenticado

Editar un comentario propio

Parámetros de ruta
idrequeridostringID del comentario.
Cuerpo (JSON)
contentrequeridostringNuevo texto.
Ejemplo de petición
{ "content": "Texto corregido" }
  • Solo se permite durante los primeros 5 minutos desde su creación; después responde 403. El comentario queda marcado con isEdited: true.

Temas y respuestas

GET/social/topics Público

Listar temas aprobados

Query string
pagenumberPágina a consultar (por defecto 1).
per_pagenumberResultados por página (por defecto 10).
groupstringFiltra por grupo.
qstringBúsqueda en título o contenido.
Ejemplo de respuesta
{
  "meta": {
    "total": 15,
    "perPage": 10,
    "currentPage": 1,
    "lastPage": 2,
    "firstPage": 1
  },
  "data": [
    {
      "id": "uuid",
      "name": "¿Cómo despliego mi sitio?",
      "slug": "como-despliego-mi-sitio",
      "group": "preguntas",
      "content": "Tengo una duda…",
      "active": true,
      "createdAt": "2026-01-01T00:00:00.000Z",
      "user": { "id": "uuid", "fullName": "Ada Lovelace", "avatar": "https://…" }
    }
  ]
}
GET/social/topics/:slug Público

Obtener un tema con sus respuestas

Las respuestas vienen paginadas, de la más reciente a la más antigua.

Parámetros de ruta
slugrequeridostringSlug del tema.
Query string
pagenumberPágina a consultar (por defecto 1).
per_pagenumberResultados por página (por defecto 10).
Ejemplo de respuesta
{
  "topic": {
    "id": "uuid",
    "name": "¿Cómo despliego mi sitio?",
    "slug": "como-despliego-mi-sitio",
    "group": "preguntas",
    "content": "Tengo una duda…",
    "active": true,
    "createdAt": "2026-01-01T00:00:00.000Z",
    "user": { "id": "uuid", "fullName": "Ada Lovelace", "avatar": "https://…" }
  },
  "replies": {
    "meta": { "total": 3, "perPage": 10, "currentPage": 1, "lastPage": 1 },
    "data": [{ "id": "uuid", "content": "Prueba con…", "createdAt": "…", "user": { "id": "uuid", "fullName": "Ada Lovelace", "avatar": "https://…" } }]
  }
}
POST/social/topics Miembro del sitio

Crear un tema

Cuerpo (JSON)
namerequeridostringTítulo. El slug se genera automáticamente.
contentrequeridostringContenido del tema.
groupstringGrupo o categoría.
Ejemplo de petición
{ "name": "¿Cómo despliego mi sitio?", "content": "Tengo una duda…", "group": "preguntas" }
Ejemplo de respuesta
{
  "id": "uuid",
  "name": "¿Cómo despliego mi sitio?",
  "slug": "como-despliego-mi-sitio",
  "group": "preguntas",
  "content": "Tengo una duda…",
  "active": true,
  "createdAt": "2026-01-01T00:00:00.000Z",
  "user": { "id": "uuid", "fullName": "Ada Lovelace", "avatar": "https://…" }
}
  • Queda pendiente de moderación hasta que el owner lo apruebe.
POST/social/topics/:slug/replies Miembro del sitio

Responder un tema

Parámetros de ruta
slugrequeridostringSlug del tema.
Cuerpo (JSON)
contentrequeridostringTexto de la respuesta.
Ejemplo de petición
{ "content": "Prueba con…" }

Moderación

Solo owner del sitio

Herramientas para aprobar, ocultar o eliminar la participación de los usuarios.

Estas rutas solo responden a usuarios con rol owner. Úsalas desde un panel de administración privado, nunca desde el frontend público de tu sitio.
GET/admin/social/comments Owner del sitio

Listar todos los comentarios (incluye pendientes)

Query string
pagenumberPágina a consultar (por defecto 1).
per_pagenumberResultados por página (por defecto 10).
qstringBúsqueda en el contenido.
commentable_typestringFiltra por tipo de recurso.
commentable_iduuidFiltra por recurso.
GET/admin/social/comments/:id Owner del sitio

Ver un comentario con su hilo

Parámetros de ruta
idrequeridostringID del comentario.
PUT/admin/social/comments/:id Owner del sitio

Aprobar u ocultar un comentario

Parámetros de ruta
idrequeridostringID del comentario.
Cuerpo (JSON)
activerequeridobooleantrue para publicarlo, false para ocultarlo.
Ejemplo de petición
{ "active": true }
DELETE/admin/social/comments/:id Owner del sitio

Eliminar un comentario

Parámetros de ruta
idrequeridostringID del comentario.
GET/admin/social/topics Owner del sitio

Listar todos los temas

Query string
pagenumberPágina a consultar (por defecto 1).
per_pagenumberResultados por página (por defecto 10).
qstringBúsqueda.
GET/admin/social/topics/:id Owner del sitio

Ver un tema por id

Parámetros de ruta
idrequeridostringID del tema.
PUT/admin/social/topics/:id Owner del sitio

Editar, aprobar u ocultar un tema

Parámetros de ruta
idrequeridostringID del tema.
Cuerpo (JSON)
namestringMínimo 3 caracteres.
contentstringContenido.
activebooleanVisibilidad pública.
Ejemplo de petición
{ "active": true }
GET/admin/social/topics/:topic_id/replies Owner del sitio

Listar respuestas de un tema

Parámetros de ruta
topic_idrequeridostringID del tema.
Query string
pagenumberPágina (por defecto 1).
per_pagenumberResultados por página (por defecto 20).
qstringBúsqueda.