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 4ffee94847..c3f3803167 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 @@ -60,22 +60,6 @@ export class UpsertTimelineActivityFromInternalEvent { } } - const formattedEvents = workspaceEventBatch.events.map((event) => { - if ('diff' in event.properties && event.properties.diff) { - return { - ...event, - properties: { - diff: event.properties.diff, - }, - }; - } - - return event; - }); - - await this.timelineActivityService.upsertEvents({ - ...workspaceEventBatch, - events: formattedEvents, - }); + await this.timelineActivityService.upsertEvents(workspaceEventBatch); } } diff --git a/packages/twenty-server/src/modules/timeline/repositories/timeline-activity.repository.ts b/packages/twenty-server/src/modules/timeline/repositories/timeline-activity.repository.ts index bf0421a44b..af2a86cc20 100644 --- a/packages/twenty-server/src/modules/timeline/repositories/timeline-activity.repository.ts +++ b/packages/twenty-server/src/modules/timeline/repositories/timeline-activity.repository.ts @@ -9,7 +9,9 @@ import { TwentyORMGlobalManager } from 'src/engine/twenty-orm/twenty-orm-global. import { type TimelineActivityPayload } from 'src/modules/timeline/types/timeline-activity-payload'; type TimelineActivityPayloadWorkspaceIdAndObjectSingularName = { - payloads: TimelineActivityPayload[]; + payloads: (Omit & { + properties: Pick; + })[]; workspaceId: string; objectSingularName: string; }; @@ -31,16 +33,22 @@ export class TimelineActivityRepository { payloads, }); - const payloadsWithDiff = payloads.filter(({ properties }) => { - const isDiffEmpty = - properties.diff !== null && - properties.diff && - Object.keys(properties.diff).length === 0; + const payloadsWithDiff = payloads + .filter(({ properties }) => { + const isDiffEmpty = + properties.diff !== null && + properties.diff && + Object.keys(properties.diff).length === 0; - return !isDiffEmpty; - }); + return !isDiffEmpty; + }) + .map(({ properties, ...rest }) => ({ + ...rest, + properties: isDefined(properties.diff) ? { diff: properties.diff } : {}, + })); - const payloadsToInsert: TimelineActivityPayload[] = []; + const payloadsToInsert: TimelineActivityPayloadWorkspaceIdAndObjectSingularName['payloads'] = + []; for (const payload of payloadsWithDiff) { const recentTimelineActivity = recentTimelineActivities.find( 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 fdefd07d73..bd7e64b3c8 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 @@ -12,6 +12,8 @@ import { parseEventNameOrThrow } from 'src/engine/workspace-event-emitter/utils/ import { TimelineActivityRepository } from 'src/modules/timeline/repositories/timeline-activity.repository'; import { TimelineActivityWorkspaceEntity } from 'src/modules/timeline/standard-objects/timeline-activity.workspace-entity'; import { type TimelineActivityPayload } from 'src/modules/timeline/types/timeline-activity-payload'; +import { NoteWorkspaceEntity } from 'src/modules/note/standard-objects/note.workspace-entity'; +import { TaskWorkspaceEntity } from 'src/modules/task/standard-objects/task.workspace-entity'; type ActivityType = 'note' | 'task'; @@ -92,7 +94,7 @@ export class TimelineActivityService { if (objectSingularName === 'note') { const noteEventsTimelineActivities = await this.computeTimelineActivityPayloadsForActivities({ - events, + events: events as ObjectRecordBaseEvent[], activityType: 'note', workspaceId, objectMetadata, @@ -114,7 +116,7 @@ export class TimelineActivityService { if (objectSingularName === 'task') { const taskEventsTimelineActivities = await this.computeTimelineActivityPayloadsForActivities({ - events, + events: events as ObjectRecordBaseEvent[], activityType: 'task', workspaceId, objectMetadata, @@ -161,7 +163,9 @@ export class TimelineActivityService { name, workspaceId, objectMetadata, - }: WorkspaceEventBatch & { + }: WorkspaceEventBatch< + ObjectRecordBaseEvent + > & { activityType: ActivityType; }): Promise { if (!isDefined(workspaceId)) { @@ -214,7 +218,7 @@ export class TimelineActivityService { return; } - const activityTitle = (event.properties.after as ObjectRecord)?.title; + const activityTitle = event.properties.diff?.title?.after; const activityId = event.recordId; if (!isDefined(activityTitle)) { 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 400958f630..e533d674ea 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,5 +1,7 @@ +import { type ObjectRecordBaseEvent } from 'src/engine/core-modules/event-emitter/types/object-record.base.event'; + export type TimelineActivityPayload = { - properties: Record; + properties: ObjectRecordBaseEvent['properties']; linkedObjectMetadataId?: string; linkedRecordId?: string; linkedRecordCachedName?: string;