Banco de dadosTables
post_media
Mídia (imagem/vídeo) anexada a posts.
Tabela de mídia anexada a um post. Um post pode ter múltiplas mídias em ordem (imagens em galeria, etc.). Os arquivos vivem no MinIO/S3; aqui só guardamos as URLs.
Colunas
| Coluna | Tipo | Nullable | Default |
|---|---|---|---|
| id ● | uuid | NOT NULL | gen_random_uuid() |
| post_id | uuid | NOT NULL | — |
| url | text | NOT NULL | — |
| thumbnail_url | text | NULL ok | — |
| display_order | integer | NOT NULL | — |
● primary key ◆ unique
Funcionalidade dos campos
id— UUID, PKpost_id— FK praposts. Cascade delete (apaga post → apaga mídia metadata, mas não os arquivos no S3).url— URL do arquivo (S3/MinIO path-style, ex:http://localhost:9000/geek-social-media/posts/abc/img.jpg)thumbnail_url— versão reduzida (gerada viasharpouffmpeg). Opcional para imagens; útil pra vídeos.display_order— inteiro (0-based) pra ordenar carrosséis. Sem unique constraint — empate possível mas não esperado.
Foreign keys
| Coluna(s) | Referência | ON DELETE | ON UPDATE |
|---|---|---|---|
| post_id | posts.id | cascade | no action |
Índices
| Nome | Único | Colunas | WHERE (parcial) |
|---|---|---|---|
| post_media_post_id_idx | não | post_id | — |
post_media_post_id_idx permite buscar todas as mídias de um post rapidamente.
Constraints
PRIMARY KEY (id)
Limpeza de S3 órfão
Ao deletar um post, o registro post_media cascateia mas o arquivo no S3 não é deletado automaticamente. Pendência: hook em delete de post pra deletar via S3Adapter.delete(). Hoje vira "lixo" com cost mínimo no MinIO local mas pode acumular em prod.
Soluções possíveis:
- App-level: deletar arquivos antes do DELETE do post (atomicidade fraca)
- Background job: scan periódico de S3 vs registros DB
- S3 lifecycle policy: deletar objetos não-referenciados após X dias
Padrões de uso
- Insert — durante
POST /postsouPUT /posts/:idcom upload via multipart - Reorder — UPDATE
display_orderem transação - Delete único —
DELETE /posts/:id/media/:mediaId
Tabelas relacionadas
posts— pai (cascade)