Итак, теперь всё работает тем образом, которым мне бы хотелось, чтобы это работало в данный момент, а именно:
Теперь мы можем развёртывать модуль авторизации непосредственно из папки установки, то есть:
1) Мы с вами выполняем npm install amocrm-oauth2 в какой-либо директории
2) Оттуда же мы можем выполнить в консоли следующую команду:
./node_modules/.bin/deploy your-folder-name your-subdomain
3) Таким образом будут созданы файлы для работы с авторизацией amoCRM (options.js, tokens.js, newAuth.js)
Далее:
1) Нам необходимо корректно заполнить файл options.js
(нашими данными из интеграции в амо) и пройти этап авторизации,
для этого открываем newAuth.js(в созданной модулем папке) и вызываем один из методов:
// для получения первичных токенов(access_token и refresh_token) ; // для их обновления. ; //В планах завезти автоматизацию для этого процесса. // 2) После инициализации класса в созданной модулем директории нам необходимо создать любой js файл. // В нём нам необходимо подтянуть template.js из папки ./node_modules/amocrm-oauth2/lib а-ля const Template = ; //а также наш токен const tokens = tokensaccess_token; // И инициализировать уже другой класс а-ля let t = 89504206666 tokens 'rogaicopyta' call; // Где первым параметров мы указываем номер, с которым будем работать // (это может быть переменная, если вы решите использовать мой модуль // для серьёзной работы и принимать входящие звонки на сервер) // затем идёт tokens -- это Ваш refresh_token, который вы получили в пункте 1. // и последний принимаемый классом параметр -- это subdomain(например rogaicopyta.amocrm.ru, // где сабдомен это rogaicopyta); // также, если вы принимаете звонки на сервер, присваивая пришедшую информацию о звонке в переменную, // то последним праметром call передаём именно её. (поступивший звонок)
3) Таким образом нам доступны следующие методы:
// где key -- это метод получения данных с помощью API amoCRM(пока работает только с contacts и leads) t; // где key -- это опять же contacts или leads(своего рода маркер для того, чтобы скрипт понял // какую структуру запроса ему нужно отправить) // query -- это переданные нами данные // в свою очередь entity -- это дополнительный фильтр сущности(contacts, companies) // т.к. в зависимости от выбранной сущности несколько видоизменяется структура запроса к CRM t; // key -- то же самое, что и выше, а query -- это результат работы метода makeReqCfg(); t // t.post -- это метод для того, чтобы мы могли отправить данные с помощью API amoCRM;
Ниже оставлю в качестве примера реализацию базовой логики на создание контакта/компании/сделки и добавление записи звонка в примечание:
const Template = ; const tokens = tokensaccess_token; const number = '88005553535'; const call = status: 'ANSWER' direction: 'incoming' voiceUrl: 'https://example.mp3' duration: 6 base_id: 7 sub_id: 7 ; let t = number tokens 'rogaicopyta' call; { try // обрезаем входящий номер на одну цифру слева, чтобы amo могла лучше его обработать // следом делаем get запрос по поиску контактов с данным номером let existingContacts = await t; // если вернулось false, что значит, что контакт не найден if existingContacts === false // мы так же проверяем компании, т.к. это разные сущности let existingCompanies = await t; // если вообще ничего нет, т.е. ни контакта, ни компании if existingCompanies === false // сперва формируем запрос на создание контакта let contactReqCfg = await t; // затем создаём контакт с текущим номером звонящего(тут пока не ясно, как выстроить логику, // что именно создавать в случае отстутсвия обеих сущностей. let reqToContactCreating = await t; // формируем запрос на создание сделки, передав id только что созданного контакта в качестве query let leadReqCfg = await t; // создаём сделку let reqToLeadCreating = await t; // дальше по тому же принципу добавляем запись разговора let callReqCfg = await t; return await t; else // если нам удалось найти компанию, то мы ищем сделки внутри неё let existingLeadsInCompany = await t; // если сделок по найденной компании нет, тогда создаём её if existingLeadsInCompany === false // затем формируем запрос на создание сделки, указывая в entity, что сделка будет создана для компании // это необходимо, т.к. несколько меняется структура запроса в зависимости от искомой до этого сущности let leadReqCfg = await t; // создаём сделку let reqToLeadCreating = await t; // по аналогии создаём и добавляем звонок let callReqCfg = await t; return await t; else // если сделки найдены, давайте присвоим их в переменную leads для удобства let leads = existingLeadsInCompany'_embedded''items'; // затем отфильтруем по статусам const filter = lead'status_id' !== 143 || lead'status_id' !== 142; if leads // если находим активную сделку(!== 143 || !== 142) // не будем дублировать, просто запишем в неё запись разговора let callReqCfg = await t; return await t; else // в противном случае, если же все сделки неактивны, let leadReqCfg = await t; // мы создаём сделку и добавляем в неё запись разговора. let reqToLeadCreating = await t; let callReqCfg = await t; return await t; else // с контактами работаем по аналогии, единственное, что меняется -- передаваемый параметр entity(выше объяснил причину) let existingLeadsInContact = await t; if existingLeadsInContact === false let leadReqCfg = await t; let reqToLeadCreating = await t; let callReqCfg = await t; return await t; else let leads = existingLeadsInContact'_embedded''items'; const filter = lead'status_id' !== 143 || lead'status_id' !== 142; if leads let callReqCfg = await t; return await t; else let leadReqCfg = await t; let reqToLeadCreating = await t; let callReqCfg = await t; return await t; catch e if e console; } ;