Перейти к содержанию

Пользовательские функции обработки (User Adapter)#

Для указания пользовательских функций при получении уведомления используются файлы user_adapter. В данных файлах вам требуется указать функции обработки уведомлений (например: запись уведомления в базу, отправка запроса в другой микросервис). В качестве шаблона можно переименовать файл source/_user_adapter.cpp. Пример обработки всех типов уведомлений доступен в файле user_adapter_example.cpp в папке examples.

Адаптер для пользователя находится в следующем файле:

  • source/user_adapter.cpp

Если у вас нет требуемого файла, создайте его путем удаления нижнего подчеркивания из названия `source/_user_adapter.cpp файла.

1. Обновление User Adapter#

Мы будем обновлять include/user_adapter.h и source/_user_adapter.cpp файлы по мере выпуска новых вебхуков. Если вы столкнулись с ошибкой сборки, где написано о том, что компилятор не смог найти требуемые функции из user_adapter, то в этом случае вам необходимо добавить новые функции из source/_user_adapter.cpp в ваш source/user_adapter.cpp.

2. Описание User Adapter#

Адаптер для пользователя содержит ваши обработчики вебхуков. Программа работает по следующему алгоритму:

  1. Запрос к серверу принимает класс webhook;

  2. Класс webhook создает объект Response и передает тело запроса классу Validator;

  3. После проверки, объект Response передается в обработчик User Adapter на основе webToken в теле запроса.;

  4. Функция обработки в User Adapter возвращает true в случае ошибки или false, если обработка произошла без ошибок. На основе этого значения, сервер вернет или 200 OK или 400 Bad Request.

Структура объекта Response (response.h):

struct Response {
    bool error = true; // true, если вебхук не прошел валидацию
    std::string typeWebhook = ""; // webhookType из тела запроса
    std::string bodyStr = "";  // содержит тело запроса, если error = false, иначе описание ошибки валидации
    nlohmann::json bodyJson = ""; //  тело пришедшего запроса
}
  1. Функции в UserAdapter описываются как:
    static bool onWebhookType(greenapi::Response& body);
    
  2. Пример функции UserAdapter:

В данном примере, обработчик будет вызван вебхуком с типом IncomingMessageReceived. С помощью структуры Response, описанной выше, вы можете проверить результат валидации запроса (body.error), обратиться к json структуре вебхука (body.bodyJson) или получить доступ к телу запроса (body.bodyStr).

bool UserAdapter::onIncomingMessageReceived(greenapi::Response& body) {
    // Каждый запрос содержит typeWebhook. Если typeWebhook нет в запросе, запрос отклоняется сервером.
    const auto typeWebhook = body.bodyJson["typeWebhook"];

    // Если вам нужно вернуть ошибку в процессе обработки запроса, верните true из этой функции.
    // Это изменит статус запроса на 400 Bad Request с немедленным возвратом результата HTTP запроса.
    // 
    // if (<error>) {
    //    return true;
    //}

    greenapi::Logger::Log("Received webhook: " + nlohmann::to_string(typeWebhook) + std::string(" with body: ") + body.bodyStr, "info");

    // Опишите ваш обработчик здесь:

    // Если нет ошибок, верните false. После этого сервер вернет статус запроса 200 OK
    return false;
}