Arquitetura do Sistema
Esta página descreve a arquitetura geral do Sistema Divino Alimento, incluindo suas principais camadas, componentes e tecnologias.
Visão Geral da Arquitetura
O Divino Alimento segue uma arquitetura MVC (Model-View-Controller) tradicional, com algumas adaptações para atender às necessidades específicas do sistema.
┌─────────────────────────────────────────┐
│ FRONTEND (Views) │
│ HTML, CSS, JavaScript, EJS Templates │
└──────────────┬──────────────────────────┘
│
▼
┌─────────────────────────────────────────┐
│ BACKEND (Controllers) │
│ Node.js + Express.js │
└──────────────┬──────────────────────────┘
│
▼
┌─────────────────────────────────────────┐
│ MODELS (ORM) │
│ Sequelize + PostgreSQL │
└─────────────────────────────────────────┘
Camadas da Aplicação
1. Camada de Apresentação (Frontend)
Tecnologias:
- HTML5/CSS3
- JavaScript (ES6+)
- EJS (Embedded JavaScript Templates)
- Bootstrap (para componentes UI)
Responsabilidades:
- Renderizar interfaces de usuário
- Validação básica de formulários
- Interações do usuário
- Comunicação com o backend via requisições HTTP
2. Camada de Aplicação (Backend)
Tecnologias:
- Node.js
- Express.js (framework web)
- Passport.js (autenticação OAuth)
Estrutura de Controllers:
controllers/
├── authController.js # Autenticação e sessões
├── userController.js # Gestão de usuários
├── productController.js # Gestão de produtos
├── cycleController.js # Gestão de ciclos
├── offerController.js # Ofertas de fornecedores
├── basketController.js # Composição de cestas
├── orderController.js # Pedidos extras
└── reportController.js # Geração de relatórios
Responsabilidades:
- Lógica de negócio
- Roteamento de requisições
- Autorização e controle de acesso
- Processamento de dados
- Geração de relatórios
3. Camada de Dados (Models)
Tecnologias:
- PostgreSQL (banco de dados relacional)
- Sequelize ORM (Object-Relational Mapping)
Principais Modelos:
models/
├── User.js # Usuários do sistema
├── Profile.js # Perfis (Fornecedor, Consumidor, Admin)
├── Product.js # Produtos comercializados
├── Category.js # Categorias de produtos
├── Cycle.js # Ciclos de comercialização
├── Basket.js # Tipos de cestas
├── DeliveryPoint.js # Pontos de entrega
├── Offer.js # Ofertas de produtos
├── BasketComposition.js # Composição das cestas
├── Order.js # Pedidos extras
└── OrderItem.js # Itens dos pedidos
Fluxo de Dados
Exemplo: Criar um Ciclo
1. Usuário (Admin) → Formulário de criação de ciclo
2. Frontend → POST /cycles (dados do ciclo)
3. Controller → Valida dados e permissões
4. Controller → cycleController.create()
5. Model → Cycle.create() via Sequelize
6. PostgreSQL → INSERT INTO cycles
7. PostgreSQL → Retorna ciclo criado
8. Controller → Renderiza página de confirmação
9. Frontend → Exibe mensagem de sucesso
Autenticação e Autorização
OAuth 2.0 (Google)
1. Usuário clica em "Login com Google"
2. Redirecionamento para Google OAuth
3. Usuário autoriza aplicação
4. Google retorna token de autenticação
5. Sistema verifica/cria usuário no banco
6. Sessão criada com Passport.js
7. Usuário redirecionado para área restrita
Controle de Acesso por Perfil
// Middleware de autorização
const requireProfile = (profileName) => {
return (req, res, next) => {
if (!req.user || !req.user.hasProfile(profileName)) {
return res.status(403).send('Acesso negado');
}
next();
};
};
// Uso nas rotas
router.post('/cycles',
requireProfile('Administrador'),
cycleController.create
);
Estrutura de Diretórios
divino-alimento/
├── config/ # Configurações (DB, OAuth, etc)
├── controllers/ # Lógica de negócio
├── models/ # Modelos Sequelize
├── routes/ # Definição de rotas
├── views/ # Templates EJS
├── public/ # Arquivos estáticos (CSS, JS, images)
├── middlewares/ # Middlewares customizados
├── utils/ # Funções utilitárias
├── migrations/ # Migrações do banco de dados
├── seeders/ # Seeds para dados iniciais
├── tests/ # Testes automatizados
├── docker-compose.yml # Configuração Docker
├── Dockerfile # Imagem Docker da aplicação
├── package.json # Dependências Node.js
└── README.md # Documentação principal
Banco de Dados
Esquema Relacional Simplificado
users (id, email, name, google_id)
│
├─► user_profiles (user_id, profile_id)
│
profiles (id, name: 'Fornecedor'|'Consumidor'|'Administrador')
products (id, name, category_id, measure, weight, price)
│
categories (id, name)
cycles (id, name, delivery_point_id, offer_start, offer_end, ...)
│
├─► offers (id, cycle_id, user_id, product_id, quantity)
│
├─► basket_compositions (id, cycle_id, basket_id, product_id, quantity)
│
└─► orders (id, cycle_id, user_id)
│
└─► order_items (id, order_id, product_id, quantity, price)
Tecnologias e Ferramentas
Principais Dependências
{
"express": "^4.18.x",
"sequelize": "^6.x",
"pg": "^8.x",
"passport": "^0.6.x",
"passport-google-oauth20": "^2.x",
"ejs": "^3.x",
"express-session": "^1.x",
"dotenv": "^16.x"
}
Infraestrutura
- Docker: Containerização da aplicação
- Docker Compose: Orquestração de containers (app + PostgreSQL)
- PostgreSQL: Banco de dados relacional
- Nginx: Proxy reverso (produção)
Padrões de Design Utilizados
MVC (Model-View-Controller)
Separação clara de responsabilidades entre dados, lógica e apresentação.
Repository Pattern
Acesso aos dados através de métodos do Sequelize ORM.
Middleware Pattern
Funções intermediárias para autenticação, autorização e validação.
Factory Pattern
Criação de relatórios em diferentes formatos (CSV, PDF).
Próximos Passos
- Configuração do Ambiente - Configure seu ambiente de desenvolvimento
- Padrões de Código - Conheça as convenções do projeto
- Guia de Contribuição - Como submeter suas alterações