API REST completa para gerenciamento de produtos do sistema RepairPro. Permite criar, listar, editar e deletar produtos com armazenamento em banco de dados SQLite.
npm install
O arquivo .env já está configurado com valores padrão. Você pode alterar se necessário:
PORT=3000
NODE_ENV=development
DB_PATH=./database.sqlite
ALLOWED_ORIGINS=http://localhost:5500,http://127.0.0.1:5500,https://victorhugoaurelianocoltro.github.io
# Modo normal
npm start
# Modo desenvolvimento (com auto-reload)
npm run dev
O servidor estará disponível em: http://localhost:3000
GET /
Retorna informações sobre a API e documentação.
GET /api/status
Retorna o status do servidor.
GET /api/produtos
Resposta:
{
"sucesso": true,
"total": 4,
"dados": [
{
"id": 1,
"cliente": "João Silva",
"telefone": "(11) 98765-4321",
"produto": "iPhone 13 Pro",
"defeito": "Tela quebrada",
"valor": 450.00,
"entrada": "2024-10-10",
"entrega": "2024-10-17",
"status": "Em andamento",
"prioridade": "Alta",
"observacoes": "Cliente solicitou urgência",
"criado_em": "2024-10-14 12:00:00",
"atualizado_em": "2024-10-14 12:00:00"
}
]
}
GET /api/produtos/:id
Exemplo:
curl http://localhost:3000/api/produtos/1
POST /api/produtos
Content-Type: application/json
Body (campos obrigatórios):
{
"cliente": "Pedro Santos",
"telefone": "(11) 99999-8888",
"produto": "MacBook Pro",
"defeito": "Teclado com defeito",
"valor": 800.00,
"entrada": "2024-10-14",
"entrega": "2024-10-21",
"status": "Pendente",
"prioridade": "Alta",
"observacoes": "Substituir teclado completo"
}
Exemplo cURL:
curl -X POST http://localhost:3000/api/produtos \
-H "Content-Type: application/json" \
-d '{
"cliente": "Pedro Santos",
"telefone": "(11) 99999-8888",
"produto": "MacBook Pro",
"defeito": "Teclado com defeito",
"valor": 800.00,
"entrada": "2024-10-14",
"entrega": "2024-10-21",
"status": "Pendente",
"prioridade": "Alta",
"observacoes": "Substituir teclado completo"
}'
PUT /api/produtos/:id
Content-Type: application/json
Body (envie apenas os campos que deseja atualizar):
{
"status": "Concluído",
"observacoes": "Serviço finalizado com sucesso"
}
Exemplo cURL:
curl -X PUT http://localhost:3000/api/produtos/1 \
-H "Content-Type: application/json" \
-d '{"status": "Concluído"}'
DELETE /api/produtos/:id
Exemplo:
curl -X DELETE http://localhost:3000/api/produtos/1
GET /api/produtos/buscar?status=Pendente&prioridade=Alta&cliente=João
Parâmetros disponíveis:
status - Filtrar por statusprioridade - Filtrar por prioridadecliente - Buscar por nome do cliente (parcial)produto - Buscar por nome do produto (parcial)Exemplo:
curl "http://localhost:3000/api/produtos/buscar?status=Pendente&prioridade=Alta"
GET /api/produtos/estatisticas
Resposta:
{
"sucesso": true,
"dados": {
"total": 10,
"porStatus": [
{ "status": "Pendente", "count": 3 },
{ "status": "Em andamento", "count": 5 },
{ "status": "Concluído", "count": 2 }
],
"porPrioridade": [
{ "prioridade": "Alta", "count": 4 },
{ "prioridade": "Normal", "count": 6 }
],
"valorTotal": 3450.00,
"recentes": [...]
}
}
// Base URL da API
const API_URL = 'http://localhost:3000/api/produtos';
// Listar todos os produtos
async function listarProdutos() {
try {
const response = await fetch(API_URL);
const data = await response.json();
if (data.sucesso) {
return data.dados;
} else {
throw new Error(data.erro);
}
} catch (error) {
console.error('Erro ao listar produtos:', error);
throw error;
}
}
// Criar novo produto
async function criarProduto(produto) {
try {
const response = await fetch(API_URL, {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(produto)
});
const data = await response.json();
if (data.sucesso) {
return data.dados;
} else {
throw new Error(data.erro);
}
} catch (error) {
console.error('Erro ao criar produto:', error);
throw error;
}
}
// Atualizar produto
async function atualizarProduto(id, dados) {
try {
const response = await fetch(`${API_URL}/${id}`, {
method: 'PUT',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(dados)
});
const data = await response.json();
if (data.sucesso) {
return data.dados;
} else {
throw new Error(data.erro);
}
} catch (error) {
console.error('Erro ao atualizar produto:', error);
throw error;
}
}
// Deletar produto
async function deletarProduto(id) {
try {
const response = await fetch(`${API_URL}/${id}`, {
method: 'DELETE'
});
const data = await response.json();
if (data.sucesso) {
return data.dados;
} else {
throw new Error(data.erro);
}
} catch (error) {
console.error('Erro ao deletar produto:', error);
throw error;
}
}
// Exemplo de uso
listarProdutos().then(produtos => {
console.log('Produtos:', produtos);
// Atualizar a interface com os produtos
});
No seu arquivo script.js, substitua o método carregarProdutos():
async carregarProdutos() {
try {
const response = await fetch('http://localhost:3000/api/produtos');
const data = await response.json();
if (data.sucesso) {
return data.dados;
} else {
console.error('Erro ao carregar produtos:', data.erro);
return [];
}
} catch (error) {
console.error('Erro ao conectar com a API:', error);
// Retornar dados fixos como fallback
return this.getProdutosFixos();
}
}
npm test
# Listar produtos
curl http://localhost:3000/api/produtos
# Criar produto
curl -X POST http://localhost:3000/api/produtos \
-H "Content-Type: application/json" \
-d '{"cliente":"Teste","telefone":"11999999999","produto":"Teste","defeito":"Teste","valor":100,"entrada":"2024-10-14","entrega":"2024-10-21"}'
http://localhost:3000Content-Type: application/jsonapi-controleprodutos/
├── controllers/
│ └── produtosController.js # Lógica de negócio
├── routes/
│ └── produtosRoutes.js # Definição de rotas
├── .env # Variáveis de ambiente
├── database.js # Configuração do banco
├── server.js # Servidor principal
├── package.json # Dependências
├── test-api.js # Script de teste
├── database.sqlite # Banco de dados (criado automaticamente)
└── README.md # Este arquivo
A API está configurada para aceitar requisições dos seguintes domínios:
Para adicionar mais domínios, edite o arquivo .env:
ALLOWED_ORIGINS=http://localhost:5500,http://seudominio.com
Se você receber erro de CORS, certifique-se de que a URL do seu front-end está na lista ALLOWED_ORIGINS no arquivo .env.
Se a porta 3000 já estiver em uso, altere no arquivo .env:
PORT=3001
O banco de dados é criado automaticamente ao iniciar o servidor pela primeira vez.
Se você encontrar algum problema, verifique:
npm install)npm start)MIT License - Sinta-se livre para usar este projeto!
Desenvolvido para o sistema RepairPro 🛠️