diff --git a/packages/create-twenty-app/package.json b/packages/create-twenty-app/package.json index 6edc20cd5d..708cbbb0d0 100644 --- a/packages/create-twenty-app/package.json +++ b/packages/create-twenty-app/package.json @@ -1,6 +1,6 @@ { "name": "create-twenty-app", - "version": "0.2.1", + "version": "0.2.2", "description": "Command-line interface to create Twenty application", "main": "dist/cli.cjs", "bin": "dist/cli.cjs", diff --git a/packages/create-twenty-app/src/utils/app-template.ts b/packages/create-twenty-app/src/utils/app-template.ts index c14fa20960..1cedb91386 100644 --- a/packages/create-twenty-app/src/utils/app-template.ts +++ b/packages/create-twenty-app/src/utils/app-template.ts @@ -127,7 +127,7 @@ const createPackageJson = async ({ auth: 'twenty auth login', }, dependencies: { - 'twenty-sdk': '0.2.1', + 'twenty-sdk': '0.2.2', }, devDependencies: { '@types/node': '^24.7.2', diff --git a/packages/twenty-apps/hello-world/package.json b/packages/twenty-apps/hello-world/package.json index 186d5a77b2..d4ee248c08 100644 --- a/packages/twenty-apps/hello-world/package.json +++ b/packages/twenty-apps/hello-world/package.json @@ -17,7 +17,7 @@ "auth": "twenty auth login" }, "dependencies": { - "twenty-sdk": "0.2.1" + "twenty-sdk": "0.2.2" }, "devDependencies": { "@types/node": "^24.7.2" diff --git a/packages/twenty-apps/hello-world/src/actions/create-new-post-card.ts b/packages/twenty-apps/hello-world/src/actions/create-new-post-card.ts index 627ecc3edf..99d05856b0 100644 --- a/packages/twenty-apps/hello-world/src/actions/create-new-post-card.ts +++ b/packages/twenty-apps/hello-world/src/actions/create-new-post-card.ts @@ -1,18 +1,30 @@ -import { type FunctionConfig } from 'twenty-sdk'; -import Twenty from '../../generated'; +import type { + FunctionConfig, + DatabaseEventPayload, + ObjectRecordCreateEvent, + CronPayload, +} from 'twenty-sdk'; +import Twenty, { type Person } from '../../generated'; -export const main = async (params: { recipient?: string }) => { +type CreateNewPostCardParams = + | { name?: string } + | DatabaseEventPayload> + | CronPayload; + +export const main = async (params: CreateNewPostCardParams) => { try { const client = new Twenty(); + const name = + 'name' in params + ? params.name ?? process.env.DEFAULT_RECIPIENT_NAME ?? 'Hello world' + : 'Hello world'; + const createPostCard = await client.mutation({ createPostCard: { __args: { data: { - name: - params.recipient ?? - process.env.DEFAULT_RECIPIENT_NAME ?? - 'Hello world', + name, }, }, name: true, diff --git a/packages/twenty-sdk/package.json b/packages/twenty-sdk/package.json index afc67fd327..ca1e8b6847 100644 --- a/packages/twenty-sdk/package.json +++ b/packages/twenty-sdk/package.json @@ -1,6 +1,6 @@ { "name": "twenty-sdk", - "version": "0.2.1", + "version": "0.2.2", "main": "dist/index.cjs", "module": "dist/index.mjs", "types": "dist/index.d.ts", diff --git a/packages/twenty-sdk/src/application/function-config.ts b/packages/twenty-sdk/src/application/functions/function-config.ts similarity index 100% rename from packages/twenty-sdk/src/application/function-config.ts rename to packages/twenty-sdk/src/application/functions/function-config.ts diff --git a/packages/twenty-sdk/src/application/functions/triggers/cron-payload-type.ts b/packages/twenty-sdk/src/application/functions/triggers/cron-payload-type.ts new file mode 100644 index 0000000000..57053fcef2 --- /dev/null +++ b/packages/twenty-sdk/src/application/functions/triggers/cron-payload-type.ts @@ -0,0 +1 @@ +export type CronPayload = {}; diff --git a/packages/twenty-sdk/src/application/functions/triggers/database-event-payload-type.ts b/packages/twenty-sdk/src/application/functions/triggers/database-event-payload-type.ts new file mode 100644 index 0000000000..34c8ef6c24 --- /dev/null +++ b/packages/twenty-sdk/src/application/functions/triggers/database-event-payload-type.ts @@ -0,0 +1,11 @@ +export type { + DatabaseEventPayload, + ObjectRecordCreateEvent, + ObjectRecordUpdateEvent, + ObjectRecordEvent, + ObjectRecordDeleteEvent, + ObjectRecordDestroyEvent, + ObjectRecordBaseEvent, + ObjectRecordRestoreEvent, + ObjectRecordUpsertEvent, +} from 'twenty-shared/database-events'; diff --git a/packages/twenty-sdk/src/application/index.ts b/packages/twenty-sdk/src/application/index.ts index 9cc820e667..c1e3f6d8cd 100644 --- a/packages/twenty-sdk/src/application/index.ts +++ b/packages/twenty-sdk/src/application/index.ts @@ -23,7 +23,19 @@ export { Field } from './fields/field.decorator'; export { OnDeleteAction } from './fields/on-delete-action'; export { RelationType } from './fields/relation-type'; export { Relation } from './fields/relation.decorator'; -export type { FunctionConfig } from './function-config'; +export type { FunctionConfig } from './functions/function-config'; +export type { CronPayload } from './functions/triggers/cron-payload-type'; +export type { + DatabaseEventPayload, + ObjectRecordCreateEvent, + ObjectRecordUpdateEvent, + ObjectRecordEvent, + ObjectRecordDeleteEvent, + ObjectRecordDestroyEvent, + ObjectRecordBaseEvent, + ObjectRecordRestoreEvent, + ObjectRecordUpsertEvent, +} from './functions/triggers/database-event-payload-type'; export { Object } from './objects/object.decorator'; export { STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS } from './objects/standard-object-ids'; export { PermissionFlag } from './permission-flag-type'; diff --git a/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/listeners/entity-events-to-db.listener.ts b/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/listeners/entity-events-to-db.listener.ts index 47d88ad41b..3d1a34bb53 100644 --- a/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/listeners/entity-events-to-db.listener.ts +++ b/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/listeners/entity-events-to-db.listener.ts @@ -1,15 +1,18 @@ import { Injectable } from '@nestjs/common'; +import { + type ObjectRecordCreateEvent, + type ObjectRecordDeleteEvent, + type ObjectRecordDestroyEvent, + type ObjectRecordRestoreEvent, + type ObjectRecordUpdateEvent, + type ObjectRecordEvent, + type ObjectRecordNonDestructiveEvent, +} from 'twenty-shared/database-events'; + import { OnDatabaseBatchEvent } from 'src/engine/api/graphql/graphql-query-runner/decorators/on-database-batch-event.decorator'; import { DatabaseEventAction } from 'src/engine/api/graphql/graphql-query-runner/enums/database-event-action'; import { CreateAuditLogFromInternalEvent } from 'src/engine/core-modules/audit/jobs/create-audit-log-from-internal-event'; -import { type ObjectRecordCreateEvent } from 'src/engine/core-modules/event-emitter/types/object-record-create.event'; -import { type ObjectRecordDeleteEvent } from 'src/engine/core-modules/event-emitter/types/object-record-delete.event'; -import { type ObjectRecordDestroyEvent } from 'src/engine/core-modules/event-emitter/types/object-record-destroy.event'; -import { type ObjectRecordEvent } from 'src/engine/core-modules/event-emitter/types/object-record-event.event'; -import { type ObjectRecordNonDestructiveEvent } from 'src/engine/core-modules/event-emitter/types/object-record-non-destructive-event'; -import { type ObjectRecordRestoreEvent } from 'src/engine/core-modules/event-emitter/types/object-record-restore.event'; -import { type ObjectRecordUpdateEvent } from 'src/engine/core-modules/event-emitter/types/object-record-update.event'; import { InjectMessageQueue } from 'src/engine/core-modules/message-queue/decorators/message-queue.decorator'; import { MessageQueue } from 'src/engine/core-modules/message-queue/message-queue.constants'; import { MessageQueueService } from 'src/engine/core-modules/message-queue/services/message-queue.service'; diff --git a/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/listeners/telemetry.listener.ts b/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/listeners/telemetry.listener.ts index 9354601751..bf9d5d08b6 100644 --- a/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/listeners/telemetry.listener.ts +++ b/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/listeners/telemetry.listener.ts @@ -1,10 +1,11 @@ import { Injectable } from '@nestjs/common'; +import { type ObjectRecordCreateEvent } from 'twenty-shared/database-events'; + import { OnCustomBatchEvent } from 'src/engine/api/graphql/graphql-query-runner/decorators/on-custom-batch-event.decorator'; import { USER_SIGNUP_EVENT_NAME } from 'src/engine/api/graphql/workspace-query-runner/constants/user-signup-event-name.constants'; import { AuditService } from 'src/engine/core-modules/audit/services/audit.service'; import { USER_SIGNUP_EVENT } from 'src/engine/core-modules/audit/utils/events/workspace-event/user/user-signup'; -import { type ObjectRecordCreateEvent } from 'src/engine/core-modules/event-emitter/types/object-record-create.event'; import { TelemetryService } from 'src/engine/core-modules/telemetry/telemetry.service'; import { CustomWorkspaceEventBatch } from 'src/engine/workspace-event-emitter/types/custom-workspace-batch-event.type'; diff --git a/packages/twenty-server/src/engine/core-modules/audit/jobs/create-audit-log-from-internal-event.ts b/packages/twenty-server/src/engine/core-modules/audit/jobs/create-audit-log-from-internal-event.ts index a7ec5dde9c..71d3afb464 100644 --- a/packages/twenty-server/src/engine/core-modules/audit/jobs/create-audit-log-from-internal-event.ts +++ b/packages/twenty-server/src/engine/core-modules/audit/jobs/create-audit-log-from-internal-event.ts @@ -1,9 +1,10 @@ +import { type ObjectRecordEvent } from 'twenty-shared/database-events'; + import { AuditService } from 'src/engine/core-modules/audit/services/audit.service'; import { OBJECT_RECORD_CREATED_EVENT } from 'src/engine/core-modules/audit/utils/events/object-event/object-record-created'; import { OBJECT_RECORD_DELETED_EVENT } from 'src/engine/core-modules/audit/utils/events/object-event/object-record-delete'; import { OBJECT_RECORD_UPDATED_EVENT } from 'src/engine/core-modules/audit/utils/events/object-event/object-record-updated'; import { OBJECT_RECORD_UPSERTED_EVENT } from 'src/engine/core-modules/audit/utils/events/object-event/object-record-upserted'; -import { type ObjectRecordEvent } from 'src/engine/core-modules/event-emitter/types/object-record-event.event'; import { Process } from 'src/engine/core-modules/message-queue/decorators/process.decorator'; import { Processor } from 'src/engine/core-modules/message-queue/decorators/processor.decorator'; import { MessageQueue } from 'src/engine/core-modules/message-queue/message-queue.constants'; diff --git a/packages/twenty-server/src/engine/core-modules/billing/listeners/billing-workspace-member.listener.ts b/packages/twenty-server/src/engine/core-modules/billing/listeners/billing-workspace-member.listener.ts index 198093664c..eebf419a84 100644 --- a/packages/twenty-server/src/engine/core-modules/billing/listeners/billing-workspace-member.listener.ts +++ b/packages/twenty-server/src/engine/core-modules/billing/listeners/billing-workspace-member.listener.ts @@ -2,13 +2,14 @@ import { Injectable } from '@nestjs/common'; +import { type ObjectRecordCreateEvent } from 'twenty-shared/database-events'; + import { OnDatabaseBatchEvent } from 'src/engine/api/graphql/graphql-query-runner/decorators/on-database-batch-event.decorator'; import { DatabaseEventAction } from 'src/engine/api/graphql/graphql-query-runner/enums/database-event-action'; import { UpdateSubscriptionQuantityJob, type UpdateSubscriptionQuantityJobData, } from 'src/engine/core-modules/billing/jobs/update-subscription-quantity.job'; -import { type ObjectRecordCreateEvent } from 'src/engine/core-modules/event-emitter/types/object-record-create.event'; import { InjectMessageQueue } from 'src/engine/core-modules/message-queue/decorators/message-queue.decorator'; import { MessageQueue } from 'src/engine/core-modules/message-queue/message-queue.constants'; import { MessageQueueService } from 'src/engine/core-modules/message-queue/services/message-queue.service'; diff --git a/packages/twenty-server/src/engine/core-modules/event-emitter/types/object-record-create.event.ts b/packages/twenty-server/src/engine/core-modules/event-emitter/types/object-record-create.event.ts deleted file mode 100644 index 45c4f68dc6..0000000000 --- a/packages/twenty-server/src/engine/core-modules/event-emitter/types/object-record-create.event.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { ObjectRecordBaseEvent } from 'src/engine/core-modules/event-emitter/types/object-record.base.event'; - -export class ObjectRecordCreateEvent< - T = object, -> extends ObjectRecordBaseEvent { - properties: { - after: T; - }; -} diff --git a/packages/twenty-server/src/engine/core-modules/event-emitter/types/object-record-delete.event.ts b/packages/twenty-server/src/engine/core-modules/event-emitter/types/object-record-delete.event.ts deleted file mode 100644 index b9717ba134..0000000000 --- a/packages/twenty-server/src/engine/core-modules/event-emitter/types/object-record-delete.event.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { ObjectRecordBaseEvent } from 'src/engine/core-modules/event-emitter/types/object-record.base.event'; - -export class ObjectRecordDeleteEvent< - T = object, -> extends ObjectRecordBaseEvent { - properties: { - before: T; - }; -} diff --git a/packages/twenty-server/src/engine/core-modules/event-emitter/types/object-record-destroy.event.ts b/packages/twenty-server/src/engine/core-modules/event-emitter/types/object-record-destroy.event.ts deleted file mode 100644 index 6f1ae908ef..0000000000 --- a/packages/twenty-server/src/engine/core-modules/event-emitter/types/object-record-destroy.event.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { ObjectRecordBaseEvent } from 'src/engine/core-modules/event-emitter/types/object-record.base.event'; - -export class ObjectRecordDestroyEvent< - T = object, -> extends ObjectRecordBaseEvent { - properties: { - before: T; - }; -} diff --git a/packages/twenty-server/src/engine/core-modules/event-emitter/types/object-record-event.event.ts b/packages/twenty-server/src/engine/core-modules/event-emitter/types/object-record-event.event.ts deleted file mode 100644 index b721f4d0e5..0000000000 --- a/packages/twenty-server/src/engine/core-modules/event-emitter/types/object-record-event.event.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { type ObjectRecordCreateEvent } from 'src/engine/core-modules/event-emitter/types/object-record-create.event'; -import { type ObjectRecordDeleteEvent } from 'src/engine/core-modules/event-emitter/types/object-record-delete.event'; -import { type ObjectRecordDestroyEvent } from 'src/engine/core-modules/event-emitter/types/object-record-destroy.event'; -import { type ObjectRecordRestoreEvent } from 'src/engine/core-modules/event-emitter/types/object-record-restore.event'; -import { type ObjectRecordUpdateEvent } from 'src/engine/core-modules/event-emitter/types/object-record-update.event'; -import { type ObjectRecordUpsertEvent } from 'src/engine/core-modules/event-emitter/types/object-record-upsert.event'; - -export type ObjectRecordEvent = - | ObjectRecordUpdateEvent - | ObjectRecordDeleteEvent - | ObjectRecordCreateEvent - | ObjectRecordDestroyEvent - | ObjectRecordRestoreEvent - | ObjectRecordUpsertEvent; diff --git a/packages/twenty-server/src/engine/core-modules/event-emitter/types/object-record-non-destructive-event.ts b/packages/twenty-server/src/engine/core-modules/event-emitter/types/object-record-non-destructive-event.ts deleted file mode 100644 index fd36fcf575..0000000000 --- a/packages/twenty-server/src/engine/core-modules/event-emitter/types/object-record-non-destructive-event.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { type ObjectRecordCreateEvent } from 'src/engine/core-modules/event-emitter/types/object-record-create.event'; -import { type ObjectRecordDeleteEvent } from 'src/engine/core-modules/event-emitter/types/object-record-delete.event'; -import { type ObjectRecordRestoreEvent } from 'src/engine/core-modules/event-emitter/types/object-record-restore.event'; -import { type ObjectRecordUpdateEvent } from 'src/engine/core-modules/event-emitter/types/object-record-update.event'; -import { type ObjectRecordUpsertEvent } from 'src/engine/core-modules/event-emitter/types/object-record-upsert.event'; - -export type ObjectRecordNonDestructiveEvent = - | ObjectRecordCreateEvent - | ObjectRecordUpdateEvent - | ObjectRecordDeleteEvent - | ObjectRecordRestoreEvent - | ObjectRecordUpsertEvent; diff --git a/packages/twenty-server/src/engine/core-modules/event-emitter/types/object-record-restore.event.ts b/packages/twenty-server/src/engine/core-modules/event-emitter/types/object-record-restore.event.ts deleted file mode 100644 index 070ecb0df5..0000000000 --- a/packages/twenty-server/src/engine/core-modules/event-emitter/types/object-record-restore.event.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { ObjectRecordCreateEvent } from 'src/engine/core-modules/event-emitter/types/object-record-create.event'; - -export class ObjectRecordRestoreEvent< - T = object, -> extends ObjectRecordCreateEvent { - properties: { - after: T; - }; -} diff --git a/packages/twenty-server/src/engine/core-modules/event-emitter/types/object-record-update.event.ts b/packages/twenty-server/src/engine/core-modules/event-emitter/types/object-record-update.event.ts deleted file mode 100644 index df2240aff3..0000000000 --- a/packages/twenty-server/src/engine/core-modules/event-emitter/types/object-record-update.event.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { type ObjectRecordDiff } from 'src/engine/core-modules/event-emitter/types/object-record-diff'; -import { ObjectRecordBaseEvent } from 'src/engine/core-modules/event-emitter/types/object-record.base.event'; - -export class ObjectRecordUpdateEvent< - T = object, -> extends ObjectRecordBaseEvent { - properties: { - updatedFields?: string[]; - diff?: Partial>; - before: T; - after: T; - }; -} diff --git a/packages/twenty-server/src/engine/core-modules/event-emitter/types/object-record-upsert.event.ts b/packages/twenty-server/src/engine/core-modules/event-emitter/types/object-record-upsert.event.ts deleted file mode 100644 index e1d165b2b6..0000000000 --- a/packages/twenty-server/src/engine/core-modules/event-emitter/types/object-record-upsert.event.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { type ObjectRecordDiff } from 'src/engine/core-modules/event-emitter/types/object-record-diff'; -import { ObjectRecordBaseEvent } from 'src/engine/core-modules/event-emitter/types/object-record.base.event'; - -export class ObjectRecordUpsertEvent< - T = object, -> extends ObjectRecordBaseEvent { - properties: { - before?: T; - after: T; - diff?: Partial>; - updatedFields?: string[]; - }; -} diff --git a/packages/twenty-server/src/engine/core-modules/file/listeners/file-attachment.listener.ts b/packages/twenty-server/src/engine/core-modules/file/listeners/file-attachment.listener.ts index d7454a8cd4..a930923d43 100644 --- a/packages/twenty-server/src/engine/core-modules/file/listeners/file-attachment.listener.ts +++ b/packages/twenty-server/src/engine/core-modules/file/listeners/file-attachment.listener.ts @@ -1,8 +1,9 @@ import { Injectable } from '@nestjs/common'; +import { type ObjectRecordDestroyEvent } from 'twenty-shared/database-events'; + import { OnDatabaseBatchEvent } from 'src/engine/api/graphql/graphql-query-runner/decorators/on-database-batch-event.decorator'; import { DatabaseEventAction } from 'src/engine/api/graphql/graphql-query-runner/enums/database-event-action'; -import { type ObjectRecordDestroyEvent } from 'src/engine/core-modules/event-emitter/types/object-record-destroy.event'; import { FileDeletionJob, type FileDeletionJobData, diff --git a/packages/twenty-server/src/engine/core-modules/file/listeners/file-workspace-member.listener.ts b/packages/twenty-server/src/engine/core-modules/file/listeners/file-workspace-member.listener.ts index 69d335fe7e..cf7cc5af99 100644 --- a/packages/twenty-server/src/engine/core-modules/file/listeners/file-workspace-member.listener.ts +++ b/packages/twenty-server/src/engine/core-modules/file/listeners/file-workspace-member.listener.ts @@ -1,8 +1,9 @@ import { Injectable } from '@nestjs/common'; +import { type ObjectRecordDestroyEvent } from 'twenty-shared/database-events'; + import { OnDatabaseBatchEvent } from 'src/engine/api/graphql/graphql-query-runner/decorators/on-database-batch-event.decorator'; import { DatabaseEventAction } from 'src/engine/api/graphql/graphql-query-runner/enums/database-event-action'; -import { type ObjectRecordDestroyEvent } from 'src/engine/core-modules/event-emitter/types/object-record-destroy.event'; import { FileDeletionJob, type FileDeletionJobData, diff --git a/packages/twenty-server/src/engine/core-modules/webhook/jobs/call-webhook-jobs.job.ts b/packages/twenty-server/src/engine/core-modules/webhook/jobs/call-webhook-jobs.job.ts index b6c6c1b75b..60758682c4 100644 --- a/packages/twenty-server/src/engine/core-modules/webhook/jobs/call-webhook-jobs.job.ts +++ b/packages/twenty-server/src/engine/core-modules/webhook/jobs/call-webhook-jobs.job.ts @@ -2,6 +2,8 @@ import { Logger } from '@nestjs/common'; import chunk from 'lodash.chunk'; +import type { ObjectRecordEvent } from 'twenty-shared/database-events'; + import { InjectMessageQueue } from 'src/engine/core-modules/message-queue/decorators/message-queue.decorator'; import { Process } from 'src/engine/core-modules/message-queue/decorators/process.decorator'; import { Processor } from 'src/engine/core-modules/message-queue/decorators/processor.decorator'; @@ -13,7 +15,6 @@ import { } from 'src/engine/core-modules/webhook/jobs/call-webhook.job'; import { WebhookService } from 'src/engine/core-modules/webhook/webhook.service'; import { WorkspaceEventBatch } from 'src/engine/workspace-event-emitter/types/workspace-event-batch.type'; -import type { ObjectRecordEvent } from 'src/engine/core-modules/event-emitter/types/object-record-event.event'; import { transformEventBatchToWebhookEvents } from 'src/engine/core-modules/webhook/utils/transform-event-batch-to-webhook-events'; const WEBHOOK_JOBS_CHUNK_SIZE = 20; diff --git a/packages/twenty-server/src/engine/core-modules/webhook/utils/__tests__/transform-event-batch-to-webhook-events.spec.ts b/packages/twenty-server/src/engine/core-modules/webhook/utils/__tests__/transform-event-batch-to-webhook-events.spec.ts index ea8f40ed81..745e40a362 100644 --- a/packages/twenty-server/src/engine/core-modules/webhook/utils/__tests__/transform-event-batch-to-webhook-events.spec.ts +++ b/packages/twenty-server/src/engine/core-modules/webhook/utils/__tests__/transform-event-batch-to-webhook-events.spec.ts @@ -1,5 +1,6 @@ +import type { ObjectRecordEvent } from 'twenty-shared/database-events'; + import { type WorkspaceEventBatch } from 'src/engine/workspace-event-emitter/types/workspace-event-batch.type'; -import type { ObjectRecordEvent } from 'src/engine/core-modules/event-emitter/types/object-record-event.event'; import type { WebhookEntity } from 'src/engine/core-modules/webhook/webhook.entity'; import { transformEventBatchToWebhookEvents } from 'src/engine/core-modules/webhook/utils/transform-event-batch-to-webhook-events'; import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type'; diff --git a/packages/twenty-server/src/engine/core-modules/webhook/utils/__tests__/transform-event-to-webhook-event.spec.ts b/packages/twenty-server/src/engine/core-modules/webhook/utils/__tests__/transform-event-to-webhook-event.spec.ts index b2b32bccf0..33c966d578 100644 --- a/packages/twenty-server/src/engine/core-modules/webhook/utils/__tests__/transform-event-to-webhook-event.spec.ts +++ b/packages/twenty-server/src/engine/core-modules/webhook/utils/__tests__/transform-event-to-webhook-event.spec.ts @@ -1,5 +1,6 @@ +import type { ObjectRecordEvent } from 'twenty-shared/database-events'; + import { transformEventToWebhookEvent } from 'src/engine/core-modules/webhook/utils/transform-event-to-webhook-event'; -import type { ObjectRecordEvent } from 'src/engine/core-modules/event-emitter/types/object-record-event.event'; describe('transformEventToWebhookEvent', () => { it('should transform event to webhook event', () => { diff --git a/packages/twenty-server/src/engine/core-modules/webhook/utils/transform-event-batch-to-webhook-events.ts b/packages/twenty-server/src/engine/core-modules/webhook/utils/transform-event-batch-to-webhook-events.ts index af8aa9a452..ca5d997935 100644 --- a/packages/twenty-server/src/engine/core-modules/webhook/utils/transform-event-batch-to-webhook-events.ts +++ b/packages/twenty-server/src/engine/core-modules/webhook/utils/transform-event-batch-to-webhook-events.ts @@ -1,7 +1,8 @@ +import type { ObjectRecordEvent } from 'twenty-shared/database-events'; + import { type WorkspaceEventBatch } from 'src/engine/workspace-event-emitter/types/workspace-event-batch.type'; import { type CallWebhookJobData } from 'src/engine/core-modules/webhook/jobs/call-webhook.job'; import { type WebhookEntity } from 'src/engine/core-modules/webhook/webhook.entity'; -import type { ObjectRecordEvent } from 'src/engine/core-modules/event-emitter/types/object-record-event.event'; import { transformEventToWebhookEvent } from 'src/engine/core-modules/webhook/utils/transform-event-to-webhook-event'; export const transformEventBatchToWebhookEvents = ({ diff --git a/packages/twenty-server/src/engine/core-modules/webhook/utils/transform-event-to-webhook-event.ts b/packages/twenty-server/src/engine/core-modules/webhook/utils/transform-event-to-webhook-event.ts index 9d7eb45de5..c0397069c4 100644 --- a/packages/twenty-server/src/engine/core-modules/webhook/utils/transform-event-to-webhook-event.ts +++ b/packages/twenty-server/src/engine/core-modules/webhook/utils/transform-event-to-webhook-event.ts @@ -1,6 +1,7 @@ import { isDefined } from 'twenty-shared/utils'; -import type { ObjectRecordEvent } from 'src/engine/core-modules/event-emitter/types/object-record-event.event'; +import type { ObjectRecordEvent } from 'twenty-shared/database-events'; + import { removeSecretFromWebhookRecord } from 'src/utils/remove-secret-from-webhook-record'; export const transformEventToWebhookEvent = ({ diff --git a/packages/twenty-server/src/engine/metadata-modules/database-event-trigger/jobs/call-database-event-trigger-jobs.job.ts b/packages/twenty-server/src/engine/metadata-modules/database-event-trigger/jobs/call-database-event-trigger-jobs.job.ts index d2c825ab49..dabac8add5 100644 --- a/packages/twenty-server/src/engine/metadata-modules/database-event-trigger/jobs/call-database-event-trigger-jobs.job.ts +++ b/packages/twenty-server/src/engine/metadata-modules/database-event-trigger/jobs/call-database-event-trigger-jobs.job.ts @@ -1,8 +1,10 @@ import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; +import chunk from 'lodash.chunk'; + +import type { ObjectRecordEvent } from 'twenty-shared/database-events'; -import type { ObjectRecordEvent } from 'src/engine/core-modules/event-emitter/types/object-record-event.event'; import { InjectMessageQueue } from 'src/engine/core-modules/message-queue/decorators/message-queue.decorator'; import { Process } from 'src/engine/core-modules/message-queue/decorators/process.decorator'; import { Processor } from 'src/engine/core-modules/message-queue/decorators/processor.decorator'; @@ -14,6 +16,9 @@ import { ServerlessFunctionTriggerJobData, } from 'src/engine/metadata-modules/serverless-function/jobs/serverless-function-trigger.job'; import { WorkspaceEventBatch } from 'src/engine/workspace-event-emitter/types/workspace-event-batch.type'; +import { transformEventBatchToEventPayloads } from 'src/engine/metadata-modules/database-event-trigger/utils/transform-event-batch-to-event-payloads'; + +const DATABASE_EVENT_JOBS_CHUNK_SIZE = 20; @Processor(MessageQueue.triggerQueue) export class CallDatabaseEventTriggerJobsJob { @@ -35,29 +40,30 @@ export class CallDatabaseEventTriggerJobsJob { relations: ['serverlessFunction'], }); - for (const databaseEventListener of databaseEventListeners) { - if ( - !this.shouldTriggerJob({ + const databaseEventListenersToTrigger = databaseEventListeners.filter( + (databaseEventListener) => + this.shouldTriggerJob({ workspaceEventBatch, eventName: databaseEventListener.settings.eventName, - }) - ) { - continue; - } + }), + ); - const { events, ...batchEventInfo } = workspaceEventBatch; + const serverlessFunctionPayloads = transformEventBatchToEventPayloads({ + databaseEventListeners: databaseEventListenersToTrigger, + workspaceEventBatch, + }); - for (const event of events) { - await this.messageQueueService.add( - ServerlessFunctionTriggerJob.name, - { - serverlessFunctionId: databaseEventListener.serverlessFunction.id, - workspaceId: databaseEventListener.workspaceId, - payload: { ...batchEventInfo, ...event }, - }, - { retryLimit: 3 }, - ); - } + const serverlessFunctionPayloadsChunks = chunk( + serverlessFunctionPayloads, + DATABASE_EVENT_JOBS_CHUNK_SIZE, + ); + + for (const serverlessFunctionPayloadsChunk of serverlessFunctionPayloadsChunks) { + await this.messageQueueService.add( + ServerlessFunctionTriggerJob.name, + serverlessFunctionPayloadsChunk, + { retryLimit: 3 }, + ); } } diff --git a/packages/twenty-server/src/engine/metadata-modules/database-event-trigger/utils/transform-event-batch-to-event-payloads.ts b/packages/twenty-server/src/engine/metadata-modules/database-event-trigger/utils/transform-event-batch-to-event-payloads.ts new file mode 100644 index 0000000000..da4c8550a4 --- /dev/null +++ b/packages/twenty-server/src/engine/metadata-modules/database-event-trigger/utils/transform-event-batch-to-event-payloads.ts @@ -0,0 +1,34 @@ +import type { + DatabaseEventPayload, + ObjectRecordEvent, +} from 'twenty-shared/database-events'; + +import type { WorkspaceEventBatch } from 'src/engine/workspace-event-emitter/types/workspace-event-batch.type'; +import { type DatabaseEventTriggerEntity } from 'src/engine/metadata-modules/database-event-trigger/entities/database-event-trigger.entity'; +import { type ServerlessFunctionTriggerJobData } from 'src/engine/metadata-modules/serverless-function/jobs/serverless-function-trigger.job'; + +export const transformEventBatchToEventPayloads = ({ + workspaceEventBatch, + databaseEventListeners, +}: { + workspaceEventBatch: WorkspaceEventBatch; + databaseEventListeners: DatabaseEventTriggerEntity[]; +}): ServerlessFunctionTriggerJobData[] => { + const result: ServerlessFunctionTriggerJobData[] = []; + + for (const databaseEventListener of databaseEventListeners) { + const { events, ...batchEventInfo } = workspaceEventBatch; + + for (const event of events) { + const payload: DatabaseEventPayload = { ...batchEventInfo, ...event }; + + result.push({ + serverlessFunctionId: databaseEventListener.serverlessFunction.id, + workspaceId: databaseEventListener.workspaceId, + payload, + }); + } + } + + return result; +}; diff --git a/packages/twenty-server/src/engine/metadata-modules/serverless-function/jobs/serverless-function-trigger.job.ts b/packages/twenty-server/src/engine/metadata-modules/serverless-function/jobs/serverless-function-trigger.job.ts index ec32dd3acf..1945be6115 100644 --- a/packages/twenty-server/src/engine/metadata-modules/serverless-function/jobs/serverless-function-trigger.job.ts +++ b/packages/twenty-server/src/engine/metadata-modules/serverless-function/jobs/serverless-function-trigger.job.ts @@ -21,12 +21,17 @@ export class ServerlessFunctionTriggerJob { ) {} @Process(ServerlessFunctionTriggerJob.name) - async handle(data: ServerlessFunctionTriggerJobData) { - await this.serverlessFunctionService.executeOneServerlessFunction({ - id: data.serverlessFunctionId, - workspaceId: data.workspaceId, - payload: data.payload || {}, - version: 'draft', - }); + async handle(serverlessFunctionPayloads: ServerlessFunctionTriggerJobData[]) { + await Promise.all( + serverlessFunctionPayloads.map( + async (serverlessFunctionPayload) => + await this.serverlessFunctionService.executeOneServerlessFunction({ + id: serverlessFunctionPayload.serverlessFunctionId, + workspaceId: serverlessFunctionPayload.workspaceId, + payload: serverlessFunctionPayload.payload || {}, + version: 'draft', + }), + ), + ); } } diff --git a/packages/twenty-server/src/engine/subscriptions/subscriptions.service.ts b/packages/twenty-server/src/engine/subscriptions/subscriptions.service.ts index 46a14c04f6..d8ef4da31e 100644 --- a/packages/twenty-server/src/engine/subscriptions/subscriptions.service.ts +++ b/packages/twenty-server/src/engine/subscriptions/subscriptions.service.ts @@ -1,8 +1,8 @@ import { Inject, Injectable } from '@nestjs/common'; import { RedisPubSub } from 'graphql-redis-subscriptions'; +import { type ObjectRecordEvent } from 'twenty-shared/database-events'; -import { type ObjectRecordEvent } from 'src/engine/core-modules/event-emitter/types/object-record-event.event'; import { WorkspaceEventBatch } from 'src/engine/workspace-event-emitter/types/workspace-event-batch.type'; import { transformEventToWebhookEvent } from 'src/engine/core-modules/webhook/utils/transform-event-to-webhook-event'; import { ON_DB_EVENT_TRIGGER } from 'src/engine/subscriptions/constants/on-db-event-trigger'; diff --git a/packages/twenty-server/src/engine/twenty-orm/utils/__tests__/format-twenty-orm-event-to-database-batch-event.util.spec.ts b/packages/twenty-server/src/engine/twenty-orm/utils/__tests__/format-twenty-orm-event-to-database-batch-event.util.spec.ts index 5d80562404..6a30ed6990 100644 --- a/packages/twenty-server/src/engine/twenty-orm/utils/__tests__/format-twenty-orm-event-to-database-batch-event.util.spec.ts +++ b/packages/twenty-server/src/engine/twenty-orm/utils/__tests__/format-twenty-orm-event-to-database-batch-event.util.spec.ts @@ -1,7 +1,7 @@ import { FieldMetadataType } from 'twenty-shared/types'; +import { type ObjectRecordUpdateEvent } from 'twenty-shared/database-events'; import { DatabaseEventAction } from 'src/engine/api/graphql/graphql-query-runner/enums/database-event-action'; -import { type ObjectRecordUpdateEvent } from 'src/engine/core-modules/event-emitter/types/object-record-update.event'; import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type'; import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type'; diff --git a/packages/twenty-server/src/engine/twenty-orm/utils/format-twenty-orm-event-to-database-batch-event.util.ts b/packages/twenty-server/src/engine/twenty-orm/utils/format-twenty-orm-event-to-database-batch-event.util.ts index f9402a2065..31a47aba79 100644 --- a/packages/twenty-server/src/engine/twenty-orm/utils/format-twenty-orm-event-to-database-batch-event.util.ts +++ b/packages/twenty-server/src/engine/twenty-orm/utils/format-twenty-orm-event-to-database-batch-event.util.ts @@ -1,16 +1,18 @@ import { STANDARD_OBJECT_IDS } from 'twenty-shared/metadata'; import { isDefined } from 'twenty-shared/utils'; +import { + ObjectRecordCreateEvent, + ObjectRecordDeleteEvent, + ObjectRecordDestroyEvent, + ObjectRecordUpdateEvent, + ObjectRecordUpsertEvent, + type ObjectRecordDiff, +} from 'twenty-shared/database-events'; import type { ObjectLiteral } from 'typeorm'; import { DatabaseEventAction } from 'src/engine/api/graphql/graphql-query-runner/enums/database-event-action'; import type { AuthContext } from 'src/engine/core-modules/auth/types/auth-context.type'; -import { ObjectRecordCreateEvent } from 'src/engine/core-modules/event-emitter/types/object-record-create.event'; -import { ObjectRecordDeleteEvent } from 'src/engine/core-modules/event-emitter/types/object-record-delete.event'; -import { ObjectRecordDestroyEvent } from 'src/engine/core-modules/event-emitter/types/object-record-destroy.event'; -import type { ObjectRecordDiff } from 'src/engine/core-modules/event-emitter/types/object-record-diff'; -import { ObjectRecordUpdateEvent } from 'src/engine/core-modules/event-emitter/types/object-record-update.event'; -import { ObjectRecordUpsertEvent } from 'src/engine/core-modules/event-emitter/types/object-record-upsert.event'; import { objectRecordChangedValues } from 'src/engine/core-modules/event-emitter/utils/object-record-changed-values'; import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type'; import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; diff --git a/packages/twenty-server/src/engine/workspace-event-emitter/workspace-event-emitter.ts b/packages/twenty-server/src/engine/workspace-event-emitter/workspace-event-emitter.ts index 6beda6e6d6..4bd199a8e6 100644 --- a/packages/twenty-server/src/engine/workspace-event-emitter/workspace-event-emitter.ts +++ b/packages/twenty-server/src/engine/workspace-event-emitter/workspace-event-emitter.ts @@ -2,14 +2,16 @@ import { Injectable } from '@nestjs/common'; import { EventEmitter2 } from '@nestjs/event-emitter'; import { isDefined } from 'twenty-shared/utils'; +import { + ObjectRecordCreateEvent, + ObjectRecordDeleteEvent, + ObjectRecordDestroyEvent, + ObjectRecordUpdateEvent, + ObjectRecordUpsertEvent, + ObjectRecordRestoreEvent, +} from 'twenty-shared/database-events'; import { DatabaseEventAction } from 'src/engine/api/graphql/graphql-query-runner/enums/database-event-action'; -import { ObjectRecordCreateEvent } from 'src/engine/core-modules/event-emitter/types/object-record-create.event'; -import { ObjectRecordDeleteEvent } from 'src/engine/core-modules/event-emitter/types/object-record-delete.event'; -import { ObjectRecordDestroyEvent } from 'src/engine/core-modules/event-emitter/types/object-record-destroy.event'; -import { type ObjectRecordRestoreEvent } from 'src/engine/core-modules/event-emitter/types/object-record-restore.event'; -import { ObjectRecordUpdateEvent } from 'src/engine/core-modules/event-emitter/types/object-record-update.event'; -import { ObjectRecordUpsertEvent } from 'src/engine/core-modules/event-emitter/types/object-record-upsert.event'; import type { FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type'; import { type CustomEventName } from 'src/engine/workspace-event-emitter/types/custom-event-name.type'; import { CustomWorkspaceEventBatch } from 'src/engine/workspace-event-emitter/types/custom-workspace-batch-event.type'; diff --git a/packages/twenty-server/src/modules/calendar/blocklist-manager/jobs/blocklist-item-delete-calendar-events.job.ts b/packages/twenty-server/src/modules/calendar/blocklist-manager/jobs/blocklist-item-delete-calendar-events.job.ts index 5c6e9aa770..718e922f56 100644 --- a/packages/twenty-server/src/modules/calendar/blocklist-manager/jobs/blocklist-item-delete-calendar-events.job.ts +++ b/packages/twenty-server/src/modules/calendar/blocklist-manager/jobs/blocklist-item-delete-calendar-events.job.ts @@ -2,8 +2,8 @@ import { Scope } from '@nestjs/common'; import { isDefined } from 'twenty-shared/utils'; import { And, Any, ILike, In, Not, Or } from 'typeorm'; +import { type ObjectRecordCreateEvent } from 'twenty-shared/database-events'; -import { type ObjectRecordCreateEvent } from 'src/engine/core-modules/event-emitter/types/object-record-create.event'; import { Process } from 'src/engine/core-modules/message-queue/decorators/process.decorator'; import { Processor } from 'src/engine/core-modules/message-queue/decorators/processor.decorator'; import { MessageQueue } from 'src/engine/core-modules/message-queue/message-queue.constants'; diff --git a/packages/twenty-server/src/modules/calendar/blocklist-manager/jobs/blocklist-reimport-calendar-events.job.ts b/packages/twenty-server/src/modules/calendar/blocklist-manager/jobs/blocklist-reimport-calendar-events.job.ts index 7c4afd1663..6cc56b3479 100644 --- a/packages/twenty-server/src/modules/calendar/blocklist-manager/jobs/blocklist-reimport-calendar-events.job.ts +++ b/packages/twenty-server/src/modules/calendar/blocklist-manager/jobs/blocklist-reimport-calendar-events.job.ts @@ -1,8 +1,8 @@ import { Scope } from '@nestjs/common'; import { Not } from 'typeorm'; +import { type ObjectRecordDeleteEvent } from 'twenty-shared/database-events'; -import { type ObjectRecordDeleteEvent } from 'src/engine/core-modules/event-emitter/types/object-record-delete.event'; import { Process } from 'src/engine/core-modules/message-queue/decorators/process.decorator'; import { Processor } from 'src/engine/core-modules/message-queue/decorators/processor.decorator'; import { MessageQueue } from 'src/engine/core-modules/message-queue/message-queue.constants'; diff --git a/packages/twenty-server/src/modules/calendar/blocklist-manager/listeners/calendar-blocklist.listener.ts b/packages/twenty-server/src/modules/calendar/blocklist-manager/listeners/calendar-blocklist.listener.ts index 39a5fc7c50..62df51593c 100644 --- a/packages/twenty-server/src/modules/calendar/blocklist-manager/listeners/calendar-blocklist.listener.ts +++ b/packages/twenty-server/src/modules/calendar/blocklist-manager/listeners/calendar-blocklist.listener.ts @@ -1,8 +1,11 @@ import { Injectable } from '@nestjs/common'; -import { type ObjectRecordCreateEvent } from 'src/engine/core-modules/event-emitter/types/object-record-create.event'; -import { type ObjectRecordDeleteEvent } from 'src/engine/core-modules/event-emitter/types/object-record-delete.event'; -import { type ObjectRecordUpdateEvent } from 'src/engine/core-modules/event-emitter/types/object-record-update.event'; +import { + type ObjectRecordCreateEvent, + type ObjectRecordDeleteEvent, + type ObjectRecordUpdateEvent, +} from 'twenty-shared/database-events'; + import { InjectMessageQueue } from 'src/engine/core-modules/message-queue/decorators/message-queue.decorator'; import { MessageQueue } from 'src/engine/core-modules/message-queue/message-queue.constants'; import { MessageQueueService } from 'src/engine/core-modules/message-queue/services/message-queue.service'; diff --git a/packages/twenty-server/src/modules/calendar/calendar-event-cleaner/listeners/calendar-event-cleaner-connected-account.listener.ts b/packages/twenty-server/src/modules/calendar/calendar-event-cleaner/listeners/calendar-event-cleaner-connected-account.listener.ts index 3096643788..01dd38e910 100644 --- a/packages/twenty-server/src/modules/calendar/calendar-event-cleaner/listeners/calendar-event-cleaner-connected-account.listener.ts +++ b/packages/twenty-server/src/modules/calendar/calendar-event-cleaner/listeners/calendar-event-cleaner-connected-account.listener.ts @@ -1,6 +1,7 @@ import { Injectable } from '@nestjs/common'; -import { type ObjectRecordDeleteEvent } from 'src/engine/core-modules/event-emitter/types/object-record-delete.event'; +import { type ObjectRecordDeleteEvent } from 'twenty-shared/database-events'; + import { InjectMessageQueue } from 'src/engine/core-modules/message-queue/decorators/message-queue.decorator'; import { MessageQueue } from 'src/engine/core-modules/message-queue/message-queue.constants'; import { MessageQueueService } from 'src/engine/core-modules/message-queue/services/message-queue.service'; diff --git a/packages/twenty-server/src/modules/calendar/calendar-event-participant-manager/listeners/calendar-event-participant-person.listener.ts b/packages/twenty-server/src/modules/calendar/calendar-event-participant-manager/listeners/calendar-event-participant-person.listener.ts index 4881e83aae..0700578865 100644 --- a/packages/twenty-server/src/modules/calendar/calendar-event-participant-manager/listeners/calendar-event-participant-person.listener.ts +++ b/packages/twenty-server/src/modules/calendar/calendar-event-participant-manager/listeners/calendar-event-participant-person.listener.ts @@ -1,12 +1,14 @@ import { Injectable } from '@nestjs/common'; import { isDefined } from 'twenty-shared/utils'; +import { + type ObjectRecordCreateEvent, + type ObjectRecordDeleteEvent, + type ObjectRecordUpdateEvent, +} from 'twenty-shared/database-events'; import { OnDatabaseBatchEvent } from 'src/engine/api/graphql/graphql-query-runner/decorators/on-database-batch-event.decorator'; import { DatabaseEventAction } from 'src/engine/api/graphql/graphql-query-runner/enums/database-event-action'; -import { type ObjectRecordCreateEvent } from 'src/engine/core-modules/event-emitter/types/object-record-create.event'; -import { type ObjectRecordDeleteEvent } from 'src/engine/core-modules/event-emitter/types/object-record-delete.event'; -import { type ObjectRecordUpdateEvent } from 'src/engine/core-modules/event-emitter/types/object-record-update.event'; import { objectRecordChangedProperties as objectRecordUpdateEventChangedProperties } from 'src/engine/core-modules/event-emitter/utils/object-record-changed-properties.util'; import { InjectMessageQueue } from 'src/engine/core-modules/message-queue/decorators/message-queue.decorator'; import { MessageQueue } from 'src/engine/core-modules/message-queue/message-queue.constants'; diff --git a/packages/twenty-server/src/modules/calendar/calendar-event-participant-manager/listeners/calendar-event-participant-workspace-member.listener.ts b/packages/twenty-server/src/modules/calendar/calendar-event-participant-manager/listeners/calendar-event-participant-workspace-member.listener.ts index b9313a3622..879dbd7753 100644 --- a/packages/twenty-server/src/modules/calendar/calendar-event-participant-manager/listeners/calendar-event-participant-workspace-member.listener.ts +++ b/packages/twenty-server/src/modules/calendar/calendar-event-participant-manager/listeners/calendar-event-participant-workspace-member.listener.ts @@ -1,9 +1,12 @@ import { Injectable } from '@nestjs/common'; +import { + type ObjectRecordCreateEvent, + type ObjectRecordUpdateEvent, +} from 'twenty-shared/database-events'; + import { OnDatabaseBatchEvent } from 'src/engine/api/graphql/graphql-query-runner/decorators/on-database-batch-event.decorator'; import { DatabaseEventAction } from 'src/engine/api/graphql/graphql-query-runner/enums/database-event-action'; -import { type ObjectRecordCreateEvent } from 'src/engine/core-modules/event-emitter/types/object-record-create.event'; -import { type ObjectRecordUpdateEvent } from 'src/engine/core-modules/event-emitter/types/object-record-update.event'; import { objectRecordChangedProperties as objectRecordUpdateEventChangedProperties } from 'src/engine/core-modules/event-emitter/utils/object-record-changed-properties.util'; import { InjectMessageQueue } from 'src/engine/core-modules/message-queue/decorators/message-queue.decorator'; import { MessageQueue } from 'src/engine/core-modules/message-queue/message-queue.constants'; diff --git a/packages/twenty-server/src/modules/connected-account/listeners/connected-account-workspace-member.listener.ts b/packages/twenty-server/src/modules/connected-account/listeners/connected-account-workspace-member.listener.ts index dc5aaa70c8..6186d3417a 100644 --- a/packages/twenty-server/src/modules/connected-account/listeners/connected-account-workspace-member.listener.ts +++ b/packages/twenty-server/src/modules/connected-account/listeners/connected-account-workspace-member.listener.ts @@ -1,9 +1,12 @@ import { Injectable } from '@nestjs/common'; +import { + type ObjectRecordDeleteEvent, + type ObjectRecordDestroyEvent, +} from 'twenty-shared/database-events'; + import { OnDatabaseBatchEvent } from 'src/engine/api/graphql/graphql-query-runner/decorators/on-database-batch-event.decorator'; import { DatabaseEventAction } from 'src/engine/api/graphql/graphql-query-runner/enums/database-event-action'; -import { type ObjectRecordDeleteEvent } from 'src/engine/core-modules/event-emitter/types/object-record-delete.event'; -import { type ObjectRecordDestroyEvent } from 'src/engine/core-modules/event-emitter/types/object-record-destroy.event'; import { InjectMessageQueue } from 'src/engine/core-modules/message-queue/decorators/message-queue.decorator'; import { MessageQueue } from 'src/engine/core-modules/message-queue/message-queue.constants'; import { MessageQueueService } from 'src/engine/core-modules/message-queue/services/message-queue.service'; diff --git a/packages/twenty-server/src/modules/connected-account/listeners/connected-account.listener.ts b/packages/twenty-server/src/modules/connected-account/listeners/connected-account.listener.ts index c4448759ef..9e922cc733 100644 --- a/packages/twenty-server/src/modules/connected-account/listeners/connected-account.listener.ts +++ b/packages/twenty-server/src/modules/connected-account/listeners/connected-account.listener.ts @@ -1,8 +1,9 @@ import { Injectable } from '@nestjs/common'; +import { type ObjectRecordDeleteEvent } from 'twenty-shared/database-events'; + import { OnDatabaseBatchEvent } from 'src/engine/api/graphql/graphql-query-runner/decorators/on-database-batch-event.decorator'; import { DatabaseEventAction } from 'src/engine/api/graphql/graphql-query-runner/enums/database-event-action'; -import { type ObjectRecordDeleteEvent } from 'src/engine/core-modules/event-emitter/types/object-record-delete.event'; import { GlobalWorkspaceOrmManager } from 'src/engine/twenty-orm/global-workspace-datasource/global-workspace-orm.manager'; import { buildSystemAuthContext } from 'src/engine/twenty-orm/utils/build-system-auth-context.util'; import { WorkspaceEventBatch } from 'src/engine/workspace-event-emitter/types/workspace-event-batch.type'; diff --git a/packages/twenty-server/src/modules/contact-creation-manager/utils/__tests__/compute-changed-additional-emails.spec.ts b/packages/twenty-server/src/modules/contact-creation-manager/utils/__tests__/compute-changed-additional-emails.spec.ts index 267f98b51d..e2414fff82 100644 --- a/packages/twenty-server/src/modules/contact-creation-manager/utils/__tests__/compute-changed-additional-emails.spec.ts +++ b/packages/twenty-server/src/modules/contact-creation-manager/utils/__tests__/compute-changed-additional-emails.spec.ts @@ -1,6 +1,6 @@ import { type EachTestingContext } from 'twenty-shared/testing'; +import { type ObjectRecordDiff } from 'twenty-shared/database-events'; -import { type ObjectRecordDiff } from 'src/engine/core-modules/event-emitter/types/object-record-diff'; import { computeChangedAdditionalEmails } from 'src/modules/contact-creation-manager/utils/compute-changed-additional-emails'; import { type PersonWorkspaceEntity } from 'src/modules/person/standard-objects/person.workspace-entity'; diff --git a/packages/twenty-server/src/modules/contact-creation-manager/utils/__tests__/has-primary-email-changed.spec.ts b/packages/twenty-server/src/modules/contact-creation-manager/utils/__tests__/has-primary-email-changed.spec.ts index a4d540d3f7..12ff008bc2 100644 --- a/packages/twenty-server/src/modules/contact-creation-manager/utils/__tests__/has-primary-email-changed.spec.ts +++ b/packages/twenty-server/src/modules/contact-creation-manager/utils/__tests__/has-primary-email-changed.spec.ts @@ -1,6 +1,6 @@ import { type EachTestingContext } from 'twenty-shared/testing'; +import { type ObjectRecordDiff } from 'twenty-shared/database-events'; -import { type ObjectRecordDiff } from 'src/engine/core-modules/event-emitter/types/object-record-diff'; import { hasPrimaryEmailChanged } from 'src/modules/contact-creation-manager/utils/has-primary-email-changed'; import { type PersonWorkspaceEntity } from 'src/modules/person/standard-objects/person.workspace-entity'; diff --git a/packages/twenty-server/src/modules/contact-creation-manager/utils/compute-changed-additional-emails.ts b/packages/twenty-server/src/modules/contact-creation-manager/utils/compute-changed-additional-emails.ts index 001cdbac57..83728d48ba 100644 --- a/packages/twenty-server/src/modules/contact-creation-manager/utils/compute-changed-additional-emails.ts +++ b/packages/twenty-server/src/modules/contact-creation-manager/utils/compute-changed-additional-emails.ts @@ -1,4 +1,5 @@ -import { type ObjectRecordDiff } from 'src/engine/core-modules/event-emitter/types/object-record-diff'; +import { type ObjectRecordDiff } from 'twenty-shared/database-events'; + import { type PersonWorkspaceEntity } from 'src/modules/person/standard-objects/person.workspace-entity'; export const computeChangedAdditionalEmails = ( diff --git a/packages/twenty-server/src/modules/contact-creation-manager/utils/has-primary-email-changed.ts b/packages/twenty-server/src/modules/contact-creation-manager/utils/has-primary-email-changed.ts index ae4b36a4fd..f157e4c0f0 100644 --- a/packages/twenty-server/src/modules/contact-creation-manager/utils/has-primary-email-changed.ts +++ b/packages/twenty-server/src/modules/contact-creation-manager/utils/has-primary-email-changed.ts @@ -1,4 +1,5 @@ -import { type ObjectRecordDiff } from 'src/engine/core-modules/event-emitter/types/object-record-diff'; +import { type ObjectRecordDiff } from 'twenty-shared/database-events'; + import { type PersonWorkspaceEntity } from 'src/modules/person/standard-objects/person.workspace-entity'; export const hasPrimaryEmailChanged = ( diff --git a/packages/twenty-server/src/modules/favorite-folder/listeners/favorite-folder.listener.ts b/packages/twenty-server/src/modules/favorite-folder/listeners/favorite-folder.listener.ts index 9fb5ad694b..eeb7dc6371 100644 --- a/packages/twenty-server/src/modules/favorite-folder/listeners/favorite-folder.listener.ts +++ b/packages/twenty-server/src/modules/favorite-folder/listeners/favorite-folder.listener.ts @@ -1,8 +1,9 @@ import { Injectable } from '@nestjs/common'; +import { type ObjectRecordDeleteEvent } from 'twenty-shared/database-events'; + import { OnDatabaseBatchEvent } from 'src/engine/api/graphql/graphql-query-runner/decorators/on-database-batch-event.decorator'; import { DatabaseEventAction } from 'src/engine/api/graphql/graphql-query-runner/enums/database-event-action'; -import { type ObjectRecordDeleteEvent } from 'src/engine/core-modules/event-emitter/types/object-record-delete.event'; import { GlobalWorkspaceOrmManager } from 'src/engine/twenty-orm/global-workspace-datasource/global-workspace-orm.manager'; import { buildSystemAuthContext } from 'src/engine/twenty-orm/utils/build-system-auth-context.util'; import { WorkspaceEventBatch } from 'src/engine/workspace-event-emitter/types/workspace-event-batch.type'; diff --git a/packages/twenty-server/src/modules/favorite/listeners/favorite-deletion.listener.ts b/packages/twenty-server/src/modules/favorite/listeners/favorite-deletion.listener.ts index 66c80ce983..ca13852be1 100644 --- a/packages/twenty-server/src/modules/favorite/listeners/favorite-deletion.listener.ts +++ b/packages/twenty-server/src/modules/favorite/listeners/favorite-deletion.listener.ts @@ -1,8 +1,9 @@ import { Injectable } from '@nestjs/common'; +import { type ObjectRecordDeleteEvent } from 'twenty-shared/database-events'; + import { OnDatabaseBatchEvent } from 'src/engine/api/graphql/graphql-query-runner/decorators/on-database-batch-event.decorator'; import { DatabaseEventAction } from 'src/engine/api/graphql/graphql-query-runner/enums/database-event-action'; -import { type ObjectRecordDeleteEvent } from 'src/engine/core-modules/event-emitter/types/object-record-delete.event'; import { InjectMessageQueue } from 'src/engine/core-modules/message-queue/decorators/message-queue.decorator'; import { MessageQueue } from 'src/engine/core-modules/message-queue/message-queue.constants'; import { MessageQueueService } from 'src/engine/core-modules/message-queue/services/message-queue.service'; diff --git a/packages/twenty-server/src/modules/messaging/blocklist-manager/jobs/messaging-blocklist-item-delete-messages.job.ts b/packages/twenty-server/src/modules/messaging/blocklist-manager/jobs/messaging-blocklist-item-delete-messages.job.ts index 549fe68181..b3839d5fea 100644 --- a/packages/twenty-server/src/modules/messaging/blocklist-manager/jobs/messaging-blocklist-item-delete-messages.job.ts +++ b/packages/twenty-server/src/modules/messaging/blocklist-manager/jobs/messaging-blocklist-item-delete-messages.job.ts @@ -3,8 +3,8 @@ import { Scope } from '@nestjs/common'; import { MessageParticipantRole } from 'twenty-shared/types'; import { isDefined } from 'twenty-shared/utils'; import { And, Any, ILike, In, Not, Or } from 'typeorm'; +import { type ObjectRecordCreateEvent } from 'twenty-shared/database-events'; -import { type ObjectRecordCreateEvent } from 'src/engine/core-modules/event-emitter/types/object-record-create.event'; import { Process } from 'src/engine/core-modules/message-queue/decorators/process.decorator'; import { Processor } from 'src/engine/core-modules/message-queue/decorators/processor.decorator'; import { MessageQueue } from 'src/engine/core-modules/message-queue/message-queue.constants'; diff --git a/packages/twenty-server/src/modules/messaging/blocklist-manager/jobs/messaging-blocklist-reimport-messages.job.ts b/packages/twenty-server/src/modules/messaging/blocklist-manager/jobs/messaging-blocklist-reimport-messages.job.ts index dbb1406500..72246a5c2d 100644 --- a/packages/twenty-server/src/modules/messaging/blocklist-manager/jobs/messaging-blocklist-reimport-messages.job.ts +++ b/packages/twenty-server/src/modules/messaging/blocklist-manager/jobs/messaging-blocklist-reimport-messages.job.ts @@ -1,8 +1,8 @@ import { Scope } from '@nestjs/common'; import { Not } from 'typeorm'; +import { type ObjectRecordDeleteEvent } from 'twenty-shared/database-events'; -import { type ObjectRecordDeleteEvent } from 'src/engine/core-modules/event-emitter/types/object-record-delete.event'; import { Process } from 'src/engine/core-modules/message-queue/decorators/process.decorator'; import { Processor } from 'src/engine/core-modules/message-queue/decorators/processor.decorator'; import { MessageQueue } from 'src/engine/core-modules/message-queue/message-queue.constants'; diff --git a/packages/twenty-server/src/modules/messaging/blocklist-manager/listeners/messaging-blocklist.listener.ts b/packages/twenty-server/src/modules/messaging/blocklist-manager/listeners/messaging-blocklist.listener.ts index 322aac9752..7301e6dfd3 100644 --- a/packages/twenty-server/src/modules/messaging/blocklist-manager/listeners/messaging-blocklist.listener.ts +++ b/packages/twenty-server/src/modules/messaging/blocklist-manager/listeners/messaging-blocklist.listener.ts @@ -1,8 +1,11 @@ import { Injectable, Scope } from '@nestjs/common'; -import { type ObjectRecordCreateEvent } from 'src/engine/core-modules/event-emitter/types/object-record-create.event'; -import { type ObjectRecordDeleteEvent } from 'src/engine/core-modules/event-emitter/types/object-record-delete.event'; -import { type ObjectRecordUpdateEvent } from 'src/engine/core-modules/event-emitter/types/object-record-update.event'; +import { + type ObjectRecordCreateEvent, + type ObjectRecordDeleteEvent, + type ObjectRecordUpdateEvent, +} from 'twenty-shared/database-events'; + import { InjectMessageQueue } from 'src/engine/core-modules/message-queue/decorators/message-queue.decorator'; import { MessageQueue } from 'src/engine/core-modules/message-queue/message-queue.constants'; import { MessageQueueService } from 'src/engine/core-modules/message-queue/services/message-queue.service'; diff --git a/packages/twenty-server/src/modules/messaging/message-cleaner/listeners/messaging-message-cleaner-connected-account.listener.ts b/packages/twenty-server/src/modules/messaging/message-cleaner/listeners/messaging-message-cleaner-connected-account.listener.ts index a3a7139574..03a5a5c976 100644 --- a/packages/twenty-server/src/modules/messaging/message-cleaner/listeners/messaging-message-cleaner-connected-account.listener.ts +++ b/packages/twenty-server/src/modules/messaging/message-cleaner/listeners/messaging-message-cleaner-connected-account.listener.ts @@ -1,6 +1,7 @@ import { Injectable } from '@nestjs/common'; -import { type ObjectRecordDeleteEvent } from 'src/engine/core-modules/event-emitter/types/object-record-delete.event'; +import { type ObjectRecordDeleteEvent } from 'twenty-shared/database-events'; + import { InjectMessageQueue } from 'src/engine/core-modules/message-queue/decorators/message-queue.decorator'; import { MessageQueue } from 'src/engine/core-modules/message-queue/message-queue.constants'; import { MessageQueueService } from 'src/engine/core-modules/message-queue/services/message-queue.service'; diff --git a/packages/twenty-server/src/modules/messaging/message-import-manager/listeners/messaging-import-manager-message-channel.listener.ts b/packages/twenty-server/src/modules/messaging/message-import-manager/listeners/messaging-import-manager-message-channel.listener.ts index 2dc1e52dc8..b514032667 100644 --- a/packages/twenty-server/src/modules/messaging/message-import-manager/listeners/messaging-import-manager-message-channel.listener.ts +++ b/packages/twenty-server/src/modules/messaging/message-import-manager/listeners/messaging-import-manager-message-channel.listener.ts @@ -1,6 +1,7 @@ import { Injectable } from '@nestjs/common'; -import { type ObjectRecordDeleteEvent } from 'src/engine/core-modules/event-emitter/types/object-record-delete.event'; +import { type ObjectRecordDeleteEvent } from 'twenty-shared/database-events'; + import { InjectMessageQueue } from 'src/engine/core-modules/message-queue/decorators/message-queue.decorator'; import { MessageQueue } from 'src/engine/core-modules/message-queue/message-queue.constants'; import { MessageQueueService } from 'src/engine/core-modules/message-queue/services/message-queue.service'; diff --git a/packages/twenty-server/src/modules/messaging/message-participant-manager/listeners/message-participant-person.listener.ts b/packages/twenty-server/src/modules/messaging/message-participant-manager/listeners/message-participant-person.listener.ts index e465f11017..fcf8676a60 100644 --- a/packages/twenty-server/src/modules/messaging/message-participant-manager/listeners/message-participant-person.listener.ts +++ b/packages/twenty-server/src/modules/messaging/message-participant-manager/listeners/message-participant-person.listener.ts @@ -1,12 +1,14 @@ import { Injectable } from '@nestjs/common'; import { isDefined } from 'twenty-shared/utils'; +import { + type ObjectRecordCreateEvent, + type ObjectRecordDeleteEvent, + type ObjectRecordUpdateEvent, +} from 'twenty-shared/database-events'; import { OnDatabaseBatchEvent } from 'src/engine/api/graphql/graphql-query-runner/decorators/on-database-batch-event.decorator'; import { DatabaseEventAction } from 'src/engine/api/graphql/graphql-query-runner/enums/database-event-action'; -import { type ObjectRecordCreateEvent } from 'src/engine/core-modules/event-emitter/types/object-record-create.event'; -import { type ObjectRecordDeleteEvent } from 'src/engine/core-modules/event-emitter/types/object-record-delete.event'; -import { type ObjectRecordUpdateEvent } from 'src/engine/core-modules/event-emitter/types/object-record-update.event'; import { objectRecordChangedProperties as objectRecordUpdateEventChangedProperties } from 'src/engine/core-modules/event-emitter/utils/object-record-changed-properties.util'; import { InjectMessageQueue } from 'src/engine/core-modules/message-queue/decorators/message-queue.decorator'; import { MessageQueue } from 'src/engine/core-modules/message-queue/message-queue.constants'; diff --git a/packages/twenty-server/src/modules/messaging/message-participant-manager/listeners/message-participant-workspace-member.listener.ts b/packages/twenty-server/src/modules/messaging/message-participant-manager/listeners/message-participant-workspace-member.listener.ts index 296b71b050..d81c927aa6 100644 --- a/packages/twenty-server/src/modules/messaging/message-participant-manager/listeners/message-participant-workspace-member.listener.ts +++ b/packages/twenty-server/src/modules/messaging/message-participant-manager/listeners/message-participant-workspace-member.listener.ts @@ -3,11 +3,13 @@ import { InjectRepository } from '@nestjs/typeorm'; import { WorkspaceActivationStatus } from 'twenty-shared/workspace'; import { Repository } from 'typeorm'; +import { + type ObjectRecordCreateEvent, + type ObjectRecordUpdateEvent, +} from 'twenty-shared/database-events'; import { OnDatabaseBatchEvent } from 'src/engine/api/graphql/graphql-query-runner/decorators/on-database-batch-event.decorator'; import { DatabaseEventAction } from 'src/engine/api/graphql/graphql-query-runner/enums/database-event-action'; -import { type ObjectRecordCreateEvent } from 'src/engine/core-modules/event-emitter/types/object-record-create.event'; -import { type ObjectRecordUpdateEvent } from 'src/engine/core-modules/event-emitter/types/object-record-update.event'; import { objectRecordChangedProperties as objectRecordUpdateEventChangedProperties } from 'src/engine/core-modules/event-emitter/utils/object-record-changed-properties.util'; import { InjectMessageQueue } from 'src/engine/core-modules/message-queue/decorators/message-queue.decorator'; import { MessageQueue } from 'src/engine/core-modules/message-queue/message-queue.constants'; diff --git a/packages/twenty-server/src/modules/timeline/jobs/upsert-timeline-activity-from-internal-event.job.ts b/packages/twenty-server/src/modules/timeline/jobs/upsert-timeline-activity-from-internal-event.job.ts index a287d552cc..ce4f985c2c 100644 --- a/packages/twenty-server/src/modules/timeline/jobs/upsert-timeline-activity-from-internal-event.job.ts +++ b/packages/twenty-server/src/modules/timeline/jobs/upsert-timeline-activity-from-internal-event.job.ts @@ -1,7 +1,7 @@ import { isDefined } from 'twenty-shared/utils'; import { In } from 'typeorm'; +import { type ObjectRecordNonDestructiveEvent } from 'twenty-shared/database-events'; -import { type ObjectRecordNonDestructiveEvent } from 'src/engine/core-modules/event-emitter/types/object-record-non-destructive-event'; import { Process } from 'src/engine/core-modules/message-queue/decorators/process.decorator'; import { Processor } from 'src/engine/core-modules/message-queue/decorators/processor.decorator'; import { MessageQueue } from 'src/engine/core-modules/message-queue/message-queue.constants'; diff --git a/packages/twenty-server/src/modules/timeline/services/timeline-activity.service.ts b/packages/twenty-server/src/modules/timeline/services/timeline-activity.service.ts index f097ae84ec..3dad7e9b87 100644 --- a/packages/twenty-server/src/modules/timeline/services/timeline-activity.service.ts +++ b/packages/twenty-server/src/modules/timeline/services/timeline-activity.service.ts @@ -3,9 +3,9 @@ import { Injectable } from '@nestjs/common'; import { type ObjectRecord } from 'twenty-shared/types'; import { isDefined } from 'twenty-shared/utils'; import { In } from 'typeorm'; +import { type ObjectRecordBaseEvent } from 'twenty-shared/database-events'; import { getFlatFieldsFromFlatObjectMetadata } from 'src/engine/api/graphql/workspace-schema-builder/utils/get-flat-fields-for-flat-object-metadata.util'; -import { type ObjectRecordBaseEvent } from 'src/engine/core-modules/event-emitter/types/object-record.base.event'; import { FeatureFlagKey } from 'src/engine/core-modules/feature-flag/enums/feature-flag-key.enum'; import { FeatureFlagService } from 'src/engine/core-modules/feature-flag/services/feature-flag.service'; import { WorkspaceManyOrAllFlatEntityMapsCacheService } from 'src/engine/metadata-modules/flat-entity/services/workspace-many-or-all-flat-entity-maps-cache.service'; diff --git a/packages/twenty-server/src/modules/timeline/types/timeline-activity-payload.ts b/packages/twenty-server/src/modules/timeline/types/timeline-activity-payload.ts index e533d674ea..c4ab8ea17a 100644 --- a/packages/twenty-server/src/modules/timeline/types/timeline-activity-payload.ts +++ b/packages/twenty-server/src/modules/timeline/types/timeline-activity-payload.ts @@ -1,4 +1,4 @@ -import { type ObjectRecordBaseEvent } from 'src/engine/core-modules/event-emitter/types/object-record.base.event'; +import { type ObjectRecordBaseEvent } from 'twenty-shared/database-events'; export type TimelineActivityPayload = { properties: ObjectRecordBaseEvent['properties']; diff --git a/packages/twenty-server/src/modules/workflow/workflow-status/listeners/workflow-version-status.listener.ts b/packages/twenty-server/src/modules/workflow/workflow-status/listeners/workflow-version-status.listener.ts index 2f9ee5cf80..d22b31ea6a 100644 --- a/packages/twenty-server/src/modules/workflow/workflow-status/listeners/workflow-version-status.listener.ts +++ b/packages/twenty-server/src/modules/workflow/workflow-status/listeners/workflow-version-status.listener.ts @@ -1,9 +1,11 @@ import { Injectable } from '@nestjs/common'; import { isDefined } from 'twenty-shared/utils'; +import { + type ObjectRecordCreateEvent, + type ObjectRecordDeleteEvent, +} from 'twenty-shared/database-events'; -import { type ObjectRecordCreateEvent } from 'src/engine/core-modules/event-emitter/types/object-record-create.event'; -import { type ObjectRecordDeleteEvent } from 'src/engine/core-modules/event-emitter/types/object-record-delete.event'; import { InjectMessageQueue } from 'src/engine/core-modules/message-queue/decorators/message-queue.decorator'; import { MessageQueue } from 'src/engine/core-modules/message-queue/message-queue.constants'; import { MessageQueueService } from 'src/engine/core-modules/message-queue/services/message-queue.service'; diff --git a/packages/twenty-server/src/modules/workflow/workflow-trigger/automated-trigger/listeners/workflow-database-event-trigger.listener.ts b/packages/twenty-server/src/modules/workflow/workflow-trigger/automated-trigger/listeners/workflow-database-event-trigger.listener.ts index bc277f30f6..1ee405f127 100644 --- a/packages/twenty-server/src/modules/workflow/workflow-trigger/automated-trigger/listeners/workflow-database-event-trigger.listener.ts +++ b/packages/twenty-server/src/modules/workflow/workflow-trigger/automated-trigger/listeners/workflow-database-event-trigger.listener.ts @@ -3,15 +3,17 @@ import { Injectable, Logger } from '@nestjs/common'; import { type ObjectRecord } from 'twenty-shared/types'; import { isDefined } from 'twenty-shared/utils'; import { In, Raw } from 'typeorm'; +import { + type ObjectRecordCreateEvent, + type ObjectRecordDeleteEvent, + type ObjectRecordDestroyEvent, + type ObjectRecordUpdateEvent, + type ObjectRecordUpsertEvent, + type ObjectRecordNonDestructiveEvent, +} from 'twenty-shared/database-events'; import { OnDatabaseBatchEvent } from 'src/engine/api/graphql/graphql-query-runner/decorators/on-database-batch-event.decorator'; import { DatabaseEventAction } from 'src/engine/api/graphql/graphql-query-runner/enums/database-event-action'; -import { type ObjectRecordCreateEvent } from 'src/engine/core-modules/event-emitter/types/object-record-create.event'; -import { type ObjectRecordDeleteEvent } from 'src/engine/core-modules/event-emitter/types/object-record-delete.event'; -import { type ObjectRecordDestroyEvent } from 'src/engine/core-modules/event-emitter/types/object-record-destroy.event'; -import { type ObjectRecordNonDestructiveEvent } from 'src/engine/core-modules/event-emitter/types/object-record-non-destructive-event'; -import { type ObjectRecordUpdateEvent } from 'src/engine/core-modules/event-emitter/types/object-record-update.event'; -import { type ObjectRecordUpsertEvent } from 'src/engine/core-modules/event-emitter/types/object-record-upsert.event'; import { InjectMessageQueue } from 'src/engine/core-modules/message-queue/decorators/message-queue.decorator'; import { MessageQueue } from 'src/engine/core-modules/message-queue/message-queue.constants'; import { MessageQueueService } from 'src/engine/core-modules/message-queue/services/message-queue.service'; diff --git a/packages/twenty-shared/package.json b/packages/twenty-shared/package.json index 2499c37d2c..a4b345785a 100644 --- a/packages/twenty-shared/package.json +++ b/packages/twenty-shared/package.json @@ -57,6 +57,11 @@ "import": "./dist/constants.mjs", "require": "./dist/constants.cjs" }, + "./database-events": { + "types": "./dist/database-events/index.d.ts", + "import": "./dist/database-events.mjs", + "require": "./dist/database-events.cjs" + }, "./metadata": { "types": "./dist/metadata/index.d.ts", "import": "./dist/metadata.mjs", @@ -98,6 +103,7 @@ "ai", "application", "constants", + "database-events", "metadata", "testing", "translations", @@ -117,6 +123,9 @@ "constants": [ "dist/constants/index.d.ts" ], + "database-events": [ + "dist/database-events/index.d.ts" + ], "metadata": [ "dist/metadata/index.d.ts" ], diff --git a/packages/twenty-shared/project.json b/packages/twenty-shared/project.json index 31f49918b8..67f5dec2fb 100644 --- a/packages/twenty-shared/project.json +++ b/packages/twenty-shared/project.json @@ -20,6 +20,8 @@ "{projectRoot}/application/dist", "{projectRoot}/constants/package.json", "{projectRoot}/constants/dist", + "{projectRoot}/database-events/package.json", + "{projectRoot}/database-events/dist", "{projectRoot}/metadata/package.json", "{projectRoot}/metadata/dist", "{projectRoot}/testing/package.json", diff --git a/packages/twenty-shared/src/database-events/database-event-payload.type.ts b/packages/twenty-shared/src/database-events/database-event-payload.type.ts new file mode 100644 index 0000000000..67350ddb6c --- /dev/null +++ b/packages/twenty-shared/src/database-events/database-event-payload.type.ts @@ -0,0 +1,30 @@ +import { type ObjectRecordEvent } from '@/database-events/object-record-event.event'; + +type SimplifiedFlatObjectMetadata = { + id: string; + nameSingular: string; + namePlural: string; + labelSingular: string; + labelPlural: string; + description: string | null; + icon: string | null; + universalIdentifier: string; + applicationId: string | null; +} & { + fieldMetadataIds: string[]; + indexMetadataIds: string[]; + viewIds: string[]; +}; + +type WorkspaceEventBatch = { + name: string; + workspaceId: string; + objectMetadata: SimplifiedFlatObjectMetadata; + events: WorkspaceEvent[]; +}; + +export type DatabaseEventPayload = Omit< + WorkspaceEventBatch, + 'events' +> & + T; diff --git a/packages/twenty-shared/src/database-events/index.ts b/packages/twenty-shared/src/database-events/index.ts new file mode 100644 index 0000000000..ee8e1601fc --- /dev/null +++ b/packages/twenty-shared/src/database-events/index.ts @@ -0,0 +1,20 @@ +/* + * _____ _ + *|_ _|_ _____ _ __ | |_ _ _ + * | | \ \ /\ / / _ \ '_ \| __| | | | Auto-generated file + * | | \ V V / __/ | | | |_| |_| | Any edits to this will be overridden + * |_| \_/\_/ \___|_| |_|\__|\__, | + * |___/ + */ + +export type { DatabaseEventPayload } from './database-event-payload.type'; +export { ObjectRecordCreateEvent } from './object-record-create.event'; +export { ObjectRecordDeleteEvent } from './object-record-delete.event'; +export { ObjectRecordDestroyEvent } from './object-record-destroy.event'; +export type { ObjectRecordDiff } from './object-record-diff'; +export type { ObjectRecordEvent } from './object-record-event.event'; +export type { ObjectRecordNonDestructiveEvent } from './object-record-non-destructive-event'; +export { ObjectRecordRestoreEvent } from './object-record-restore.event'; +export { ObjectRecordUpdateEvent } from './object-record-update.event'; +export { ObjectRecordUpsertEvent } from './object-record-upsert.event'; +export { ObjectRecordBaseEvent } from './object-record.base.event'; diff --git a/packages/twenty-shared/src/database-events/object-record-create.event.ts b/packages/twenty-shared/src/database-events/object-record-create.event.ts new file mode 100644 index 0000000000..f52c06cf90 --- /dev/null +++ b/packages/twenty-shared/src/database-events/object-record-create.event.ts @@ -0,0 +1,9 @@ +import { ObjectRecordBaseEvent } from '@/database-events/object-record.base.event'; + +export class ObjectRecordCreateEvent< + T = object, +> extends ObjectRecordBaseEvent { + declare properties: { + after: T; + }; +} diff --git a/packages/twenty-shared/src/database-events/object-record-delete.event.ts b/packages/twenty-shared/src/database-events/object-record-delete.event.ts new file mode 100644 index 0000000000..288e2e72a2 --- /dev/null +++ b/packages/twenty-shared/src/database-events/object-record-delete.event.ts @@ -0,0 +1,9 @@ +import { ObjectRecordBaseEvent } from '@/database-events/object-record.base.event'; + +export class ObjectRecordDeleteEvent< + T = object, +> extends ObjectRecordBaseEvent { + declare properties: { + before: T; + }; +} diff --git a/packages/twenty-shared/src/database-events/object-record-destroy.event.ts b/packages/twenty-shared/src/database-events/object-record-destroy.event.ts new file mode 100644 index 0000000000..4318b05fbe --- /dev/null +++ b/packages/twenty-shared/src/database-events/object-record-destroy.event.ts @@ -0,0 +1,9 @@ +import { ObjectRecordBaseEvent } from '@/database-events/object-record.base.event'; + +export class ObjectRecordDestroyEvent< + T = object, +> extends ObjectRecordBaseEvent { + declare properties: { + before: T; + }; +} diff --git a/packages/twenty-server/src/engine/core-modules/event-emitter/types/object-record-diff.ts b/packages/twenty-shared/src/database-events/object-record-diff.ts similarity index 100% rename from packages/twenty-server/src/engine/core-modules/event-emitter/types/object-record-diff.ts rename to packages/twenty-shared/src/database-events/object-record-diff.ts diff --git a/packages/twenty-shared/src/database-events/object-record-event.event.ts b/packages/twenty-shared/src/database-events/object-record-event.event.ts new file mode 100644 index 0000000000..acea9f44f9 --- /dev/null +++ b/packages/twenty-shared/src/database-events/object-record-event.event.ts @@ -0,0 +1,14 @@ +import { type ObjectRecordDeleteEvent } from '@/database-events/object-record-delete.event'; +import { type ObjectRecordUpdateEvent } from '@/database-events/object-record-update.event'; +import { type ObjectRecordCreateEvent } from '@/database-events/object-record-create.event'; +import { type ObjectRecordDestroyEvent } from '@/database-events/object-record-destroy.event'; +import { type ObjectRecordRestoreEvent } from '@/database-events/object-record-restore.event'; +import { type ObjectRecordUpsertEvent } from '@/database-events/object-record-upsert.event'; + +export type ObjectRecordEvent = + | ObjectRecordUpdateEvent + | ObjectRecordDeleteEvent + | ObjectRecordCreateEvent + | ObjectRecordDestroyEvent + | ObjectRecordRestoreEvent + | ObjectRecordUpsertEvent; diff --git a/packages/twenty-shared/src/database-events/object-record-non-destructive-event.ts b/packages/twenty-shared/src/database-events/object-record-non-destructive-event.ts new file mode 100644 index 0000000000..2c93a0c5ce --- /dev/null +++ b/packages/twenty-shared/src/database-events/object-record-non-destructive-event.ts @@ -0,0 +1,12 @@ +import { type ObjectRecordCreateEvent } from '@/database-events/object-record-create.event'; +import { type ObjectRecordDeleteEvent } from '@/database-events/object-record-delete.event'; +import { type ObjectRecordRestoreEvent } from '@/database-events/object-record-restore.event'; +import { type ObjectRecordUpsertEvent } from '@/database-events/object-record-upsert.event'; +import { type ObjectRecordUpdateEvent } from '@/database-events/object-record-update.event'; + +export type ObjectRecordNonDestructiveEvent = + | ObjectRecordCreateEvent + | ObjectRecordUpdateEvent + | ObjectRecordDeleteEvent + | ObjectRecordRestoreEvent + | ObjectRecordUpsertEvent; diff --git a/packages/twenty-shared/src/database-events/object-record-restore.event.ts b/packages/twenty-shared/src/database-events/object-record-restore.event.ts new file mode 100644 index 0000000000..fb38b3c107 --- /dev/null +++ b/packages/twenty-shared/src/database-events/object-record-restore.event.ts @@ -0,0 +1,9 @@ +import { ObjectRecordCreateEvent } from '@/database-events/object-record-create.event'; + +export class ObjectRecordRestoreEvent< + T = object, +> extends ObjectRecordCreateEvent { + declare properties: { + after: T; + }; +} diff --git a/packages/twenty-shared/src/database-events/object-record-update.event.ts b/packages/twenty-shared/src/database-events/object-record-update.event.ts new file mode 100644 index 0000000000..49be950d99 --- /dev/null +++ b/packages/twenty-shared/src/database-events/object-record-update.event.ts @@ -0,0 +1,13 @@ +import { ObjectRecordBaseEvent } from '@/database-events/object-record.base.event'; +import { type ObjectRecordDiff } from '@/database-events/object-record-diff'; + +export class ObjectRecordUpdateEvent< + T = object, +> extends ObjectRecordBaseEvent { + declare properties: { + updatedFields?: string[]; + diff?: Partial>; + before: T; + after: T; + }; +} diff --git a/packages/twenty-shared/src/database-events/object-record-upsert.event.ts b/packages/twenty-shared/src/database-events/object-record-upsert.event.ts new file mode 100644 index 0000000000..7ab2868c01 --- /dev/null +++ b/packages/twenty-shared/src/database-events/object-record-upsert.event.ts @@ -0,0 +1,13 @@ +import { ObjectRecordBaseEvent } from '@/database-events/object-record.base.event'; +import { type ObjectRecordDiff } from '@/database-events/object-record-diff'; + +export class ObjectRecordUpsertEvent< + T = object, +> extends ObjectRecordBaseEvent { + declare properties: { + before?: T; + after: T; + diff?: Partial>; + updatedFields?: string[]; + }; +} diff --git a/packages/twenty-server/src/engine/core-modules/event-emitter/types/object-record.base.event.ts b/packages/twenty-shared/src/database-events/object-record.base.event.ts similarity index 72% rename from packages/twenty-server/src/engine/core-modules/event-emitter/types/object-record.base.event.ts rename to packages/twenty-shared/src/database-events/object-record.base.event.ts index 414839bbb0..701135a8f8 100644 --- a/packages/twenty-server/src/engine/core-modules/event-emitter/types/object-record.base.event.ts +++ b/packages/twenty-shared/src/database-events/object-record.base.event.ts @@ -1,4 +1,4 @@ -import { type ObjectRecordDiff } from 'src/engine/core-modules/event-emitter/types/object-record-diff'; +import { type ObjectRecordDiff } from '@/database-events/object-record-diff'; type Properties = { updatedFields?: string[];