Geek Social — Documentação
Banco de dadosTables

messages

Mensagens de chat — texto, áudio, vídeo, imagem, arquivo, calls.

Mensagens enviadas em conversas. Suporta vários formatos:

  • Textocontent preenchido, sem attachments
  • Áudio/Vídeo/Imagem/Arquivo — anexos em message_attachments com mime_type indicando tipo
  • Callcall_metadata JSONB com info da call (status, duração, iniciador)
  • Replyreply_to_id referencia outra message do mesmo conversation

Mensagens podem ser deletadas (soft via deleted_at) ou escondidas per-user (hidden_for_user_ids).

Colunas

ColunaTipoNullableDefault
id uuidNOT NULLgen_random_uuid()
conversation_iduuidNOT NULL
user_iduuidNOT NULL
contenttextNULL ok
reply_to_iduuidNULL ok
call_metadatajsonbNULL ok
is_temporarybooleanNOT NULLfalse
temporary_eventjsonbNULL ok
hidden_for_user_idsjsonbNOT NULL[]
deleted_attimestampNULL ok
created_attimestampNOT NULLnow()
updated_attimestampNOT NULLnow()

primary key   unique

Funcionalidade dos campos

  • id — UUID, PK
  • conversation_id — FK pra conversations. Cascade delete.
  • user_id — autor. Cascade delete.
  • content — texto da mensagem. Pode ser NULL (mensagens de só-mídia ou só-call).
  • reply_to_id — FK auto-referencial pra messages.id. Usado pra "reply quoted" na UI. Sem cascade enforcement — apagar a msg referenciada deixa o reply órfão (frontend mostra "mensagem deletada").
  • call_metadata — JSONB com { status, durationSec, startedAt, endedAt, initiatorId } para mensagens de call. Status: completed | missed | rejected | cancelled | failed.
  • is_temporary — flag set se a conversa estava em modo temporário no momento do envio
  • temporary_event — JSONB com { enabled: bool, byUserId: string }. Marca o ponto de mudança de estado (ligar/desligar modo temp). Mensagem-evento mostra "Joe ativou mensagens temporárias".
  • hidden_for_user_ids — JSONB array. Quando user X marca msg como "lida + escondida" no modo temp, seu id entra aqui. Quando todos os destinatários estão na lista, cron deleta a msg.
  • deleted_at — soft delete. Frontend mostra "Mensagem apagada" no lugar do conteúdo.
  • created_at / updated_at — managed.

Foreign keys

Coluna(s)ReferênciaON DELETEON UPDATE
conversation_idconversations.idcascadeno action
user_idusers.idcascadeno action

Índices

NomeÚnicoColunasWHERE (parcial)
messages_conversation_created_at_idxnãoconversation_id, created_at

messages_conversation_created_at_idx — query principal (paginar mensagens da conversa em ordem cronológica).

Constraints

  • PRIMARY KEY (id)

Soft delete vs hard delete

  • Apagar pra mim — adiciona meu user_id em hidden_for_user_ids. Outros continuam vendo.
  • Apagar pra todos — UPDATE deleted_at = now(). Todos veem "Mensagem apagada".
  • Apagar pelo cron temp — UPDATE deleted_at quando hidden_for_user_ids cobre todos os membros (a mensagem some pra todos efetivamente).

Forward / share / download

Endpoints separados:

  • POST /chat/messages/:id/forward { conversationIds } — replica em N conversas
  • GET /chat/messages/:id/share — gera link público temporário (raro, ainda é débito)
  • GET /chat/messages/:id/download — para attachments, retorna URL S3 com signed URL

Padrões de uso

  • Enviar textoPOST /chat/messages { conversationId, content }
  • Enviar mídia — multipart upload, backend cria message + attachments numa transação
  • Reply — campo replyToId no body
  • Marcar lidaPOST /chat/conversations/:id/read (atualiza conversation_members.last_read_at)
  • ReagirPOST /chat/messages/:id/react { emoji } (insere em message_reactions)

Tabelas relacionadas

On this page