Posts
Endpoints para crear y gestionar posts sociales, likes y comentarios.
Modelos de Datos
Section titled “Modelos de Datos”Los siguientes modelos de Prisma pertenecen al schema social:
model Post { id String @id @default(cuid()) userProfileId String @map("user_profile_id") title String? content String imageUrl String? @map("image_url") videoUrl String? @map("video_url") isPublic Boolean @default(true) @map("is_public")
userProfile UserProfile @relation(fields: [userProfileId], references: [id], onDelete: Cascade) likes Like[] comments Comment[]
createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at")
@@map("posts") @@schema("social")}model Like { id String @id @default(cuid()) userProfileId String @map("user_profile_id") postId String @map("post_id")
userProfile UserProfile @relation(fields: [userProfileId], references: [id], onDelete: Cascade) post Post @relation(fields: [postId], references: [id], onDelete: Cascade)
createdAt DateTime @default(now()) @map("created_at")
@@unique([userProfileId, postId]) @@map("likes") @@schema("social")}Comment
Section titled “Comment”model Comment { id String @id @default(cuid()) userProfileId String @map("user_profile_id") postId String @map("post_id") content String
userProfile UserProfile @relation(fields: [userProfileId], references: [id], onDelete: Cascade) post Post @relation(fields: [postId], references: [id], onDelete: Cascade)
createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at")
@@map("comments") @@schema("social")}Endpoints
Section titled “Endpoints”Obtener Posts
Section titled “Obtener Posts”Obtener posts públicos con filtrado.
- URL:
/api/v1/social/posts - Método:
GET - Autenticación Requerida: Sí
Descripción Interna
Section titled “Descripción Interna”Este endpoint obtiene posts públicos:
-
Filtro base: Solo posts con
isPublic: true -
Filtros opcionales:
userId: Posts de un usuario específicofollowing: Si es true y se proporciona userId, obtiene posts de usuarios seguidos
-
Lógica de following:
- Obtiene lista de followingIds del usuario
- Filtra posts donde userProfileId está en esa lista
-
Incluye:
- userProfile (id, name)
- Contadores de likes y comments
-
Ordenado por createdAt descendente
Parámetros de Consulta de Solicitud
Section titled “Parámetros de Consulta de Solicitud”limit: Número de posts por páginaoffset: Offset para paginaciónuserId: Filtrar por usuariofollowing: Obtener posts solo de usuarios seguidos
Respuesta
Section titled “Respuesta”{ "data": [ { "id": "...", "title": "My first post", "content": "Just finished a great workout!", "isPublic": true, "createdAt": "2023-10-27T10:00:00Z", "userProfile": { "id": "...", "name": "John Doe" }, "_count": { "likes": 5, "comments": 3 } } ], "pagination": {...}}Ejemplo de Cliente Hono
Section titled “Ejemplo de Cliente Hono”import { hcWithType } from '@vitality-gym/api/client'
const client = hcWithType('http://localhost:3000')
const res = await client.api.v1.social.posts.$get({ query: { limit: '10' }})Crear Post
Section titled “Crear Post”Crear un nuevo post social.
- URL:
/api/v1/social/posts - Método:
POST - Autenticación Requerida: Sí
Descripción Interna
Section titled “Descripción Interna”Este endpoint crea un nuevo post:
-
Obtiene userProfileId del token de autenticación
-
Crea el post con:
- title, content (proporcionados)
- imageUrl (opcional)
- isPublic (default: true)
- userProfileId
-
Incluye en respuesta:
- userProfile (id, name)
- Contadores iniciales (0 likes, 0 comments)
Cuerpo de Solicitud
Section titled “Cuerpo de Solicitud”{ "title": "Workout Complete", "content": "Just finished a great workout!", "imageUrl": "https://...", "isPublic": true}Ejemplo de Cliente Hono
Section titled “Ejemplo de Cliente Hono”import { hcWithType } from '@vitality-gym/api/client'
const client = hcWithType('http://localhost:3000')
const res = await client.api.v1.social.posts.$post({ json: { content: 'Just finished a great workout!' }})Obtener Post por ID
Section titled “Obtener Post por ID”Obtener detalles de un post específico incluyendo likes y comentarios.
- URL:
/api/v1/social/posts/:id - Método:
GET - Autenticación Requerida: Sí
Descripción Interna
Section titled “Descripción Interna”Este endpoint obtiene un post con todo su contenido:
- Busca post por ID usando
findUniqueOrThrow - Incluye:
- userProfile (id, userId, name)
- likes con userProfile de cada like
- comments con userProfile, ordenados por fecha descendente
- Contadores de likes y comments
Actualizar Post
Section titled “Actualizar Post”Actualizar un post existente.
- URL:
/api/v1/social/posts/:id - Método:
PUT - Autenticación Requerida: Sí
Eliminar Post
Section titled “Eliminar Post”Eliminar un post.
- URL:
/api/v1/social/posts/:id - Método:
DELETE - Autenticación Requerida: Sí
Alternar Like
Section titled “Alternar Like”Dar o quitar like a un post.
- URL:
/api/v1/social/posts/:id/like - Método:
POST - Autenticación Requerida: Sí
Descripción Interna
Section titled “Descripción Interna”Este endpoint alterna el like en un post:
-
Busca like existente con compound key (userProfileId + postId)
-
Si no existe: Crea nuevo like
-
Si existe: Elimina el like
-
Retorna el like creado o eliminado con userProfile
Comportamiento Toggle
Section titled “Comportamiento Toggle”- Primera llamada: Añade like
- Segunda llamada: Quita like
- Tercera llamada: Añade like (etc.)
Ejemplo de Cliente Hono
Section titled “Ejemplo de Cliente Hono”import { hcWithType } from '@vitality-gym/api/client'
const client = hcWithType('http://localhost:3000')
const res = await client.api.v1.social.posts[':id'].like.$post({ param: { id: 'post_id' }})Crear Comentario
Section titled “Crear Comentario”Añadir un comentario a un post.
- URL:
/api/v1/social/posts/:id/comments - Método:
POST - Autenticación Requerida: Sí
Descripción Interna
Section titled “Descripción Interna”Este endpoint añade un comentario:
- Obtiene postId de params y userProfileId del token
- Crea el comentario con content proporcionado
- Incluye userProfile en respuesta
Cuerpo de Solicitud
Section titled “Cuerpo de Solicitud”{ "content": "Great job!"}Ejemplo de Cliente Hono
Section titled “Ejemplo de Cliente Hono”import { hcWithType } from '@vitality-gym/api/client'
const client = hcWithType('http://localhost:3000')
const res = await client.api.v1.social.posts[':id'].comments.$post({ param: { id: 'post_id' }, json: { content: 'Great job!' }})Eliminar Comentario
Section titled “Eliminar Comentario”Eliminar un comentario.
- URL:
/api/v1/social/comments/:commentId - Método:
DELETE - Autenticación Requerida: Sí
Descripción Interna
Section titled “Descripción Interna”Este endpoint elimina un comentario:
- Verifica propiedad: Compara userProfileId del comentario con el del token
- Si no coincide: Lanza error “No tienes permisos para eliminar este comentario”
- Si coincide: Elimina el comentario
Nota: Solo el autor del comentario puede eliminarlo.