Geek Social — Documentação
Banco de dadosTables

reports

Denúncias de conteúdo abusivo (user, post, comment, message, collection).

Sistema de denúncias do Geek Social. Implementado em 5 superfícies: usuários, posts, mensagens, coleções, conversas. O reporter informa o tipo (target_type) + ID do alvo + razão (enum) + descrição opcional.

Sem flow de moderação automatizado — admin vê dashboard de pendentes e marca como reviewed/dismissed manualmente. Pendência: integração com Linear/issue tracker.

Colunas

ColunaTipoNullableDefault
id uuidNOT NULLgen_random_uuid()
reporter_iduuidNOT NULL
target_typeenumcolumnNOT NULL
target_iduuidNOT NULL
reasonenumcolumnNOT NULL
descriptiontextNULL ok
statusenumcolumnNOT NULLpending
created_attimestampNOT NULLnow()
updated_attimestampNOT NULLnow()

primary key   unique

Funcionalidade dos campos

  • id — UUID, PK
  • reporter_id — quem denunciou (cascade)
  • target_type — enum: user | message | post | collection | conversation
  • target_id — UUID polimórfico (não é FK — referencia por type)
  • reason — enum: spam | harassment | nsfw | hate | other
  • description — texto livre opcional, contexto do denunciante
  • statuspending | reviewed | dismissed. Updated quando admin processa.
  • created_at / updated_at — managed.

Foreign keys

Coluna(s)ReferênciaON DELETEON UPDATE
reporter_idusers.idcascadeno action

target_id é polimórfico — sem FK explícita pra qualquer tabela. Backend valida na criação que o target existe.

Índices

NomeÚnicoColunasWHERE (parcial)
reports_reporter_target_uniquesimreporter_id, target_type, target_id
reports_status_created_at_idxnãostatus, created_at

Detalhes:

  • reports_reporter_target_unique em (reporter_id, target_type, target_id) — impede o mesmo user denunciar o mesmo alvo 2x
  • reports_status_created_at_idx — query de admin "pending mais antigos primeiro"

Constraints

  • PRIMARY KEY (id)

Polimorfismo do target

Dependendo de target_type, target_id aponta pra:

  • userusers.id
  • messagemessages.id
  • postposts.id
  • collectioncollections.id
  • conversationconversations.id

Se o alvo é deletado depois (cascade ou hard delete), a denúncia continua existindo com target_id apontando pra registro inexistente — admin precisa lidar com isso na UI ("conteúdo já removido").

Razões — semântica

  • spam — promoção indesejada, divulgação fora de contexto
  • harassment — perseguição, ameaças, mensagens insistentes não-bem-vindas
  • nsfw — conteúdo adulto/explícito sem flag adequada
  • hate — discurso de ódio, discriminação
  • other — qualquer outra coisa; descrição obrigatória nesse caso? (Não enforced no schema; dependeria de validação no service.)

Padrões de uso

  • ReportarPOST /reports { targetType, targetId, reason, description? }
  • Listar pendentes (admin)GET /admin/reports?status=pending (endpoint admin não documentado aqui ainda)
  • Marcar reviewedPUT /admin/reports/:id { status: 'reviewed' }

Tabelas relacionadas

On this page