- ✅ Separação por Domínios: Cada módulo representa um domínio funcional
- ✅ Independência Relativa: Módulos podem ser habilitados/desabilitados
- ✅ Feature Flags: Controle granular de funcionalidades por território
- ✅ Clean Architecture: Camadas bem definidas (Domain, Application, Infrastructure, API)
- ✅ Extensibilidade: Fácil adicionar novos módulos sem impactar existentes
Modularização - Arquitetura Modular do Arah
Versão: 1.0
Data: 2026-01-28
Status: 📋 Documentação Técnica
Tipo: Documentação Técnica - Arquitetura Modular
🎯 Visão Geral
O Arah utiliza uma arquitetura modular baseada em Clean Architecture e Domain-Driven Design (DDD), onde cada módulo representa um domínio funcional específico com responsabilidades claras e bem definidas.
Isolamento real (deploy, rede, falhas independentes) só existe com serviços separados (microserviços). Para o tamanho e estágio do projeto, o Arah não adota microserviços.
O objetivo adotado é ter infraestrutura independente por módulo, isolando pontos de manutenção e de falha dentro do mesmo processo:
- Manutenção: alterações em Feed (schema, repositório, bugs) ficam contidas no projeto
Arah.Modules.Feed.Infrastructure; o mesmo para Events, Map, Chat, Marketplace, etc. Menos risco de regressão em outros domínios e ownership claro por módulo. - Falha: um bug ou problema de persistência em um módulo fica limitado ao código e ao DbContext daquele módulo; o restante da aplicação continua referenciando apenas interfaces da Application.
- Evolução: se no futuro um módulo precisar virar serviço separado, a fronteira já está desenhada (projeto de infra + contratos de aplicação).
Ou seja: uma infraestrutura modular, não vários serviços, com isolamento de responsabilidade e de impacto por domínio.
🏗️ Princípios de Modularização
1. Domínio como Unidade de Modularização
Cada módulo representa um domínio funcional completo:
- Autenticação e Identidade
- Territórios
- Feed Comunitário
- Eventos
- Marketplace
- Chat
- etc.
Cada módulo segue Clean Architecture com camadas:
Módulo/
├── Domain/ # Entidades, Value Objects, Interfaces
├── Application/ # Services, Use Cases, DTOs
├── Infrastructure/ # Repositories, External Services
└── Api/ # Controllers, Endpoints
3. Feature Flags por Módulo
Módulos podem ser habilitados/desabilitados via feature flags:
- Controle por território
- Rollout gradual
- A/B testing
- Desativação de funcionalidades
4. Dependências Explícitas
- Módulos core são sempre habilitados
- Módulos opcionais podem depender de outros módulos
- Dependências são validadas na inicialização
🧩 Arquitetura Modular
Arah.Api (API Layer)
↓
Arah.Application (Application Layer)
├── Módulo 1 (Domain Services)
├── Módulo 2 (Domain Services)
└── Módulo N (Domain Services)
↓
Arah.Domain (Domain Layer)
├── Módulo 1 (Entities, Value Objects)
├── Módulo 2 (Entities, Value Objects)
└── Módulo N (Entities, Value Objects)
↓
Arah.Infrastructure (Infrastructure Layer)
├── Módulo 1 (Repositories, External Services)
├── Módulo 2 (Repositories, External Services)
└── Módulo N (Repositories, External Services)
backend/
├── Arah.Api/
│ ├── Controllers/
│ │ ├── AuthController.cs # Módulo: Autenticação
│ │ ├── TerritoriesController.cs # Módulo: Territórios
│ │ ├── FeedController.cs # Módulo: Feed
│ │ ├── EventsController.cs # Módulo: Eventos
│ │ ├── MarketplaceController.cs # Módulo: Marketplace
│ │ └── ChatController.cs # Módulo: Chat
│ └── ...
├── Arah.Application/
│ ├── Services/
│ │ ├── Auth/ # Módulo: Autenticação
│ │ ├── Territories/ # Módulo: Territórios
│ │ ├── Feed/ # Módulo: Feed
│ │ ├── Events/ # Módulo: Eventos
│ │ ├── Marketplace/ # Módulo: Marketplace
│ │ └── Chat/ # Módulo: Chat
│ └── ...
├── Arah.Domain/
│ ├── Users/ # Módulo: Autenticação
│ ├── Territories/ # Módulo: Territórios
│ ├── Feed/ # Módulo: Feed
│ ├── Events/ # Módulo: Eventos
│ ├── Marketplace/ # Módulo: Marketplace
│ └── Chat/ # Módulo: Chat
└── Arah.Infrastructure/
├── Postgres/
│ ├── Entities/ # Mapeamento por módulo
│ └── Repositories/ # Repositories por módulo
└── ...
📦 Módulos do Sistema
Módulos Core (Sempre Habilitados)
1. Autenticação e Identidade
- Responsabilidade: Gerenciar identidade única do usuário, autenticação e verificação
- Elementos: User, AuthProvider, UserIdentityVerificationStatus, 2FA
- Feature Flags: Nenhum (sempre habilitado)
2. Territórios
- Responsabilidade: Representar lugares físicos reais de forma neutra
- Elementos: Territory, GeoAnchor, fronteiras geográficas
- Feature Flags: Nenhum (sempre habilitado)
3. Memberships
- Responsabilidade: Gerenciar relação entre usuários e territórios
- Elementos: TerritoryMembership, MembershipRole, MembershipCapability
- Feature Flags: Nenhum (sempre habilitado)
Módulos de Conteúdo
- Responsabilidade: Publicações e timeline territorial
- Elementos: Post, PostGeoAnchor, Media
- Feature Flags:
AlertPosts- Permitir posts do tipo ALERTEventPosts- Permitir posts de eventosMediaImagesEnabled- Habilitar imagensMediaVideosEnabled- Habilitar vídeosMediaAudioEnabled- Habilitar áudios
- Responsabilidade: Organizar eventos comunitários por território
- Elementos: Event, participação, georreferenciamento
- Feature Flags:
EventPosts- Habilitar eventos no feedMediaImagesEnabled- Habilitar imagens em eventosMediaVideosEnabled- Habilitar vídeos em eventosMediaAudioEnabled- Habilitar áudios em eventos
6. Mapa Territorial
- Responsabilidade: Visualização geográfica de conteúdos
- Elementos: MapEntity, MapEntityRelation
- Feature Flags: Nenhum específico (usa flags de conteúdo)
7. Alertas
- Responsabilidade: Alertas de saúde pública e comunicação emergencial
- Elementos: Alert, notificações prioritárias
- Feature Flags:
AlertPosts- Habilitar posts do tipo ALERT
8. Assets
- Responsabilidade: Recursos compartilhados do território
- Elementos: Asset, geolocalização obrigatória
- Feature Flags: Nenhum específico
Módulos de Comunicação e Economia
- Responsabilidade: Comunicação territorial (canais, grupos, DM)
- Elementos: ChatConversation, ChatMessage, ConversationParticipant
- Feature Flags:
ChatEnabled- Master switch do chatChatTerritoryPublicChannel- Canal públicoChatTerritoryResidentsChannel- Canal de moradoresChatGroups- Grupos no chatChatDmEnabled- Mensagens diretasChatMediaEnabled- Mídias no chatChatMediaImagesEnabled- Imagens no chatChatMediaAudioEnabled- Áudios no chat
- Responsabilidade: Sistema de trocas locais integrado ao território
- Elementos: Store, StoreItem, Cart, Checkout
- Feature Flags:
MarketplaceEnabled- Habilitar marketplaceMediaImagesEnabled- Habilitar imagens em itensMediaVideosEnabled- Habilitar vídeos em itensMediaAudioEnabled- Habilitar áudios em itens
11. Subscriptions
- Responsabilidade: Sistema de assinaturas recorrentes
- Elementos: Subscription, Plan, pagamentos recorrentes
- Feature Flags: Nenhum específico (habilitado se módulo ativo)
Módulos de Governança
12. Moderação
- Responsabilidade: Manter qualidade e segurança do conteúdo
- Elementos: Report, Sanction, WorkItem
- Feature Flags: Nenhum específico (habilitado se módulo ativo)
13. Governança e Votação
- Responsabilidade: Decisões coletivas e governança participativa
- Elementos: Vote, Proposal
- Feature Flags: Nenhum específico (habilitado se módulo ativo)
14. Notificações
- Responsabilidade: Sistema confiável de notificações in-app
- Elementos: OutboxMessage, UserNotification
- Feature Flags: Nenhum específico (habilitado se módulo ativo)
Módulos Administrativos
15. Admin e Configuração
- Responsabilidade: Administração do sistema e configurações globais
- Elementos: SystemConfig, SystemPermission, WorkQueue
- Feature Flags: Nenhum específico (habilitado se módulo ativo)
- Responsabilidade: Conexões entre usuários (círculo de amigos), priorização no feed e notificações de solicitação/aceitação
- Elementos: UserConnection, ConnectionPrivacySettings, ConnectionStatus, ConnectionRequestPolicy, ConnectionVisibility
- Feature Flags:
ConnectionsEnabled(15) — habilitar conexões no territórioConnectionsFeedPrioritize(16) — priorizar posts de conexões no feed
🗺️ Organização por Domínios
Cada módulo representa um domínio funcional completo:
- Domínio = Módulo: Um domínio funcional = um módulo
- Responsabilidade Única: Cada módulo tem uma responsabilidade clara
- Independência Relativa: Módulos podem funcionar independentemente (com dependências explícitas)
- Feature Flags: Controle granular de funcionalidades
| Domínio Funcional | Módulo | Status |
|---|---|---|
| Autenticação e Identidade | Auth | Core |
| Territórios | Territories | Core |
| Memberships | Memberships | Core |
| Feed Comunitário | Feed | Opcional |
| Eventos | Events | Opcional |
| Mapa Territorial | Map | Opcional |
| Marketplace | Marketplace | Opcional |
| Chat | Chat | Opcional |
| Alertas | Alerts | Opcional |
| Assets | Assets | Opcional |
| Moderação | Moderation | Opcional |
| Notificações | Notifications | Opcional |
| Subscriptions | Subscriptions | Opcional |
| Governança | Governance | Opcional |
| Admin | Admin | Opcional |
| Conexões (Círculo de Amigos) | Connections | Opcional |
⚙️ Feature Flags e Configuração
Sistema de Feature Flags
Feature flags permitem controle granular de funcionalidades:
- Por Território: Cada território pode ter flags diferentes
- Por Módulo: Flags específicas de cada módulo
- Hierarquia: Flags podem depender de outras flags
- Validação: Dependências são validadas automaticamente
public enum FeatureFlag
{
// Feed
AlertPosts = 1,
EventPosts = 2,
// Marketplace
MarketplaceEnabled = 3,
// Chat
ChatEnabled = 4,
ChatTerritoryPublicChannel = 5,
ChatTerritoryResidentsChannel = 6,
ChatGroups = 7,
ChatDmEnabled = 8,
ChatMediaEnabled = 9,
// Mídias
MediaImagesEnabled = 10,
MediaVideosEnabled = 11,
MediaAudioEnabled = 12,
ChatMediaImagesEnabled = 13,
ChatMediaAudioEnabled = 14,
// Conexões (Círculo de Amigos)
ConnectionsEnabled = 15,
ConnectionsFeedPrioritize = 16
}
Validação de Dependências
// ChatMediaEnabled requer ChatEnabled
if (flag == FeatureFlag.ChatMediaEnabled &&
!IsEnabled(territoryId, FeatureFlag.ChatEnabled))
{
throw new InvalidOperationException(
"ChatMediaEnabled requires ChatEnabled");
}
🔗 Dependências entre Módulos
Módulos Core
Sempre habilitados, sem dependências:
- Autenticação e Identidade
- Territórios
- Memberships
| Módulo | Depende de | Tipo |
|---|---|---|
| Feed | Territórios, Memberships | Obrigatória |
| Eventos | Territórios, Memberships | Obrigatória |
| Mapa | Territórios, Feed/Eventos | Obrigatória |
| Marketplace | Territórios, Memberships | Obrigatória |
| Chat | Territórios, Memberships, Notificações | Obrigatória |
| Alertas | Territórios, Feed | Obrigatória |
| Assets | Territórios, Memberships | Obrigatória |
| Moderação | Territórios, Memberships | Obrigatória |
| Governança | Territórios, Memberships | Obrigatória |
| Notificações | Autenticação | Obrigatória |
| Subscriptions | Autenticação, Territórios | Obrigatória |
| Admin | Autenticação | Obrigatória |
| Connections (Círculo de Amigos) | Autenticação, Memberships, Notificações | Obrigatória |
O sistema valida dependências na inicialização:
public void ValidateModuleDependencies(
IEnumerable<string> enabledModules)
{
var requiredModules = new Dictionary<string, string[]>
{
{ "Chat", new[] { "Territories", "Memberships", "Notifications" } },
{ "Marketplace", new[] { "Territories", "Memberships" } },
// ...
};
foreach (var module in enabledModules)
{
if (requiredModules.TryGetValue(module, out var deps))
{
foreach (var dep in deps)
{
if (!enabledModules.Contains(dep))
{
throw new InvalidOperationException(
$"{module} requires {dep}");
}
}
}
}
}
🔌 Extensibilidade
-
Criar Estrutura de Diretórios:
backend/ ├── Arah.Domain/NewModule/ ├── Arah.Application/Services/NewModule/ ├── Arah.Infrastructure/Postgres/Entities/NewModule/ └── Arah.Api/Controllers/NewModuleController.cs -
Definir Feature Flags (se necessário):
public enum FeatureFlag { // ... flags existentes NewModuleEnabled = 15 } -
Registrar no DI Container:
services.AddScoped<INewModuleService, NewModuleService>(); -
Adicionar ao Instalador:
- Adicionar módulo à lista de seleção
- Configurar feature flags relacionadas
- Adicionar validações de dependências
Boas Práticas para Novos Módulos
- ✅ Seguir Clean Architecture
- ✅ Definir responsabilidade única e clara
- ✅ Usar feature flags quando apropriado
- ✅ Documentar dependências
- ✅ Adicionar testes unitários e de integração
- ✅ Seguir padrões de nomenclatura existentes
✅ Boas Práticas
1. Separação de Responsabilidades
- Cada módulo tem uma responsabilidade única e clara
- Módulos não devem conhecer detalhes internos de outros módulos
- Comunicação entre módulos via interfaces bem definidas
2. Feature Flags
- Use feature flags para funcionalidades que podem ser desabilitadas
- Valide dependências entre flags
- Documente flags e suas dependências
3. Dependências
- Torne dependências explícitas
- Valide dependências na inicialização
- Documente dependências entre módulos
4. Testes
- Teste cada módulo independentemente
- Teste integração entre módulos
- Teste feature flags e suas dependências
5. Documentação
- Documente responsabilidade de cada módulo
- Documente feature flags e dependências
- Documente APIs e contratos
- Clean Architecture - Princípios de Clean Architecture
- Domain-Driven Design - Modelo de domínio
- Feature Flags - Sistema de feature flags
- Arquitetura de Services - Organização de services
- Plataforma Arah - Visão geral dos domínios
Última atualização: 2026-01-28
Versão: 1.0
Status: 📋 Documentação Técnica