API-controledeprodutos

🚀 API de Controle de Produtos - RepairPro

API REST completa para gerenciamento de produtos do sistema RepairPro. Permite criar, listar, editar e deletar produtos com armazenamento em banco de dados SQLite.

📋 Características

🛠️ Tecnologias

📦 Instalação

1. Instalar dependências

npm install

2. Configurar variáveis de ambiente (opcional)

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

3. Iniciar o servidor

# Modo normal
npm start

# Modo desenvolvimento (com auto-reload)
npm run dev

O servidor estará disponível em: http://localhost:3000

📚 Documentação da API

Endpoints Disponíveis

🏠 Rota Principal

GET /

Retorna informações sobre a API e documentação.

📊 Status

GET /api/status

Retorna o status do servidor.


📦 Produtos

Listar todos os produtos

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"
    }
  ]
}

Buscar produto por ID

GET /api/produtos/:id

Exemplo:

curl http://localhost:3000/api/produtos/1

Criar novo produto

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"
  }'

Atualizar produto

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"}'

Deletar produto

DELETE /api/produtos/:id

Exemplo:

curl -X DELETE http://localhost:3000/api/produtos/1

Buscar com filtros

GET /api/produtos/buscar?status=Pendente&prioridade=Alta&cliente=João

Parâmetros disponíveis:

Exemplo:

curl "http://localhost:3000/api/produtos/buscar?status=Pendente&prioridade=Alta"

Obter estatísticas

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": [...]
  }
}

🔗 Integração com o Front-end

Exemplo de uso no JavaScript

// 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
});

Modificando o Front-end atual

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();
  }
}

🧪 Testando a API

Usando o script de teste

npm test

Usando curl

# 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"}'

Usando Postman ou Insomnia

  1. Importe a URL base: http://localhost:3000
  2. Crie requisições para cada endpoint
  3. Configure o método HTTP adequado (GET, POST, PUT, DELETE)
  4. Para POST e PUT, adicione o header Content-Type: application/json

📁 Estrutura do Projeto

api-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

🔒 Segurança e CORS

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

🚀 Deploy (Produção)

Opções de hospedagem gratuita:

  1. Render.com
  2. Railway.app
  3. Fly.io
  4. Heroku (plano gratuito limitado)

Passos básicos para deploy:

  1. Crie um repositório Git
  2. Faça commit dos arquivos
  3. Conecte com a plataforma de hospedagem
  4. Configure as variáveis de ambiente
  5. A plataforma fará o deploy automaticamente

❓ Problemas Comuns

Erro de CORS

Se você receber erro de CORS, certifique-se de que a URL do seu front-end está na lista ALLOWED_ORIGINS no arquivo .env.

Porta já em uso

Se a porta 3000 já estiver em uso, altere no arquivo .env:

PORT=3001

Banco de dados não criado

O banco de dados é criado automaticamente ao iniciar o servidor pela primeira vez.

📞 Suporte

Se você encontrar algum problema, verifique:

  1. Se todas as dependências foram instaladas (npm install)
  2. Se o servidor está rodando (npm start)
  3. Se a URL da API está correta
  4. Se o CORS está configurado corretamente

📝 Licença

MIT License - Sinta-se livre para usar este projeto!


Desenvolvido para o sistema RepairPro 🛠️

API-controledeprodutos