API RESTful desenvolvida em Node.js com TypeScript e Express para gerenciamento do catálogo de produtos de segurança eletrônica e automação do sistema Infotell.
- Sobre o Projeto
- Funcionalidades
- Arquitetura
- Tecnologias
- Pré-requisitos e Instalação
- Variáveis de Ambiente
- Scripts Disponíveis
- Documentação dos Endpoints
- Estrutura do Modelo de Dados
- Autor e Licença
A Infotell API fornece operações completas de CRUD (Create, Read, Update, Delete) para cadastro e controle de produtos (câmeras, DVRs, centrais de alarme, sensores, fechaduras digitais, etc.).
A persistência de dados é baseada em arquivo JSON assíncrono via fs/promises, mantendo o fluxo desacoplado através de uma arquitetura em camadas (Controller - Service - Repository).
- 📋 Listagem geral: Consulta todos os produtos cadastrados com tratamento para retorno vazio (HTTP 204).
- 🔍 Busca por ID: Recuperação pontual de produtos por identificador numérico.
- ➕ Cadastro de produto: Validação de duplicidade de ID e sugestão automática do próximo ID disponível.
- ✏️ Atualização parcial/total: Modificação de produtos com validação de idempotência (rejeita requisições com dados inalterados).
- 🗑️ Remoção de produto: Exclusão com verificação prévia de existência do recurso.
- 🌐 Padronização HTTP: Respostas centralizadas através de helper com códigos de status semânticos.
O projeto adota uma arquitetura em camadas bem definida, promovendo separação de responsabilidades e facilidade de manutenção:
src/
├── controllers/ # Recebe as requisições HTTP e entrega as respostas
│ └── products-controller.ts
├── services/ # Regras de negócio, validações e tratamento de erros
│ └── products-service.ts
├── repositories/ # Camada de persistência e acesso aos dados (JSON / fs)
│ └── procutsData.ts
├── models/ # Tipagens e interfaces TypeScript
│ └── product-model.ts
├── utils/ # Helpers utilitários (respostas HTTP padronizadas)
│ └── http-helper.ts
├── data/ # Arquivo de persistência local
│ └── productsData.json
├── routes.ts # Definição e roteamento dos endpoints da API
├── app.ts # Inicialização do Express, middlewares e CORS
└── server.ts # Ponto de entrada (boot do servidor HTTP na porta)
- Runtime: Node.js (ES Modules)
- Linguagem: TypeScript
- Framework Web: Express 5
- Segurança e CORS: cors
- Execução em Desenvolvimento: tsx (com watch mode e injeção de
.env) - Bundler de Produção: tsup
- Node.js (versão 18 ou superior recomendada)
- Gerenciador de pacotes npm (ou yarn / pnpm)
- Clone o repositório:
git clone https://github.com/gamancio-tech/infotellAPI.git
cd infotellAPI- Instale as dependências:
npm installCrie um arquivo .env na raiz do projeto (caso não exista) com a seguinte definição:
PORT=3333| Comando | Descrição |
|---|---|
npm run start:watch |
Executa a API em modo de desenvolvimento com live reload automático ao alterar arquivos |
npm run start:dev |
Inicia o servidor em modo desenvolvimento sem watch |
npm run dist |
Gera a build compilada para produção na pasta dist/ através do tsup |
npm run start:dist |
Compila o projeto e inicia a versão de produção |
Base URL: http://localhost:3333/api
- Método:
GET - Rota:
/products - Respostas:
200 OK: Retorna o array de produtos.204 No Content: Quando não houver produtos cadastrados.
Exemplo de Resposta (200 OK):
[
{
"id": 1,
"name": "Câmera de Segurança Wi-Fi Full HD iM3",
"price": 239.9,
"marca": "Intelbras",
"tecnicalDescriptions": {
"resolucao": "Full HD 1080p",
"alcanceVisaoNoturna": "10 metros",
"campoDeVisao": "114°",
"conectividade": "Wi-Fi 2.4GHz",
"suporteMicroSD": "Até 256GB"
}
}
]- Método:
GET - Rota:
/products/:id - Parâmetros de URL:
id(número inteiro) - Respostas:
200 OK: Retorna o objeto do produto.400 Bad Request: ID não informado ou inválido ({ "error": "ID inválido" }).404 Not Found: Produto não encontrado ({ "error": "Produto não encontrado" }).
- Método:
POST - Rota:
/products - Corpo da Requisição (Body):
{
"id": 12,
"name": "Sensor de Barreira Infravermelho Ativo",
"price": 189.90,
"marca": "Intelbras",
"tecnicalDescriptions": {
"alcance": "30 metros",
"feixes": 2
}
}- Respostas:
201 Created:{ "message": "created" }400 Bad Request: ID já existente ou erro de validação ({ "error": "Esse id já existe, id disponível: X" }).
- Método:
PATCH - Rota:
/products/:id - Corpo da Requisição (Body):
{
"id": 1,
"name": "Câmera de Segurança Wi-Fi Full HD iM3 Atualizada",
"price": 249.90,
"marca": "Intelbras",
"tecnicalDescriptions": {
"resolucao": "Full HD 1080p",
"conectividade": "Wi-Fi 2.4GHz"
}
}- Respostas:
200 OK:"Produto atualizado com sucesso"400 Bad Request: ID divergente, dados iguais aos atuais ou ID não informado.404 Not Found: Produto não encontrado.500 Internal Server Error: Falha interna durante a persistência.
- Método:
DELETE - Rota:
/products/:id - Parâmetros de URL:
id(número inteiro) - Respostas:
200 OK:"Produto deletado com sucesso"400 Bad Request: ID não informado ou erro na exclusão.404 Not Found: Produto não encontrado.
Definição da interface ProductModel:
export interface ProductModel {
id: number;
name: string;
price: number;
marca: string;
tecnicalDescriptions?: any;
}| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
id |
number |
Sim | Identificador único do produto |
name |
string |
Sim | Nome / título descritivo do produto |
price |
number |
Sim | Preço unitário em reais |
marca |
string |
Sim | Fabricante / marca do equipamento |
tecnicalDescriptions |
object / any |
Não | Ficha técnica e especificações adicionais |
- Gustavo Amancio
- Repositório: gamancio-tech/infotellAPI
Este projeto está sob a licença ISC. Consulte o arquivo package.json para mais informações.