const axios = require("axios"); const logger = require('../utils/logger.js'); // Consulta o endereço completo usando a API externa de CEP const getConsultaCep = async (rawCep) => { logger.info('Iniciando consulta de CEP'); if (!rawCep) { logger.warn('CEP não fornecido para getConsultaCep'); throw new Error("cep é obrigatório"); } const cep = String(rawCep).trim().replace(/\D/g, ""); if (cep.length !== 8) { logger.warn('CEP inválido fornecido para getConsultaCep', { cepBruto: rawCep, cepLimpo: cep }); throw new Error("cep inválido, verifique se foram digitados apenas números"); } try { const cepRestUrl = 'https://api.cep.rest/'; const address = await axios.post(cepRestUrl, { cep }); console.log(address.data); // Tratamento de resposta conforme diferentes estruturas possíveis if (address.data && address.data.code === 404) { logger.warn('CEP não encontrado na API externa', { cep, response: address.data }); return null; // Controller tratará como 'Endereço não encontrado' } else if (address.data && address.data.code) { logger.error('API de CEP retornou um código de erro', { cep, response: address.data }); throw new Error("Erro ao consultar o CEP na API externa"); } else { // Estrutura 1: { "cep:09662000": { bairro, ... } } const cepKey = `cep:${cep}`; if (address.data.data && address.data.data[cepKey]) { logger.info('CEP encontrado com chave aninhada', { cepKey }); return address.data.data[cepKey]; } // Estrutura 2: { bairro, cep, ... } (direto em data) else if (address.data.data && address.data.data.cep) { return address.data.data; } else { logger.warn('Estrutura de resposta não reconhecida', { response: address.data }); return address.data.data || address.data; } } } catch (error) { logger.error("Erro na chamada da API de CEP", { message: error.message, stack: error.stack, cep }); throw new Error("Erro ao consultar o CEP"); } }; module.exports = { getConsultaCep }; /* DESCRIÇÃO: Este arquivo define um serviço para consultar endereços a partir de um CEP. FLUXO: 1. É chamado principalmente pelo `contratacao.service.js`. 2. Recebe um CEP e um número. 3. Formata e valida o CEP. 4. Realiza uma requisição POST para a API externa `https://api.cep.rest/`. 5. Trata a resposta da API: - Se o CEP não for encontrado (código 404), retorna `null`. - Se houver outro erro na API, lança uma exceção. - Se for bem-sucedido, verifica qual estrutura a API retornou: * Estrutura aninhada: `{ data: { "cep:09662000": { ... } } }` → extrai a chave dinâmica * Estrutura direta: `{ data: { bairro, cep, ... } }` → retorna data direto 6. Em caso de erro na comunicação, loga o erro e lança uma exceção genérica. Este serviço abstrai a complexidade da comunicação com a API de CEP, fornecendo uma interface simples para outras partes da aplicação obterem dados de endereço. */