Territórios e Memberships - Documentação Funcional
Versão: 1.0
Data: 2026-01-28
Status: Funcionalidade Implementada
Parte de: Documentação Funcional da Plataforma
📋 Índice
- Visão Geral
- Função de Negócio
- Elementos da Arquitetura
- Fluxos Funcionais
- Casos de Uso
- Regras de Negócio
🎯 Visão Geral
Os domínios de Territórios e Memberships são o coração da plataforma Arah. Eles definem como lugares físicos reais são representados digitalmente e como pessoas se relacionam com esses lugares.
Território: Geográfico e Neutro
Um Território representa apenas um lugar físico real:
- Nome
- Localização (coordenadas geográficas)
- Fronteira geográfica
- NÃO contém lógica social
O território existe antes do app e continua existindo mesmo sem usuários.
Membership: Vínculo Social
Um Membership representa a relação entre uma pessoa e um território:
- Papel (Visitor ou Resident)
- Verificação de residência
- Permissões e capacidades
- Configurações e opt-ins
💼 Função de Negócio
Para o Usuário
Como Visitante (Visitor)
- Descobrir territórios próximos à localização
- Entrar como visitor para explorar conteúdo público
- Visualizar feed público do território
- Ver eventos públicos e participar
- Explorar mapa com entidades públicas
- Solicitar residência para acesso ampliado
Como Morador (Resident)
- Todas as funções de Visitor +
- Acessar conteúdo exclusivo para moradores
- Criar posts com visibilidade RESIDENTS_ONLY
- Participar de votações comunitárias
- Usar marketplace (comprar e vender)
- Acessar chat de moradores
- Criar lojas no marketplace (após verificação)
Para a Comunidade
- Definir regras de participação e visibilidade
- Gerenciar membros (aprovar/revogar residências)
- Controlar acesso através de feature flags
- Garantir autenticidade através de verificação de residência
🏗️ Elementos da Arquitetura
Entidades Principais
Territory (Território)
- Propósito: Representar lugar físico real de forma neutra
- Atributos:
Id: Identificador únicoName: Nome do territórioCity: CidadeState: EstadoLatitude,Longitude: Coordenadas geográficasBoundary: Fronteira geográfica (polígono)Tags: Caracterização do território (definida por votações)
TerritoryMembership (Vínculo)
- Propósito: Relação entre User e Territory
- Atributos:
UserId: UsuárioTerritoryId: TerritórioRole: VISITOR ou RESIDENTResidencyVerification: NONE, GEOVERIFIED, DOCUMENTVERIFIEDMembershipStatus: Pending, Active, Suspended, RevokedCreatedAt: Data de criação do vínculo
MembershipSettings (Configurações)
- Propósito: Configurações e opt-ins do membro
- Atributos:
MarketplaceOptIn: Opt-in para marketplace- Outras preferências territoriais
MembershipCapability (Capacidades)
- Propósito: Poderes operacionais territoriais
- Tipos: Curator, Moderator, EventOrganizer
- Características: Empilháveis (um membership pode ter múltiplas)
FeatureFlag (Flags de Funcionalidade)
- Propósito: Controlar funcionalidades por território
- Exemplos: MARKETPLACEENABLED, ALERTPOSTS, CHATENABLED
🔄 Fluxos Funcionais
Fluxo 1: Descoberta e Entrada como Visitor
┌─────────────┐
│ Usuário │
│ Autenticado│
└──────┬──────┘
│
│ 1. Busca territórios próximos
▼
┌─────────────────────┐
│ GET /territories/ │
│ nearby?lat=&lng= │
└──────┬──────────────┘
│
│ 2. Retorna lista de territórios
▼
┌─────────────────────┐
│ Seleciona │
│ território │
└──────┬──────────────┘
│
│ 3. Entra como Visitor
▼
┌─────────────────────┐
│ POST /territories/ │
│ {id}/enter │
└──────┬──────────────┘
│
│ 4. Sistema cria Membership
│ Role: VISITOR
│ ResidencyVerification: NONE
▼
┌─────────────────────┐
│ Membership criado │
│ Status: Active │
└──────┬──────────────┘
│
│ 5. Usuário pode explorar
│ conteúdo público
▼
┌─────────────────────┐
│ Feed Público │
│ Mapa Público │
│ Eventos Públicos │
└─────────────────────┘
Resultado: Usuário vinculado como Visitor com acesso a conteúdo público
Fluxo 2: Solicitação de Residência
┌─────────────┐
│ Usuário │
│ (Visitor) │
└──────┬──────┘
│
│ 1. Decide solicitar residência
▼
┌─────────────────────┐
│ POST /memberships/ │
│ {territoryId}/ │
│ become-resident │
│ - message (opcional)│
│ - recipientUserIds │
│ (opcional) │
└──────┬──────────────┘
│
│ 2. Sistema cria JoinRequest
│
┌──┴──┐
│Com │ ──► 3a. Direcionado para
│Dest.│ destinatários específicos
└──┬──┘
│ Sem destinatário
▼
┌─────────────────────┐
│ 3b. Direcionado │
│ para Curator │
│ (ou SystemAdmin │
│ se não houver) │
└──────┬──────────────┘
│
│ 4. JoinRequest criado
│ Status: Pending
▼
┌─────────────────────┐
│ Usuário aguarda │
│ aprovação │
└─────────────────────┘
Resultado: Solicitação de residência criada, aguardando aprovação
Fluxo 3: Aprovação de Residência
┌─────────────┐
│ Curator │
│ (ou Admin) │
└──────┬──────┘
│
│ 1. Recebe notificação de
│ JoinRequest pendente
▼
┌─────────────────────┐
│ Revisa solicitação │
│ - Verifica dados │
│ - Opcional: pede │
│ documentos │
└──────┬──────────────┘
│
┌──┴──┐
│Aprova│ ──► 2a. Aprova JoinRequest
└──┬──┘
│ Rejeita
▼
┌─────────────────────┐
│ 2b. Rejeita │
│ (com motivo) │
└──────┬──────────────┘
│
│ 3. Sistema atualiza Membership
│ Role: RESIDENT
│ Status: Active
▼
┌─────────────────────┐
│ Usuário notificado │
│ da aprovação │
└──────┬──────────────┘
│
│ 4. Usuário agora tem acesso
│ ampliado (conteúdo exclusivo)
▼
┌─────────────────────┐
│ Acesso como │
│ RESIDENT │
└─────────────────────┘
Resultado: Usuário aprovado como Resident com acesso ampliado
Fluxo 4: Verificação de Residência
┌─────────────┐
│ Usuário │
│ (Resident) │
└──────┬──────┘
│
│ 1. Tenta acessar funcionalidade
│ que requer verificação
│ (ex: criar loja no marketplace)
▼
┌─────────────────────┐
│ Sistema verifica │
│ ResidencyVerification│
└──────┬──────────────┘
│
┌──┴──┐
│NONE │ ──► 2a. Solicita verificação
└──┬──┘
│ GEOVERIFIED ou DOCUMENTVERIFIED
▼
┌─────────────────────┐
│ 2b. Permite acesso │
└─────────────────────┘
│
│ (Se NONE)
▼
┌─────────────────────┐
│ Opção 1: │
│ Verificação Geo │
│ POST /verify- │
│ residency/geo │
│ (coordenadas dentro│
│ do raio) │
└──────┬──────────────┘
│
│ 3a. Sistema marca
│ GEOVERIFIED
▼
┌─────────────────────┐
│ Opção 2: │
│ Verificação Doc │
│ POST /verify- │
│ residency/document │
│ (upload documentos)│
└──────┬──────────────┘
│
│ 3b. Sistema processa
│ (manual ou automático)
│ DOCUMENTVERIFIED
▼
┌─────────────────────┐
│ ResidencyVerification│
│ atualizado │
└─────────────────────┘
Resultado: Usuário com residência verificada pode acessar funcionalidades sensíveis
Fluxo 5: Seleção de Território Ativo
┌─────────────┐
│ Usuário │
└──────┬──────┘
│
│ 1. Seleciona território
│ para interagir
▼
┌─────────────────────┐
│ POST /territories/ │
│ selection │
│ - territoryId │
│ - X-Session-Id │
└──────┬──────────────┘
│
│ 2. Sistema armazena seleção
│ por sessão
▼
┌─────────────────────┐
│ Território ativo │
│ definido para │
│ sessão │
└──────┬──────────────┘
│
│ 3. Operações subsequentes
│ usam território ativo
│ por padrão
▼
┌─────────────────────┐
│ Feed, Mapa, │
│ Eventos, etc. │
│ filtrados por │
│ território ativo │
└─────────────────────┘
Resultado: Território ativo definido para sessão, usado em operações subsequentes
📖 Casos de Uso
Caso de Uso 1: Usuário Descobre e Entra em Território
Ator: Usuário autenticado
Pré-condições: Usuário autenticado
Fluxo Principal:
- Usuário acessa tela de descoberta de territórios
- Sistema busca territórios próximos à localização do usuário
- Usuário visualiza lista de territórios
- Usuário seleciona um território
- Sistema cria Membership com Role=VISITOR
- Usuário é redirecionado para feed do território
Pós-condições: Usuário vinculado como Visitor ao território
Caso de Uso 2: Visitor Solicita Residência
Ator: Visitor
Pré-condições: Usuário é Visitor no território
Fluxo Principal:
- Visitor acessa opção "Solicitar Residência"
- (Opcional) Visitor informa mensagem e destinatários
- Sistema cria JoinRequest
- JoinRequest é direcionado para Curator (ou SystemAdmin)
- Curator recebe notificação
- Visitor aguarda aprovação
Fluxo Alternativo: Se já houver JoinRequest pendente, retorna a mesma solicitação
Pós-condições: JoinRequest criado com status Pending
Caso de Uso 3: Curator Aprova Residência
Ator: Curator
Pré-condições: JoinRequest pendente existe
Fluxo Principal:
- Curator recebe notificação de JoinRequest
- Curator acessa work queue de aprovações
- Curator revisa solicitação
- Curator aprova JoinRequest
- Sistema atualiza Membership: Role=RESIDENT, Status=Active
- Usuário recebe notificação de aprovação
- Usuário agora tem acesso ampliado
Fluxo Alternativo: Curator pode rejeitar com motivo
Pós-condições: Usuário é Resident no território
Caso de Uso 4: Resident Verifica Residência
Ator: Resident
Pré-condições: Usuário é Resident, ResidencyVerification=NONE
Fluxo Principal:
- Resident tenta acessar funcionalidade que requer verificação
- Sistema bloqueia e solicita verificação
- Resident escolhe método:
- Verificação Geo: Sistema valida coordenadas dentro do raio
- Verificação Doc: Resident faz upload de documentos
- Sistema processa verificação
- ResidencyVerification atualizado para GEOVERIFIED ou DOCUMENTVERIFIED
- Resident pode acessar funcionalidade
Pós-condições: Resident com residência verificada
⚙️ Regras de Negócio
Territórios
-
Neutralidade:
- Território não contém lógica social
- Existe independente de usuários
- Representa apenas lugar físico
-
Descoberta:
- Busca por proximidade geográfica
- Busca por nome, cidade, estado
- Listagem pública (não exige autenticação)
-
Seleção:
- Um usuário pode ter múltiplas sessões
- Cada sessão pode ter território ativo diferente
- Território ativo usado por padrão em operações
Memberships
-
Papéis:
- VISITOR: Acesso limitado, conteúdo público
- RESIDENT: Acesso ampliado, conteúdo exclusivo
-
Regra de Residência Única:
- Um usuário pode ser Resident em apenas 1 território
- Para mudar, deve transferir residência
-
Verificação de Residência:
- NONE: Sem verificação
- GEOVERIFIED: Verificado por geolocalização
- DOCUMENTVERIFIED: Verificado por documentos
- Permite acumulação (GEO + DOC)
-
Status:
- Pending: Aguardando aprovação
- Active: Ativo
- Suspended: Suspenso temporariamente
- Revoked: Revogado permanentemente
Solicitação de Residência
-
Destinatários:
- Se
recipientUserIdsinformado: direcionado para esses usuários - Se não informado: direcionado para Curator
- Se não houver Curator: fallback para SystemAdmin
- Se
-
Anti-abuso:
- Máximo 3 destinatários por solicitação
- Máximo 3 criações (create+cancel+recreate) por usuário/território em 24h
- Rate limit: 429 Too Many Requests se excedido
-
Idempotência:
- Se já houver JoinRequest pendente, retorna a mesma
Capacidades
-
Tipos:
- Curator: Curadoria de conteúdo e aprovação de residências
- Moderator: Moderação de conteúdo e usuários
- EventOrganizer: Organização de eventos
-
Empilháveis:
- Um Membership pode ter múltiplas capacidades
- Cada capacidade atua apenas no território do Membership
-
Auditoria:
- Concessão/revogação com auditoria completa
- Registro de quem concedeu/revogou e motivo
Feature Flags
-
Controle Territorial:
- Cada território pode habilitar/desabilitar funcionalidades
- Exemplos: MARKETPLACEENABLED, ALERTPOSTS, CHATENABLED
-
Impacto:
- Quando desabilitado, endpoints retornam 404
- Evita exposição de funcionalidades desabilitadas
🔗 Integrações
Com Outros Domínios
- Feed: Filtrado por território e visibilidade baseada em Membership
- Eventos: Vinculados a território
- Mapa: Entidades territoriais
- Marketplace: Requer Membership com verificação
- Chat: Canais territoriais baseados em Membership
- Governança: Votações territoriais baseadas em Membership
📊 Métricas e Observabilidade
Métricas Importantes
- Territórios criados (total, por período)
- Memberships criados (Visitors, Residents)
- Taxa de conversão Visitor → Resident
- Tempo médio de aprovação de residência
- Taxa de verificação de residência (Geo vs Doc)
Logs Estruturados
- Criação de territórios
- Criação de Memberships
- Mudanças de Role (Visitor → Resident)
- Aprovações/rejeições de residência
- Verificações de residência
📚 Documentação Relacionada
- Plataforma Arah - Visão geral
- Autenticação e Identidade - Pré-requisito
- Feed Comunitário - Conteúdo territorial
- Governança e Votação - Aprovação de residências
- API - Territórios - Documentação técnica
- API - Memberships - Documentação técnica
Última Atualização: 2026-01-28
Versão: 1.0
Status: Funcionalidade Implementada