Skip to main content
Установочные хуки — это специальные логические функции, которые выполняются во время жизненного цикла установки, обновления или удаления. Они используют то же окружение выполнения обработчика, что и обычные logic functions, но объявляются с помощью собственных функций определения и существуют вне обычной модели триггеров (HTTP, cron, события базы данных). Установочные хуки получают InstallPayload ({ previousVersion?: string; newVersion: string }previousVersion имеет значение undefined при новой установке); хук удаления получает UninstallPayload ({ version?: string } — версия, которая удаляется). Каждое приложение может определить не более одного хука каждого типа (предустановочный, постустановочный, хук удаления). Сборка манифеста завершится ошибкой, если будет обнаружено более одного хука любого типа.

Краткий обзор

Общее практическое правило: по умолчанию используйте post-install. Обращайтесь к pre-install только тогда, когда сама миграция разрушительна и вам нужно перехватить предыдущее состояние, прежде чем оно исчезнет.

Общее поведение для обоих хуков

  • Конфиг — это конфиг defineLogicFunction без настроек триггера, но с shouldRunOnVersionUpgrade.
  • Когда запускается: по умолчанию только при чистой установке. Установите shouldRunOnVersionUpgrade: true, чтобы также запускать его при обновлениях. Используйте previousVersion / newVersion, чтобы разветвлять логику в зависимости от пути обновления.
  • Идемпотентность имеет значение: асинхронный post-install может быть повторно выполнен, и любой хук будет запускаться повторно при обновлениях, если включён shouldRunOnVersionUpgrade.
  • Обычное окружение logic-функций (APPLICATION_ID, APP_ACCESS_TOKEN, API_URL) инъецируется, поэтому вы можете вызывать Twenty API с токеном своего приложения.
  • Хук автоматически прикрепляется к манифесту приложения на этапе сборки (preInstallLogicFunction / postInstallLogicFunction) — ничего не нужно указывать в defineApplication().
  • Значение timeoutSeconds по умолчанию — 300, чтобы позволить выполнять более длительные задачи настройки, такие как инициализация данных.
  • Не выполняется в dev-режиме: yarn twenty dev пропускает процесс установки и синхронизирует файлы напрямую, поэтому хуки там никогда не запускаются. Вместо этого запускайте их вручную:
Запускается после завершения установки приложения: метаданные синхронизированы, SDK-клиент сгенерирован, новая схема доступна для запросов. Пример — инициализировать запись по умолчанию при новой установке:
src/logic-functions/post-install.ts
Флаг shouldRunSynchronously управляет моделью выполнения:
  • false (по умолчанию) — ставится в очередь сообщений (retryLimit: 3) и выполняется воркером. Ответ установки возвращается, как только задача поставлена в очередь. Используйте для длительных операций — инициализация больших наборов данных, медленные сторонние API.
  • true — выполняется непосредственно в процессе установки. Запрос на установку блокируется до завершения обработчика; выброшенная ошибка возвращается вызывающей стороне как POST_INSTALL_ERROR (без повторных попыток). Используйте для быстрых операций, которые обязательно должны завершиться до ответа. На этом этапе миграция уже применена, поэтому сбой не откатывает изменения схемы — он только сообщает об ошибке.
Запускается до миграции метаданных, в контексте предыдущей схемы — подходящее место, чтобы создать резервную копию данных, которые были бы потеряны при миграции, или отклонить рискованное обновление. Перед выполнением сервер запускает чисто добавочную «урезанную синхронизацию», которая регистрирует только pre-install функцию новой версии; всё остальное — объекты, поля и данные предыдущей версии — остаётся нетронутым во время выполнения вашего обработчика.Pre-install всегда синхронный и блокирует установку. Если обработчик генерирует исключение, установка прерывается до применения каких-либо изменений схемы — рабочее пространство остаётся на предыдущей версии в согласованном состоянии. Это сделано намеренно: pre-install — ваш последний шанс отказать в рискованном обновлении.Пример — скопировать значения устаревшего поля перед тем, как миграция его удалит:
src/logic-functions/pre-install.ts

Хук удаления

defineUninstallLogicFunction объявляет хук, который выполняется, когда пользователь удаляет ваше приложение. Он выполняется до того, как метаданные, данные и код приложения будут удалены — после запуска миграции удаления уже нечему будет выполняться — поэтому ваш обработчик все еще может запрашивать объекты и записи приложения. Используйте его для очистки внешних ресурсов: отмены выделения ресурсов API, удаления оставшихся ботов, отзыва вебхуков. Заметки:
  • Хук работает по принципу «по возможности»: он выполняется синхронно, но сбой только логируется и никогда не блокирует удаление — очистка не должна делать удаление приложения невозможным.
  • Он получает UninstallPayload ({ version?: string } — версия, которая удаляется).
  • Он не выполняется при откате неуспешной новой установки — приложение так и не было полностью установлено.
  • Хук не может выполниться после того, как приложение удалено, поэтому внешняя очистка, которая зависит от данных приложения (например, ID ботов, сохраненные в записях), должна выполняться здесь, а не во внешнем запланированном задании.
  • Как и установочные хуки, он не выполняется в режиме разработки — вместо этого запустите его вручную:
src/logic-functions/uninstall.ts