Banco de dadosTables
post_reactions
Reações (gamer-themed) em posts.
Reações em posts. O Geek Social usa um set fixo de reações temáticas (não emoji livre):
power_up(⚡) — gostei muito / forçaepic(🌟) — épico, espetacularcritical(💥) — crítico, golpe certeiroloot(💎) — quero! / desejadogg(🎯) — good game, bem jogado
Cada usuário pode reagir uma vez por post (unique (post_id, user_id)). Reagir de novo trocando o tipo é UPDATE.
Colunas
| Coluna | Tipo | Nullable | Default |
|---|---|---|---|
| id ● | uuid | NOT NULL | gen_random_uuid() |
| post_id | uuid | NOT NULL | — |
| user_id | uuid | NOT NULL | — |
| type | enumcolumn | NOT NULL | — |
| created_at | timestamp | NOT NULL | now() |
● primary key ◆ unique
Funcionalidade dos campos
id— UUID, PKpost_id— FK praposts(cascade delete)user_id— FK prausers(cascade delete)type— enumreactionTypeEnum:power_up | epic | critical | loot | ggcreated_at— momento da reação (mesmo se trocar tipo, o created_at original permanece — é apenas a reação inicial)
Foreign keys
| Coluna(s) | Referência | ON DELETE | ON UPDATE |
|---|---|---|---|
| post_id | posts.id | cascade | no action |
| user_id | users.id | cascade | no action |
Índices
| Nome | Único | Colunas | WHERE (parcial) |
|---|---|---|---|
| post_reactions_post_user_unique | sim | post_id, user_id | — |
Unique post_reactions_post_user_unique em (post_id, user_id). Reagir de novo: UPSERT (Drizzle: onConflictDoUpdate).
Constraints
PRIMARY KEY (id)
Contagem por post
PostsService carrega reaction_counts: { power_up: N, epic: N, ... } agregado por type pra exibir no card do post. Implementação atual usa GROUP BY type. Para alta volumetria, considerar denormalização em posts com triggers.
Padrões de uso
- Reagir —
POST /posts/:id/react { type }faz UPSERT - Trocar reação — UPSERT mesmo endpoint com type diferente
- Remover —
DELETE /posts/:id/react - Listar quem reagiu —
GET /posts/:id/reactions(paginado)
Tabelas relacionadas
posts— pai (cascade)users— autor da reação (cascade)notifications—post_reaction