Uma API RESTful para gerenciar uma loja de plantas, construída com Node.js, Express e TypeScript, utilizando SQLite como banco de dados.
- API RESTful completa para gerenciar catálogo de plantas e tipos de plantas
- TypeScript para tipagem estática e melhor segurança do código
- Banco de dados SQLite para armazenamento persistente sem necessidade de configuração adicional
- Arquitetura MVC para organização clara do código
- Validação de dados com YUP para garantir integridade dos dados
- Inicialização automática do banco de dados com dados iniciais
- Suporte a CORS para integração com frontends
- Node.js (v18 ou superior)
- npm (v8 ou superior)
# Clonar o repositório
git clone https://github.com/gelasioebel/api-plantas-backend.git
# Entrar no diretório do projeto
cd api-plantas-backend# Instalar dependências do projeto
npm installO banco de dados é criado e inicializado automaticamente na primeira execução. Se precisar recriá-lo:
# Limpar o banco de dados e reconstruir
npm run reset:all| Script | Descrição |
|---|---|
npm start |
Inicia o servidor em modo produção usando ts-node |
npm run dev |
Inicia o servidor em modo desenvolvimento com auto-reload |
npm run build |
Compila o código TypeScript para JavaScript |
npm run clean |
Remove node_modules, package-lock.json e pasta dist |
npm run clean:db |
Remove arquivos de banco de dados SQLite |
npm run reset |
Reinstala dependências e reconstrói o projeto |
npm run reset:all |
Limpa tudo (inclusive banco de dados) e reconstrói o projeto |
api-plantas-backend/
├── db/ # Diretório do banco de dados SQLite (criado automaticamente)
├── src/
│ ├── controllers/ # Controladores para manipulação das requisições
│ │ └── plantaController.ts # Controlador para endpoints de plantas
│ ├── database/ # Configuração e inicialização do banco de dados
│ │ ├── database.ts # Conexão com o banco de dados
│ │ └── initDatabase.ts # Inicialização do esquema e dados iniciais
│ ├── middlewares/ # Middlewares para validação e autenticação
│ │ └── validationMiddleware.ts # Validação de dados com Yup
│ ├── models/ # Modelos de dados e operações de banco
│ │ └── plantaModel.ts # Modelo para manipulação de plantas no BD
│ └── routes/ # Definição das rotas da API
│ └── route.ts # Rotas para os endpoints da API
├── server.ts # Arquivo principal do servidor
├── tsconfig.json # Configuração do TypeScript
├── package.json # Dependências e scripts do projeto
└── README.md # Documentação do projeto
O projeto utiliza SQLite com as seguintes tabelas:
| Campo | Tipo | Descrição |
|---|---|---|
| id | INTEGER | Chave primária, autoincremento |
| nome | VARCHAR(100) | Nome do tipo de planta |
| created_at | TIMESTAMP | Data/hora de criação |
| updated_at | TIMESTAMP | Data/hora da última atualização |
| Campo | Tipo | Descrição |
|---|---|---|
| id | INTEGER | Chave primária, autoincremento |
| nome | VARCHAR(100) | Nome da planta |
| subtitulo | VARCHAR(200) | Descrição curta da planta |
| etiquetas | TEXT | Tags separadas por vírgula |
| preco | DECIMAL(10,2) | Preço da planta |
| esta_em_promocao | BOOLEAN | Indica se está em promoção |
| porcentagem_desconto | DECIMAL(5,2) | Percentual do desconto (se em promoção) |
| caracteristicas | TEXT | Características da planta |
| descricao | TEXT | Descrição completa da planta |
| url_imagem | VARCHAR(255) | URL da imagem da planta |
| tipo_planta_id | INTEGER | Referência ao ID na tabela tipos_planta |
| created_at | TIMESTAMP | Data/hora de criação |
| updated_at | TIMESTAMP | Data/hora da última atualização |
Na primeira inicialização, o banco é populado com os seguintes tipos de plantas:
- Plantas de Interior
- Plantas de Exterior
- Suculentas
- Cactos
- Árvores Frutíferas
- Flores
- Ervas Aromáticas
Também são adicionadas algumas plantas de exemplo.
Todos os endpoints começam com o prefixo /api
- URL:
/api/plantas - Método:
GET - Resposta: Array de plantas
- URL:
/api/plantas/:id - Método:
GET - Resposta: Detalhes da planta com o ID especificado
- URL:
/api/tipos-planta - Método:
GET - Resposta: Array de tipos de plantas
- URL:
/api/plantasAPI de Plantas - Método:
POST - Corpo: Dados da planta em JSON
- Resposta: Planta criada com ID
curl -X POST http://ec2-13-59-190-75.us-east-2.compute.amazonaws.com:3000/api/plantas \
-H "Content-Type: application/json" \
-d '{
"nome": "Samambaia Americana",
"subtitulo": "Planta pendente com folhas rendadas",
"etiquetas": "interior,pendente,sombra",
"preco": 35.90,
"esta_em_promocao": false,
"caracteristicas": "Folhas rendadas; Gosta de umidade; Crescimento médio",
"descricao": "A Samambaia Americana é uma planta elegante com folhas delicadas em formato de renda...",
"url_imagem": "https://upload.wikimedia.org/wikipedia/commons/d/d4/Polypodiopsida_Fern_02.jpg",
"tipo_planta_id": 1
}'- URL:
/api/plantas/:id
- Exemplo:
/api/plantas/4 - Método:
GET - Resposta: Detalhes da planta com o ID especificado
{
"id": 4,
"nome": "Samambaia Americana",
"subtitulo": "Planta pendente com folhas rendadas",
"etiquetas": "interior,pendente,sombra",
"preco": 35.90,
"esta_em_promocao": 0,
"porcentagem_desconto": null,
"caracteristicas": "Folhas rendadas; Gosta de umidade; Crescimento médio",
"descricao": "A Samambaia Americana é uma planta elegante com folhas delicadas em formato de renda...",
"url_imagem": "https://upload.wikimedia.org/wikipedia/commons/d/d4/Polypodiopsida_Fern_02.jpg",
"tipo_planta_id": 1,
"created_at": "2025-02-25T12:34:56.789Z",
"updated_at": "2025-02-25T12:34:56.789Z"
}Este projeto está licenciado sob a licença MIT