Repository navigation
3.0.0
Изменения и улучшения
Шесть новых методов — диалоги и тикеты пользователя, поиск по телефону и по chat ID мессенджера, старт диалога с учеником, заметки к тикету и выгрузка ответов анкеты. Плюс теги в ответе заказа и четыре переименованных метода
Релиз мажорный: переименованы методы и связанные с ними типы. Ниже — что менять в коде, с примерами
🚀 Как обновиться
npm i getcourse-api@3⚠️ Ломающие изменения
Переименованные методы
Fields путали с *CustomFields — методом, который возвращает только конкретный набор дополнительных полей, хотя сами *Fields-методы всегда работали с объектом целиком. Терминология для этого — Info
| Было | Стало |
|---|---|
getUserFields |
getUserInfo |
getDealFields |
getDealInfo |
updateUserFields |
updateUserInfo |
updateDealFields |
updateDealInfo |
*CustomFields-методы не переименованы — с их именами всё было в порядке
Переименованные типы
Идут вслед за методами — правится только import type, вызовы методов не меняются
| Было | Стало | Почему |
|---|---|---|
DealTag |
DealTagNames |
имя отошло самому тегу заказа — { id, name } |
OfferTag |
OfferTagNames |
симметрично DealTagNames, форма типа не менялась |
SurveyAnswer |
UserSurveyAnswer |
имя отошло плоской выгрузке из нового getSurveyAnswers |
GetUserFieldsRequest |
GetUserInfoRequest |
вслед за getUserInfo |
UpdateUserFieldsRequest |
UpdateUserInfoRequest |
вслед за updateUserInfo |
UpdateDealFieldsRequest |
UpdateDealInfoRequest |
вслед за updateDealInfo |
getUserByTelegramChatId устарел
Работает по-прежнему, но помечен @deprecated — заменяется getUserByChatId, который покрывает Telegram, ВКонтакте и MAX одним методом
✨ Что нового
💬 Диалоги и тикеты пользователя одним вызовом
const dialogs = await gc.getUserDialogs({ userId: 251804773 });
const tickets = await gc.getUserTickets({ userId: 251804773 });Раньше приходилось обходить диалоги по одному через getDialogHistory. Оба метода отдают одинаковую форму — массив { dialog_id, messages }, у тикетов в dialog_id лежит ID тикета
✉️ Написать ученику первым
await gc.startDialog({
recipientId: 251804773,
commentText: "Здравствуйте! Ваш заказ готов",
transport: [3],
userId: 903417,
});Раньше требовалось входящее обращение от ученика, чтобы появился dialogId. startDialog принимает recipientId — ID ученика — вместо ID диалога. Повторный вызов с тем же учеником уходит в уже открытый диалог, новый не создаётся
🔍 Поиск пользователя по телефону и chat ID
const user = await gc.getUserInfo({ userId: 251804773 });
const fullName = `${user.data.first_name} ${user.data.last_name}`.trim();
const usersByPhone = await gc.getUserInfo({ phone: "+70000000000" });
const emails = Object.values(usersByPhone.data).map((person) => person.email);
const byChat = await gc.getUserByChatId({ messengerType: "tg", chatId: 118472905 });По userId или email — один пользователь. По телефону — словарь { [userId]: User }, потому что номер может принадлежать нескольким людям. По chat ID Telegram, ВКонтакте или MAX — всегда один пользователь
Если совпадений нет ни по одному способу поиска — метод бросает GetCourseApiError, а не возвращает пустой результат
🎫 Заметка к тикету HelpDesk
await gc.addTicketNote({
ticketId: 4471,
text: "Внутренняя пометка, клиенту не видна",
userId: 903417,
});Аналог addDialogNote, но для HelpDesk. В отличие от addDialogNote требует userId — от чьего имени заводится заметка
📋 Ответы анкеты
const answers = await gc.getSurveyAnswers({ surveyId: 1668900 });
for (const answer of answers.data.answers) {
console.log(answer.user_name, answer.answers);
}Отличается от getUserSurveyAnswers: тот отдаёт анкеты по пользователю со вложенной моделью формы, getSurveyAnswers — плоскую выгрузку ответов по анкете с отдельным справочником вопросов (answers.data.questions)
🏷 Теги в ответе заказа
const deal = await gc.getDealInfo(12345);
deal.data.tags.map((tag) => tag.name);getDealInfo теперь возвращает DealWithTags — заказ вместе с тегами. getUserDeals теги не отдаёт, там как был Deal, так и остался
🆘 Если что-то пошло не так
Нашли расхождение с реальным поведением API или не хватает метода — заводите issue. Типы в пакете строятся на живых ответах API, а не на схеме, поэтому такие сообщения ценны
Откатиться на прежнюю версию всегда можно командой npm i getcourse-api@2.0.1