Работа с Usedesk

Для обращения к API Usedesk мы создали библиотеку @sipuni/usedesk (opens new window). Ниже несколько примеров работы с этой библиотекой.

Авторизация

Токен авторизации доступен в аргументах функции args.settings.api_key.

const SipuniUsedeskApi = require('@sipuni/usedesk');

module.exports = async (args) => {
  const token = args.settings.api_key;
  const api = new SipuniUsedeskApi({ token });
}

Для коробочной версии также необходимо подать адрес сервера.

const SipuniUsedeskApi = require('@sipuni/usedesk');

module.exports = async (args) => {
  const token = args.settings.api_key;
  const host = 'yourdomain.ru'; // Домен коробочной версии Usedesk
  const api = new SipuniUsedeskApi({ token, host });
}

Создание контакта и запроса при входящем

В следующем примере, ищется клиент по номеру телефона, если не найден, то создается новый клиент. Затем, у клиента ищется запрос со статусом Новый или Открыт. Если такого нет, то запрос создается.

Полученные идентификаторы клиента и запроса возвращаются в виде объекта. Все что возвращает функция, сохраняется в контексте звонка и доступно другим функциям, например, при завершении звонка мы можем использовать ticket_id для добавления комментария к нему.

const SipuniUsedeskApi = require('@sipuni/usedesk');


async function findClient(api, phone) {
    const clients = await api.clients.list({
      offset: 0,
      query: phone, // поиск по номеру абонента
      search_type: 'full_match',
    });
    if (clients.length > 0) {
        return clients[0];
    }
    return null;
}

async function createClient(api, phone) {
    const client = await api.clients.create({
      name: phone,
      phone: phone,
    });
    client.id = client.client_id; // добавляем поле id, как у клиента вернувшегося из findClient
    return client;
}

async function findOpenTicket(api, client) {
    const found = await api.tickets.list({
      client_id: client.id,
      fstatus: '1,8', // Запросы со статусами Открыт и Новый
    });
    if (!found.length) {
        return null;
    } else {
        return found[0]; // Берем первый запрос
    }
}

async function createTicket(api, client, phone) {
    const ticket = await api.tickets.create({
      subject: `Входящий звонок от ${phone}`,
      message: 'Входящий запрос',
      client_id: client.id,
    });
    ticket.id = ticket.ticket_id;
    return ticket;
}

module.exports = async (args) => {
    const phone = args.call_args.src_num;
    const token = args.settings.api_key;
    let client = null;
    let isExistingClient = true;
    let ticket = null;

    const api = new SipuniUsedeskApi({ token });
  
    // Ищем клиента, создаем если не найден
    client = await findClient(api, phone);
    if (!client) {
        client = await createClient(api, phone);
        isExistingClient = false;
    }
  
    // Ищем открытый или новый запрос, если не найден – создаем
    if (isExistingClient) {
      ticket = await findOpenTicket(api, client);
    }
    if (!ticket) {
        ticket = await createTicket(api, client, phone);
    }
    
    // Возвращаем объект с идентификаторами клиента и запроса, 
    // и флаг existing_client - клиент найден или создан
    // Эта информация пригодится в других функциях
    return {
      client_id: client.id,
      ticket_id: ticket.id,
      existing_client: isExistingClient,
    };
};

Добавление комментария с записью разговора

После завершения разговора создадим комментарий. В комментарии будет ссылка на запись и длительность разговора. Эта функция, предполагает, что запрос был уже создан при поступлении звонка, и ticket_id содержится в контексте звонка.

const SipuniUsedeskApi = require('@sipuni/usedesk');
const moment = require('moment');

// Возвращает длительность разговора в формате 00:01:34
function getCallDuration(callArgs) {
    // timestamp и call_answer_timestamp приходят как строки, поэтому преобразуем в число
    const conversationStarted = parseInt(callArgs.call_answer_timestamp, 10); 
    const conversationEnded = parseInt(callArgs.timestamp, 10);
    
    const seconds = conversationEnded - conversationStarted;
    return moment.utc(seconds * 1000).format('HH:mm:ss');
}

async function createComment(api, ticketId, callArgs) {
    const duration = getCallDuration(callArgs);
    const message = `<a href="${callArgs.call_record_link}">Запись разговора</a> ${duration}`;
    const comment = await api.tickets.createComment({
      ticket_id: ticketId,
      message,
    });
    comment.id = comment.comment_id; 
    return comment;
}

module.exports = async (args) => {
    let commentId = null;
    const ticketId = args.context.ticket_id; // получаем id запроса из контекста звонка
    
    if (ticketId) {
        const token = args.settings.api_key;
        const api = new SipuniUsedeskApi({ token });
        const comment = await createComment(api, ticketId, args.call_args);
        commentId = comment.id;
    }

    return {
      comment_id: commentId,
    };
};