Publicaciones Guardadas y Colecciones — Referencia Técnica
← Volver a Publicaciones Guardadas y Colecciones
Dónde vive esto
Backend
apps/backend/graphql/resolvers/saved-post.resolver.js— resuelvecollectionPosts,isPostSaved,savedPostsCount,savePost,unsavePost,movePostToCollection(la antigua querymySavedPosts, que abarcaba todas las colecciones a la vez, fue eliminada; las publicaciones ahora solo se consultan por colección mediantecollectionPosts)apps/backend/graphql/resolvers/saved-collection.resolver.js— resuelvemyCollections,publicCollections,createCollection,updateCollection,deleteCollection,toggleCollectionPrivacyapps/backend/graphql/types/saved-post.type.js— esquema de GraphQL deSavedPostapps/backend/graphql/types/saved-collection.type.js— esquema de GraphQL deSavedCollectionapps/backend/managers/post-managers/saved-post.manager.js— lógica de negocio/validación de publicaciones guardadasapps/backend/managers/post-managers/saved-collection.manager.js— lógica de negocio/validación de colecciones
Frontend
apps/frontend-nextjs/src/components/PostCard.tsx—handleToggleSaveconecta el ícono de marcador: dejar de guardar es una llamada directa aunsavePost, mientras que guardar abreSaveToCollectionModalpara que la publicación pueda colocarse en una colección específica; refleja el estadoisSavedapps/frontend-nextjs/src/components/SavedCollectionsSection.tsx— se renderiza bajo la pestaña "Guardado" deProfilePage.tsxy en/settings/saved(SavedPage.tsx); consultamyCollections/collectionPosts, conectacreateCollection/deleteCollection/updateCollection(renombrar)/toggleCollectionPrivacy/movePostToCollectionapps/frontend-nextjs/src/components/SaveToCollectionModal.tsx— selector de en qué colección guardar una publicación; también conectacreateCollectionapps/frontend-nextjs/src/page-components/settings/SavedPage.tsx—Settings → Saved(/settings/saved), solo renderizaSavedCollectionsSectionapps/frontend-nextjs/src/page-components/settings/DiscoverCollectionsPage.tsx—Settings → Discover collections(/settings/discover-collections); consultapublicCollections, enlaza cada resultado a/{username}
Checklist de implementación técnica
-
savePost/unsavePost— resolvers conectados; el ícono de marcador dePostCard.tsxes un interruptor realmente funcional -
myCollections/collectionPosts— conectadas; utilizadas porSavedCollectionsSection.tsxbajo la pestaña Guardado. Ya no existe una query que devuelva todas las colecciones a la vez (mySavedPostsfue eliminada); la interfaz profundiza en una colección a la vez. -
createCollection/deleteCollection— conectadas; utilizadas porSavedCollectionsSection.tsx/SaveToCollectionModal.tsx -
updateCollection(renombrar) — conectada;handleRenamedeSavedCollectionsSection.tsxla llama desde la vista de detalle de la colección -
toggleCollectionPrivacy— conectada;handleTogglePrivacydeSavedCollectionsSection.tsx(la etiqueta Pública/Privada en la vista de detalle de la colección) -
movePostToCollection— conectada;handleMovePostdeSavedCollectionsSection.tsx(pasar el cursor sobre una publicación → "Mover" → elegir destino) -
publicCollections— conectada;DiscoverCollectionsPage.tsxen/settings/discover-collections
Colecciones (SavedCollection)
| Campo | Descripción |
|---|---|
name | Nombre de la colección |
description | Descripción opcional |
isPublic | Visible para otros usuarios |
isDefault | Colección "Guardado" creada automáticamente que recibe cada usuario en su primer guardado. deleteCollection rechaza eliminarla (aplicado en el backend); SavedCollectionsSection.tsx también oculta los controles de renombrar/privacidad/eliminar para ella en la interfaz. El frontend la muestra bajo una etiqueta localizada (collections.defaultName) en lugar de su name original |
postCount | Número de publicaciones guardadas |
myCollections devuelve todas las colecciones propiedad del usuario autenticado, incluyendo postCount para renderizar el conteo de miniaturas de la cuadrícula. También crea de forma diferida la colección predeterminada del usuario primero, de modo que siempre esté presente incluso antes de su primer guardado. publicCollections devuelve un feed navegable de colecciones públicas de cualquier usuario.
createCollection crea una nueva colección con nombre. updateCollection cambia el nombre o la descripción. deleteCollection la elimina y deja de guardar todas las publicaciones dentro de ella (las publicaciones no se eliminan); rechaza eliminar la colección predeterminada (isDefault). toggleCollectionPrivacy alterna entre pública y privada en una sola llamada.
query MyCollections { myCollections { id name description isPublic isDefault postCount } }
query PublicCollections($limit: Int) { publicCollections(limit: $limit) { id name user { username } } }
mutation CreateCollection($input: SavedCollectionCreateInput!) { createCollection(input: $input) { id name } }
mutation UpdateCollection($collectionId: ID!, $input: SavedCollectionUpdateInput!) {
updateCollection(collectionId: $collectionId, input: $input) { id name }
}
mutation DeleteCollection($collectionId: ID!) { deleteCollection(collectionId: $collectionId) }
mutation ToggleCollectionPrivacy($collectionId: ID!) { toggleCollectionPrivacy(collectionId: $collectionId) { isPublic } }
Publicaciones guardadas (SavedPost)
collectionPosts devuelve las publicaciones guardadas de una colección específica (collectionId es obligatorio). Ya no existe una única query que devuelva las publicaciones guardadas de todas las colecciones a la vez — el frontend enumera las colecciones mediante myCollections y profundiza en una a través de collectionPosts por colección.
isPostSaved es una verificación booleana ligera — úsala para renderizar el estado del ícono de marcador en una tarjeta de publicación. savedPostsCount devuelve un solo entero para la fila de estadísticas del perfil.
savePost guarda una publicación, opcionalmente dentro de una colección. Si se omite collectionId: volver a guardar una publicación ya guardada la deja sin cambios en su colección actual, mientras que un guardado completamente nuevo se coloca en la colección predeterminada ("Guardado") creada automáticamente para el usuario — ya no existe un estado sin colección/"Sin clasificar". unsavePost la elimina de la colección en la que se encuentre. movePostToCollection cambia a qué colección pertenece una publicación previamente guardada.
query CollectionPosts($collectionId: ID!, $limit: Int, $offset: Int) {
collectionPosts(collectionId: $collectionId, limit: $limit, offset: $offset) {
id
post { id text media { mediaUrl } }
collection { name }
createdAt
}
}
query IsPostSaved($postId: ID!) { isPostSaved(postId: $postId) }
query SavedPostsCount { savedPostsCount }
mutation SavePost($postId: ID!, $collectionId: ID) { savePost(postId: $postId, collectionId: $collectionId) { id } }
mutation UnsavePost($postId: ID!) { unsavePost(postId: $postId) }
mutation MovePostToCollection($postId: ID!, $collectionId: ID!) {
movePostToCollection(postId: $postId, collectionId: $collectionId) { id collection { name } }
}
Flujo típico
- El usuario toca "Guardar" en una publicación
SaveToCollectionModalse abre como un selector de colección (con la opción de crear una nueva colección al momento); la colección predeterminada "Guardado" del usuario es una de las opciones- La publicación aparece en los resultados de
collectionPostsde esa colección, visible bajo la pestaña Guardado deProfilePage.tsxo enSettings → Saved - Las colecciones públicas se pueden explorar mediante
Settings → Discover collections, que enlaza cada resultado al perfil de su propietario