JavaScript

Atualize o aplicativo Express para realizar chamadas de API ao Salesforce

Nesta seção, você atualizará seu aplicativo Express para criar uma nova tarefa no Salesforce quando seu webhook for acionado por uma chamada.

Para atualizar um aplicativo ExpressJS:

  1. No seu aplicativo, adicione o Biblioteca JSForce além de dotenv usando:

    npm install jsforce dotenv--save
  2. Crie um novo arquivo chamado .env, que conterá o seguinte:

    SF_USERNAME=''
    SF_PASSWORD=''
    SF_TOKEN=''
    

    O SF_USERNAME e SF_PASSWORD serão o nome de usuário e a senha usados para fazer login no Salesforce. O SF_TOKEN é o token que você deveria ter recebido por e-mail quando seu token de segurança foi gerado pelo Salesforce.

  3. Crie um novo arquivo JavaScript, chamado Salesforce.js e adicione o seguinte:

    var jsforce = require('jsforce');
    var conn = new jsforce.Connection();
    
    function login() {
        return new Promise((resolve, reject) => {
            conn.login(process.env.SF_USERNAME, process.env.SF_PASSWORD + process.env.SF_TOKEN, function(err, res) {
                if (err) {reject(err); return}
                resolve(res)
            })
        })
    }
    
    function getContact(phone_number) {
        return new Promise((resolve, reject) => {
            var q = `SELECT Id FROM Contact WHERE Phone='${phone_number}'`
            console.log(q)
            conn.query(q, function(err, res) {
                if (err) {reject(err); console.log(err);}
                resolve(res)
            })
        })
    }
    
    function createContact(first_name, last_name, phone_number) {
        return new Promise((resolve, reject) => {
            //Create new contact, get the record ID
            console.log(`Create contact ${first_name} ${last_name} ${phone_number}`)
            var data = { FirstName : first_name, LastName : last_name, Phone:phone_number}
            if (first_name != null) {
                data['FirstName'] = first_name
            }
            if (last_name != null) {
                data['LastName'] = last_name
            }
            conn.sobject("Contact").create(data, function(err, ret) {
                if (err || !ret.success) { reject(err);  console.error(err, ret); return }
                console.log("Created new contact id : " + ret.id);
                resolve(ret)
            });
        })
    }
    
    function addTask(subject, call_dur, recordId) {
        return new Promise((resolve, reject) => {
            conn.sobject("Task").create({ TaskSubtype : 'Call', CallDurationInSeconds : call_dur, Subject:subject, WhoId:recordId}, function(err, ret) {
                if (err || !ret.success) { reject(err);  console.error(err, ret); return }
                console.log("Created new task id : " + ret.id);
                resolve(ret)
            });
        })
    }
    
    module.exports.login = login
    module.exports.getContact = getContact
    module.exports.createContact = createContact
    module.exports.addTask = addTask
    
  4. Atualize o código em app.js para importar esse novo arquivo:

    var salesforce = require('./Salesforce.js')
    

    Quando o aplicativo carregar, escreva o código para fazer login usando suas credenciais do Salesforce.

    salesforce.login()
        .then(function(res) {
        console.log(res)
    }).catch((function(err) {
        console.log(err)
    }))
    
  5. Atualize o código no app.post('/webhook) da sua aplicação para usar o novo Salesforce.js arquivo.

    require('dotenv').config()
    const express = require('express')
    const app = express()
    const port = 3000
    app.post('/webhook', (req, res) => {
        var event = req.body.event
        var callerId = event.callerId;
        var first_name = null
        var last_name = null
        var phone_number = event.phoneNumber.replace(/\D/g,'')
        if (typeof(callerId) != "undefined") {
            [last_name, first_name] = callerId.split(" ")
        } else {
            last_name = phone_number
        }
        var direction = event.direction
        var duration = event.duration
        var state = event.state
        if (state == "ANSWERED")  {
            var name = `${first_name} ${last_name}`
            if (typeof(callerId) == "undefined") {
                name = phone_number
            }
            var subject = `${direction.toLowerCase()} call with ${name}`
            salesforce.getContact(phone_number)
            .then(function(contact) {
                console.log(contact)
                if (contact["totalSize"] == 0) {
                    //Create new contact
                    return salesforce.createContact(first_name, last_name, phone_number)
                    .then(function(contact) {
                    var contactId = contact["Id"]
                    return salesforce.addTask(subject, duration, contactId)
                    })
                } else {
                    //Grab the first contact
                    var contactId = contact["records"][0]["Id"]
                    return salesforce.addTask(subject, duration, contactId)
                }
            }).catch(function(err) {
            console.log(err)
            })
        }
        res.sendStatus(200);
        });
     app.listen(port, () => console.log(`Example app listening at http://localhost:${port}`))
    

    Este código será acionado quando for feita ou recebida uma chamada a partir do seu número VBC. Quando a chamada for concluída (if (state == "ANSWERED")), o aplicativo procurará primeiro um contato com o número de telefone fornecido (event.phoneNumber).

    Isso chamará o salesforce.getContact() função para pesquisar o Contato. Se o Contato existir, criamos uma nova Tarefa usando a função salesforce.addTask(). Isso criará uma nova tarefa no Salesforce que incluirá o título e o contato associado (usando o contactId) e a duração da ligação.

    Se não houver nenhum contato que corresponda ao número de telefone fornecido, use o contact["totalSize"] == 0 verificar; em seguida, o aplicativo criará um novo contato usando o event.callerId propriedade do webhook e dividir a string em nome e sobrenome. Observe que as chamadas efetuadas PODEM não conter essa propriedade. Nesse caso, usaremos o número de telefone como sobrenome do contato.

  6. Para iniciar seu aplicativo, execute o seguinte comando:

    node app.js

A partir de agora, seu aplicativo criará uma nova tarefa no Salesforce sempre que uma chamada for concluída, seja ela efetuada ou recebida.

Observação: Certifique-se de que a porta especificada (300) é a mesma porta que você usa ao criar sua URL do ngrok.