Módulos
Chat
Conversas DM 1-1 + grupos com roles, mensagens com mídia/áudio/calls, modo Snapchat, DM requests.
Visão geral
O módulo Chat é o mais extenso do sistema (32 endpoints REST + ~15 eventos socket). Cobre:
- Conversas DM 1-1 — entre amigos. Auto-criadas no aceite de friendship.
- Grupos — N membros com roles (owner/admin/member) + permissions granulares
- DM Requests — pedido inicial entre não-amigos antes de virar conversa real
- Mensagens — texto, attachments (audio/video/imagem/arquivo), reply, calls, reactions livres
- End-to-end encryption (E2EE) — Signal Protocol em DMs e grupos; backend só vê ciphertext. Detalhes em Criptografia E2EE.
- Modo Snapchat per-user — mensagens efêmeras em conversas marcadas como temporary
- Forward / share — replicar mensagens em N conversas
- Read receipts + typing — eventos de socket ephemeral
- Calls 1-1 — sinalização WebRTC via socket; backend não relays media
Entidades principais
| Tabela | Papel |
|---|---|
conversations | Container (DM ou group) |
conversation_members | Membership + estado per-user |
dm_requests | Pré-conversa entre não-amigos |
messages | Conteúdo (texto, attachments refs, callMetadata) |
message_reactions | Reações |
message_attachments | Mídia anexada |
push_subscriptions | Web Push subscriptions |
user_presence | Last seen |
Endpoints
32 endpoints divididos:
- DM/Requests (5): open dm, send/list/accept/reject dm request
- Grupos (5): create, get, update, delete, upload cover
- Membros (5): invite, remove, update role/permissions, leave
- Mensagens (6): get history, send, delete, forward, react, upload attachment
- Conversas (9): list, get, mark read, archive/unarchive, mute/unmute, hide, set temporary
- Push (2): register, remove
Ver API Reference — Chat.
Fluxos
DM com amigo
DM Request (não-amigo)
Enviar mensagem com attachment
Modo Snapchat per-user
Calls 1-1 (WebRTC signaling)
Mute / Archive / Hide
| Ação | Tabela updated | Efeito |
|---|---|---|
| Mute | conversation_members.is_muted=true | Mensagens chegam, sem push |
| Archive | conversation_members.is_archived=true | Some da lista ativa, não some o conteúdo |
| Hide (Snapchat per-user) | conversation_members.hidden_at=now() | Mensagens novas viram efêmeras pro user |
Eventos de socket
Catálogo completo em Eventos de socket. Os principais do chat:
| Evento | Sentido |
|---|---|
message:new | Server → cliente (room conv:id) |
message:edited | idem |
message:deleted | idem |
message:reaction | idem |
conversation:read | bidirecional (peer recebe) |
conversation:typing | bidirecional ephemeral |
conversation:refresh | server → user (forçar re-fetch lista) |
conversation:created | server → user (membro adicionado) |
conversation:updated | server → room |
presence:online/offline/update | server → friend-of:userId |
import:progress/done | server → user (Steam) |
call:incoming/offer/answer/ice/hangup | bidirecional WebRTC signaling |
Edge cases e regras especiais
- DM entre não-amigos vai como dm_request — rotear automaticamente sem confundir UX
hidden_for_user_idsem messages é JSONB — guarda ids dos users que "apagaram pra mim"- Read receipts respeitam
users.show_read_receipts— se desabilitado, eventos não são emitidos - Mute não impede notif persistida — só suprime push/sound
- Group
ownerúnico — sair sem transferir owner derruba o grupo - Reply preserved se msg original deletada —
reply_to_idsem cascade; UI mostra "mensagem deletada" - Forward limite 20 destinos — anti-spam
- Attachment sem message_id — possível durante upload preview; se nunca virar mensagem, fica órfão (cleanup pendência)
- Calls têm callMetadata mesmo se rejeitada —
statusregistra outcome - Push é dual — socket + web push paralelos
is_temporaryé per-conversation +hidden_atper-user combinam pra modo "Snapchat só pra mim"- Group permissions restringem can_send_messages e can_send_files separadamente
- DM request rejected é final — sender não pode reenviar (unique constraint)
- Mensagens E2E são opacas pro backend —
messages.is_encrypted=true+contentcarrega ciphertext ("messageType.base64body"em DM;base64bodyem grupo). Decifração só no cliente; push notifications são metadata-only
Dependências entre módulos
- Friends — DM 1-1 só entre amigos; block desconecta
- Notifications — push notif depende de subscriptions ativas
- Users —
show_presenceeshow_read_receiptsafetam o que é emitido - Storage (S3) — uploads de attachments + thumbnails
- Reports — message/conversation podem ser target de reports
- Crypto —
signal_*tabelas + endpoints/crypto/*provêm o keying material consumido pelas DMs e grupos. Ver Criptografia E2EE.