Controlador: app/Http/Controllers/Api/PostController.php (480 líneas)
/api/posts (pública)Feed de publicaciones paginado (10 por página).
Query params (opcionales):
page: Número de páginaResponse:
{
"success": true,
"data": {
"current_page": 1,
"data": [
{
"id": 42,
"titulo": "Mi primer post",
"descripcion": "Descripción del post",
"tipo": "imagen",
"imagen": "uuid_full.webp",
"imagen_mini": "uuid_feed.webp",
"imagen_url": "https://dominio.com/uploads/uuid_full.webp",
"imagen_mini_url": "https://dominio.com/uploads/uuid_feed.webp",
"visibility": "public",
"user": {
"id": 1,
"name": "Juan",
"username": "juanp",
"imagen": "perfil.jpg",
"insignia": null,
"imagen_url": "https://dominio.com/perfiles/perfil.jpg"
},
"comments_count": 5,
"likes_count": 12,
"created_at": "2025-06-20T...",
"compact_time": "2 horas"
}
],
"last_page": 8,
"per_page": 10,
"total": 76
}
}
Flujo: Ordena por created_at DESC, eager loads user y comentarios, agrega withCount('likes', 'comentarios'), construye URLs de imagen dinámicamente.
/api/posts/{post} (pública)Detalle de un post con comentarios en árbol jerárquico.
Response: Incluye el post completo con:
comments: Array de comentarios raíz con children recursivosid, comentario, user, depth, reply_count, gif_url, childrenformatCommentTree():
Post
├── Comentario 1 (depth 0)
│ ├── Respuesta 1.1 (depth 1)
│ │ └── Respuesta 1.1.1 (depth 2)
│ └── Respuesta 1.2 (depth 1)
└── Comentario 2 (depth 0)
El método agrupa comentarios por parent_id, luego construye el árbol recursivamente. Incluye user data en cada comentario.
/api/posts/filter (pública)Filtrar posts por universidad y/o carrera.