JavaScript

Mise à jour de l'application Express pour effectuer des appels API vers Salesforce

Dans cette section, vous mettrez à jour votre application Express pour créer une nouvelle tâche sur Salesforce lorsque votre webhook est déclenché à partir d'un appel.

Pour mettre à jour une application ExpressJS :

  1. Dans votre application, ajoutez le fichier Bibliothèque JSForce ainsi que dotenv en utilisant :

    npm install jsforce dotenv--save
  2. Créer un nouveau fichier appelé .envqui aura les caractéristiques suivantes :

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

    Les SF_USERNAME et SF_PASSWORD sera le nom d'utilisateur et le mot de passe utilisés pour se connecter à Salesforce. Le nom d'utilisateur et le mot de passe SF_TOKEN est le jeton que vous avez dû recevoir par e-mail lorsque votre jeton de sécurité a été généré par Salesforce.

  3. Créez un nouveau fichier Javascript, appelé Salesforce.js et ajouter ce qui suit :

    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. Mettre à jour le code dans app.js pour importer ce nouveau fichier :

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

    Lorsque l'application se charge, écrivez le code pour vous connecter à l'aide de vos identifiants Salesforce.

    salesforce.login()
        .then(function(res) {
        console.log(res)
    }).catch((function(err) {
        console.log(err)
    }))
    
  5. Mettre à jour le code dans le app.post('/webhook) de votre application afin d'utiliser le nouveau système Salesforce.js fichier.

    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}`))
    

    Ce code sera déclenché lorsqu'un appel est émis ou reçu à partir de votre numéro VBC, lorsque l'appel est terminé(if (state == "ANSWERED")), l'application cherchera d'abord un contact avec le numéro de téléphone donné (event.phoneNumber).

    Ceci appellera le salesforce.getContact() pour rechercher le contact. Si le contact existe, nous créons une nouvelle tâche à l'aide de la fonction salesforce.addTask(). Cela créera une nouvelle tâche dans Salesforce qui comprendra le titre, le contact associé (à l'aide de l'attribut contactId) et la durée de l'appel.

    Si aucun contact ne correspond au numéro de téléphone donné, l'utilisation de l'option contact["totalSize"] == 0 l'application créera alors un nouveau contact à l'aide de l'option event.callerId du webhook, et divise la chaîne en un prénom et un nom de famille. Remarque : les appels sortants PEUVENT ne pas avoir cette propriété. Dans ce cas, nous utiliserons le numéro de téléphone comme nom de famille du contact.

  6. Pour démarrer votre application, exécutez la commande suivante :

    node app.js

Votre application créera désormais une nouvelle tâche dans Salesforce lorsqu'un appel abouti est passé ou reçu.

Note : Assurez-vous que le port que vous avez spécifié (300) est le même port que celui utilisé lors de la création de l'URL de ngrok.