Posts & Feed
Posts manuais + item_share automáticos, comentários, reações temáticas, feed cronológico.
Visão geral
Posts são unidades de feed do Geek Social. Há dois tipos:
manual— criado pelo usuário com texto + mídia opcionalitem_share— criado automaticamente quando o user adiciona item numa coleção comauto_share_to_feed=true
O feed mostra posts dos amigos + próprios + públicos, respeitando posts.visibility e filtrando user_blocks em ambas as direções.
Posts têm comentários (planos, sem aninhamento), reactions temáticas (gamer-themed: ⚡epic, 💥critical, 💎loot, 🎯gg, ⚡power_up), e múltiplas mídias em galeria.
Entidades principais
| Tabela | Papel |
|---|---|
posts | Container do post |
post_media | Mídia anexada |
post_comments | Comentários |
post_reactions | Reações com tipos fixos |
Endpoints
15 endpoints distribuídos em 4 sub-módulos:
Posts (em /posts): create, get, update, delete, add media, remove media (6).
Comments (em /posts/:postId): add, list, update, delete (4).
Reactions (em /posts/:postId): react, remove, list (3).
Feed (em /feed e /users/:userId/posts): get feed do user, posts no perfil de outro (2).
Fluxos
Criar post manual com mídia
Item_share automático
Feed com privacy + blocks
Reagir / trocar reação
Comentar (sem threads)
Eventos de socket
| Evento | Quando |
|---|---|
notification:new (post_comment) | Comentário novo no seu post |
notification:new (post_reaction) | Reação nova no seu post |
Posts em si não geram eventos próprios — feed é poll-based via REST. Considerar futuramente: emit feed:new-post pra friends online.
Edge cases e regras especiais
- Post sem content nem mídia — proibido pelo controller (mas
contenté opcional no schema) - Item_share preserva mesmo se item deletado — não. Cascade delete derruba (item_id é FK com cascade)
- Editar post: apenas autor; updated_at é setado, UI mostra "editado"
- Editar comentário: apenas autor edita; mas dono do post pode deletar (moderação leve)
- Post
private: só o autor vê. Strange use case mas suportado (talvez "rascunho público no futuro") - Reaction de tipo único por user/post — trocar tipo é UPDATE; remover é DELETE
- Soft delete de post: não há. DELETE é hard, cascateia comments/reactions/media. Arquivos S3 ficam órfãos (pendência geral)
- Feed performance: índice
posts_visibility_created_at_idxfavorece queries de feed; mas feed cresce — paginação é mandatória visibility=friends_onlyvsusers.privacy=friends_only— granulares e independentes; user pode ter perfil público e post friends_only
Dependências entre módulos
- Friends — visibility gating
- Items / Collections — origem dos item_share posts
- Notifications — post_comment, post_reaction
- Storage — uploads de mídia
- Reports — posts e comments podem ser denunciados (target_type=post|comment)