InstallPayload ({ previousVersion?: string; newVersion: string } — previousVersion è undefined in caso di nuova installazione); l’hook di disinstallazione riceve un UninstallPayload ({ version?: string } — la versione che viene rimossa).
Ogni app può definire al massimo uno per ciascun hook (pre-install, post-install, uninstall). La build del manifesto genera un errore se viene rilevato più di un hook per qualsiasi tipo.
A colpo d’occhio
Regola generale: usa post-install come impostazione predefinita. Ricorri al pre-install solo quando la migrazione stessa è distruttiva e devi intercettare lo stato precedente prima che vada perso.
Comportamento condiviso da entrambi gli hook
- La config è una config di
defineLogicFunctionmeno le impostazioni di trigger, piùshouldRunOnVersionUpgrade. - Quando viene eseguito: solo sulle nuove installazioni, per impostazione predefinita. Imposta
shouldRunOnVersionUpgrade: trueper eseguirlo anche sugli upgrade. UsapreviousVersion/newVersionper ramificare in base al percorso di upgrade. - L’idempotenza è importante: il post-install async può essere ritentato e qualsiasi hook viene rieseguito sugli upgrade quando
shouldRunOnVersionUpgradeè attivo. - Il consueto ambiente delle logic-function (
APPLICATION_ID,APP_ACCESS_TOKEN,API_URL) viene iniettato, così puoi chiamare le API di Twenty con il token della tua app. - L’hook viene collegato automaticamente al manifesto dell’applicazione in fase di build (
preInstallLogicFunction/postInstallLogicFunction) — non c’è nulla da referenziare indefineApplication(). - Il
timeoutSecondspredefinito è 300 per consentire attività di setup più lunghe, come il seeding dei dati. - Non eseguito in modalità dev:
yarn twenty devsalta il flusso di installazione e sincronizza direttamente i file, quindi gli hook non vengono mai eseguiti in quell’ambiente. Attivali invece manualmente:
definePostInstallLogicFunction
Viene eseguita dopo che la migrazione dei metadati dello spazio di lavoro è stata applicata
definePostInstallLogicFunction
Viene eseguita dopo che la migrazione dei metadati dello spazio di lavoro è stata applicata
Viene eseguito una volta che l’installazione della tua app è terminata: metadati sincronizzati, client SDK generato, nuovo schema interrogabile. Esempio — eseguire il seeding di un record predefinito nelle nuove installazioni:Il flag
src/logic-functions/post-install.ts
shouldRunSynchronously controlla il modello di esecuzione:false(predefinito) — messo in coda nella message queue (retryLimit: 3) ed eseguito da un worker. La risposta dell’installazione ritorna non appena il job viene messo in coda. Da usare per lavoro di lunga durata — seeding di grandi dataset, API di terze parti lente.true— eseguito inline durante il flusso di installazione. La richiesta di installazione rimane bloccata finché l’handler non termina; un errore lanciato viene esposto al chiamante comePOST_INSTALL_ERROR(nessun retry). Da usare per lavoro rapido che deve completarsi prima della risposta. La migrazione è già stata applicata a questo punto, quindi un errore non annulla le modifiche allo schema — si limita a esporre l’errore.
definePreInstallLogicFunction
Viene eseguita prima che la migrazione dei metadati dello spazio di lavoro sia applicata
definePreInstallLogicFunction
Viene eseguita prima che la migrazione dei metadati dello spazio di lavoro sia applicata
Viene eseguito prima della migrazione dei metadati, contro lo schema precedente — il posto giusto per eseguire il backup di dati che una migrazione perderebbe o per rifiutare un upgrade rischioso. Prima dell’esecuzione, il server esegue una “sincronizzazione ridotta” puramente additiva che registra solo la funzione di pre-install della versione nuova; tutto il resto — oggetti, campi e dati della versione precedente — rimane intatto quando il tuo handler viene eseguito.Il pre-install è sempre sincrono e blocca l’installazione. Se l’handler genera un’eccezione, l’installazione viene interrotta prima che venga applicata qualsiasi modifica allo schema — il workspace rimane sulla versione precedente in uno stato coerente. Questo è intenzionale: il pre-install è la tua ultima possibilità per rifiutare un aggiornamento rischioso.Esempio — copiare i valori di un campo legacy prima che la migrazione lo elimini:
src/logic-functions/pre-install.ts
Hook di disinstallazione
defineUninstallLogicFunction dichiara un hook che viene eseguito quando un utente disinstalla la tua app. Viene eseguito prima che i metadati, i dati e il codice dell’app vengano rimossi — una volta eseguita la migrazione di eliminazione non rimane più nulla da eseguire — quindi il tuo gestore può ancora interrogare gli oggetti e i record dell’app. Usalo per la pulizia delle risorse esterne: deprovisioning delle risorse API, eliminazione dei bot rimanenti, revoca dei webhook.
Note:
- L’hook è “best-effort”: viene eseguito in modo sincrono, ma un errore viene registrato e non blocca mai la disinstallazione — la pulizia non deve rendere impossibile rimuovere un’app.
- Riceve
UninstallPayload({ version?: string }— la versione che viene rimossa). - Non viene eseguito quando un tentativo di nuova installazione non riuscito viene annullato — l’app non ha mai terminato l’installazione.
- L’hook non può essere eseguito dopo che l’app è stata rimossa, quindi la pulizia esterna che dipende dai dati dell’app (ad es. ID dei bot memorizzati nei record) deve essere eseguita qui, non in un job pianificato esterno.
- Come gli hook di installazione, non viene eseguito in modalità dev — attivalo manualmente invece:
src/logic-functions/uninstall.ts