Pular para o conteúdo principal
Versão: Versão Cestas

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