Geek Social — Documentação
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

ColunaTipoNullableDefault
id uuidNOT NULLgen_random_uuid()
post_iduuidNOT NULL
urltextNOT NULL
thumbnail_urltextNULL ok
display_orderintegerNOT NULL

primary key   unique

Funcionalidade dos campos

  • id — UUID, PK
  • post_id — FK pra posts. 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 via sharp ou ffmpeg). 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ênciaON DELETEON UPDATE
post_idposts.idcascadeno action

Índices

NomeÚnicoColunasWHERE (parcial)
post_media_post_id_idxnãopost_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 /posts ou PUT /posts/:id com upload via multipart
  • Reorder — UPDATE display_order em transação
  • Delete únicoDELETE /posts/:id/media/:mediaId

Tabelas relacionadas

  • posts — pai (cascade)

On this page