conversations
Conversas de chat — DM 1-1 ou grupo.
Container das mensagens de chat. Tipo determina semântica:
dm— DM 1-1, sempre 2 membros, criada quando amizade é aceita ou DM request é aceitogroup— grupo com nome, descrição, capa; múltiplos membros com roles
Conversas têm flag is_temporary que liga o modo "Snapchat-style" — mensagens são apagadas após X tempo de leitura por usuário (ver conversation_members e messages).
Colunas
| Coluna | Tipo | Nullable | Default |
|---|---|---|---|
| id ● | uuid | NOT NULL | gen_random_uuid() |
| type | enumcolumn | NOT NULL | — |
| name | varchar | NULL ok | — |
| description | text | NULL ok | — |
| cover_url | varchar | NULL ok | — |
| created_by | uuid | NULL ok | — |
| is_temporary | boolean | NOT NULL | false |
| created_at | timestamp | NOT NULL | now() |
| updated_at | timestamp | NOT NULL | now() |
● primary key ◆ unique
Funcionalidade dos campos
id— UUID, PKtype—dmougroupname— texto livre. Obrigatório pragroup; ignorado emdm(UI mostra nome do outro user).description— opcional, livre. Só para grupos.cover_url— capa do grupo (S3/MinIO).created_by— quem criou. Set null em delete (preserva grupo se dono apaga conta).is_temporary— modo ephemeral. Hoje per-conversation (não per-user); a flag per-user vive emconversation_members.hidden_at.created_at/updated_at— managed.
Foreign keys
| Coluna(s) | Referência | ON DELETE | ON UPDATE |
|---|---|---|---|
| created_by | users.id | set null | no action |
Índices
Esta tabela não tem índices customizados.
Sem índices secundários customizados. Lookups são por membership via conversation_members.
Constraints
PRIMARY KEY (id)
DM 1-1 e amizade
DMs são criadas automaticamente quando:
- Uma amizade é aceita (
friendsService.acceptRequestchamachatGateway.linkFriendship) - Um
dm_requesté aceito por user que não é amigo
DMs entre não-amigos passam por DM request primeiro (ver dm_requests).
Group permissions
conversation_members.permissions é JSONB { can_send_messages: bool, can_send_files: bool }. Usado pra moderação leve em grupos. Roles (owner | admin | member) determinam quem pode mudar essas permissions.
Conversa temporária
Ao criar conversa com is_temporary=true:
- Mensagens novas têm
is_temporary=true - Cron
runTemporaryCleanupReaddeleta msgs lidas após período curto (per-user viahidden_for_user_ids) - Cron
runTemporaryCleanupTtldeleta mensagens antigas (TTL absoluto, fallback)
Padrões de uso
- Criar DM —
POST /chat/conversations { type: 'dm', otherUserId }(ou auto-criada por amizade/dm_request) - Criar grupo —
POST /chat/groups { name, memberIds }(criador viraowner) - Update grupo —
PUT /chat/groups/:id - Sair — DELETE membro próprio (cascade simples no
conversation_members) - Apagar grupo — apenas owner; cascade message + members
Tabelas relacionadas
conversation_members— quem participa, com rolemessages— mensagensdm_requests— pré-conversa entre não-amigosusers— created_by