user_blocks
Relação assimétrica de bloqueio entre usuários.
Bloquear um usuário cria um row aqui (blocker_id → blocked_id). A relação é direcional — A bloquear B é diferente de B bloquear A; ambos podem coexistir.
Bloquear tem efeitos cascateados:
- Desfaz amizade existente entre os dois (DELETE em
friendships) - Remove conexão de chat (unlink no socket gateway)
- Esconde conteúdo de ambos os lados — perfil, posts, comentários, listings, ofertas
- Re-emite atualização das conversas dos dois lados via socket
Desbloquear faz UPDATE/DELETE inverso (deleta o block) mas não restaura amizade automaticamente — usuários precisam refazer o pedido se quiserem.
Colunas
| Coluna | Tipo | Nullable | Default |
|---|---|---|---|
| id ● | uuid | NOT NULL | gen_random_uuid() |
| blocker_id | uuid | NOT NULL | — |
| blocked_id | uuid | NOT NULL | — |
| created_at | timestamp | NOT NULL | now() |
● primary key ◆ unique
Funcionalidade dos campos
id— UUID, PKblocker_id— quem bloqueoublocked_id— quem foi bloqueadocreated_at— momento do bloqueio
Sem updated_at porque um block é estático: ou existe ou não.
Foreign keys
| Coluna(s) | Referência | ON DELETE | ON UPDATE |
|---|---|---|---|
| blocker_id | users.id | cascade | no action |
| blocked_id | users.id | cascade | no action |
Índices
| Nome | Único | Colunas | WHERE (parcial) |
|---|---|---|---|
| user_blocks_blocker_blocked_unique | sim | blocker_id, blocked_id | — |
user_blocks_blocker_blocked_unique garante que um par (A, B) só pode ter um único registro. (B, A) é um par diferente — pode existir simultaneamente.
Constraints
PRIMARY KEY (id)
Como o block é avaliado
Em queries que retornam conteúdo entre usuários (perfil, feed, chat), o backend faz JOIN/EXISTS com user_blocks pra excluir conteúdo entre quem bloqueou ou foi bloqueado. Função helper:
function isBlockedBetween(a: string, b: string) {
return db.execute(sql`
SELECT 1 FROM user_blocks
WHERE (blocker_id = ${a} AND blocked_id = ${b})
OR (blocker_id = ${b} AND blocked_id = ${a})
`)
}Padrões de uso
- Bloquear — INSERT user_blocks + DELETE friendships entre os dois + emit socket events
- Desbloquear — DELETE user_blocks + emit socket events (não recria amizade)
- Visibilidade query — sempre filtrar
NOT EXISTS (SELECT 1 FROM user_blocks WHERE ...)
Tabelas relacionadas
users— blocker e blockedfriendships— apagado em cascata pelo app (não por DB FK)conversations— chat fica desabilitado