Arquitetura do Frontend
Descrição
O frontend foi desenvolvido utilizando Next.js com React, buscando uma arquitetura componentizada, que facilite manutenção, testes e escalabilidade.
A aplicação segue um padrão de rotas baseado em pastas, aproveitando a estrutura do Next para criação automática de rotas a partir do diretório app/.
Tecnologias
- Next.js → Framework React para rotas e renderização.
 - React → Biblioteca de UI, base do frontend.
 - Axios → Consumo de APIs.
 - Tailwind CSS → Estilização utilitária com paleta customizada.
 - ESLint → Padronização de código.
 - Docker → Conteinerização do ambiente.
 - GitLab → Versionamento, Wiki e CI/CD.
 
Estrutura de Arquivos do Frontend
src/
├── app/
├── page.tsx
├── globals.css
├── layout.tsx
├── screen1/
│   ├── page.tsx
│   ├── loading.tsx
│   ├── error.tsx
│   └── components/
│       ├── component1/
│       │   ├── index.tsx
│       │   ├── skeleton.tsx
│       │   └── error.tsx
│       └── component2/
│           ├── index.tsx
│           ├── skeleton.tsx
│           └── error.tsx
├── screen2/
│   ├── page.tsx
│   ├── loading.tsx
│   └── error.tsx
└── components/
    └── lib/
Explicativo dos Diretórios
- app/ → raiz da aplicação, organiza as rotas e páginas.
 - page.tsx → ponto de entrada de cada rota.
 - loading.tsx → tela/estado de carregamento da rota.
 - error.tsx → fallback para tratamento de erros da rota.
 - 
components/ → componentes exclusivos da tela, cada um em sua pasta com 
index,skeletoneerror. - components (nível raiz) → componentes compartilhados entre várias telas.
 - lib/ → utilitários gerais (funções auxiliares, hooks globais etc.).
 
Justificativa da Arquitetura
A arquitetura foi escolhida para:
- Facilitar debug e manutenção, isolando erros e loaders por tela e por componente.
 - Seguir o padrão de componentização do React, reaproveitando blocos de UI.
 - Permitir futura expansão para testes unitários e testes de integração mais claros, já que erros e estados de loading estão isolados.
 - Melhorar a organização visual do projeto, facilitando a navegação pelo código.
 
Arquitetura do Backend
Descrição
O backend foi desenvolvido utilizando NestJS, um framework Node.js para a construção de aplicações server-side eficientes e escaláveis. A arquitetura adotada é a de Monolito Modular, onde a aplicação é dividida em módulos que representam os domínios de negócio da aplicação (ex: producers, areas, harvests).
Esta abordagem promove uma forte Separação de Responsabilidades (Separation of Concerns), com cada módulo possuindo camadas bem definidas (Controller, Service, Repository), facilitando a manutenção, testabilidade e o desenvolvimento paralelo de novas funcionalidades.
Tecnologias
- NestJS → Framework backend para a estrutura da aplicação, injeção de dependência e modularidade.
 - TypeScript → Superset do JavaScript que adiciona tipagem estática, aumentando a robustez do código.
 - Prisma → ORM (Object-Relational Mapper) de próxima geração para a comunicação com o banco de dados.
 - PostgreSQL → Banco de dados relacional, com a extensão PostGIS para manipulação de dados geoespaciais.
 - Docker → Conteinerização do ambiente de desenvolvimento e produção.
 - Swagger → Geração automática de documentação da API a partir do código.
 - Passport.js → Middleware para estratégias de autenticação (JWT).
 - ESLint / Prettier → Padronização e formatação de código.
 - GitLab → Versionamento, Wiki e CI/CD.
 
Estrutura de Arquivos do Backend
aiprodutor-backend/
├── prisma/
│   ├── migrations/
│   └── schema.prisma
├── src/
│   ├── main.ts
│   ├── app.module.ts
│   ├── auth/
│   │   ├── dto/
│   │   ├── guards/
│   │   ├── strategies/
│   │   ├── auth.controller.ts
│   │   ├── auth.controller.spec.ts
│   │   ├── auth.service.ts
│   │   ├── auth.service.spec.ts
│   │   └── auth.module.ts
│   └── ... (demais módulos de dominio como `producers`, `areas`, etc.)
├── shared/
│   ├── prisma/
│   └── config/
└── test/
    ├── auth.e2e-spec.ts
    └── jest-e2e.json
Diagrama de Sistema
Padrões de Projeto e Explicação das Camadas
A arquitetura se baseia em um conjunto de padrões de projeto para garantir um código limpo, desacoplado e manutenível.
Padrões Fundamentais
- 
Arquitetura Modular: O sistema é dividido em módulos de domínio independentes (
ProducersModule,AreasModule). Cada módulo encapsula um conjunto coeso de funcionalidades. - 
Injeção de Dependência (DI): Utilizada nativamente pelo NestJS, permite que as dependências de uma classe (como um 
Serviceprecisando de umRepository) sejam "injetadas" externamente, em vez de serem criadas internamente. Isso desacopla o código e facilita enormemente os testes. - 
Repository Pattern: A camada de 
Service(lógica de negócio) não se comunica diretamente com o ORM (Prisma). Em vez disso, ela depende de uma abstração (oRepository), que centraliza e encapsula todas as consultas ao banco de dados. Isso isola a lógica de negócio dos detalhes de implementação da persistência. - 
DTO (Data Transfer Object): Classes que definem a estrutura de dados que trafegam nas fronteiras da aplicação (ex: corpo de uma requisição HTTP). São usadas com os 
ValidationPipesdo NestJS para garantir a integridade dos dados que entram no sistema. 
Explicativo das Camadas
- 
*.controller.ts(Camada de API) → Responsável por receber requisições HTTP, validar os dados de entrada através de DTOs e direcionar a chamada para a camada de serviço. Não contém regras de negócio. - 
*.service.ts(Camada de Serviço) → Contém a lógica de negócio principal. Orquestra as regras, cálculos e decisões. É o "cérebro" de cada módulo e depende dos Repositories para manipular dados. - 
*.repository.ts(Camada de Acesso a Dados) → Abstrai a comunicação com o banco de dados. Centraliza as queries (especialmente as mais complexas) e garante que o restante da aplicação não precise "saber" que o Prisma está sendo usado. - 
*.spec.ts(Camada de Testes) → Arquivos de testes unitários que vivem ao lado do código que testam, garantindo a qualidade e o comportamento esperado de cada unidade (Service, Controller, etc.). 
Justificativa da Arquitetura
A arquitetura do backend foi projetada com os seguintes objetivos:
- Manutenibilidade e Escalabilidade → A divisão em módulos por domínio permite que a equipe encontre, corrija e adicione funcionalidades de forma isolada e segura, sem impactar o resto do sistema.
 - Separação de Responsabilidades (SoC) → Cada camada tem um propósito claro. Controllers não acessam o banco, e Services não lidam com HTTP. Isso torna o código mais limpo, previsível e fácil de raciocinar.
 - Testabilidade → A Injeção de Dependência e o Repository Pattern facilitam a criação de testes unitários, permitindo "mockar" (simular) o acesso ao banco para testar a lógica de negócio de forma isolada.
 - Robustez → O uso de DTOs com validação automática na camada de Controller garante a integridade dos dados na entrada da API, prevenindo a propagação de dados inválidos para as camadas internas.
 
Arquitetura AWS
Visão Geral
Esta arquitetura descreve a infraestrutura da aplicação AI Produtor, construída inteiramente sobre a AWS (Amazon Web Services).
Ela é composta por uma camada de frontend (site hospedado no Amplify), uma camada de backend (API sem servidor com AWS Lambda) e um pipeline CI/CD automatizado via GitLab Runner e Docker.
O objetivo é garantir escalabilidade, segurança, baixo custo operacional e entrega contínua.
Fluxo de Requisições
1. Cliente
Usuários acessam a aplicação via:
- https://ai-produtor.com/ → Frontend (interface web)
 - https://api.ai-produtor.com/ → Backend (API REST)
 
2. Amazon Route 53
O Amazon Route 53 atua como o serviço DNS, responsável por rotear o tráfego:
- Frontend → AWS Amplify
 - Backend (API) → Amazon API Gateway
 
Funções principais:
- Gerencia domínios e subdomínios.
 - Redireciona requisições de forma segura e escalável.
 - Suporta SSL/TLS e monitoramento de integridade.
 
3. AWS Amplify
O AWS Amplify hospeda o frontend da aplicação (ex: React, Vue, Angular).
Fornece:
- Deploy automático integrado ao GitLab.
 - CDN global para alta performance.
 - HTTPS e SSL automáticos.
 - Rollback de versões e CI/CD simplificado.
 
4. Amazon API Gateway
O Amazon API Gateway é a porta de entrada para o backend, hospedando os endpoints da API.
Funções:
- Controle de acesso (IAM, JWT, Cognito, etc.).
 - Limitação de requisições (throttling).
 - Conversão e roteamento de payloads.
 - Integração direta com AWS Lambda.
 
5. AWS Lambda
O AWS Lambda executa o código backend sob demanda, sem necessidade de gerenciar servidores.
Responsabilidades:
- Processamento de requisições recebidas pelo API Gateway.
 - Consultas a dados no Amazon RDS.
 - Acesso a segredos armazenados no AWS Secrets Manager.
 - Execução escalável e pagamento por uso.
 
6. AWS Secrets Manager
Serviço responsável por armazenar com segurança:
- Credenciais do banco de dados.
 - Tokens e chaves sensíveis.
 - Senhas e variáveis de ambiente.
 
Benefícios:
- Evita exposição de segredos no código.
 - Rotaciona automaticamente credenciais.
 - Integração nativa com Lambda e RDS.
 
7. Amazon RDS
O Amazon Relational Database Service (RDS) hospeda o banco de dados relacional da aplicação.
Pode ser PostgreSQL, MySQL ou outro motor compatível.
Características:
- Backup automatizado.
 - Alta disponibilidade e escalabilidade.
 - Segurança via VPC e grupos de segurança.
 
8. CI/CD – Amazon EC2 + Docker + GitLab Runner
Pipeline de deploy automatizado, responsável pela entrega contínua do backend.
- O GitLab Runner roda em uma instância Amazon EC2.
 - Usa Docker para construir e empacotar as imagens da aplicação.
 - Envia as imagens para o AWS Elastic Container Service (ECS).
 - Automatiza build, testes e deploy a cada commit no repositório.
 
9. AWS Elastic Container Service (ECS)
O ECS orquestra os containers do backend.
Funções:
- Gerenciamento de containers via Docker.
 - Escalonamento automático.
 - Integração com Load Balancer e CloudWatch.
 - Deploy automatizado via GitLab Runner.
 
Segurança e Boas Práticas
- Todo o tráfego é HTTPS via Route 53 + Amplify.
 - Segredos são armazenados apenas no Secrets Manager.
 - Lambda utiliza políticas IAM com menor privilégio possível.
 - Containers no ECS rodam em sub-redes privadas.
 - Logs e métricas são enviados para CloudWatch.
 
Fluxo Completo
| Etapa | Origem | Destino | Descrição | 
|---|---|---|---|
| 1 | Cliente | Route 53 | Usuário acessa domínio principal ou API | 
| 2 | Route 53 | AWS Amplify | Entrega do frontend web | 
| 3 | Route 53 | API Gateway | Redireciona requisições para backend | 
| 4 | API Gateway | Lambda | Executa lógica de negócio | 
| 5 | Lambda | Secrets Manager | Obtém credenciais seguras | 
| 6 | Lambda | RDS | Acessa dados da aplicação | 
| 7 | GitLab Runner (EC2 + Docker) | ECS | Build e deploy automatizado | 
| 8 | ECS | Lambda/API | Mantém serviços backend disponíveis | 
Conclusão
Esta arquitetura combina simplicidade operacional, alta disponibilidade e segurança corporativa, aproveitando o ecossistema AWS para suportar o crescimento contínuo do projeto AI Produtor.
