bling-mcp
Version:
API MCP para integração com Bling
177 lines (162 loc) • 6.73 kB
text/typescript
import { blingClient, renovarToken } from '../blingClient.js';
import axios from 'axios';
// Categorias de Produtos
export interface CategoriaProduto {
id?: number;
descricao: string;
}
export interface ListarCategoriasProdutosParams {
pagina?: number;
limite?: number;
descricao?: string;
}
/**
* Lista as categorias de produtos
*/
export async function listarCategoriasProdutos(params?: ListarCategoriasProdutosParams): Promise<CategoriaProduto[]> {
try {
console.log('Listando categorias de produtos', params);
const response = await blingClient.get('/categorias/produtos', { params });
return response.data.data as CategoriaProduto[];
} catch (error) {
return handleApiError(error, 'listarCategoriasProdutos', params);
}
}
/**
* Obtém uma categoria de produto pelo ID
*/
export async function obterCategoriaProduto(id: number | string): Promise<CategoriaProduto> {
try {
console.log('Obtendo categoria de produto', id);
const response = await blingClient.get(`/categorias/produtos/${id}`);
return response.data.data as CategoriaProduto;
} catch (error) {
return handleApiError(error, 'obterCategoriaProduto', { id });
}
}
/**
* Cria uma nova categoria de produto
*/
export async function criarCategoriaProduto(categoria: Omit<CategoriaProduto, 'id'>): Promise<CategoriaProduto> {
try {
console.log('Criando categoria de produto', categoria);
const response = await blingClient.post('/categorias/produtos', categoria);
return response.data.data as CategoriaProduto;
} catch (error) {
return handleApiError(error, 'criarCategoriaProduto', categoria);
}
}
/**
* Atualiza uma categoria de produto existente
*/
export async function atualizarCategoriaProduto(id: number | string, categoria: Partial<CategoriaProduto>): Promise<CategoriaProduto> {
try {
console.log('Atualizando categoria de produto', id, categoria);
const response = await blingClient.put(`/categorias/produtos/${id}`, categoria);
return response.data.data as CategoriaProduto;
} catch (error) {
return handleApiError(error, 'atualizarCategoriaProduto', { id, categoria });
}
}
/**
* Remove uma categoria de produto pelo ID
*/
export async function excluirCategoriaProduto(id: number | string): Promise<void> {
try {
console.log('Excluindo categoria de produto', id);
await blingClient.delete(`/categorias/produtos/${id}`);
console.log('Categoria de produto excluída com sucesso');
} catch (error) {
return handleApiError(error, 'excluirCategoriaProduto', { id });
}
}
// Categorias de Receitas/Despesas
export interface CategoriaReceitaDespesa {
id?: number;
idCategoriaPai?: number;
descricao: string;
tipo: number; // 1=Despesa, 2=Receita, 3=Ambos
}
export interface ListarCategoriasReceitasDespesasParams {
pagina?: number;
limite?: number;
descricao?: string;
tipo?: number;
}
/**
* Lista as categorias de receitas/despesas
*/
export async function listarCategoriasReceitasDespesas(params?: ListarCategoriasReceitasDespesasParams): Promise<CategoriaReceitaDespesa[]> {
try {
console.log('Listando categorias de receitas/despesas', params);
const response = await blingClient.get('/categorias/receitas-despesas', { params });
return response.data.data as CategoriaReceitaDespesa[];
} catch (error) {
return handleApiError(error, 'listarCategoriasReceitasDespesas', params);
}
}
/**
* Obtém uma categoria de receita/despesa pelo ID
*/
export async function obterCategoriaReceitaDespesa(id: number | string): Promise<CategoriaReceitaDespesa> {
try {
console.log('Obtendo categoria de receita/despesa', id);
const response = await blingClient.get(`/categorias/receitas-despesas/${id}`);
return response.data.data as CategoriaReceitaDespesa;
} catch (error) {
return handleApiError(error, 'obterCategoriaReceitaDespesa', { id });
}
}
/**
* Cria uma nova categoria de receita/despesa
*/
export async function criarCategoriaReceitaDespesa(categoria: Omit<CategoriaReceitaDespesa, 'id'>): Promise<CategoriaReceitaDespesa> {
try {
console.log('Criando categoria de receita/despesa', categoria);
const response = await blingClient.post('/categorias/receitas-despesas', categoria);
return response.data.data as CategoriaReceitaDespesa;
} catch (error) {
return handleApiError(error, 'criarCategoriaReceitaDespesa', categoria);
}
}
/**
* Atualiza uma categoria de receita/despesa existente
*/
export async function atualizarCategoriaReceitaDespesa(id: number | string, categoria: Partial<CategoriaReceitaDespesa>): Promise<CategoriaReceitaDespesa> {
try {
console.log('Atualizando categoria de receita/despesa', id, categoria);
const response = await blingClient.put(`/categorias/receitas-despesas/${id}`, categoria);
return response.data.data as CategoriaReceitaDespesa;
} catch (error) {
return handleApiError(error, 'atualizarCategoriaReceitaDespesa', { id, categoria });
}
}
/**
* Remove uma categoria de receita/despesa pelo ID
*/
export async function excluirCategoriaReceitaDespesa(id: number | string): Promise<void> {
try {
console.log('Excluindo categoria de receita/despesa', id);
await blingClient.delete(`/categorias/receitas-despesas/${id}`);
console.log('Categoria de receita/despesa excluída com sucesso');
} catch (error) {
return handleApiError(error, 'excluirCategoriaReceitaDespesa', { id });
}
}
// Tratamento centralizado de erro e renovação de token
async function handleApiError(error: unknown, funcName: string, params: any): Promise<any> {
if (axios.isAxiosError(error) && error.response?.status === 401) {
await renovarToken();
if (funcName === 'listarCategoriasProdutos') return listarCategoriasProdutos(params);
if (funcName === 'obterCategoriaProduto') return obterCategoriaProduto(params.id);
if (funcName === 'criarCategoriaProduto') return criarCategoriaProduto(params);
if (funcName === 'atualizarCategoriaProduto') return atualizarCategoriaProduto(params.id, params.categoria);
if (funcName === 'excluirCategoriaProduto') return excluirCategoriaProduto(params.id);
if (funcName === 'listarCategoriasReceitasDespesas') return listarCategoriasReceitasDespesas(params);
if (funcName === 'obterCategoriaReceitaDespesa') return obterCategoriaReceitaDespesa(params.id);
if (funcName === 'criarCategoriaReceitaDespesa') return criarCategoriaReceitaDespesa(params);
if (funcName === 'atualizarCategoriaReceitaDespesa') return atualizarCategoriaReceitaDespesa(params.id, params.categoria);
if (funcName === 'excluirCategoriaReceitaDespesa') return excluirCategoriaReceitaDespesa(params.id);
}
throw error;
}