saveinmed/saveinmed-frontend/src/services/carrinhoApiService.ts
Tiago Yamamoto b39caf0fd0 first commit
2025-12-17 13:58:26 -03:00

325 lines
No EOL
9 KiB
TypeScript

/**
* Serviço para gerenciar carrinho via API BFF
* Integração com https://bff-dev.saveinmed.com.br/api/v1/carrinhos
*/
const BFF_BASE_URL = process.env.NEXT_PUBLIC_BFF_API_URL!;
/**
* Interface para dados do carrinho na API
*/
export interface CarrinhoApiData {
itens: string[]; // IDs dos produtos
codigoInterno: string; // Código interno do carrinho
labNome: string[]; // Nomes dos laboratórios
quantidade: number[]; // Quantidades de cada produto
valorTotal: number[]; // Valores totais de cada produto
usuarios: string; // ID do usuário
}
/**
* Interface para resposta da API
*/
export interface CarrinhoApiResponse {
success: boolean;
data?: any;
error?: string;
message?: string;
}
/**
* Serviço de carrinho para API BFF
*/
export const carrinhoApiService = {
/**
* Obtém o token de autenticação do localStorage
*/
getAuthToken: (): string | null => {
return localStorage.getItem('access_token');
},
/**
* Obtém o ID do usuário atual
*/
getUserId: (): string | null => {
try {
const userStr = localStorage.getItem('user');
if (!userStr) return null;
const user = JSON.parse(userStr);
return user.$id || user.id || user.usuario_id || null;
} catch {
return null;
}
},
/**
* Busca dados do usuário via API /me se não estiver no localStorage
*/
fetchUserData: async (): Promise<any | null> => {
try {
const token = carrinhoApiService.getAuthToken();
if (!token) return null;
const response = await fetch(`${BFF_BASE_URL}/auth/me`, {
method: 'GET',
headers: {
'accept': 'application/json',
'Authorization': `Bearer ${token}`,
},
});
if (response.ok) {
const userData = await response.json();
localStorage.setItem('user', JSON.stringify(userData));
return userData;
}
return null;
} catch (error) {
console.error('Erro ao buscar dados do usuário:', error);
return null;
}
},
/**
* Gera código interno único para o carrinho
*/
generateCodigoInterno: (): string => {
const timestamp = Date.now();
const random = Math.floor(Math.random() * 10000);
return `CARR${timestamp}${random}`;
},
/**
* Converte produtos locais para formato da API
*/
convertProdutosToApiFormat: (produtos: any[]): Partial<CarrinhoApiData> => {
const itens: string[] = [];
const labNome: string[] = [];
const quantidade: number[] = [];
const valorTotal: number[] = [];
produtos.forEach(item => {
const produto = item.produto;
const qtd = item.quantidade;
const preco = produto.preco_final || 0;
itens.push(produto.$id || produto.id);
quantidade.push(qtd);
valorTotal.push(preco * qtd);
// Extrair nome do laboratório
let nomelab = '';
if (produto.lab_nome) {
nomelab = produto.lab_nome;
} else if (produto.laboratorio) {
if (typeof produto.laboratorio === 'string') {
nomelab = produto.laboratorio;
} else if (produto.laboratorio.nome) {
nomelab = produto.laboratorio.nome;
}
}
labNome.push(nomelab || 'Laboratório não informado');
});
return {
itens,
labNome,
quantidade,
valorTotal,
};
},
/**
* Cria um novo carrinho na API
*/
criar: async (produtos: any[]): Promise<CarrinhoApiResponse> => {
try {
const token = carrinhoApiService.getAuthToken();
if (!token) {
return { success: false, error: 'Token de autenticação não encontrado' };
}
let userId = carrinhoApiService.getUserId();
// Se não tem usuário no localStorage, buscar via API
if (!userId) {
const userData = await carrinhoApiService.fetchUserData();
userId = userData?.$id || userData?.id || userData?.usuario_id;
}
if (!userId) {
return { success: false, error: 'ID do usuário não encontrado' };
}
const apiData = carrinhoApiService.convertProdutosToApiFormat(produtos);
const payload = {
documentId: "unique()",
data: {
...apiData,
codigoInterno: carrinhoApiService.generateCodigoInterno(),
usuarios: userId,
}
};
const response = await fetch(`${BFF_BASE_URL}/carrinhos`, {
method: 'POST',
headers: {
'accept': 'application/json',
'Content-Type': 'application/json',
'Authorization': `Bearer ${token}`,
},
body: JSON.stringify(payload),
});
const data = await response.json();
if (response.ok) {
return { success: true, data };
} else {
console.error('❌ Erro ao criar carrinho:', data);
return { success: false, error: data.message || 'Erro ao criar carrinho' };
}
} catch (error) {
console.error('💥 Erro na criação do carrinho:', error);
return { success: false, error: 'Erro de conexão ao criar carrinho' };
}
},
/**
* Atualiza um carrinho existente na API
*/
atualizar: async (carrinhoId: string, produtos: any[]): Promise<CarrinhoApiResponse> => {
try {
const token = carrinhoApiService.getAuthToken();
if (!token) {
return { success: false, error: 'Token de autenticação não encontrado' };
}
let userId = carrinhoApiService.getUserId();
// Se não tem usuário no localStorage, buscar via API
if (!userId) {
const userData = await carrinhoApiService.fetchUserData();
userId = userData?.$id || userData?.id || userData?.usuario_id;
}
if (!userId) {
return { success: false, error: 'ID do usuário não encontrado' };
}
const apiData = carrinhoApiService.convertProdutosToApiFormat(produtos);
const payload = {
data: {
...apiData,
codigoInterno: carrinhoApiService.generateCodigoInterno(),
usuarios: userId,
}
};
const response = await fetch(`${BFF_BASE_URL}/carrinhos/${carrinhoId}`, {
method: 'PATCH',
headers: {
'accept': 'application/json',
'Content-Type': 'application/json',
'Authorization': `Bearer ${token}`,
},
body: JSON.stringify(payload),
});
const data = await response.json();
if (response.ok) {
return { success: true, data };
} else {
console.error('❌ Erro ao atualizar carrinho:', data);
return { success: false, error: data.message || 'Erro ao atualizar carrinho' };
}
} catch (error) {
console.error('💥 Erro na atualização do carrinho:', error);
return { success: false, error: 'Erro de conexão ao atualizar carrinho' };
}
},
/**
* Exclui um carrinho da API
*/
excluir: async (carrinhoId: string): Promise<CarrinhoApiResponse> => {
try {
const token = carrinhoApiService.getAuthToken();
if (!token) {
return { success: false, error: 'Token de autenticação não encontrado' };
}
const response = await fetch(`${BFF_BASE_URL}/carrinhos/${carrinhoId}`, {
method: 'DELETE',
headers: {
'accept': 'application/json',
'Authorization': `Bearer ${token}`,
},
});
if (response.ok) {
return { success: true };
} else {
const data = await response.json().catch(() => ({}));
console.error('❌ Erro ao excluir carrinho:', data);
return { success: false, error: data.message || 'Erro ao excluir carrinho' };
}
} catch (error) {
console.error('💥 Erro na exclusão do carrinho:', error);
return { success: false, error: 'Erro de conexão ao excluir carrinho' };
}
},
/**
* Lista carrinhos do usuário
*/
listarPorUsuario: async (): Promise<CarrinhoApiResponse> => {
try {
const token = carrinhoApiService.getAuthToken();
if (!token) {
return { success: false, error: 'Token de autenticação não encontrado' };
}
let userId = carrinhoApiService.getUserId();
// Se não tem usuário no localStorage, buscar via API
if (!userId) {
const userData = await carrinhoApiService.fetchUserData();
userId = userData?.$id || userData?.id || userData?.usuario_id;
}
if (!userId) {
return { success: false, error: 'ID do usuário não encontrado' };
}
const response = await fetch(`${BFF_BASE_URL}/carrinhos?usuarios=${userId}`, {
method: 'GET',
headers: {
'accept': 'application/json',
'Authorization': `Bearer ${token}`,
},
});
const data = await response.json();
if (response.ok) {
return { success: true, data };
} else {
console.error('❌ Erro ao listar carrinhos:', data);
return { success: false, error: data.message || 'Erro ao listar carrinhos' };
}
} catch (error) {
console.error('💥 Erro ao listar carrinhos:', error);
return { success: false, error: 'Erro de conexão ao listar carrinhos' };
}
},
};