Arquitetura do Sistema
Documentação técnica da arquitetura do sistema PAC.
Visão Geral
O sistema PAC é construído seguindo os princípios de Clean Architecture, separando as responsabilidades em camadas bem definidas.
Stack Tecnológica
Backend
- Framework: NestJS (Node.js)
- Linguagem: TypeScript
- Banco de Dados: PostgreSQL
- ORM: TypeORM
- Autenticação: JWT (JSON Web Tokens)
- Agendamento: @nestjs/schedule (Cron Jobs)
- Email: Nodemailer
- Validação: class-validator, class-transformer
Frontend
- Framework: Angular
- Linguagem: TypeScript
- UI Framework: Metronic
- HTTP Client: Angular HttpClient
- Roteamento: Angular Router
Estrutura do Backend
back/src/
├── domain/ # Camada de Domínio
│ ├── entities/ # Entidades do domínio
│ ├── dtos/ # Data Transfer Objects
│ ├── repositories/ # Interfaces de repositórios
│ └── services/ # Serviços de domínio
│
├── application/ # Camada de Aplicação
│ └── [módulos]/ # Casos de uso por módulo
│
├── infrastructure/ # Camada de Infraestrutura
│ ├── database/ # Entidades ORM e configuração
│ ├── repositories/ # Implementação dos repositórios
│ ├── services/ # Serviços externos (email, hash, etc)
│ ├── jobs/ # Tarefas agendadas (Cron)
│ └── providers/ # Providers e configurações
│
└── presentation/ # Camada de Apresentação
├── controllers/ # Controllers HTTP
├── dtos/ # DTOs de resposta
├── guards/ # Guards de autenticação/autorização
├── decorators/ # Decorators customizados
└── modules/ # Módulos NestJS
Camadas da Arquitetura
Domain (Domínio)
Camada mais interna, contém as regras de negócio puras:
- Entities: Entidades do domínio (Client, FormularioModelo, etc)
- DTOs: Interfaces para transferência de dados
- Repositories: Interfaces que definem contratos de acesso a dados
- Services: Serviços de domínio com lógica de negócio
Application (Aplicação)
Contém os casos de uso do sistema:
- Cada módulo tem seus casos de uso específicos
- Orquestra chamadas entre domínio e infraestrutura
- Implementa regras de aplicação
Infrastructure (Infraestrutura)
Implementações concretas de interfaces:
- Database: Entidades ORM (TypeORM), migrations
- Repositories: Implementação dos repositórios
- Services: Serviços externos (EmailService, HashService, etc)
- Jobs: Tarefas agendadas (geração de formulários)
- Providers: Configurações e providers
Presentation (Apresentação)
Interface com o mundo externo:
- Controllers: Endpoints REST
- DTOs: DTOs de request/response
- Guards: Autenticação e autorização
- Interceptors: Interceptadores de requisições
- Filters: Filtros de exceções
Fluxo de Dados
sequenceDiagram
participant Client as Cliente HTTP
participant Controller as Controller
participant UseCase as Use Case
participant Repository as Repository
participant Database as Banco de Dados
Client->>Controller: Request HTTP
Controller->>Controller: Validação (DTO)
Controller->>UseCase: Executa caso de uso
UseCase->>Repository: Busca dados
Repository->>Database: Query SQL
Database-->>Repository: Dados
Repository-->>UseCase: Entidade de domínio
UseCase->>UseCase: Regras de negócio
UseCase->>Repository: Salva alterações
Repository->>Database: Insert/Update
Database-->>Repository: Confirmação
Repository-->>UseCase: Sucesso
UseCase-->>Controller: Resultado
Controller->>Controller: Transforma em DTO
Controller-->>Client: Response HTTP
Autenticação e Autorização
Autenticação
- Usa JWT (JSON Web Tokens)
- Token contém informações do usuário (id, role, entityId)
- Token expira após período configurado
- Refresh token para renovação
Autorização
- Guards verificam permissões por rota
- Baseado no role do usuário:
- ADMIN: Acesso total
- RESPONSAVEL_TECNICO: Acesso a seus clientes e formulários
- CLIENT: Acesso apenas aos seus dados
- TECNICO: Acesso limitado
Banco de Dados
Estrutura
- PostgreSQL como banco relacional
- TypeORM como ORM
- Migrations para versionamento do schema
- Relacionamentos bem definidos entre entidades
Principais Tabelas
users: Usuários do sistemaclients: Empresas clientesresponsaveis_tecnicos: Responsáveis técnicosformulario_modelos: Modelos de formuláriosformulario_perguntas: Perguntas dos formuláriosformulario_instancias: Instâncias de formulários preenchidosformulario_resposta_perguntas: Respostas das perguntaschamados: Chamados de suportesetores: Setores das empresastecnicos: Técnicos das empresas
Jobs Agendados
FormularioSchedulerJob
- Frequência: A cada 10 minutos (
*/10 * * * *) - Função: Gera instâncias de formulários automaticamente
- Lógica:
- Busca formulários publicados e ativos
- Verifica frequência (diário/semanal/personalizado)
- Verifica horários configurados (janela de 15 min)
- Cria instâncias para clientes vinculados
Serviços Externos
EmailService
- Envio de emails via SMTP
- Templates HTML para diferentes tipos de email
- Notificações automáticas
Outros Serviços
- BcryptHashService: Hash de senhas
- JwtTokenService: Geração e validação de tokens
- CepService: Consulta de CEP
- ReceitaFederalService: Validação de CNPJ
- AsaasService: Integração com gateway de pagamento
- FileUploadService: Upload de arquivos
Estrutura do Frontend
front2/src/app/
├── pages/ # Páginas do sistema
├── services/ # Serviços HTTP
├── models/ # Modelos TypeScript
├── modules/ # Módulos funcionais
│ ├── auth/ # Autenticação
│ └── crud/ # Componentes CRUD
└── _metronic/ # Theme/Layout
Comunicação Frontend-Backend
- REST API para comunicação
- JSON como formato de dados
- JWT no header Authorization
- Interceptors para tratamento de erros e tokens
Segurança
- Senhas hasheadas com bcrypt
- Tokens JWT com expiração
- Validação de dados em todas as camadas
- Rate limiting (throttling)
- CORS configurado
- Validação de entrada (class-validator)