Geek Social — Documentação
Banco de dadosTables

posts

Posts do feed — manuais escritos pelo usuário ou item-share automáticos.

Posts são publicações de feed — texto livre + mídia, ou compartilhamento estruturado de um item. O feed mostra posts dos amigos respeitando visibility por post (independente de users.privacy).

Tipos:

  • manual — post comum: texto + mídia opcional. content é o texto.
  • item_share — post automatizado quando o usuário adiciona item numa coleção com auto_share_to_feed=true. item_id referencia o item.

Colunas

ColunaTipoNullableDefault
id uuidNOT NULLgen_random_uuid()
user_iduuidNOT NULL
typeenumcolumnNOT NULL
contenttextNULL ok
visibilityenumcolumnNOT NULL
item_iduuidNULL ok
collection_iduuidNULL ok
created_attimestampNOT NULLnow()
updated_attimestampNOT NULLnow()

primary key   unique

Funcionalidade dos campos

  • id — UUID, PK
  • user_id — autor. Cascade delete: apaga posts do user.
  • typemanual ou item_share
  • content — texto livre. Opcional (post pode ter só mídia, ou só ser item_share).
  • visibilitypublic, friends_only, private
  • item_id — só pra item_share. Cascade delete (item apagado → post some).
  • collection_id — só pra item_share (qual coleção recebeu o item). Set null em delete (post permanece no feed mesmo se coleção sumir).
  • created_at / updated_at — managed.

Foreign keys

Coluna(s)ReferênciaON DELETEON UPDATE
user_idusers.idcascadeno action
item_iditems.idcascadeno action
collection_idcollections.idset nullno action

Índices

NomeÚnicoColunasWHERE (parcial)
posts_user_created_at_idxnãouser_id, created_at
posts_visibility_created_at_idxnãovisibility, created_at
posts_item_id_idxnãoitem_id

Detalhes:

  • posts_user_created_at_idx — perfil do usuário (timeline ordenada)
  • posts_visibility_created_at_idx — feed público
  • posts_item_id_idx — "todos os posts referenciando este item"

Constraints

  • PRIMARY KEY (id)

Visibility na construção do feed

FeedService cria query que respeita visibility e relação:

SELECT * FROM posts
WHERE
  (visibility = 'public')
  OR (visibility = 'friends_only' AND EXISTS (SELECT 1 FROM friendships ...))
  OR (visibility = 'private' AND user_id = $currentUser)
ORDER BY created_at DESC
LIMIT 20 OFFSET ?

(Acoplado com filtro de user_blocks pra não mostrar de gente bloqueada.)

Padrões de uso

  • Criar post manualPOST /posts com content + media uploads → INSERT post + INSERT post_media
  • Item share automático — disparado pelo ItemsService.create se collection.auto_share_to_feed
  • EditarPUT /posts/:id (content + visibility)
  • Deletar — DELETE cascateia comments/reactions/media

Tabelas relacionadas

On this page