Banco de dadosTables
message_reactions
Reações em mensagens de chat (emojis livres).
Reações em mensagens. Diferente de post_reactions, aqui o emoji é livre (string até 16 chars). Cada usuário pode reagir com múltiplos emojis na mesma mensagem (não está limitado a 1 reação como nos posts), mas cada par (message_id, user_id, emoji) é único — não dá pra reagir com o mesmo emoji 2x.
Colunas
| Coluna | Tipo | Nullable | Default |
|---|---|---|---|
| id ● | uuid | NOT NULL | gen_random_uuid() |
| message_id | uuid | NOT NULL | — |
| user_id | uuid | NOT NULL | — |
| emoji | varchar | NOT NULL | — |
| created_at | timestamp | NOT NULL | now() |
● primary key ◆ unique
Funcionalidade dos campos
id— UUID, PKmessage_id— FK pramessages(cascade)user_id— FK prausers(cascade)emoji— string até 16 chars. Suporta emojis multi-byte (ex: 👨🚀 family). Backend não normaliza Unicode (variantes podem fragmentar contagem).created_at— momento da reação
Foreign keys
| Coluna(s) | Referência | ON DELETE | ON UPDATE |
|---|---|---|---|
| message_id | messages.id | cascade | no action |
| user_id | users.id | cascade | no action |
Índices
| Nome | Único | Colunas | WHERE (parcial) |
|---|---|---|---|
| message_reactions_unique | sim | message_id, user_id, emoji | — |
| message_reactions_message_idx | não | message_id | — |
Detalhes:
message_reactions_unique—(message_id, user_id, emoji)impede mesma reação repetida do mesmo usermessage_reactions_message_idx— usado pra carregar todas reações de uma mensagem rapidamente
Constraints
PRIMARY KEY (id)
Agregação na UI
Frontend agrupa por emoji: { '🎉': [user1, user2], '👀': [user3] }. Mostra com count e tooltip de quem reagiu.
Padrões de uso
- Reagir —
POST /chat/messages/:id/react { emoji }→ INSERT - Remover —
DELETE /chat/messages/:id/react?emoji=...→ DELETE - Toggle — frontend faz POST e se 409 (já existe), faz DELETE em vez