Geek Social — Documentação
Módulos

Comunidades

Espaços temáticos com membros, tópicos, moderação e pedidos de entrada — ao estilo Orkut.

Visão geral

Comunidades são espaços persistentes que reúnem pessoas ao redor de um interesse (gênero de jogo, jogo específico, hobby de colecionador etc.). Qualquer usuário autenticado pode criar, participar ou moderar comunidades.

Dois modelos de entrada:

  • public — qualquer membro pode entrar diretamente
  • restricted — entrada requer aprovação de owner ou moderador

Entidades principais

TabelaPapel
communitiesContainer da comunidade (nome, slug, capa, ícone, visibilidade, contadores denormalizados)
community_membersRelação user ↔ comunidade com role (owner / moderator / member) e status (pending / active / banned)
community_join_requestsPedidos de entrada para comunidades restricted (status pending / approved / rejected)
community_topic_metaMetadados de tópico — extensão de posts com pinned, locked, movedFrom
community_transfersTransferência de ownership pendente (1 por vez)
community_invitesConvites diretos para comunidades restritas
community_audit_logLog de ações de moderação (ban, unban, promote, demote, kick, topic delete)

Schema resumido

communities
├── id, slug (auto-suffix em colisão), name, description
├── ownerId (nullable — owner pode deletar conta sem destruir comunidade)
├── category (boardgames | tcg | rpg-mesa | rpg-digital | mmo | souls | fps |
│             survival | indie | retro | mobile | simulation | strategy |
│             mods | community-events)
├── iconUrl, coverUrl   ← multipart no create/update
├── visibility: public | restricted
├── rules (5000 chars), welcomeMessage (1000 chars)
├── memberCount, topicCount  ← counters denormalizados
└── deletedAt (soft delete — só owner)

community_members
├── communityId, userId
├── role: owner | moderator | member
├── status: pending | active | banned
├── banReason, joinedAt, approvedAt
└── unique(communityId, userId)

community_join_requests
├── communityId, userId
├── status: pending | approved | rejected
├── decidedBy, decidedAt
└── partial unique(communityId, userId) WHERE status='pending'

community_topic_meta        ← estende posts (PK = postId)
├── communityId
├── pinned, locked, pinnedAt, lockedAt
└── movedFromCommunityId

Endpoints

28 rotas sob /comunidades:

Comunidades (CRUD)

MétodoPathAuthResumo
POST/comunidadesCriar comunidade (multipart: cover + icon obrigatórios)
GET/comunidadesListar comunidades visíveis (filtros: category, visibility, search)
GET/comunidades/me/ownedMinhas comunidades como dono
GET/comunidades/me/joinedComunidades das quais faço parte
GET/comunidades/:idDetalhes da comunidade (id ou slug)
PATCH/comunidades/:idAtualizar campos (owner/moderador)
DELETE/comunidades/:idSoft delete (somente owner)

Membros

MétodoPathAuthResumo
POST/comunidades/:id/membersEntrar (pública) ou pedir entrada (restrita)
DELETE/comunidades/:id/members/meSair da comunidade
GET/comunidades/:id/membersListar membros (filtros: role, status)
POST/comunidades/:id/members/:userId/promotePromover a moderador (owner only)
POST/comunidades/:id/members/:userId/demoteRebaixar de moderador (owner only)
POST/comunidades/:id/members/:userId/banBanir membro (owner/moderador)
POST/comunidades/:id/members/:userId/unbanDesbanir membro (owner/moderador)
DELETE/comunidades/:id/members/:userIdRemover (kick) membro (owner/moderador)

Pedidos de entrada (Join Requests)

MétodoPathAuthResumo
GET/comunidades/:id/join-requestsListar pedidos pendentes (owner/moderador)
POST/comunidades/:id/join-requests/:userId/approveAprovar pedido (owner/moderador)
POST/comunidades/:id/join-requests/:userId/rejectRejeitar pedido (owner/moderador)

Tópicos

MétodoPathAuthResumo
GET/comunidades/:id/topicsListar tópicos (pinned primeiro, depois cronológico)
POST/comunidades/:id/topicsCriar tópico (membro ativo)
GET/comunidades/:id/topics/:topicIdDetalhes do tópico + meta
DELETE/comunidades/:id/topics/:topicIdDeletar tópico (autor, owner ou moderador)

Tópicos reutilizam o sistema de posts: reactions (power_up, epic, critical, loot, gg) e comentários planos funcionam nos tópicos sem endpoints extras.

Fluxos

Criar comunidade

Entrar em comunidade restrita

Aprovar pedido de entrada

Moderação de membro

ban     → status = 'banned', banReason gravado, audit log
unban   → status = 'active', banReason limpo, audit log
kick    → row deletada de community_members, audit log
promote → role = 'moderator' (owner only), audit log
demote  → role = 'member'    (owner only), audit log

Todas as ações de moderação são registradas em community_audit_log com actorId, targetUserId, action e metadata.

Regras de acesso

AçãoQuem pode
Ver comunidade pública (detalhes, membros, tópicos)Qualquer autenticado
Ver comunidade restrita (detalhes)Somente membros ativos; não-membros veem só metadados mínimos
Criar tópicoMembro ativo
Deletar tópicoAutor do tópico, owner ou moderador
Aprovar/rejeitar pedidoOwner ou moderador
Banir / kickar membroOwner ou moderador (não pode banir outro moderador sem ser owner)
Promover / rebaixarSomente owner
Editar comunidadeOwner ou moderador
Soft deleteSomente owner

Visibilidade e feeds

  • Posts criados como tópico de comunidade não aparecem no feed global — ficam restritos ao feed da comunidade.
  • Reactions e comentários em tópicos funcionam via endpoints existentes (/posts/:id/reactions, /posts/:id/comments), sem rotas extras.

Slug

O slug é derivado do nome (slugify) na criação. Em caso de colisão, um sufixo numérico atômico é adicionado dentro de uma transação (my-communitymy-community-2my-community-3…). O endpoint de detalhes aceita tanto UUID quanto slug como :id.

Códigos de erro

CommunitiesError.code:

HTTPCódigoCausa
400MISSING_FILEScover ou icon não enviados no multipart
403NOT_MEMBERoperação requer ser membro ativo
403NOT_MODERATORoperação requer owner ou moderador
403NOT_OWNERoperação requer ser o owner
403ALREADY_BANNEDusuário está banido da comunidade
404COMMUNITY_NOT_FOUNDcomunidade não encontrada
409ALREADY_MEMBERusuário já é membro ativo
409JOIN_REQUEST_PENDINGjá há pedido de entrada pendente
410COMMUNITY_DELETEDcomunidade foi excluída

Limitações conhecidas (alpha)

  • Sem chat próprio por comunidade — usuários se comunicam via DM ou tópicos
  • Posts cruzados (cross-post de tópico no feed pessoal) não implementados
  • Transferência de ownership (community_transfers) criada no schema mas endpoints ainda não expostos
  • Convites diretos (community_invites) no schema mas endpoints não expostos
  • Sem notificações de eventos da comunidade (novo tópico, pedido aprovado etc.)
  • Sem limite de comunidades por usuário
  • Sem busca full-text em tópicos

On this page