InstallPayload ({ previousVersion?: string; newVersion: string } — تكون قيمة previousVersion هي undefined في حالة التثبيت الجديد)، بينما يتلقى خطاف إلغاء التثبيت UninstallPayload ({ version?: string } — الإصدار الذي تتم إزالته).
يمكن لكل تطبيق تعريف خطاف واحد كحد أقصى من كل نوع (قبل التثبيت، بعد التثبيت، إلغاء التثبيت). سيُنتِج إنشاء ملف البيان خطأً إذا تم اكتشاف أكثر من خطاف واحد من أي نوع.
لمحة سريعة
قاعدة عامة: اجعل الافتراضي هو post-install. الجأ إلى ما قبل التثبيت فقط عندما يكون الترحيل نفسه هدّامًا وتحتاج إلى التقاط الحالة السابقة قبل أن تزول.
السلوك المشترك بين كلا الخطافين
- إعداد التهيئة هو إعداد
defineLogicFunctionنفسه مطروحًا منه إعدادات المشغّل، مضافًا إليهshouldRunOnVersionUpgrade. - موعد تشغيله: في عمليات التثبيت الجديدة فقط، افتراضيًا. عيِّن
shouldRunOnVersionUpgrade: trueلتشغيله أيضًا عند الترقيات. استخدمpreviousVersion/newVersionللتفرع حسب مسار الترقية. - أهمية اللاّتغيّر (Idempotency): قد يُعاد تشغيل post-install غير المتزامن، وأيٌّ من الخطافين يُعاد تشغيله عند الترقيات عندما يكون
shouldRunOnVersionUpgradeمفعّلًا. - يتم حقن بيئة دوال المنطق المعتادة (
APPLICATION_ID، وAPP_ACCESS_TOKEN، وAPI_URL)، لذا يمكنك استدعاء Twenty API باستخدام رمز التطبيق الخاص بك. - يُربَط الخطّاف تلقائيًا بملف بيان التطبيق وقت الإنشاء (
preInstallLogicFunction/postInstallLogicFunction) — لا حاجة للإشارة إليه فيdefineApplication(). - القيمة الافتراضية لـ
timeoutSecondsهي 300 للسماح بمهام إعداد أطول مثل بذر البيانات. - غير منفَّذ في نمط التطوير: يتخطى
yarn twenty devتدفق التثبيت ويزامن الملفات مباشرةً، لذا لا تعمل الخطافات هناك مطلقًا. بدلًا من ذلك، شغّلها يدويًا:
definePostInstallLogicFunction
تعمل بعد تطبيق ترحيل البيانات الوصفية لمساحة العمل
definePostInstallLogicFunction
تعمل بعد تطبيق ترحيل البيانات الوصفية لمساحة العمل
يعمل بعد انتهاء تثبيت تطبيقك: تمت مزامنة البيانات الوصفية، وتم إنشاء عميل SDK، وأصبح من الممكن الاستعلام عن المخطط الجديد. مثال — بذر سجل افتراضي في عمليات التثبيت الجديدة:تتحكم الشارة
src/logic-functions/post-install.ts
shouldRunSynchronously في نموذج التنفيذ:false(الإعداد الافتراضي) — يُوضَع في قائمة انتظار الرسائل (retryLimit: 3) ويُشغِّله عامل. تعود استجابة التثبيت بمجرد وضع المهمة في قائمة الانتظار. يُستخدم للأعمال طويلة الأمد — بذر مجموعات بيانات كبيرة، وواجهات برمجة تطبيقات بطيئة لأطراف ثالثة.true— يُنفَّذ مضمَّنًا أثناء تدفق التثبيت. يحجب طلب التثبيت حتى ينتهي المعالج؛ يظهر الخطأ الذي يتم رميه كـPOST_INSTALL_ERRORللمستدعي (بدون محاولات إعادة). يُستخدم للأعمال السريعة التي يجب إتمامها قبل الاستجابة. تم تطبيق الترحيل بالفعل في هذه المرحلة، لذا لا يؤدي الفشل إلى التراجع عن تغييرات المخطط — بل يُظهِر الخطأ فقط.
definePreInstallLogicFunction
تعمل قبل تطبيق ترحيل البيانات الوصفية لمساحة العمل
definePreInstallLogicFunction
تعمل قبل تطبيق ترحيل البيانات الوصفية لمساحة العمل
يعمل قبل ترحيل البيانات الوصفية، مقابل المخطط السابق — المكان المناسب لنسخ البيانات احتياطيًا التي قد يفقدها الترحيل، أو لرفض ترقية خطِرة. قبل التنفيذ، يُشغِّل الخادم مزامنة ذات طابع إضافي فقط “pared-down sync” تُسجِّل دالة ما قبل التثبيت للإصدار الجديد فقط؛ أما كل ما عدا ذلك — كائنات الإصدار السابق وحقوله وبياناته — فيبقى دون مساس عندما يعمل المعالج.ما قبل التثبيت دائمًا متزامن ويحجب عملية التثبيت. إذا رمى المعالج استثناءً، تُلغى عملية التثبيت قبل أي تغيير في المخطط — وتبقى مساحة العمل على الإصدار السابق بحالة متّسقة. هذا مقصود: ما قبل التثبيت هو فرصتك الأخيرة لرفض ترقية تنطوي على مخاطر.مثال — نسخ قيم حقل قديم قبل أن يُسقِطه الترحيل:
src/logic-functions/pre-install.ts
خطاف إلغاء التثبيت
تُصرّحdefineUninstallLogicFunction عن خطاف يتم تشغيله عندما يلغي المستخدم تثبيت تطبيقك. يتم تنفيذه قبل إزالة بيانات التعريف للتطبيق وبياناته وكوده — بمجرد تشغيل ترحيل الحذف، لن يتبقى أي شيء للتنفيذ — لذلك لا يزال بإمكان معالجك الاستعلام عن كائنات التطبيق وسجلاته. استخدمه لتنظيف الموارد الخارجية: إلغاء توفير موارد واجهة برمجة التطبيقات (API)، وحذف الروبوتات المتبقية، وإبطال خطافات الويب.
الملاحظات:
- الخطاف يعتمد على مبدأ “أقصى جهد ممكن”: يتم تشغيله بشكل متزامن، ولكن في حالة الفشل يتم تسجيل الخطأ ولا يعرقل عملية إلغاء التثبيت مطلقًا — يجب ألا يجعل التنظيف إزالة التطبيق مستحيلة.
- يتلقى
UninstallPayload({ version?: string }— الإصدار الذي تتم إزالته). - لا يتم تشغيله عند التراجع عن عملية تثبيت جديدة فاشلة — حيث لم يكتمل تثبيت التطبيق مطلقًا.
- لا يمكن للخطاف أن يعمل بعد إزالة التطبيق، لذلك يجب أن يتم هنا أي تنظيف خارجي يعتمد على بيانات التطبيق (مثلًا: معرّفات الروبوتات المخزنة في السجلات)، وليس في مهمة مجدولة خارجية.
- ومثل خطافات التثبيت، لا يتم تنفيذه في وضع التطوير (dev mode) — بدلًا من ذلك، قم بتشغيله يدويًا:
src/logic-functions/uninstall.ts