diff --git a/packages/twenty-docs/l/de/developers/extend/apps/logic/logic-functions.mdx b/packages/twenty-docs/l/de/developers/extend/apps/logic/logic-functions.mdx index 983d06b1fe..a0a95b2ea5 100644 --- a/packages/twenty-docs/l/de/developers/extend/apps/logic/logic-functions.mdx +++ b/packages/twenty-docs/l/de/developers/extend/apps/logic/logic-functions.mdx @@ -13,8 +13,8 @@ Jede Funktionsdatei verwendet `defineLogicFunction()`, um eine Konfiguration mit ```ts src/logic-functions/createPostCard.logic-function.ts import { defineLogicFunction } from 'twenty-sdk/define'; -import type { DatabaseEventPayload, ObjectRecordCreateEvent, CronPayload, RoutePayload } from 'twenty-sdk/define'; -import { CoreApiClient, type Person } from 'twenty-client-sdk/core'; +import type { RoutePayload } from 'twenty-sdk/logic-function'; +import { CoreApiClient } from 'twenty-client-sdk/core'; const handler = async (params: RoutePayload) => { const client = new CoreApiClient(); @@ -78,10 +78,10 @@ yarn twenty logs #### Routen-Trigger-Payload Wenn ein Route-Trigger Ihre Logikfunktion aufruft, erhält sie ein `RoutePayload`-Objekt, das dem [AWS-HTTP-API-v2-Format](https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-develop-integrations-lambda.html) folgt. -Importieren Sie den Typ `RoutePayload` aus `twenty-sdk`: +Importieren Sie den Typ `RoutePayload` aus `twenty-sdk/logic-function`: ```ts -import { defineLogicFunction, type RoutePayload } from 'twenty-sdk/define'; +import type { RoutePayload } from 'twenty-sdk/logic-function'; const handler = async (event: RoutePayload) => { const { headers, queryStringParameters, pathParameters, body } = event; @@ -140,6 +140,115 @@ const handler = async (event: RoutePayload) => { Header-Namen werden in Kleinbuchstaben normalisiert. Greifen Sie mit Schlüsseln in Kleinbuchstaben darauf zu (z. B. `event.headers['content-type']`). +#### Datenbank-Event-Trigger-Payload + +Wenn ein Datenbank-Event-Trigger Ihre Logic Function aufruft, erhält sie eine `DatabaseEventPayload` pro geändertem Datensatz. Die Payload kombiniert Metadaten über den Quell-Workspace und das Objekt mit dem Ereignis auf Datensatzebene. + +```ts +import type { + DatabaseEventPayload, + ObjectRecordCreateEvent, + ObjectRecordDestroyEvent, + ObjectRecordUpdateEvent, +} from 'twenty-sdk/logic-function'; + +type Person = { + id: string; + emails?: { primaryEmail?: string }; +}; +``` + +Die Nutzlast umfasst: + +| Eigenschaft | Beschreibung | +| ------------------------------------------------ | -------------------------------------------------------------------------------------------------------------- | +| `name` | Ereignisname, z. B. `person.updated`. | +| `workspaceId` | Arbeitsbereich, in dem das Ereignis stattgefunden hat. | +| `objectMetadata` | Metadaten für das Objekt, das geändert wurde. | +| `recordId` | ID des geänderten Datensatzes. | +| `userId`, `userWorkspaceId`, `workspaceMemberId` | Akteurfelder, wenn das Ereignis von einem Benutzer des Arbeitsbereichs ausgelöst wurde. | +| `properties` | Datensatzdaten für das Ereignis mit `before`, `after`, `diff` und `updatedFields`, abhängig von der Operation. | + +| Ereignis | Datensatzdaten | +| ------------------ | -------------------------------------------------------------------------------------------------------------- | +| `person.created` | `event.properties.after` | +| `person.updated` | `event.properties.before`, `event.properties.after`, `event.properties.diff`, `event.properties.updatedFields` | +| `person.destroyed` | `event.properties.before` | + +Bei Soft Deletes folgt `.deleted` der Aktualisierungsstruktur, da sich das Feld `deletedAt` des Datensatzes ändert. +Für dauerhafte Löschvorgänge verwende `.destroyed`. + + +`databaseEventTriggerSettings.updatedFields` filtert, welche Aktualisierungsereignisse die Funktion auslösen. +`event.properties.updatedFields` gibt an, welche Felder beim aktuellen Ereignis tatsächlich geändert wurden. + + +Beispiel für ein Created-Ereignis: + +```ts +type PersonCreatedEvent = DatabaseEventPayload< + ObjectRecordCreateEvent +>; + +const handler = async (event: PersonCreatedEvent) => { + const person = event.properties.after; + + return { + personId: event.recordId, + email: person.emails?.primaryEmail, + }; +}; +``` + +Beispiel für ein Updated-Ereignis: + +```ts +type PersonUpdatedEvent = DatabaseEventPayload< + ObjectRecordUpdateEvent +>; + +const handler = async (event: PersonUpdatedEvent) => { + const { before, after, diff, updatedFields } = event.properties; + + return { + personId: event.recordId, + updatedFields, + previousEmail: before.emails?.primaryEmail, + currentEmail: after.emails?.primaryEmail, + emailDiff: diff.emails, + }; +}; +``` + +Nur bei E-Mail-Aktualisierungen auslösen: + +```ts +export default defineLogicFunction({ + ..., + databaseEventTriggerSettings: { + eventName: 'person.updated', + updatedFields: ['emails'], + }, +}); +``` + +Beispiel für ein Destroyed-Ereignis: + +```ts +type PersonDestroyedEvent = DatabaseEventPayload< + ObjectRecordDestroyEvent +>; + +const handler = async (event: PersonDestroyedEvent) => { + const personBeforeDestroy = event.properties.before; + + return { + personId: event.recordId, + email: personBeforeDestroy.emails?.primaryEmail, + }; +}; +``` + #### Eine Funktion als KI-Tool oder Workflow-Aktion verfügbar machen Logikfunktionen können auf zwei Oberflächen verfügbar gemacht werden, jeweils mit eigenem Trigger: diff --git a/packages/twenty-docs/l/pt/developers/extend/apps/logic/logic-functions.mdx b/packages/twenty-docs/l/pt/developers/extend/apps/logic/logic-functions.mdx index 3983c42a72..034a08b9ab 100644 --- a/packages/twenty-docs/l/pt/developers/extend/apps/logic/logic-functions.mdx +++ b/packages/twenty-docs/l/pt/developers/extend/apps/logic/logic-functions.mdx @@ -13,8 +13,8 @@ Cada arquivo de função usa `defineLogicFunction()` para exportar uma configura ```ts src/logic-functions/createPostCard.logic-function.ts import { defineLogicFunction } from 'twenty-sdk/define'; -import type { DatabaseEventPayload, ObjectRecordCreateEvent, CronPayload, RoutePayload } from 'twenty-sdk/define'; -import { CoreApiClient, type Person } from 'twenty-client-sdk/core'; +import type { RoutePayload } from 'twenty-sdk/logic-function'; +import { CoreApiClient } from 'twenty-client-sdk/core'; const handler = async (params: RoutePayload) => { const client = new CoreApiClient(); @@ -78,10 +78,10 @@ yarn twenty logs #### Payload de gatilho de rota Quando um gatilho de rota invoca sua função de lógica, ela recebe um objeto `RoutePayload` que segue o [formato HTTP API v2 da AWS](https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-develop-integrations-lambda.html). -Importe o tipo `RoutePayload` de `twenty-sdk`: +Importe o tipo `RoutePayload` de `twenty-sdk/logic-function`: ```ts -import { defineLogicFunction, type RoutePayload } from 'twenty-sdk/define'; +import type { RoutePayload } from 'twenty-sdk/logic-function'; const handler = async (event: RoutePayload) => { const { headers, queryStringParameters, pathParameters, body } = event; @@ -140,6 +140,115 @@ const handler = async (event: RoutePayload) => { Os nomes dos cabeçalhos são normalizados para minúsculas. Acesse-os usando chaves em minúsculas (por exemplo, `event.headers['content-type']`). +#### Payload do gatilho de evento do banco de dados + +Quando um gatilho de evento do banco de dados invoca sua função lógica, ela recebe um `DatabaseEventPayload` por registro alterado. O payload combina metadados sobre o workspace e o objeto de origem com o evento em nível de registro. + +```ts +import type { + DatabaseEventPayload, + ObjectRecordCreateEvent, + ObjectRecordDestroyEvent, + ObjectRecordUpdateEvent, +} from 'twenty-sdk/logic-function'; + +type Person = { + id: string; + emails?: { primaryEmail?: string }; +}; +``` + +O payload inclui: + +| Propriedade | Descrição | +| ------------------------------------------------ | --------------------------------------------------------------------------------------------------------- | +| `name` | Nome do evento, como `person.updated`. | +| `workspaceId` | Workspace onde o evento aconteceu. | +| `objectMetadata` | Metadados do objeto que foi alterado. | +| `recordId` | ID do registro alterado. | +| `userId`, `userWorkspaceId`, `workspaceMemberId` | Campos do autor quando o evento foi causado por um usuário do workspace. | +| `properties` | Dados do registro para o evento, com `before`, `after`, `diff` e `updatedFields`, dependendo da operação. | + +| Evento | Dados do registro | +| ------------------ | -------------------------------------------------------------------------------------------------------------- | +| `person.created` | `event.properties.after` | +| `person.updated` | `event.properties.before`, `event.properties.after`, `event.properties.diff`, `event.properties.updatedFields` | +| `person.destroyed` | `event.properties.before` | + +Para exclusões lógicas, `.deleted` segue o formato de atualização porque o campo `deletedAt` do registro é alterado. +Para exclusões permanentes, use `.destroyed`. + + +`databaseEventTriggerSettings.updatedFields` filtra quais eventos de atualização disparam a função. +`event.properties.updatedFields` informa quais campos realmente foram alterados no evento atual. + + +Exemplo de evento de criação: + +```ts +type PersonCreatedEvent = DatabaseEventPayload< + ObjectRecordCreateEvent +>; + +const handler = async (event: PersonCreatedEvent) => { + const person = event.properties.after; + + return { + personId: event.recordId, + email: person.emails?.primaryEmail, + }; +}; +``` + +Exemplo de evento de atualização: + +```ts +type PersonUpdatedEvent = DatabaseEventPayload< + ObjectRecordUpdateEvent +>; + +const handler = async (event: PersonUpdatedEvent) => { + const { before, after, diff, updatedFields } = event.properties; + + return { + personId: event.recordId, + updatedFields, + previousEmail: before.emails?.primaryEmail, + currentEmail: after.emails?.primaryEmail, + emailDiff: diff.emails, + }; +}; +``` + +Disparar somente em atualizações de email: + +```ts +export default defineLogicFunction({ + ..., + databaseEventTriggerSettings: { + eventName: 'person.updated', + updatedFields: ['emails'], + }, +}); +``` + +Exemplo de evento de destruição: + +```ts +type PersonDestroyedEvent = DatabaseEventPayload< + ObjectRecordDestroyEvent +>; + +const handler = async (event: PersonDestroyedEvent) => { + const personBeforeDestroy = event.properties.before; + + return { + personId: event.recordId, + email: personBeforeDestroy.emails?.primaryEmail, + }; +}; +``` + #### Expor uma função como ferramenta de IA ou como ação de fluxo de trabalho As funções de lógica podem ser expostas em duas superfícies, cada uma com seu próprio gatilho: diff --git a/packages/twenty-docs/l/ro/developers/extend/apps/logic/logic-functions.mdx b/packages/twenty-docs/l/ro/developers/extend/apps/logic/logic-functions.mdx index 00397fe4d3..4ddc110a28 100644 --- a/packages/twenty-docs/l/ro/developers/extend/apps/logic/logic-functions.mdx +++ b/packages/twenty-docs/l/ro/developers/extend/apps/logic/logic-functions.mdx @@ -13,8 +13,8 @@ Fiecare fișier de funcție folosește `defineLogicFunction()` pentru a exporta ```ts src/logic-functions/createPostCard.logic-function.ts import { defineLogicFunction } from 'twenty-sdk/define'; -import type { DatabaseEventPayload, ObjectRecordCreateEvent, CronPayload, RoutePayload } from 'twenty-sdk/define'; -import { CoreApiClient, type Person } from 'twenty-client-sdk/core'; +import type { RoutePayload } from 'twenty-sdk/logic-function'; +import { CoreApiClient } from 'twenty-client-sdk/core'; const handler = async (params: RoutePayload) => { const client = new CoreApiClient(); @@ -79,10 +79,10 @@ yarn twenty logs Când un declanșator de rută invocă funcția logică, aceasta primește un obiect `RoutePayload` care urmează [AWS HTTP API v2 format](https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-develop-integrations-lambda.html). -Importați tipul `RoutePayload` din `twenty-sdk`: +Importați tipul `RoutePayload` din `twenty-sdk/logic-function`: ```ts -import { defineLogicFunction, type RoutePayload } from 'twenty-sdk/define'; +import type { RoutePayload } from 'twenty-sdk/logic-function'; const handler = async (event: RoutePayload) => { const { headers, queryStringParameters, pathParameters, body } = event; @@ -141,6 +141,115 @@ const handler = async (event: RoutePayload) => { Numele anteturilor sunt normalizate la litere mici. Accesați-le folosind chei cu litere mici (de exemplu, `event.headers['content-type']`). +#### Payload-ul declanșatorului de eveniment al bazei de date + +Când un declanșator de eveniment al bazei de date apelează funcția dvs. logică, aceasta primește un `DatabaseEventPayload` pentru fiecare înregistrare modificată. Payload-ul combină metadatele despre spațiul de lucru și obiectul sursă cu evenimentul la nivel de înregistrare. + +```ts +import type { + DatabaseEventPayload, + ObjectRecordCreateEvent, + ObjectRecordDestroyEvent, + ObjectRecordUpdateEvent, +} from 'twenty-sdk/logic-function'; + +type Person = { + id: string; + emails?: { primaryEmail?: string }; +}; +``` + +Payload-ul include: + +| Proprietate | Descriere | +| ------------------------------------------------ | -------------------------------------------------------------------------------------------------------------- | +| `name` | Numele evenimentului, cum ar fi `person.updated`. | +| `workspaceId` | Spațiul de lucru în care a avut loc evenimentul. | +| `objectMetadata` | Metadate pentru obiectul care s-a modificat. | +| `recordId` | ID-ul înregistrării modificate. | +| `userId`, `userWorkspaceId`, `workspaceMemberId` | Câmpurile actorului atunci când evenimentul a fost cauzat de un utilizator al spațiului de lucru. | +| `properties` | Datele înregistrării pentru eveniment, cu `before`, `after`, `diff` și `updatedFields` în funcție de operație. | + +| Eveniment | Datele înregistrării | +| ------------------ | -------------------------------------------------------------------------------------------------------------- | +| `person.created` | `event.properties.after` | +| `person.updated` | `event.properties.before`, `event.properties.after`, `event.properties.diff`, `event.properties.updatedFields` | +| `person.destroyed` | `event.properties.before` | + +Pentru ștergeri logice (soft delete), `.deleted` urmează structura de tip update deoarece câmpul `deletedAt` al înregistrării se modifică. +Pentru ștergeri permanente, folosiți `.destroyed`. + + +`databaseEventTriggerSettings.updatedFields` filtrează ce evenimente de actualizare declanșează funcția. +`event.properties.updatedFields` vă indică ce câmpuri s-au modificat efectiv în evenimentul curent. + + +Exemplu de eveniment de creare: + +```ts +type PersonCreatedEvent = DatabaseEventPayload< + ObjectRecordCreateEvent +>; + +const handler = async (event: PersonCreatedEvent) => { + const person = event.properties.after; + + return { + personId: event.recordId, + email: person.emails?.primaryEmail, + }; +}; +``` + +Exemplu de eveniment de actualizare: + +```ts +type PersonUpdatedEvent = DatabaseEventPayload< + ObjectRecordUpdateEvent +>; + +const handler = async (event: PersonUpdatedEvent) => { + const { before, after, diff, updatedFields } = event.properties; + + return { + personId: event.recordId, + updatedFields, + previousEmail: before.emails?.primaryEmail, + currentEmail: after.emails?.primaryEmail, + emailDiff: diff.emails, + }; +}; +``` + +Declanșare doar la actualizări ale e-mailului: + +```ts +export default defineLogicFunction({ + ..., + databaseEventTriggerSettings: { + eventName: 'person.updated', + updatedFields: ['emails'], + }, +}); +``` + +Exemplu de eveniment de ștergere: + +```ts +type PersonDestroyedEvent = DatabaseEventPayload< + ObjectRecordDestroyEvent +>; + +const handler = async (event: PersonDestroyedEvent) => { + const personBeforeDestroy = event.properties.before; + + return { + personId: event.recordId, + email: personBeforeDestroy.emails?.primaryEmail, + }; +}; +``` + #### Expunerea unei funcții ca instrument AI sau ca acțiune în fluxul de lucru Funcțiile logice pot fi expuse în două locuri, fiecare cu propriul declanșator: diff --git a/packages/twenty-docs/l/ru/developers/extend/apps/logic/logic-functions.mdx b/packages/twenty-docs/l/ru/developers/extend/apps/logic/logic-functions.mdx index fd09e35faa..255c499d16 100644 --- a/packages/twenty-docs/l/ru/developers/extend/apps/logic/logic-functions.mdx +++ b/packages/twenty-docs/l/ru/developers/extend/apps/logic/logic-functions.mdx @@ -13,8 +13,8 @@ icon: bolt ```ts src/logic-functions/createPostCard.logic-function.ts import { defineLogicFunction } from 'twenty-sdk/define'; -import type { DatabaseEventPayload, ObjectRecordCreateEvent, CronPayload, RoutePayload } from 'twenty-sdk/define'; -import { CoreApiClient, type Person } from 'twenty-client-sdk/core'; +import type { RoutePayload } from 'twenty-sdk/logic-function'; +import { CoreApiClient } from 'twenty-client-sdk/core'; const handler = async (params: RoutePayload) => { const client = new CoreApiClient(); @@ -78,10 +78,10 @@ yarn twenty logs #### Полезная нагрузка триггера маршрута Когда триггер маршрута вызывает вашу логическую функцию, она получает объект `RoutePayload`, который соответствует [формату AWS HTTP API v2](https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-develop-integrations-lambda.html). -Импортируйте тип `RoutePayload` из `twenty-sdk`: +Импортируйте тип `RoutePayload` из `twenty-sdk/logic-function`: ```ts -import { defineLogicFunction, type RoutePayload } from 'twenty-sdk/define'; +import type { RoutePayload } from 'twenty-sdk/logic-function'; const handler = async (event: RoutePayload) => { const { headers, queryStringParameters, pathParameters, body } = event; @@ -140,6 +140,115 @@ const handler = async (event: RoutePayload) => { Имена заголовков приводятся к нижнему регистру. Обращайтесь к ним, используя ключи в нижнем регистре (например, `event.headers['content-type']`). +#### Полезная нагрузка триггера события базы данных + +Когда триггер события базы данных вызывает вашу функцию логики, она получает по одному `DatabaseEventPayload` на каждую изменённую запись. Полезная нагрузка объединяет метаданные о рабочем пространстве-источнике и объекте с событием на уровне записи. + +```ts +import type { + DatabaseEventPayload, + ObjectRecordCreateEvent, + ObjectRecordDestroyEvent, + ObjectRecordUpdateEvent, +} from 'twenty-sdk/logic-function'; + +type Person = { + id: string; + emails?: { primaryEmail?: string }; +}; +``` + +Полезная нагрузка включает: + +| Свойство | Описание | +| ------------------------------------------------ | -------------------------------------------------------------------------------------------------- | +| `name` | Имя события, например `person.updated`. | +| `workspaceId` | Рабочее пространство, в котором произошло событие. | +| `objectMetadata` | Метаданные для объекта, который изменился. | +| `recordId` | Идентификатор измененной записи. | +| `userId`, `userWorkspaceId`, `workspaceMemberId` | Поля инициатора, если событие было вызвано пользователем рабочего пространства. | +| `properties` | Данные записи для события с `before`, `after`, `diff` и `updatedFields` в зависимости от операции. | + +| Событие | Данные записи | +| ------------------ | -------------------------------------------------------------------------------------------------------------- | +| `person.created` | `event.properties.after` | +| `person.updated` | `event.properties.before`, `event.properties.after`, `event.properties.diff`, `event.properties.updatedFields` | +| `person.destroyed` | `event.properties.before` | + +При логическом удалении `.deleted` имеет формат обновления, поскольку изменяется поле `deletedAt` записи. +Для окончательного удаления используйте `.destroyed`. + + +`databaseEventTriggerSettings.updatedFields` фильтрует, какие события обновления запускают функцию. +`event.properties.updatedFields` указывает, какие поля фактически изменились в текущем событии. + + +Пример события создания: + +```ts +type PersonCreatedEvent = DatabaseEventPayload< + ObjectRecordCreateEvent +>; + +const handler = async (event: PersonCreatedEvent) => { + const person = event.properties.after; + + return { + personId: event.recordId, + email: person.emails?.primaryEmail, + }; +}; +``` + +Пример события обновления: + +```ts +type PersonUpdatedEvent = DatabaseEventPayload< + ObjectRecordUpdateEvent +>; + +const handler = async (event: PersonUpdatedEvent) => { + const { before, after, diff, updatedFields } = event.properties; + + return { + personId: event.recordId, + updatedFields, + previousEmail: before.emails?.primaryEmail, + currentEmail: after.emails?.primaryEmail, + emailDiff: diff.emails, + }; +}; +``` + +Триггер только при обновлении email: + +```ts +export default defineLogicFunction({ + ..., + databaseEventTriggerSettings: { + eventName: 'person.updated', + updatedFields: ['emails'], + }, +}); +``` + +Пример события уничтожения: + +```ts +type PersonDestroyedEvent = DatabaseEventPayload< + ObjectRecordDestroyEvent +>; + +const handler = async (event: PersonDestroyedEvent) => { + const personBeforeDestroy = event.properties.before; + + return { + personId: event.recordId, + email: personBeforeDestroy.emails?.primaryEmail, + }; +}; +``` + #### Предоставление функции в качестве инструмента ИИ или действия рабочего процесса Функции логики могут быть представлены в двух интерфейсах, у каждого — свой триггер: diff --git a/packages/twenty-docs/l/tr/developers/extend/apps/logic/logic-functions.mdx b/packages/twenty-docs/l/tr/developers/extend/apps/logic/logic-functions.mdx index 370ea7ab1a..325bfced7a 100644 --- a/packages/twenty-docs/l/tr/developers/extend/apps/logic/logic-functions.mdx +++ b/packages/twenty-docs/l/tr/developers/extend/apps/logic/logic-functions.mdx @@ -13,8 +13,8 @@ Her işlev dosyası, bir işleyici ve isteğe bağlı tetikleyiciler içeren bir ```ts src/logic-functions/createPostCard.logic-function.ts import { defineLogicFunction } from 'twenty-sdk/define'; -import type { DatabaseEventPayload, ObjectRecordCreateEvent, CronPayload, RoutePayload } from 'twenty-sdk/define'; -import { CoreApiClient, type Person } from 'twenty-client-sdk/core'; +import type { RoutePayload } from 'twenty-sdk/logic-function'; +import { CoreApiClient } from 'twenty-client-sdk/core'; const handler = async (params: RoutePayload) => { const client = new CoreApiClient(); @@ -79,10 +79,10 @@ yarn twenty logs Bir rota tetikleyicisi mantık fonksiyonunuzu çağırdığında, [AWS HTTP API v2 formatını](https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-develop-integrations-lambda.html) izleyen bir `RoutePayload` nesnesi alır. -`RoutePayload` türünü `twenty-sdk` içinden içe aktarın: +`RoutePayload` türünü `twenty-sdk/logic-function` içinden içe aktarın: ```ts -import { defineLogicFunction, type RoutePayload } from 'twenty-sdk/define'; +import type { RoutePayload } from 'twenty-sdk/logic-function'; const handler = async (event: RoutePayload) => { const { headers, queryStringParameters, pathParameters, body } = event; @@ -141,6 +141,115 @@ const handler = async (event: RoutePayload) => { Başlık adları küçük harfe normalize edilir. Onlara küçük harfli anahtarlarla erişin (örneğin, `event.headers['content-type']`). +#### Veritabanı olay tetikleyicisi yükü + +Bir veritabanı olay tetikleyicisi mantık fonksiyonunuzu çağırdığında, değişen her kayıt için bir `DatabaseEventPayload` alır. Yük, kaynak çalışma alanı ve nesne hakkındaki üstveriyi, kayıt düzeyindeki olayla birleştirir. + +```ts +import type { + DatabaseEventPayload, + ObjectRecordCreateEvent, + ObjectRecordDestroyEvent, + ObjectRecordUpdateEvent, +} from 'twenty-sdk/logic-function'; + +type Person = { + id: string; + emails?: { primaryEmail?: string }; +}; +``` + +Yük, şunları içerir: + +| Özellik | Açıklama | +| ------------------------------------------------ | ------------------------------------------------------------------------------------------------- | +| `name` | `person.updated` gibi bir olay adı. | +| `workspaceId` | Olayın gerçekleştiği çalışma alanı. | +| `objectMetadata` | Değişen nesne için üstveri. | +| `recordId` | Değişen kaydın kimliği. | +| `userId`, `userWorkspaceId`, `workspaceMemberId` | Olay bir çalışma alanı kullanıcısı tarafından tetiklendiğinde aktör alanları. | +| `properties` | İşleme bağlı olarak `before`, `after`, `diff` ve `updatedFields` içeren olay için kayıt verileri. | + +| Etkinlik | Kayıt verileri | +| ------------------ | -------------------------------------------------------------------------------------------------------------- | +| `person.created` | `event.properties.after` | +| `person.updated` | `event.properties.before`, `event.properties.after`, `event.properties.diff`, `event.properties.updatedFields` | +| `person.destroyed` | `event.properties.before` | + +Yumuşak silmeler için, kayıt `deletedAt` alanı değiştiğinden `.deleted`, güncelleme tarzı yapıyı izler. +Kalıcı silmeler için `.destroyed` kullanın. + + +`databaseEventTriggerSettings.updatedFields`, hangi güncelleme olaylarının fonksiyonu tetikleyeceğini filtreler. +`event.properties.updatedFields`, mevcut olayda hangi alanların gerçekten değiştiğini size bildirir. + + +Oluşturma olayı örneği: + +```ts +type PersonCreatedEvent = DatabaseEventPayload< + ObjectRecordCreateEvent +>; + +const handler = async (event: PersonCreatedEvent) => { + const person = event.properties.after; + + return { + personId: event.recordId, + email: person.emails?.primaryEmail, + }; +}; +``` + +Güncelleme olayı örneği: + +```ts +type PersonUpdatedEvent = DatabaseEventPayload< + ObjectRecordUpdateEvent +>; + +const handler = async (event: PersonUpdatedEvent) => { + const { before, after, diff, updatedFields } = event.properties; + + return { + personId: event.recordId, + updatedFields, + previousEmail: before.emails?.primaryEmail, + currentEmail: after.emails?.primaryEmail, + emailDiff: diff.emails, + }; +}; +``` + +Yalnızca e-posta güncellemelerinde tetikle: + +```ts +export default defineLogicFunction({ + ..., + databaseEventTriggerSettings: { + eventName: 'person.updated', + updatedFields: ['emails'], + }, +}); +``` + +Yok etme olayı örneği: + +```ts +type PersonDestroyedEvent = DatabaseEventPayload< + ObjectRecordDestroyEvent +>; + +const handler = async (event: PersonDestroyedEvent) => { + const personBeforeDestroy = event.properties.before; + + return { + personId: event.recordId, + email: personBeforeDestroy.emails?.primaryEmail, + }; +}; +``` + #### Bir işlevi bir yapay zekâ aracı veya iş akışı eylemi olarak kullanıma sunma Mantık işlevleri, her birinin kendi tetikleyicisi olacak şekilde iki yerde kullanılabilir hâle getirilebilir: diff --git a/packages/twenty-docs/l/zh/developers/extend/apps/logic/logic-functions.mdx b/packages/twenty-docs/l/zh/developers/extend/apps/logic/logic-functions.mdx index 6e5267f81b..7fcf577f66 100644 --- a/packages/twenty-docs/l/zh/developers/extend/apps/logic/logic-functions.mdx +++ b/packages/twenty-docs/l/zh/developers/extend/apps/logic/logic-functions.mdx @@ -13,8 +13,8 @@ icon: bolt ```ts src/logic-functions/createPostCard.logic-function.ts import { defineLogicFunction } from 'twenty-sdk/define'; -import type { DatabaseEventPayload, ObjectRecordCreateEvent, CronPayload, RoutePayload } from 'twenty-sdk/define'; -import { CoreApiClient, type Person } from 'twenty-client-sdk/core'; +import type { RoutePayload } from 'twenty-sdk/logic-function'; +import { CoreApiClient } from 'twenty-client-sdk/core'; const handler = async (params: RoutePayload) => { const client = new CoreApiClient(); @@ -79,10 +79,10 @@ yarn twenty logs 当路由触发器调用你的逻辑函数时,它会接收一个遵循 [AWS HTTP API v2 格式](https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-develop-integrations-lambda.html)的 `RoutePayload` 对象。 -从 `twenty-sdk` 导入 `RoutePayload` 类型: +从 `twenty-sdk/logic-function` 导入 `RoutePayload` 类型: ```ts -import { defineLogicFunction, type RoutePayload } from 'twenty-sdk/define'; +import type { RoutePayload } from 'twenty-sdk/logic-function'; const handler = async (event: RoutePayload) => { const { headers, queryStringParameters, pathParameters, body } = event; @@ -141,6 +141,115 @@ const handler = async (event: RoutePayload) => { 请求头名称会被规范化为小写。 请使用小写键访问它们(例如,`event.headers['content-type']`)。 +#### 数据库事件触发器有效负载 + +当数据库事件触发器调用你的逻辑函数时,每条被更改的记录都会对应一个 `DatabaseEventPayload`。 该负载将关于源工作区和对象的元数据与记录级事件组合在一起。 + +```ts +import type { + DatabaseEventPayload, + ObjectRecordCreateEvent, + ObjectRecordDestroyEvent, + ObjectRecordUpdateEvent, +} from 'twenty-sdk/logic-function'; + +type Person = { + id: string; + emails?: { primaryEmail?: string }; +}; +``` + +有效负载包括: + +| 属性 | 描述 | +| ------------------------------------------------ | ------------------------------------------------------------ | +| `name` | 事件名称,例如 `person.updated`。 | +| `workspaceId` | 事件发生的工作区。 | +| `objectMetadata` | 已更改对象的元数据。 | +| `recordId` | 已更改记录的 ID。 | +| `userId`, `userWorkspaceId`, `workspaceMemberId` | 当事件由工作区用户触发时的操作者字段。 | +| `properties` | 事件的记录数据,根据操作不同,包含 `before`、`after`、`diff` 和 `updatedFields`。 | + +| 事件 | 记录数据 | +| ------------------ | -------------------------------------------------------------------------------------------------------------- | +| `person.created` | `event.properties.after` | +| `person.updated` | `event.properties.before`, `event.properties.after`, `event.properties.diff`, `event.properties.updatedFields` | +| `person.destroyed` | `event.properties.before` | + +对于软删除,`.deleted` 遵循更新样式的结构,因为记录的 `deletedAt` 字段发生了变化。 +对于永久删除,请使用 `.destroyed`。 + + +`databaseEventTriggerSettings.updatedFields` 会筛选出哪些更新事件会触发该函数。 +`event.properties.updatedFields` 告诉你在当前事件中哪些字段实际发生了变化。 + + +创建事件示例: + +```ts +type PersonCreatedEvent = DatabaseEventPayload< + ObjectRecordCreateEvent +>; + +const handler = async (event: PersonCreatedEvent) => { + const person = event.properties.after; + + return { + personId: event.recordId, + email: person.emails?.primaryEmail, + }; +}; +``` + +更新事件示例: + +```ts +type PersonUpdatedEvent = DatabaseEventPayload< + ObjectRecordUpdateEvent +>; + +const handler = async (event: PersonUpdatedEvent) => { + const { before, after, diff, updatedFields } = event.properties; + + return { + personId: event.recordId, + updatedFields, + previousEmail: before.emails?.primaryEmail, + currentEmail: after.emails?.primaryEmail, + emailDiff: diff.emails, + }; +}; +``` + +仅在 email 更新时触发: + +```ts +export default defineLogicFunction({ + ..., + databaseEventTriggerSettings: { + eventName: 'person.updated', + updatedFields: ['emails'], + }, +}); +``` + +销毁事件示例: + +```ts +type PersonDestroyedEvent = DatabaseEventPayload< + ObjectRecordDestroyEvent +>; + +const handler = async (event: PersonDestroyedEvent) => { + const personBeforeDestroy = event.properties.before; + + return { + personId: event.recordId, + email: personBeforeDestroy.emails?.primaryEmail, + }; +}; +``` + #### 将函数公开为 AI 工具或工作流操作 逻辑函数可以在两个入口对外公开,每个入口都有各自的触发器: