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 工具或工作流操作
逻辑函数可以在两个入口对外公开,每个入口都有各自的触发器: