- Ambiente de Desenvolvimento:
http://localhost:3001 - Serviço de Arquivos Estáticos (Uploads):
http://localhost:3001/images/ - Front-End Integrado: Desenvolvido em conjunto com o repositório cliente Site_Escola_React_Redux_API
A Escola API RESTful é uma aplicação de back-end em Node.js e Express, utilizando o ORM Sequelize sobre MySQL/MariaDB, arquitetada para atender às demandas de gerenciamento acadêmico de alunos, fotos e usuários de uma instituição de ensino.
A API adota o padrão MVC (Model-View-Controller) desacoplado, expondo endpoints RESTful com validações estritas de schema, controle de sessão stateless baseado em tokens JWT, hashing irreversível de senhas com BCrypt, upload de arquivos estáticos via Multer e cabeçalhos de segurança corporativa configurados com Helmet e CORS restritivo.
- 🔐 Autenticação & Controle de Sessão (
/tokens):- Emissão de token JWT assinado para usuários cadastrados válidos.
- Middleware de interceptação
loginRequiredvalidando cabeçalho Bearer e persistência do usuário.
- 👤 Gerenciamento de Usuários Operadores (
/users):- Cadastro de novos administradores com validações de e-mail único e tamanho mínimo de senha.
- Atualização de dados cadastrais e exclusão restritas ao próprio usuário autenticado.
- 👨🎓 Gestão Completa de Alunos (
/alunos):- Listagem pública ordenada de alunos trazendo fotos associadas em eager loading.
- Consulta detalhada de aluno por ID com histórico de fotos anexadas.
- Criação, edição e exclusão de cadastros de alunos restritas a operadores logados.
- 📸 Upload e Processamento de Imagens (
/fotos):- Upload de avatares com filtro rigoroso de extensão MIME (
image/png,image/jpeg). - Geração de nomes aleatórios com timestamp para evitar colisão de arquivos em disco.
- Campo virtual no Sequelize gerando dinamicamente a URL pública absoluta de cada imagem.
- Upload de avatares com filtro rigoroso de extensão MIME (
- Campos Virtuais no Sequelize (
VIRTUAL):- Senha Segura: A entidade
Userrecebe a senha em texto plano via setter virtual, valida o tamanho e gera automaticamente opassword_hashcom BCrypt antes de persistir, nunca salvando a senha original. - URL Absoluta de Imagem: A entidade
Fotomonta dinamicamente o link completo de acesso (http://APP_URL:PORT/images/filename) através de um getter virtual.
- Senha Segura: A entidade
- Camada de Proteção com Helmet & CORS Dinâmico: Aplicação configurada com lista de permissões (whitelisting) aceitando apenas requisições originadas de clientes autorizados.
- Migrações e Seeds com Sequelize CLI: Gerenciamento de evolução do esquema relacional e dados de demonstração através de scripts versionados em
src/database/migrations. - Compatibilidade com Deploy Serverless: Estrutura adaptada com arquivo
vercel.jsone arquivo de entrada raiz para execução em nuvem.
src/
├── app.js # Configuração do Express, middlewares, CORS e rotas
├── server.js # Inicialização do servidor HTTP e escuta na porta
├── config/
│ ├── appConfig.js # URL e porta do serviço
│ ├── database.js # Configurações de conexão do Sequelize (Dialect, Pools, TZ)
│ └── multerConfig.js # Filtro de extensões e destino de uploads
├── controller/
│ ├── AlunoController.js # CRUD de Alunos
│ ├── FotoController.js # Recepção de uploads e gravação no banco
│ ├── HomeController.js # Healthcheck inicial
│ ├── TokenController.js # Autenticação e geração de JWT
│ └── UserController.js # CRUD de Usuários operadores
├── database/
│ ├── index.js # Inicialização e associação de modelos
│ ├── migrations/ # Migrações relacionais do banco de dados
│ └── seeds/ # Dados iniciais de teste
├── middlewares/
│ └── loginRequired.js # Validação do token JWT e injeção de req.userId
├── model/
│ ├── Aluno.js # Modelo de Alunos com validações
│ ├── Foto.js # Modelo de Fotos com getter de URL
│ └── User.js # Modelo de Usuários com hash de senha
├── routes/
│ ├── alunoRoutes.js
│ ├── homeRoutes.js
│ ├── photoRoutes.js
│ ├── tokenRoutes.js
│ └── userRoutes.js
├── util/ # Helpers utilitários
static/
└── uploads/
└── images/ # Diretório físico de armazenamento das fotos
erDiagram
USERS {
int id PK
varchar nome
varchar email UK
varchar password_hash
datetime created_at
datetime updated_at
}
ALUNOS ||--o{ FOTOS : "possui"
ALUNOS {
int id PK
varchar nome
varchar sobrenome
varchar email UK
int idade
float peso
float altura
datetime created_at
datetime updated_at
}
FOTOS {
int id PK
varchar originalname
varchar filename
int aluno_id FK
datetime created_at
datetime updated_at
}
| Método | Rota | Autenticação | Descrição |
|---|---|---|---|
POST |
/tokens |
Pública | Login com e-mail e senha, retornando JWT |
POST |
/users |
Pública | Cadastro de novo usuário operador |
GET |
/users |
Pública | Listagem de usuários (apenas ID, nome e e-mail) |
PUT |
/users |
Bearer JWT | Atualização do próprio perfil logado |
DELETE |
/users |
Bearer JWT | Exclusão do próprio usuário logado |
| Método | Rota | Autenticação | Descrição |
|---|---|---|---|
GET |
/alunos |
Pública | Lista todos os alunos com suas respectivas fotos |
GET |
/alunos/:id |
Pública | Consulta detalhes de um aluno por ID |
POST |
/alunos |
Bearer JWT | Cadastra novo aluno no sistema |
PUT |
/alunos/:id |
Bearer JWT | Atualiza dados de um aluno existente |
DELETE |
/alunos/:id |
Bearer JWT | Remove um aluno do sistema |
| Método | Rota | Autenticação | Descrição |
|---|---|---|---|
POST |
/fotos |
Bearer JWT | Upload de imagem (multipart/form-data) vinculada a aluno |
- Node.js: Versão 18 ou superior.
- Banco de Dados: MySQL ou MariaDB rodando localmente na porta 3306.
- Gerenciador de Pacotes:
npm.
git clone https://github.com/erickystn/API_REST_NODE-SEQUELIZE.git
cd API_REST_NODE-SEQUELIZEnpm installCrie um arquivo .env na raiz do projeto com base no .env.example:
DATABASE=escola
DATABASE_HOST=localhost
DATABASE_PORT=3306
DATABASE_USERNAME=root
DATABASE_PASSWORD=root
TOKEN_SECRET=seu_segredo_jwt_super_seguro
TOKEN_EXPIRATION=7d
APP_URL=http://localhost
APP_PORT=3001npx sequelize db:migrate# Modo de desenvolvimento (com nodemon):
npm run dev
# Modo de produção:
npm startO servidor iniciará em http://localhost:3001.
curl -X POST http://localhost:3001/tokens \
-H "Content-Type: application/json" \
-d '{
"email": "admin@escola.com",
"password": "senhaSegura123"
}'curl -X POST http://localhost:3001/alunos \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <SEU_TOKEN_JWT>" \
-d '{
"nome": "Lucas",
"sobrenome": "Menezes",
"email": "lucas@email.com",
"idade": 21,
"peso": 75.5,
"altura": 1.78
}'| Tecnologia | Versão | Finalidade |
|---|---|---|
| Node.js | 18+ | Ambiente de execução JavaScript no servidor |
| Express | 4.19 | Framework HTTP minimalista e modular |
| Sequelize | 6.37 | ORM relacional com suporte a migrações e validações |
| MariaDB / MySQL2 | 3.3 / 3.9 | Drivers de banco relacional SQL |
| Bcryptjs | 2.4 | Criptografia irreversível de senhas |
| JsonWebToken | 9.0 | Autenticação baseada em tokens stateless |
| Multer | 1.4 | Processamento e armazenamento de uploads multipart/form-data |
| Helmet & Cors | 7.1 / 2.8 | Proteção de cabeçalhos e controle de origens HTTP |
Desenvolvido por Ericky Sant'ana.
Distribuído sob a licença MIT.