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 comauto_share_to_feed=true.item_idreferencia o item.
Colunas
| Coluna | Tipo | Nullable | Default |
|---|---|---|---|
| id ● | uuid | NOT NULL | gen_random_uuid() |
| user_id | uuid | NOT NULL | — |
| type | enumcolumn | NOT NULL | — |
| content | text | NULL ok | — |
| visibility | enumcolumn | NOT NULL | — |
| item_id | uuid | NULL ok | — |
| collection_id | uuid | NULL ok | — |
| created_at | timestamp | NOT NULL | now() |
| updated_at | timestamp | NOT NULL | now() |
● primary key ◆ unique
Funcionalidade dos campos
id— UUID, PKuser_id— autor. Cascade delete: apaga posts do user.type—manualouitem_sharecontent— texto livre. Opcional (post pode ter só mídia, ou só ser item_share).visibility—public,friends_only,privateitem_id— só praitem_share. Cascade delete (item apagado → post some).collection_id— só praitem_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ência | ON DELETE | ON UPDATE |
|---|---|---|---|
| user_id | users.id | cascade | no action |
| item_id | items.id | cascade | no action |
| collection_id | collections.id | set null | no action |
Índices
| Nome | Único | Colunas | WHERE (parcial) |
|---|---|---|---|
| posts_user_created_at_idx | não | user_id, created_at | — |
| posts_visibility_created_at_idx | não | visibility, created_at | — |
| posts_item_id_idx | não | item_id | — |
Detalhes:
posts_user_created_at_idx— perfil do usuário (timeline ordenada)posts_visibility_created_at_idx— feed públicoposts_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 manual —
POST /postscomcontent+ media uploads → INSERT post + INSERT post_media - Item share automático — disparado pelo
ItemsService.createsecollection.auto_share_to_feed - Editar —
PUT /posts/:id(content + visibility) - Deletar — DELETE cascateia comments/reactions/media
Tabelas relacionadas
users— autor (cascade)items— alvo de item_share (cascade)collections— origem de item_share (set null)post_media— anexos (cascade)post_reactions— reactions (cascade)post_comments— comments (cascade)notifications—post_comment,post_reaction