Como criar uma função para integração via Webhook com o Puca

Visão Geral

Este módulo permite que usuários cadastrem, editem e monitorem funções customizadas, além de disparar chamadas via webhook e visualizar logs em tempo real. A documentação a seguir explica, passo a passo, como:

  1. Acessar a página de Depuração.
  2. Selecionar e monitorar logs de uma função.
  3. Criar e editar funções.
  4. Enviar requisições de teste.

1. Acessando a Página de Depuração

  1. Acessar o modulo de Funções
  2. Através do menu, Abra a página de Depuração.

:bullseye: Nesta tela você pode:

  • Escolher a função a ser monitorada.
  • Acompanhar, em tempo real, os logs que ela emite.
  • Disparar requisições via webhook para testar seu comportamento.

2. Monitorando e Testando Funções

  1. Na página de Depuração, pesquise pelas Funções e selecione a que deseja analisar.
  2. A seção de Logs exibirá todas os logs gerados pela função customizada selecionada.
  3. Na área de Requisições, insira o payload JSON desejado e clique em Executar.
  4. É possível visualizar a resposta retornada pela função.


3. Definindo Funções: Criação e Edição

3.1 Acesso ao Componente de Pesquisa

No topo da aba de listagem de logs, utilize o campo de Pesquisa de Funções. Clique no ícone de opções ao lado de cada item para:

  • Editar Função
  • Criar Nova Função

3.2 Fluxo de Criação de Função

  1. Clique em Nova Função.
  2. Preencha o formulário:

4. Código Fonte da Função

No campo Código Fonte, defina:

4.1 Campos do Objeto info

  • info.headers.user: Identificador do usuário que disparou a chamada.
  • info.headers.baseURL: URL base para requisições internas.
  • info.data: Payload enviado na requisição.

4.2 Usando o comunicationService

O serviço comunicationService possui método .call({ method, path, body }) para efetuar chamadas HTTP internas.

Exemplo: Corpo de função customizada para inserir uma interação em Pessoa/Empresa

// Importa pacote para serializar parâmetros de query string
const qs = require('qs');

module.exports = async (info, comunicationService) => {
    const {
        headers: { user, baseURL },
        data
    } = info;

    console.log(data)

    if (!data.cnpj) {
        throw new Error('defina o campo CNPJ')
    }

    // Parâmetros para buscar pessoa/empresa por cpf_cnpj
    const params = {
        fields: ['puca_pid'],
        alias: 'person',
        args: { cpf_cnpj: data.cnpj },
        where: {
            v1: 'cpf_cnpj',
            v2: '$cpf_cnpj',
            operator: 'equals'
        }
    };

    // Busca pessoa/empresa no CRM
    const { data: [person] } = await comunicationService.call({
        method: 'GET',
        path: `puca-crm-api/person?${qs.stringify(params)}`
    });

    if(!person) {
        throw new Error('Pessoa/Empresa não encontrada')
    }

    // Monta payload da interação
    const body = {
        type: '1eed0a52-082c-4210-999d-2f1195517631',
        target: person.puca_pid,
        text: 'Teste add interaction!'
        // link: '' // opcional: URL para tela específica
    };

    // Cria a interação
    await comunicationService.call({
        method: 'POST',
        path: 'puca-crm-api/interaction',
        body
    });

    // Retorna mensagem de sucesso, se fornecida
    return data?.textoDeSucesso || [];
};

Dica: Utilize payloads variados para garantir que sua função lida corretamente com diferentes cenários de entrada.