From a18203934ce69f2ffb29215e71124a15cb3b8dd1 Mon Sep 17 00:00:00 2001 From: Charles Bochet Date: Tue, 9 Dec 2025 16:41:50 +0100 Subject: [PATCH] Fix flat entity maps date serialization (#16420) Changes: - as we store date in redis as serialized, let's make all flatEntity dates as string. This requires changing FlatEntity types and making sure that entity are converted to flatEntity and flatEntity to dtos --- .../__mocks__/mockPersonObjectMetadata.ts | 4 +- .../object-record-changed-values.spec.ts | 6 +-- ...m-create-agent-input-to-flat-agent.util.ts | 2 +- ...gent-input-to-flat-agent-to-update.util.ts | 2 +- ...ace-flat-cron-trigger-map-cache.service.ts | 2 + ...trigger-input-to-flat-cron-trigger.util.ts | 2 +- ...at-cron-trigger-to-update-or-throw.util.ts | 2 +- ...atabase-event-trigger-map-cache.service.ts | 2 + ...put-to-flat-database-event-trigger.util.ts | 2 +- ...e-event-trigger-to-update-or-throw.util.ts | 2 +- .../from-agent-entity-to-agent-dto.util.ts | 4 +- ...ansform-agent-entity-to-flat-agent.util.ts | 6 +-- ...ard-agent-definition-to-flat-agent.util.ts | 8 ++-- .../create-empty-flat-entity-maps.constant.ts | 4 +- ...ntity-by-metadata-engine-name-test.type.ts | 6 +-- .../types/flat-entity-maps.type.ts | 4 +- .../flat-entity/types/flat-entity.type.ts | 37 ++++++++++++------- ...ity-maps-through-mutation-or-throw.spec.ts | 4 +- ...ntity-to-flat-entity-maps-or-throw.util.ts | 8 ++-- ...ity-from-flat-entity-maps-or-throw.util.ts | 6 +-- ...by-id-in-flat-entity-maps-or-throw.util.ts | 6 +-- ...t-entity-by-id-in-flat-entity-maps.util.ts | 6 ++- ...by-id-in-flat-entity-maps-or-throw.util.ts | 6 +-- ...et-flat-entities-by-application-id.util.ts | 4 +- ...t-entities-by-universal-identifier.util.ts | 6 ++- .../get-sub-flat-entity-maps-or-throw.util.ts | 4 +- ...ntity-in-flat-entity-maps-or-throw.util.ts | 17 +++++---- ...ansform-flat-entity-for-comparison.util.ts | 4 +- ...lat-field-metadatas-to-create.spec.ts.snap | 16 ++++---- ...rate-index-for-flat-field-metadata.util.ts | 2 +- ...-field-metadata-is-nullable-update.util.ts | 2 +- ...flat-field-metadata-options-update.util.ts | 2 +- .../__mocks__/get-flat-index-metadata.mock.ts | 2 +- .../types/flat-index-metadata.type.ts | 10 +++-- ...data-entity-to-flat-index-metadata.util.ts | 9 ++++- .../get-flat-object-metadata.mock.ts | 2 +- ...and-flat-field-metadatas-to-create.util.ts | 2 +- ...ata-entity-to-flat-object-metadata.util.ts | 2 + ...ed-flat-object-metadata-validation.util.ts | 4 +- ...fter-flat-object-identifier-update.util.ts | 2 +- ...tab-entity-to-flat-page-layout-tab.util.ts | 6 +-- ...-flat-page-layout-widget-to-create.util.ts | 2 +- ...o-flat-page-layout-widget-or-throw.util.ts | 2 +- ...-entity-to-flat-page-layout-widget.util.ts | 3 ++ ...-layout-entity-to-flat-page-layout.util.ts | 6 +-- ...-target-entity-to-flat-role-target.util.ts | 4 +- ...-role-input-to-flat-role-to-create.util.ts | 2 +- .../from-role-entity-to-flat-role.util.ts | 4 +- ...ndard-role-definition-to-flat-role.util.ts | 2 +- ...input-to-flat-view-field-to-create.util.ts | 2 +- ...-input-to-flat-view-field-or-throw.util.ts | 2 +- ...ew-field-entity-to-flat-view-field.util.ts | 3 ++ ...nput-to-flat-view-filter-to-create.util.ts | 2 +- ...input-to-flat-view-filter-or-throw.util.ts | 2 +- ...-filter-entity-to-flat-view-filter.util.ts | 3 ++ ...te-flat-view-groups-on-view-create.util.ts | 2 +- ...input-to-flat-view-group-to-create.util.ts | 2 +- ...-input-to-flat-view-group-or-throw.util.ts | 2 +- ...ew-group-entity-to-flat-view-group.util.ts | 3 ++ ...-view-input-to-flat-view-to-create.util.ts | 2 +- ...e-view-input-to-flat-view-or-throw.util.ts | 2 +- .../from-view-entity-to-flat-view.util.ts | 3 ++ ...ld-default-index-for-custom-object.util.ts | 8 ++-- ...nput-to-flat-role-target-to-create.util.ts | 6 +-- .../metadata-modules/role/role.resolver.ts | 3 ++ ...ce-flat-route-trigger-map-cache.service.ts | 2 + ...rigger-input-to-flat-route-trigger.util.ts | 4 +- ...t-route-trigger-to-update-or-throw.util.ts | 2 +- .../serverless-function-v2.service.ts | 2 +- ...-input-to-flat-serverless-function.util.ts | 4 +- ...entity-to-flat-serverless-function.type.ts | 3 ++ .../services/view-field-v2.service.ts | 25 ++++++++----- ...-flat-view-field-to-view-field-dto.util.ts | 15 ++++++++ .../services/view-filter.service.ts | 33 ++++++++++------- ...lat-view-filter-to-view-filter-dto.util.ts | 15 ++++++++ .../view-group/services/view-group.service.ts | 25 ++++++++----- ...-flat-view-group-to-view-group-dto.util.ts | 15 ++++++++ .../view/services/view.service.ts | 33 ++++++++++------- .../utils/from-flat-view-to-view-dto.util.ts | 13 +++++++ .../workspace-entity-manager.spec.ts | 4 +- ...umn-name-to-field-metadata-id.util.spec.ts | 4 +- ...tadata-id-to-column-names-map.util.spec.ts | 4 +- ...reate-standard-index-flat-metadata.util.ts | 8 ++-- ...eate-standard-object-flat-metadata.util.ts | 4 +- ...peorm-non-nullable-date-properties.type.ts | 5 +++ ...d-typeorm-nullable-date-properties.type.ts | 9 +++++ ...ity-maps-through-mutation-or-throw.util.ts | 6 +-- ...ity-maps-through-mutation-or-throw.util.ts | 6 +-- ...ity-maps-through-mutation-or-throw.util.ts | 6 +-- .../failed-flat-entity-validation.type.ts | 4 +- .../comparators/workspace-agent.comparator.ts | 2 +- .../factories/standard-role.factory.ts | 2 +- .../interfaces/syncable-entity.interface.ts | 3 +- ...ow-database-event-trigger.listener.spec.ts | 4 +- 94 files changed, 357 insertions(+), 204 deletions(-) create mode 100644 packages/twenty-server/src/engine/metadata-modules/view-field/utils/from-flat-view-field-to-view-field-dto.util.ts create mode 100644 packages/twenty-server/src/engine/metadata-modules/view-filter/utils/from-flat-view-filter-to-view-filter-dto.util.ts create mode 100644 packages/twenty-server/src/engine/metadata-modules/view-group/utils/from-flat-view-group-to-view-group-dto.util.ts create mode 100644 packages/twenty-server/src/engine/metadata-modules/view/utils/from-flat-view-to-view-dto.util.ts create mode 100644 packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/types/extract-record-typeorm-non-nullable-date-properties.type.ts create mode 100644 packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/types/extract-record-typeorm-nullable-date-properties.type.ts diff --git a/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/__mocks__/mockPersonObjectMetadata.ts b/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/__mocks__/mockPersonObjectMetadata.ts index 0ab4cdf36a..72fbebd9cb 100644 --- a/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/__mocks__/mockPersonObjectMetadata.ts +++ b/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/__mocks__/mockPersonObjectMetadata.ts @@ -162,8 +162,8 @@ export const mockPersonFlatObjectMetadata = ( viewIds: [], applicationId: null, isLabelSyncedWithName: false, - createdAt: new Date(), - updatedAt: new Date(), + createdAt: new Date().toISOString(), + updatedAt: new Date().toISOString(), shortcut: null, description: null, standardOverrides: null, diff --git a/packages/twenty-server/src/engine/core-modules/event-emitter/utils/__tests__/object-record-changed-values.spec.ts b/packages/twenty-server/src/engine/core-modules/event-emitter/utils/__tests__/object-record-changed-values.spec.ts index 285c051528..c23294eb51 100644 --- a/packages/twenty-server/src/engine/core-modules/event-emitter/utils/__tests__/object-record-changed-values.spec.ts +++ b/packages/twenty-server/src/engine/core-modules/event-emitter/utils/__tests__/object-record-changed-values.spec.ts @@ -1,7 +1,7 @@ +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'; import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type'; -import { objectRecordChangedValues } from 'src/engine/core-modules/event-emitter/utils/object-record-changed-values'; const mockObjectMetadata = { id: '1', @@ -24,8 +24,8 @@ const mockObjectMetadata = { viewIds: [], applicationId: null, isLabelSyncedWithName: false, - createdAt: new Date(), - updatedAt: new Date(), + createdAt: new Date().toISOString(), + updatedAt: new Date().toISOString(), shortcut: null, description: null, standardOverrides: null, diff --git a/packages/twenty-server/src/engine/metadata-modules/ai/ai-agent/utils/from-create-agent-input-to-flat-agent.util.ts b/packages/twenty-server/src/engine/metadata-modules/ai/ai-agent/utils/from-create-agent-input-to-flat-agent.util.ts index 7a6fcadc50..e9e0465105 100644 --- a/packages/twenty-server/src/engine/metadata-modules/ai/ai-agent/utils/from-create-agent-input-to-flat-agent.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/ai/ai-agent/utils/from-create-agent-input-to-flat-agent.util.ts @@ -38,7 +38,7 @@ export const fromCreateAgentInputToFlatAgent = ({ ], ); - const createdAt = new Date(); + const createdAt = new Date().toISOString(); const agentId = v4(); const standardId = createAgentInput.standardId ?? null; const universalIdentifier = standardId ?? agentId; diff --git a/packages/twenty-server/src/engine/metadata-modules/ai/ai-agent/utils/from-update-agent-input-to-flat-agent-to-update.util.ts b/packages/twenty-server/src/engine/metadata-modules/ai/ai-agent/utils/from-update-agent-input-to-flat-agent-to-update.util.ts index 505eb17b84..e88954a0e0 100644 --- a/packages/twenty-server/src/engine/metadata-modules/ai/ai-agent/utils/from-update-agent-input-to-flat-agent-to-update.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/ai/ai-agent/utils/from-update-agent-input-to-flat-agent-to-update.util.ts @@ -38,7 +38,7 @@ const computeAgentFlatRoleTargetToUpdate = ({ } const existingRoleTarget = flatRoleTargetByAgentIdMaps[flatAgent.id]; - const updatedAt = new Date(); + const updatedAt = new Date().toISOString(); if (roleId === null) { if (isDefined(existingRoleTarget)) { diff --git a/packages/twenty-server/src/engine/metadata-modules/cron-trigger/services/workspace-flat-cron-trigger-map-cache.service.ts b/packages/twenty-server/src/engine/metadata-modules/cron-trigger/services/workspace-flat-cron-trigger-map-cache.service.ts index 6ff16f500a..605bba7213 100644 --- a/packages/twenty-server/src/engine/metadata-modules/cron-trigger/services/workspace-flat-cron-trigger-map-cache.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/cron-trigger/services/workspace-flat-cron-trigger-map-cache.service.ts @@ -46,6 +46,8 @@ export class WorkspaceFlatCronTriggerMapCacheService extends WorkspaceCacheProvi ]), universalIdentifier: cronTriggerEntity.universalIdentifier ?? cronTriggerEntity.id, + createdAt: cronTriggerEntity.createdAt.toISOString(), + updatedAt: cronTriggerEntity.updatedAt.toISOString(), } satisfies FlatCronTrigger; addFlatEntityToFlatEntityMapsThroughMutationOrThrow({ diff --git a/packages/twenty-server/src/engine/metadata-modules/cron-trigger/utils/from-create-cron-trigger-input-to-flat-cron-trigger.util.ts b/packages/twenty-server/src/engine/metadata-modules/cron-trigger/utils/from-create-cron-trigger-input-to-flat-cron-trigger.util.ts index 1e274aafa4..e4af7c2099 100644 --- a/packages/twenty-server/src/engine/metadata-modules/cron-trigger/utils/from-create-cron-trigger-input-to-flat-cron-trigger.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/cron-trigger/utils/from-create-cron-trigger-input-to-flat-cron-trigger.util.ts @@ -12,7 +12,7 @@ export const fromCreateCronTriggerInputToFlatCronTrigger = ({ workspaceId: string; workspaceCustomApplicationId: string; }): FlatCronTrigger => { - const now = new Date(); + const now = new Date().toISOString(); const id = v4(); return { diff --git a/packages/twenty-server/src/engine/metadata-modules/cron-trigger/utils/from-update-cron-trigger-input-to-flat-cron-trigger-to-update-or-throw.util.ts b/packages/twenty-server/src/engine/metadata-modules/cron-trigger/utils/from-update-cron-trigger-input-to-flat-cron-trigger-to-update-or-throw.util.ts index 0914e06295..5a9e025854 100644 --- a/packages/twenty-server/src/engine/metadata-modules/cron-trigger/utils/from-update-cron-trigger-input-to-flat-cron-trigger-to-update-or-throw.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/cron-trigger/utils/from-update-cron-trigger-input-to-flat-cron-trigger-to-update-or-throw.util.ts @@ -26,6 +26,6 @@ export const fromUpdateCronTriggerInputToFlatCronTriggerToUpdateOrThrow = ({ return { ...existingFlatCronTrigger, settings: updateCronTriggerInput.update.settings, - updatedAt: new Date(), + updatedAt: new Date().toISOString(), }; }; diff --git a/packages/twenty-server/src/engine/metadata-modules/database-event-trigger/services/workspace-flat-database-event-trigger-map-cache.service.ts b/packages/twenty-server/src/engine/metadata-modules/database-event-trigger/services/workspace-flat-database-event-trigger-map-cache.service.ts index aa5f7a214e..a5705a74f0 100644 --- a/packages/twenty-server/src/engine/metadata-modules/database-event-trigger/services/workspace-flat-database-event-trigger-map-cache.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/database-event-trigger/services/workspace-flat-database-event-trigger-map-cache.service.ts @@ -48,6 +48,8 @@ export class WorkspaceFlatDatabaseEventTriggerMapCacheService extends WorkspaceC universalIdentifier: databaseEventTriggerEntity.universalIdentifier ?? databaseEventTriggerEntity.id, + createdAt: databaseEventTriggerEntity.createdAt.toISOString(), + updatedAt: databaseEventTriggerEntity.updatedAt.toISOString(), } satisfies FlatDatabaseEventTrigger; addFlatEntityToFlatEntityMapsThroughMutationOrThrow({ diff --git a/packages/twenty-server/src/engine/metadata-modules/database-event-trigger/utils/from-create-database-event-trigger-input-to-flat-database-event-trigger.util.ts b/packages/twenty-server/src/engine/metadata-modules/database-event-trigger/utils/from-create-database-event-trigger-input-to-flat-database-event-trigger.util.ts index 86d49ac46d..e9b84772fc 100644 --- a/packages/twenty-server/src/engine/metadata-modules/database-event-trigger/utils/from-create-database-event-trigger-input-to-flat-database-event-trigger.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/database-event-trigger/utils/from-create-database-event-trigger-input-to-flat-database-event-trigger.util.ts @@ -12,7 +12,7 @@ export const fromCreateDatabaseEventTriggerInputToFlatDatabaseEventTrigger = ({ workspaceId: string; workspaceCustomApplicationId: string; }): FlatDatabaseEventTrigger => { - const now = new Date(); + const now = new Date().toISOString(); const id = uuidV4(); return { diff --git a/packages/twenty-server/src/engine/metadata-modules/database-event-trigger/utils/from-update-database-event-trigger-input-to-flat-database-event-trigger-to-update-or-throw.util.ts b/packages/twenty-server/src/engine/metadata-modules/database-event-trigger/utils/from-update-database-event-trigger-input-to-flat-database-event-trigger-to-update-or-throw.util.ts index 40c2a0a52c..0b4ec729e9 100644 --- a/packages/twenty-server/src/engine/metadata-modules/database-event-trigger/utils/from-update-database-event-trigger-input-to-flat-database-event-trigger-to-update-or-throw.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/database-event-trigger/utils/from-update-database-event-trigger-input-to-flat-database-event-trigger-to-update-or-throw.util.ts @@ -27,6 +27,6 @@ export const fromUpdateDatabaseEventTriggerInputToFlatDatabaseEventTriggerToUpda return { ...existingFlatDatabaseEventTrigger, settings: updateDatabaseEventTriggerInput.update.settings, - updatedAt: new Date(), + updatedAt: new Date().toISOString(), }; }; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-agent/utils/from-agent-entity-to-agent-dto.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-agent/utils/from-agent-entity-to-agent-dto.util.ts index 6785d655ee..64043bfb41 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-agent/utils/from-agent-entity-to-agent-dto.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-agent/utils/from-agent-entity-to-agent-dto.util.ts @@ -20,7 +20,7 @@ export const fromFlatAgentWithRoleIdToAgentDto = ({ workspaceId, roleId, }: FlatAgentWithRoleId): AgentDTO => ({ - createdAt, + createdAt: new Date(createdAt), description: description ?? undefined, evaluationInputs, id, @@ -32,7 +32,7 @@ export const fromFlatAgentWithRoleIdToAgentDto = ({ prompt, responseFormat, standardId, - updatedAt, + updatedAt: new Date(updatedAt), workspaceId, applicationId: applicationId ?? undefined, icon: icon ?? undefined, diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-agent/utils/transform-agent-entity-to-flat-agent.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-agent/utils/transform-agent-entity-to-flat-agent.util.ts index 04b5b18734..d161f15706 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-agent/utils/transform-agent-entity-to-flat-agent.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-agent/utils/transform-agent-entity-to-flat-agent.util.ts @@ -5,9 +5,9 @@ export const transformAgentEntityToFlatAgent = ( agentEntity: AgentEntity, ): FlatAgent => { return { - createdAt: agentEntity.createdAt, - deletedAt: agentEntity.deletedAt, - updatedAt: agentEntity.updatedAt, + createdAt: agentEntity.createdAt.toISOString(), + deletedAt: agentEntity.deletedAt?.toISOString() ?? null, + updatedAt: agentEntity.updatedAt.toISOString(), id: agentEntity.id, standardId: agentEntity.standardId, name: agentEntity.name, diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-agent/utils/transform-standard-agent-definition-to-flat-agent.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-agent/utils/transform-standard-agent-definition-to-flat-agent.util.ts index 5273d1749a..0238bf7631 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-agent/utils/transform-standard-agent-definition-to-flat-agent.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-agent/utils/transform-standard-agent-definition-to-flat-agent.util.ts @@ -21,13 +21,13 @@ export const transformStandardAgentDefinitionToFlatAgent = ({ outputStrategy: _outputStrategy, ...agentData } = standardAgentDefinition; - const createdAt = new Date(); + const createdAt = new Date().toISOString(); return { id: existingAgentEntity?.id ?? v4(), - createdAt: existingAgentEntity?.createdAt ?? createdAt, - updatedAt: existingAgentEntity?.updatedAt ?? createdAt, - deletedAt: existingAgentEntity?.deletedAt ?? null, + createdAt: existingAgentEntity?.createdAt?.toISOString() ?? createdAt, + updatedAt: existingAgentEntity?.updatedAt?.toISOString() ?? createdAt, + deletedAt: existingAgentEntity?.deletedAt?.toISOString() ?? null, ...agentData, workspaceId, universalIdentifier: standardAgentDefinition.standardId, diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-entity/constant/create-empty-flat-entity-maps.constant.ts b/packages/twenty-server/src/engine/metadata-modules/flat-entity/constant/create-empty-flat-entity-maps.constant.ts index 9cff142b9d..4bbb141f79 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-entity/constant/create-empty-flat-entity-maps.constant.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-entity/constant/create-empty-flat-entity-maps.constant.ts @@ -1,9 +1,9 @@ import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type'; -import { type FlatEntity } from 'src/engine/metadata-modules/flat-entity/types/flat-entity.type'; +import { type SyncableFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/flat-entity.type'; export const createEmptyFlatEntityMaps = () => ({ byId: {}, idByUniversalIdentifier: {}, universalIdentifiersByApplicationId: {}, - }) as const satisfies FlatEntityMaps; + }) as const satisfies FlatEntityMaps; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/all-flat-entity-by-metadata-engine-name-test.type.ts b/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/all-flat-entity-by-metadata-engine-name-test.type.ts index 39ecb83512..b5ba32f195 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/all-flat-entity-by-metadata-engine-name-test.type.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/all-flat-entity-by-metadata-engine-name-test.type.ts @@ -1,8 +1,8 @@ -import { type Expect } from 'twenty-shared/testing'; import { type AllMetadataName } from 'twenty-shared/metadata'; +import { type Expect } from 'twenty-shared/testing'; import { type AllFlatEntityTypesByMetadataName } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-types-by-metadata-name'; -import { type FlatEntity } from 'src/engine/metadata-modules/flat-entity/types/flat-entity.type'; +import { type SyncableFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/flat-entity.type'; import { type WorkspaceMigrationActionV2 } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-action-common-v2'; type ExpectedGenericFlatEntityInformation = { @@ -11,7 +11,7 @@ type ExpectedGenericFlatEntityInformation = { deleted: WorkspaceMigrationActionV2 | WorkspaceMigrationActionV2[]; updated: WorkspaceMigrationActionV2 | WorkspaceMigrationActionV2[]; }; - flatEntity: FlatEntity; + flatEntity: SyncableFlatEntity; }; type ExpectedGenericAllFlatEntityInformationByMetadataEngine = { diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type.ts b/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type.ts index 5589194cf3..f15cc45cc1 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type.ts @@ -1,6 +1,6 @@ -import { type FlatEntity } from 'src/engine/metadata-modules/flat-entity/types/flat-entity.type'; +import { type SyncableFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/flat-entity.type'; -export type FlatEntityMaps = { +export type FlatEntityMaps = { byId: Partial>; idByUniversalIdentifier: Partial>; universalIdentifiersByApplicationId: Partial>; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/flat-entity.type.ts b/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/flat-entity.type.ts index 26d0a17523..1b6af2c843 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/flat-entity.type.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/flat-entity.type.ts @@ -1,22 +1,33 @@ import { type SyncableEntity } from 'src/engine/workspace-manager/workspace-sync/interfaces/syncable-entity.interface'; -import { type ApplicationEntity } from 'src/engine/core-modules/application/application.entity'; -import { type ExtractRecordTypeOrmRelationProperties } from 'src/engine/workspace-manager/workspace-migration-v2/types/extract-record-typeorm-relation-properties.type'; +import { type ExtractRecordTypeOrmNonNullableDateProperties } from 'src/engine/workspace-manager/workspace-migration-v2/types/extract-record-typeorm-non-nullable-date-properties.type'; +import { type ExtractRecordTypeOrmNullableDateProperties } from 'src/engine/workspace-manager/workspace-migration-v2/types/extract-record-typeorm-nullable-date-properties.type'; import { type NonNullableProperties } from 'src/types/non-nullable-properties.type'; -export type SyncableEntityRelationProperties = - ExtractRecordTypeOrmRelationProperties; - -export interface FlatEntity - extends NonNullableProperties< - Omit - > { +export type SyncableFlatEntity = NonNullableProperties< + Omit +> & { id: string; applicationId: string | null; -} +}; + +export type EntityNullableDateProperties = + ExtractRecordTypeOrmNullableDateProperties; + +export type EntityNonNullableDateProperties = + ExtractRecordTypeOrmNonNullableDateProperties; export type FlatEntityFrom< - TEntity extends SyncableEntity, + TEntity, TEntityRelationProperties extends keyof TEntity, -> = FlatEntity & - Omit; +> = Omit< + TEntity, + | TEntityRelationProperties + | EntityNonNullableDateProperties + | EntityNullableDateProperties + | 'application' +> & { + [P in EntityNonNullableDateProperties]: string; +} & { + [P in EntityNullableDateProperties]: string | null; +}; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/__tests__/delete-flat-entity-from-flat-entity-and-related-entity-maps-through-mutation-or-throw.spec.ts b/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/__tests__/delete-flat-entity-from-flat-entity-and-related-entity-maps-through-mutation-or-throw.spec.ts index 45c63bc734..c7ac089178 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/__tests__/delete-flat-entity-from-flat-entity-and-related-entity-maps-through-mutation-or-throw.spec.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/__tests__/delete-flat-entity-from-flat-entity-and-related-entity-maps-through-mutation-or-throw.spec.ts @@ -50,8 +50,8 @@ describe('deleteFlatEntityFromFlatEntityAndRelatedEntityMapsThroughMutationOrThr viewGroupIds: [], workspaceId, calendarFieldMetadataId: mockFieldMetadata.id, - createdAt: new Date('2024-01-01'), - updatedAt: new Date('2024-01-01'), + createdAt: new Date('2024-01-01').toISOString(), + updatedAt: new Date('2024-01-01').toISOString(), icon: 'icon', isCompact: false, name: 'View Name', diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/add-flat-entity-to-flat-entity-maps-or-throw.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/add-flat-entity-to-flat-entity-maps-or-throw.util.ts index cee44fc384..a4dac00b90 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/add-flat-entity-to-flat-entity-maps-or-throw.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/add-flat-entity-to-flat-entity-maps-or-throw.util.ts @@ -5,14 +5,16 @@ import { FlatEntityMapsExceptionCode, } from 'src/engine/metadata-modules/flat-entity/exceptions/flat-entity-maps.exception'; import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type'; -import { type FlatEntity } from 'src/engine/metadata-modules/flat-entity/types/flat-entity.type'; +import { type SyncableFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/flat-entity.type'; -type AddFlatEntityToFlatEntityMapsOrThrowArgs = { +type AddFlatEntityToFlatEntityMapsOrThrowArgs = { flatEntity: T; flatEntityMaps: FlatEntityMaps; }; -export const addFlatEntityToFlatEntityMapsOrThrow = ({ +export const addFlatEntityToFlatEntityMapsOrThrow = < + T extends SyncableFlatEntity, +>({ flatEntity, flatEntityMaps, }: AddFlatEntityToFlatEntityMapsOrThrowArgs): FlatEntityMaps => { diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/delete-flat-entity-from-flat-entity-maps-or-throw.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/delete-flat-entity-from-flat-entity-maps-or-throw.util.ts index d002ce0b60..c43677bdc3 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/delete-flat-entity-from-flat-entity-maps-or-throw.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/delete-flat-entity-from-flat-entity-maps-or-throw.util.ts @@ -6,17 +6,17 @@ import { FlatEntityMapsExceptionCode, } from 'src/engine/metadata-modules/flat-entity/exceptions/flat-entity-maps.exception'; import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type'; -import { type FlatEntity } from 'src/engine/metadata-modules/flat-entity/types/flat-entity.type'; +import { type SyncableFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/flat-entity.type'; export type DeleteFlatEntityFromFlatEntityMapsOrThrowArgs< - T extends FlatEntity, + T extends SyncableFlatEntity, > = { entityToDeleteId: string; flatEntityMaps: FlatEntityMaps; }; export const deleteFlatEntityFromFlatEntityMapsOrThrow = < - T extends FlatEntity, + T extends SyncableFlatEntity, >({ flatEntityMaps, entityToDeleteId, diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util.ts index 69c246f1d5..18d950a35d 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util.ts @@ -6,16 +6,16 @@ import { FlatEntityMapsExceptionCode, } from 'src/engine/metadata-modules/flat-entity/exceptions/flat-entity-maps.exception'; import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type'; -import { type FlatEntity } from 'src/engine/metadata-modules/flat-entity/types/flat-entity.type'; +import { type SyncableFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/flat-entity.type'; export type FindFlatEntityByIdInFlatEntityMapsOrThrowArgs< - T extends FlatEntity, + T extends SyncableFlatEntity, > = { flatEntityMaps: FlatEntityMaps; flatEntityId: string; }; export const findFlatEntityByIdInFlatEntityMapsOrThrow = < - T extends FlatEntity, + T extends SyncableFlatEntity, >({ flatEntityMaps, flatEntityId, diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util.ts index 0ba9191880..9f9b2d7d2a 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util.ts @@ -1,10 +1,12 @@ -import { type FlatEntity } from 'src/engine/metadata-modules/flat-entity/types/flat-entity.type'; +import { type SyncableFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/flat-entity.type'; import { findFlatEntityByIdInFlatEntityMapsOrThrow, type FindFlatEntityByIdInFlatEntityMapsOrThrowArgs, } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util'; -export const findFlatEntityByIdInFlatEntityMaps = ( +export const findFlatEntityByIdInFlatEntityMaps = < + T extends SyncableFlatEntity, +>( args: FindFlatEntityByIdInFlatEntityMapsOrThrowArgs, ): T | undefined => { try { diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/find-many-flat-entity-by-id-in-flat-entity-maps-or-throw.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/find-many-flat-entity-by-id-in-flat-entity-maps-or-throw.util.ts index 142ad70c57..71f5631375 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/find-many-flat-entity-by-id-in-flat-entity-maps-or-throw.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/find-many-flat-entity-by-id-in-flat-entity-maps-or-throw.util.ts @@ -1,17 +1,17 @@ import { isDefined } from 'twenty-shared/utils'; import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type'; -import { type FlatEntity } from 'src/engine/metadata-modules/flat-entity/types/flat-entity.type'; +import { type SyncableFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/flat-entity.type'; import { getSubFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/get-sub-flat-entity-maps-or-throw.util'; export type FindManyFlatEntityByIdInFlatEntityMapsOrThrowArgs< - T extends FlatEntity, + T extends SyncableFlatEntity, > = { flatEntityMaps: FlatEntityMaps; flatEntityIds: string[]; }; export const findManyFlatEntityByIdInFlatEntityMapsOrThrow = < - T extends FlatEntity, + T extends SyncableFlatEntity, >({ flatEntityMaps, flatEntityIds, diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/get-flat-entities-by-application-id.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/get-flat-entities-by-application-id.util.ts index 20cfa172ca..6fe6c2b837 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/get-flat-entities-by-application-id.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/get-flat-entities-by-application-id.util.ts @@ -1,9 +1,9 @@ import { isDefined } from 'twenty-shared/utils'; import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type'; -import { type FlatEntity } from 'src/engine/metadata-modules/flat-entity/types/flat-entity.type'; +import { type SyncableFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/flat-entity.type'; -export const getFlatEntitiesByApplicationId = ( +export const getFlatEntitiesByApplicationId = ( maps: FlatEntityMaps, applicationId: string, ): T[] => { diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/get-flat-entities-by-universal-identifier.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/get-flat-entities-by-universal-identifier.util.ts index 20c009bff8..1add97c55b 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/get-flat-entities-by-universal-identifier.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/get-flat-entities-by-universal-identifier.util.ts @@ -1,9 +1,11 @@ import { isDefined } from 'twenty-shared/utils'; import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type'; -import { type FlatEntity } from 'src/engine/metadata-modules/flat-entity/types/flat-entity.type'; +import { type SyncableFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/flat-entity.type'; -export const getFlatEntityByUniversalIdentifier = ( +export const getFlatEntityByUniversalIdentifier = < + T extends SyncableFlatEntity, +>( maps: FlatEntityMaps, universalIdentifier: string, ): T | undefined => { diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/get-sub-flat-entity-maps-or-throw.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/get-sub-flat-entity-maps-or-throw.util.ts index 61427588d6..2ff0f67053 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/get-sub-flat-entity-maps-or-throw.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/get-sub-flat-entity-maps-or-throw.util.ts @@ -1,10 +1,10 @@ import { createEmptyFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/constant/create-empty-flat-entity-maps.constant'; import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type'; -import { type FlatEntity } from 'src/engine/metadata-modules/flat-entity/types/flat-entity.type'; +import { type SyncableFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/flat-entity.type'; import { addFlatEntityToFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/add-flat-entity-to-flat-entity-maps-or-throw.util'; import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util'; -export const getSubFlatEntityMapsOrThrow = ({ +export const getSubFlatEntityMapsOrThrow = ({ flatEntityIds, flatEntityMaps, }: { diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/replace-flat-entity-in-flat-entity-maps-or-throw.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/replace-flat-entity-in-flat-entity-maps-or-throw.util.ts index 9ae9bd293c..6d5f241d8b 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/replace-flat-entity-in-flat-entity-maps-or-throw.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/replace-flat-entity-in-flat-entity-maps-or-throw.util.ts @@ -1,15 +1,18 @@ import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type'; -import { type FlatEntity } from 'src/engine/metadata-modules/flat-entity/types/flat-entity.type'; +import { type SyncableFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/flat-entity.type'; import { addFlatEntityToFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/add-flat-entity-to-flat-entity-maps-or-throw.util'; import { deleteFlatEntityFromFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/delete-flat-entity-from-flat-entity-maps-or-throw.util'; -export type ReplaceFlatEntityInFlatEntityMapsOrThrowArgs = - { - flatEntity: T; - flatEntityMaps: FlatEntityMaps; - }; +export type ReplaceFlatEntityInFlatEntityMapsOrThrowArgs< + T extends SyncableFlatEntity, +> = { + flatEntity: T; + flatEntityMaps: FlatEntityMaps; +}; -export const replaceFlatEntityInFlatEntityMapsOrThrow = ({ +export const replaceFlatEntityInFlatEntityMapsOrThrow = < + T extends SyncableFlatEntity, +>({ flatEntity, flatEntityMaps, }: ReplaceFlatEntityInFlatEntityMapsOrThrowArgs): FlatEntityMaps => { diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/transform-flat-entity-for-comparison.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/transform-flat-entity-for-comparison.util.ts index 75d3f93385..368f506457 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/transform-flat-entity-for-comparison.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/transform-flat-entity-for-comparison.util.ts @@ -1,8 +1,8 @@ -import { type FlatEntity } from 'src/engine/metadata-modules/flat-entity/types/flat-entity.type'; +import { type SyncableFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/flat-entity.type'; import { orderObjectProperties } from 'src/engine/workspace-manager/workspace-sync-metadata/comparators/utils/order-object-properties.util'; export function transformFlatEntityForComparison< - TFlatEntity extends FlatEntity, + TFlatEntity extends SyncableFlatEntity, PToCompare extends keyof TFlatEntity, PJsonB extends PToCompare, >({ diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__tests__/__snapshots__/morph-relation-from-create-field-input-to-flat-field-metadatas-to-create.spec.ts.snap b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__tests__/__snapshots__/morph-relation-from-create-field-input-to-flat-field-metadatas-to-create.spec.ts.snap index 682cfafa5b..cade8b6223 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__tests__/__snapshots__/morph-relation-from-create-field-input-to-flat-field-metadatas-to-create.spec.ts.snap +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__tests__/__snapshots__/morph-relation-from-create-field-input-to-flat-field-metadatas-to-create.spec.ts.snap @@ -267,15 +267,15 @@ exports[`fromCreateFieldInputToFlatFieldMetadatasToCreate MORPH_RELATION test su "indexMetadatas": [ { "applicationId": Any, - "createdAt": Any, + "createdAt": Any, "flatIndexFieldMetadatas": [ { - "createdAt": Any, + "createdAt": Any, "fieldMetadataId": Any, "id": Any, "indexMetadataId": Any, "order": 0, - "updatedAt": Any, + "updatedAt": Any, }, ], "id": Any, @@ -286,20 +286,20 @@ exports[`fromCreateFieldInputToFlatFieldMetadatasToCreate MORPH_RELATION test su "name": "IDX_f687e4e4252800dddd8e5518362", "objectMetadataId": Any, "universalIdentifier": Any, - "updatedAt": Any, + "updatedAt": Any, "workspaceId": Any, }, { "applicationId": Any, - "createdAt": Any, + "createdAt": Any, "flatIndexFieldMetadatas": [ { - "createdAt": Any, + "createdAt": Any, "fieldMetadataId": Any, "id": Any, "indexMetadataId": Any, "order": 0, - "updatedAt": Any, + "updatedAt": Any, }, ], "id": Any, @@ -310,7 +310,7 @@ exports[`fromCreateFieldInputToFlatFieldMetadatasToCreate MORPH_RELATION test su "name": "IDX_cb15d901e889e25d0a9acecb595", "objectMetadataId": Any, "universalIdentifier": Any, - "updatedAt": Any, + "updatedAt": Any, "workspaceId": Any, }, ], diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/generate-index-for-flat-field-metadata.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/generate-index-for-flat-field-metadata.util.ts index 80cb850144..6908473938 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/generate-index-for-flat-field-metadata.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/generate-index-for-flat-field-metadata.util.ts @@ -18,7 +18,7 @@ export const generateIndexForFlatFieldMetadata = ({ workspaceId, }: GenerateIndexForFlatFieldMetadataArgs): FlatIndexMetadata => { const indexId = v4(); - const createdAt = new Date(); + const createdAt = new Date().toISOString(); const flatIndex: FlatIndexMetadata = generateFlatIndexMetadataWithNameOrThrow( { diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/recompute-view-groups-on-enum-flat-field-metadata-is-nullable-update.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/recompute-view-groups-on-enum-flat-field-metadata-is-nullable-update.util.ts index a5ebb05182..48bdbe7028 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/recompute-view-groups-on-enum-flat-field-metadata-is-nullable-update.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/recompute-view-groups-on-enum-flat-field-metadata-is-nullable-update.util.ts @@ -65,7 +65,7 @@ export const recomputeViewGroupsOnEnumFlatFieldMetadataIsNullableUpdate = ({ ) { const highestViewGroupPosition = highestViewGroupPositionByViewId[viewId]; const viewGroupId = v4(); - const createdAt = new Date(); + const createdAt = new Date().toISOString(); sideEffectResult.flatViewGroupsToCreate.push({ id: viewGroupId, diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/recompute-view-groups-on-flat-field-metadata-options-update.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/recompute-view-groups-on-flat-field-metadata-options-update.util.ts index 7db865d066..5f52d88681 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/recompute-view-groups-on-flat-field-metadata-options-update.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/recompute-view-groups-on-flat-field-metadata-options-update.util.ts @@ -89,7 +89,7 @@ export const recomputeViewGroupsOnFlatFieldMetadataOptionsUpdate = ({ const viewIds = Object.keys(viewGroupsByViewId.flatViewGroupRecordByViewId); - const createdAt = new Date(); + const createdAt = new Date().toISOString(); const flatViewGroupsToCreate = createdFieldMetadataOptions.flatMap( (option, createdOptionIndex) => viewIds.map((viewId) => { diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-index-metadata/__mocks__/get-flat-index-metadata.mock.ts b/packages/twenty-server/src/engine/metadata-modules/flat-index-metadata/__mocks__/get-flat-index-metadata.mock.ts index 48189fb440..e9279a344f 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-index-metadata/__mocks__/get-flat-index-metadata.mock.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-index-metadata/__mocks__/get-flat-index-metadata.mock.ts @@ -10,7 +10,7 @@ type FlatIndexMetadataOverrides = Required< export const getFlatIndexMetadataMock = ( overrides: FlatIndexMetadataOverrides, ): FlatIndexMetadata => { - const createdAt = faker.date.anytime(); + const createdAt = faker.date.anytime().toISOString(); return { flatIndexFieldMetadatas: [], diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-index-metadata/types/flat-index-metadata.type.ts b/packages/twenty-server/src/engine/metadata-modules/flat-index-metadata/types/flat-index-metadata.type.ts index d1e67ba840..053d3cc831 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-index-metadata/types/flat-index-metadata.type.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-index-metadata/types/flat-index-metadata.type.ts @@ -10,13 +10,15 @@ export type IndexMetadataRelationProperties = MetadataEntitiesRelationTarget >; -// Can't use FlatEntityFrom here because IndexFieldMetadataEntity is not a SyncableEntity -export type FlatIndexFieldMetadata = Omit< - IndexFieldMetadataEntity, +export type IndexFieldMetadataEntityRelationProperties = ExtractRecordTypeOrmRelationProperties< IndexFieldMetadataEntity, MetadataEntitiesRelationTarget - > + >; + +export type FlatIndexFieldMetadata = FlatEntityFrom< + IndexFieldMetadataEntity, + IndexFieldMetadataEntityRelationProperties >; export type FlatIndexMetadata = FlatEntityFrom< diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-index-metadata/utils/from-index-metadata-entity-to-flat-index-metadata.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-index-metadata/utils/from-index-metadata-entity-to-flat-index-metadata.util.ts index d04abe3abb..c94f598e87 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-index-metadata/utils/from-index-metadata-entity-to-flat-index-metadata.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-index-metadata/utils/from-index-metadata-entity-to-flat-index-metadata.util.ts @@ -14,15 +14,20 @@ export const fromIndexMetadataEntityToFlatIndexMetadata = ( return { ...indexMetadataEntityWithoutRelations, + createdAt: indexMetadataEntity.createdAt.toISOString(), + updatedAt: indexMetadataEntity.updatedAt.toISOString(), universalIdentifier: indexMetadataEntityWithoutRelations.universalIdentifier ?? indexMetadataEntityWithoutRelations.id, flatIndexFieldMetadatas: indexMetadataEntity.indexFieldMetadatas.map( - (indexFieldMetadata) => - removePropertiesFromRecord(indexFieldMetadata, [ + (indexFieldMetadata) => ({ + ...removePropertiesFromRecord(indexFieldMetadata, [ 'indexMetadata', 'fieldMetadata', ]), + createdAt: indexFieldMetadata.createdAt.toISOString(), + updatedAt: indexFieldMetadata.updatedAt.toISOString(), + }), ), }; }; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/__mocks__/get-flat-object-metadata.mock.ts b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/__mocks__/get-flat-object-metadata.mock.ts index d2315bdf77..5dad29c51c 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/__mocks__/get-flat-object-metadata.mock.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/__mocks__/get-flat-object-metadata.mock.ts @@ -9,7 +9,7 @@ type FlatObjectMetadataOverrides = Required< export const getFlatObjectMetadataMock = ( overrides: FlatObjectMetadataOverrides, ): FlatObjectMetadata => { - const createdAt = '2024-01-01T00:00:00.000Z' as unknown as Date; + const createdAt = '2024-01-01T00:00:00.000Z'; return { viewIds: [], diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/from-create-object-input-to-flat-object-metadata-and-flat-field-metadatas-to-create.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/from-create-object-input-to-flat-object-metadata-and-flat-field-metadatas-to-create.util.ts index 4d5c528fee..ef40f5e12c 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/from-create-object-input-to-flat-object-metadata-and-flat-field-metadatas-to-create.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/from-create-object-input-to-flat-object-metadata-and-flat-field-metadatas-to-create.util.ts @@ -54,7 +54,7 @@ export const fromCreateObjectInputToFlatObjectMetadataAndFlatFieldMetadatasToCre }, workspaceId, }); - const createdAt = new Date(); + const createdAt = new Date().toISOString(); const flatObjectMetadataToCreate: FlatObjectMetadata = { fieldMetadataIds: [], viewIds: [], diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/from-object-metadata-entity-to-flat-object-metadata.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/from-object-metadata-entity-to-flat-object-metadata.util.ts index f35ed7a17b..397ffe297d 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/from-object-metadata-entity-to-flat-object-metadata.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/from-object-metadata-entity-to-flat-object-metadata.util.ts @@ -16,6 +16,8 @@ export const fromObjectMetadataEntityToFlatObjectMetadata = ( return { ...objectMetadataEntityWithoutRelations, + createdAt: objectMetadataEntity.createdAt.toISOString(), + updatedAt: objectMetadataEntity.updatedAt.toISOString(), viewIds: objectMetadataEntity.views.map((viewEntity) => viewEntity.id), indexMetadataIds: objectMetadataEntity.indexMetadatas.map( (indexEntity) => indexEntity.id, diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/is-failed-flat-object-metadata-validation.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/is-failed-flat-object-metadata-validation.util.ts index 34caeb4af6..39708f3962 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/is-failed-flat-object-metadata-validation.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/is-failed-flat-object-metadata-validation.util.ts @@ -1,4 +1,4 @@ -import { type FlatEntity } from 'src/engine/metadata-modules/flat-entity/types/flat-entity.type'; +import { type SyncableFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/flat-entity.type'; import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type'; import { WORKSPACE_MIGRATION_OBJECT_ACTION_TYPES, @@ -7,7 +7,7 @@ import { import { type FailedFlatEntityValidation } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/types/failed-flat-entity-validation.type'; export const isFailedFlatObjectMetadataValidation = ( - failedValidation: FailedFlatEntityValidation, + failedValidation: FailedFlatEntityValidation, ): failedValidation is FailedFlatEntityValidation => { return WORKSPACE_MIGRATION_OBJECT_ACTION_TYPES.includes( failedValidation.type as WorkspaceMigrationObjectActionTypeV2, diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/recompute-view-field-identifier-after-flat-object-identifier-update.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/recompute-view-field-identifier-after-flat-object-identifier-update.util.ts index f3eb3d2b14..a8c3f44229 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/recompute-view-field-identifier-after-flat-object-identifier-update.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/recompute-view-field-identifier-after-flat-object-identifier-update.util.ts @@ -52,7 +52,7 @@ export const recomputeViewFieldIdentifierAfterFlatObjectIdentifierUpdate = ({ if (!isDefined(labelMetadataIdentifierViewField)) { const viewFieldId = v4(); - const createdAt = new Date(); + const createdAt = new Date().toISOString(); const flatViewFieldToCreate: FlatViewField = { fieldMetadataId: updatedLabelIdentifierFieldMetadataId, position: lowestViewFieldPosition - 1, diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-page-layout-tab/utils/transform-page-layout-tab-entity-to-flat-page-layout-tab.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-page-layout-tab/utils/transform-page-layout-tab-entity-to-flat-page-layout-tab.util.ts index 889b8a57c1..001723e58e 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-page-layout-tab/utils/transform-page-layout-tab-entity-to-flat-page-layout-tab.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-page-layout-tab/utils/transform-page-layout-tab-entity-to-flat-page-layout-tab.util.ts @@ -5,9 +5,9 @@ export const transformPageLayoutTabEntityToFlatPageLayoutTab = ( pageLayoutTabEntity: PageLayoutTabEntity, ): FlatPageLayoutTab => { return { - createdAt: pageLayoutTabEntity.createdAt, - deletedAt: pageLayoutTabEntity.deletedAt, - updatedAt: pageLayoutTabEntity.updatedAt, + createdAt: pageLayoutTabEntity.createdAt.toISOString(), + deletedAt: pageLayoutTabEntity.deletedAt?.toISOString() ?? null, + updatedAt: pageLayoutTabEntity.updatedAt.toISOString(), id: pageLayoutTabEntity.id, title: pageLayoutTabEntity.title, position: pageLayoutTabEntity.position, diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-page-layout-widget/utils/from-create-page-layout-widget-input-to-flat-page-layout-widget-to-create.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-page-layout-widget/utils/from-create-page-layout-widget-input-to-flat-page-layout-widget-to-create.util.ts index 22c3175061..10ffbce93b 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-page-layout-widget/utils/from-create-page-layout-widget-input-to-flat-page-layout-widget-to-create.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-page-layout-widget/utils/from-create-page-layout-widget-input-to-flat-page-layout-widget-to-create.util.ts @@ -23,7 +23,7 @@ export const fromCreatePageLayoutWidgetInputToFlatPageLayoutWidgetToCreate = ({ ['pageLayoutTabId'], ); - const createdAt = new Date(); + const createdAt = new Date().toISOString(); const pageLayoutWidgetId = v4(); return { diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-page-layout-widget/utils/from-delete-page-layout-widget-input-to-flat-page-layout-widget-or-throw.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-page-layout-widget/utils/from-delete-page-layout-widget-input-to-flat-page-layout-widget-or-throw.util.ts index 73af83ef34..6f44c68522 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-page-layout-widget/utils/from-delete-page-layout-widget-input-to-flat-page-layout-widget-or-throw.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-page-layout-widget/utils/from-delete-page-layout-widget-input-to-flat-page-layout-widget-or-throw.util.ts @@ -36,6 +36,6 @@ export const fromDeletePageLayoutWidgetInputToFlatPageLayoutWidgetOrThrow = ({ return { ...existingFlatPageLayoutWidgetToDelete, - deletedAt: new Date(), + deletedAt: new Date().toISOString(), }; }; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-page-layout-widget/utils/from-page-layout-widget-entity-to-flat-page-layout-widget.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-page-layout-widget/utils/from-page-layout-widget-entity-to-flat-page-layout-widget.util.ts index 00bfa9dbaa..c580df772d 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-page-layout-widget/utils/from-page-layout-widget-entity-to-flat-page-layout-widget.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-page-layout-widget/utils/from-page-layout-widget-entity-to-flat-page-layout-widget.util.ts @@ -14,6 +14,9 @@ export const fromPageLayoutWidgetEntityToFlatPageLayoutWidget = ( return { ...pageLayoutWidgetEntityWithoutRelations, + createdAt: pageLayoutWidgetEntity.createdAt.toISOString(), + updatedAt: pageLayoutWidgetEntity.updatedAt.toISOString(), + deletedAt: pageLayoutWidgetEntity.deletedAt?.toISOString() ?? null, universalIdentifier: pageLayoutWidgetEntityWithoutRelations.universalIdentifier ?? pageLayoutWidgetEntityWithoutRelations.id, diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-page-layout/utils/transform-page-layout-entity-to-flat-page-layout.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-page-layout/utils/transform-page-layout-entity-to-flat-page-layout.util.ts index 820b793863..673b5c6b9e 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-page-layout/utils/transform-page-layout-entity-to-flat-page-layout.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-page-layout/utils/transform-page-layout-entity-to-flat-page-layout.util.ts @@ -5,9 +5,9 @@ export const transformPageLayoutEntityToFlatPageLayout = ( pageLayoutEntity: PageLayoutEntity, ): FlatPageLayout => { return { - createdAt: pageLayoutEntity.createdAt, - deletedAt: pageLayoutEntity.deletedAt, - updatedAt: pageLayoutEntity.updatedAt, + createdAt: pageLayoutEntity.createdAt.toISOString(), + deletedAt: pageLayoutEntity.deletedAt?.toISOString() ?? null, + updatedAt: pageLayoutEntity.updatedAt.toISOString(), id: pageLayoutEntity.id, name: pageLayoutEntity.name, type: pageLayoutEntity.type, diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-role-target/utils/from-role-target-entity-to-flat-role-target.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-role-target/utils/from-role-target-entity-to-flat-role-target.util.ts index 6c45e87e05..dd41be5701 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-role-target/utils/from-role-target-entity-to-flat-role-target.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-role-target/utils/from-role-target-entity-to-flat-role-target.util.ts @@ -14,7 +14,7 @@ export const fromRoleTargetsEntityToFlatRoleTarget = ( targetApplicationId: roleTarget.targetApplicationId, applicationId: roleTarget.applicationId, universalIdentifier: roleTarget.universalIdentifier ?? roleTarget.id, - createdAt: roleTarget.createdAt, - updatedAt: roleTarget.updatedAt, + createdAt: roleTarget.createdAt.toISOString(), + updatedAt: roleTarget.updatedAt.toISOString(), }; }; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-role/utils/from-create-role-input-to-flat-role-to-create.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-role/utils/from-create-role-input-to-flat-role-to-create.util.ts index 40a83f9c90..71700e3a09 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-role/utils/from-create-role-input-to-flat-role-to-create.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-role/utils/from-create-role-input-to-flat-role-to-create.util.ts @@ -13,7 +13,7 @@ export const fromCreateRoleInputToFlatRoleToCreate = ({ workspaceId: string; applicationId: string; }): FlatRole => { - const now = new Date(); + const now = new Date().toISOString(); const { label, diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-role/utils/from-role-entity-to-flat-role.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-role/utils/from-role-entity-to-flat-role.util.ts index a50397926f..574e525c98 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-role/utils/from-role-entity-to-flat-role.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-role/utils/from-role-entity-to-flat-role.util.ts @@ -20,8 +20,8 @@ export const fromRoleEntityToFlatRole = (role: RoleEntity): FlatRole => { canBeAssignedToApiKeys: role.canBeAssignedToApiKeys, canBeAssignedToApplications: role.canBeAssignedToApplications, workspaceId: role.workspaceId, - createdAt: role.createdAt, - updatedAt: role.updatedAt, + createdAt: role.createdAt.toISOString(), + updatedAt: role.updatedAt.toISOString(), universalIdentifier: role.universalIdentifier ?? role.standardId ?? role.id, applicationId: role.applicationId ?? null, roleTargetIds: role.roleTargets.map((rt) => rt.id), diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-role/utils/from-standard-role-definition-to-flat-role.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-role/utils/from-standard-role-definition-to-flat-role.util.ts index b754e70e4c..e362a7c355 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-role/utils/from-standard-role-definition-to-flat-role.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-role/utils/from-standard-role-definition-to-flat-role.util.ts @@ -7,7 +7,7 @@ export const fromStandardRoleDefinitionToFlatRole = ( standardRoleDefinition: StandardRoleDefinition, workspaceId: string, ): FlatRole => { - const createdAt = new Date(); + const createdAt = new Date().toISOString(); return { ...standardRoleDefinition, diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-view-field/utils/from-create-view-field-input-to-flat-view-field-to-create.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-view-field/utils/from-create-view-field-input-to-flat-view-field-to-create.util.ts index f6d2883a14..3e24522759 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-view-field/utils/from-create-view-field-input-to-flat-view-field-to-create.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-view-field/utils/from-create-view-field-input-to-flat-view-field-to-create.util.ts @@ -22,7 +22,7 @@ export const fromCreateViewFieldInputToFlatViewFieldToCreate = ({ ['aggregateOperation', 'fieldMetadataId', 'id', 'viewId'], ); - const createdAt = new Date(); + const createdAt = new Date().toISOString(); const viewFieldId = createViewFieldInput.id ?? v4(); return { diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-view-field/utils/from-delete-view-field-input-to-flat-view-field-or-throw.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-view-field/utils/from-delete-view-field-input-to-flat-view-field-or-throw.util.ts index bc6f39bf6a..07ab8ed43b 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-view-field/utils/from-delete-view-field-input-to-flat-view-field-or-throw.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-view-field/utils/from-delete-view-field-input-to-flat-view-field-or-throw.util.ts @@ -35,6 +35,6 @@ export const fromDeleteViewFieldInputToFlatViewFieldOrThrow = ({ return { ...existingFlatViewFieldToDelete, - deletedAt: new Date(), + deletedAt: new Date().toISOString(), }; }; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-view-field/utils/from-view-field-entity-to-flat-view-field.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-view-field/utils/from-view-field-entity-to-flat-view-field.util.ts index 7629dc2113..355f0c1850 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-view-field/utils/from-view-field-entity-to-flat-view-field.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-view-field/utils/from-view-field-entity-to-flat-view-field.util.ts @@ -14,6 +14,9 @@ export const fromViewFieldEntityToFlatViewField = ( return { ...viewFieldEntityWithoutRelations, + createdAt: viewFieldEntity.createdAt.toISOString(), + updatedAt: viewFieldEntity.updatedAt.toISOString(), + deletedAt: viewFieldEntity.deletedAt?.toISOString() ?? null, universalIdentifier: viewFieldEntityWithoutRelations.universalIdentifier ?? viewFieldEntityWithoutRelations.id, diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-view-filter/utils/from-create-view-filter-input-to-flat-view-filter-to-create.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-view-filter/utils/from-create-view-filter-input-to-flat-view-filter-to-create.util.ts index 4e0966a59b..eb9fc1b82d 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-view-filter/utils/from-create-view-filter-input-to-flat-view-filter-to-create.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-view-filter/utils/from-create-view-filter-input-to-flat-view-filter-to-create.util.ts @@ -27,7 +27,7 @@ export const fromCreateViewFilterInputToFlatViewFilterToCreate = ({ ], ); - const createdAt = new Date(); + const createdAt = new Date().toISOString(); const viewFilterId = createViewFilterInput.id ?? v4(); return { diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-view-filter/utils/from-delete-view-filter-input-to-flat-view-filter-or-throw.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-view-filter/utils/from-delete-view-filter-input-to-flat-view-filter-or-throw.util.ts index 17a7041173..4c33885967 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-view-filter/utils/from-delete-view-filter-input-to-flat-view-filter-or-throw.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-view-filter/utils/from-delete-view-filter-input-to-flat-view-filter-or-throw.util.ts @@ -35,6 +35,6 @@ export const fromDeleteViewFilterInputToFlatViewFilterOrThrow = ({ return { ...existingFlatViewFilterToDelete, - deletedAt: new Date(), + deletedAt: new Date().toISOString(), }; }; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-view-filter/utils/from-view-filter-entity-to-flat-view-filter.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-view-filter/utils/from-view-filter-entity-to-flat-view-filter.util.ts index 95377c53d9..07d7a5bfec 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-view-filter/utils/from-view-filter-entity-to-flat-view-filter.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-view-filter/utils/from-view-filter-entity-to-flat-view-filter.util.ts @@ -14,6 +14,9 @@ export const fromViewFilterEntityToFlatViewFilter = ( return { ...viewFilterEntityWithoutRelations, + createdAt: viewFilterEntity.createdAt.toISOString(), + updatedAt: viewFilterEntity.updatedAt.toISOString(), + deletedAt: viewFilterEntity.deletedAt?.toISOString() ?? null, universalIdentifier: viewFilterEntityWithoutRelations.universalIdentifier ?? viewFilterEntityWithoutRelations.id, diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-view-group/utils/compute-flat-view-groups-on-view-create.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-view-group/utils/compute-flat-view-groups-on-view-create.util.ts index 95871b30ed..b28955cd27 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-view-group/utils/compute-flat-view-groups-on-view-create.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-view-group/utils/compute-flat-view-groups-on-view-create.util.ts @@ -28,7 +28,7 @@ export const computeFlatViewGroupsOnViewCreate = ({ ); } - const createdAt = new Date(); + const createdAt = new Date().toISOString(); const flatViewGroupsFromOptions: FlatViewGroup[] = ( mainGroupByFieldMetadata.options ?? [] diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-view-group/utils/from-create-view-group-input-to-flat-view-group-to-create.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-view-group/utils/from-create-view-group-input-to-flat-view-group-to-create.util.ts index a7bad09dd3..3369037b32 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-view-group/utils/from-create-view-group-input-to-flat-view-group-to-create.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-view-group/utils/from-create-view-group-input-to-flat-view-group-to-create.util.ts @@ -21,7 +21,7 @@ export const fromCreateViewGroupInputToFlatViewGroupToCreate = ({ ['fieldValue', 'id', 'viewId'], ); - const createdAt = new Date(); + const createdAt = new Date().toISOString(); const viewGroupId = createViewGroupInput.id ?? v4(); return { diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-view-group/utils/from-delete-view-group-input-to-flat-view-group-or-throw.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-view-group/utils/from-delete-view-group-input-to-flat-view-group-or-throw.util.ts index 1416c2e5f3..f8da0ab648 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-view-group/utils/from-delete-view-group-input-to-flat-view-group-or-throw.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-view-group/utils/from-delete-view-group-input-to-flat-view-group-or-throw.util.ts @@ -35,6 +35,6 @@ export const fromDeleteViewGroupInputToFlatViewGroupOrThrow = ({ return { ...existingFlatViewGroupToDelete, - deletedAt: new Date(), + deletedAt: new Date().toISOString(), }; }; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-view-group/utils/from-view-group-entity-to-flat-view-group.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-view-group/utils/from-view-group-entity-to-flat-view-group.util.ts index e8cc3b8322..67d0d3679f 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-view-group/utils/from-view-group-entity-to-flat-view-group.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-view-group/utils/from-view-group-entity-to-flat-view-group.util.ts @@ -14,6 +14,9 @@ export const fromViewGroupEntityToFlatViewGroup = ( return { ...viewGroupEntityWithoutRelations, + createdAt: viewGroupEntity.createdAt.toISOString(), + updatedAt: viewGroupEntity.updatedAt.toISOString(), + deletedAt: viewGroupEntity.deletedAt?.toISOString() ?? null, universalIdentifier: viewGroupEntityWithoutRelations.universalIdentifier ?? viewGroupEntityWithoutRelations.id, diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-view/utils/from-create-view-input-to-flat-view-to-create.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-view/utils/from-create-view-input-to-flat-view-to-create.util.ts index b44cf130bd..f78b8c9e5d 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-view/utils/from-create-view-input-to-flat-view-to-create.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-view/utils/from-create-view-input-to-flat-view-to-create.util.ts @@ -35,7 +35,7 @@ export const fromCreateViewInputToFlatViewToCreate = ({ ['id', 'name', 'objectMetadataId'], ); - const createdAt = new Date(); + const createdAt = new Date().toISOString(); const viewId = createViewInput.id ?? v4(); const flatViewToCreate = { diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-view/utils/from-delete-view-input-to-flat-view-or-throw.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-view/utils/from-delete-view-input-to-flat-view-or-throw.util.ts index 61f81ed25e..d47bbf837a 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-view/utils/from-delete-view-input-to-flat-view-or-throw.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-view/utils/from-delete-view-input-to-flat-view-or-throw.util.ts @@ -35,6 +35,6 @@ export const fromDeleteViewInputToFlatViewOrThrow = ({ return { ...existingFlatViewToDelete, - deletedAt: new Date(), + deletedAt: new Date().toISOString(), }; }; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-view/utils/from-view-entity-to-flat-view.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-view/utils/from-view-entity-to-flat-view.util.ts index 4966e2101a..3575a28f5b 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-view/utils/from-view-entity-to-flat-view.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-view/utils/from-view-entity-to-flat-view.util.ts @@ -12,6 +12,9 @@ export const fromViewEntityToFlatView = (viewEntity: ViewEntity): FlatView => { return { ...viewEntityWithoutRelations, + createdAt: viewEntity.createdAt.toISOString(), + updatedAt: viewEntity.updatedAt.toISOString(), + deletedAt: viewEntity.deletedAt?.toISOString() ?? null, universalIdentifier: viewEntityWithoutRelations.universalIdentifier ?? viewEntityWithoutRelations.id, diff --git a/packages/twenty-server/src/engine/metadata-modules/object-metadata/utils/build-default-index-for-custom-object.util.ts b/packages/twenty-server/src/engine/metadata-modules/object-metadata/utils/build-default-index-for-custom-object.util.ts index ec617f404c..adf4e251a2 100644 --- a/packages/twenty-server/src/engine/metadata-modules/object-metadata/utils/build-default-index-for-custom-object.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/object-metadata/utils/build-default-index-for-custom-object.util.ts @@ -23,16 +23,16 @@ export const buildDefaultIndexesForCustomObject = ({ const tsVectorFlatIndex = generateFlatIndexMetadataWithNameOrThrow({ objectFlatFieldMetadatas, flatIndex: { - createdAt, + createdAt: createdAt.toISOString(), flatIndexFieldMetadatas: [ { - createdAt, + createdAt: createdAt.toISOString(), fieldMetadataId: defaultFlatFieldForCustomObjectMaps.fields.searchVectorField.id, id: v4(), indexMetadataId: tsFlatVectorIndexId, order: 0, - updatedAt: createdAt, + updatedAt: createdAt.toISOString(), }, ], id: tsFlatVectorIndexId, @@ -42,7 +42,7 @@ export const buildDefaultIndexesForCustomObject = ({ isUnique: false, objectMetadataId: flatObjectMetadata.id, universalIdentifier: tsFlatVectorIndexId, - updatedAt: createdAt, + updatedAt: createdAt.toISOString(), workspaceId, applicationId: flatObjectMetadata.applicationId ?? null, }, diff --git a/packages/twenty-server/src/engine/metadata-modules/role-target/utils/from-create-role-target-input-to-flat-role-target-to-create.util.ts b/packages/twenty-server/src/engine/metadata-modules/role-target/utils/from-create-role-target-input-to-flat-role-target-to-create.util.ts index 1254e0890e..74862bb2a2 100644 --- a/packages/twenty-server/src/engine/metadata-modules/role-target/utils/from-create-role-target-input-to-flat-role-target-to-create.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/role-target/utils/from-create-role-target-input-to-flat-role-target-to-create.util.ts @@ -1,5 +1,5 @@ -import { v4 } from 'uuid'; import { isDefined } from 'twenty-shared/utils'; +import { v4 } from 'uuid'; import { type AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type'; import { type FlatRoleTarget } from 'src/engine/metadata-modules/flat-role-target/types/flat-role-target.type'; @@ -28,8 +28,8 @@ export const fromCreateRoleTargetInputToFlatRoleTargetToCreate = ({ agentId: null, apiKeyId: null, targetApplicationId: null, - createdAt: now, - updatedAt: now, + createdAt: now.toISOString(), + updatedAt: now.toISOString(), universalIdentifier: universalIdentifier ?? v4(), workspaceId, applicationId: createRoleTargetInput.applicationId, diff --git a/packages/twenty-server/src/engine/metadata-modules/role/role.resolver.ts b/packages/twenty-server/src/engine/metadata-modules/role/role.resolver.ts index 4ce15c46ed..cf7d185b57 100644 --- a/packages/twenty-server/src/engine/metadata-modules/role/role.resolver.ts +++ b/packages/twenty-server/src/engine/metadata-modules/role/role.resolver.ts @@ -288,6 +288,9 @@ export class RoleResolver { return agents.map((agentEntity) => fromFlatAgentWithRoleIdToAgentDto({ ...agentEntity, + createdAt: agentEntity.createdAt.toISOString(), + updatedAt: agentEntity.updatedAt.toISOString(), + deletedAt: agentEntity.deletedAt?.toISOString() ?? null, universalIdentifier: agentEntity.universalIdentifier ?? agentEntity.id, roleId: role.id, }), diff --git a/packages/twenty-server/src/engine/metadata-modules/route-trigger/services/workspace-flat-route-trigger-map-cache.service.ts b/packages/twenty-server/src/engine/metadata-modules/route-trigger/services/workspace-flat-route-trigger-map-cache.service.ts index 32e8f43c3e..7dbcc378a3 100644 --- a/packages/twenty-server/src/engine/metadata-modules/route-trigger/services/workspace-flat-route-trigger-map-cache.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/route-trigger/services/workspace-flat-route-trigger-map-cache.service.ts @@ -44,6 +44,8 @@ export class WorkspaceFlatRouteTriggerMapCacheService extends WorkspaceCacheProv ...removePropertiesFromRecord(routeTriggerEntity, [ ...ROUTE_TRIGGER_ENTITY_RELATION_PROPERTIES, ]), + createdAt: routeTriggerEntity.createdAt.toISOString(), + updatedAt: routeTriggerEntity.updatedAt.toISOString(), universalIdentifier: routeTriggerEntity.universalIdentifier ?? routeTriggerEntity.id, } satisfies FlatRouteTrigger; diff --git a/packages/twenty-server/src/engine/metadata-modules/route-trigger/utils/from-create-route-trigger-input-to-flat-route-trigger.util.ts b/packages/twenty-server/src/engine/metadata-modules/route-trigger/utils/from-create-route-trigger-input-to-flat-route-trigger.util.ts index 510f2d3f12..651c82a463 100644 --- a/packages/twenty-server/src/engine/metadata-modules/route-trigger/utils/from-create-route-trigger-input-to-flat-route-trigger.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/route-trigger/utils/from-create-route-trigger-input-to-flat-route-trigger.util.ts @@ -23,8 +23,8 @@ export const fromCreateRouteTriggerInputToFlatRouteTrigger = ({ httpMethod: createRouteTriggerInput.httpMethod, serverlessFunctionId: createRouteTriggerInput.serverlessFunctionId, workspaceId, - createdAt: now, - updatedAt: now, + createdAt: now.toISOString(), + updatedAt: now.toISOString(), applicationId: workspaceCustomApplicationId, }; }; diff --git a/packages/twenty-server/src/engine/metadata-modules/route-trigger/utils/from-update-route-trigger-input-to-flat-route-trigger-to-update-or-throw.util.ts b/packages/twenty-server/src/engine/metadata-modules/route-trigger/utils/from-update-route-trigger-input-to-flat-route-trigger-to-update-or-throw.util.ts index 51292f9595..f01b72c55d 100644 --- a/packages/twenty-server/src/engine/metadata-modules/route-trigger/utils/from-update-route-trigger-input-to-flat-route-trigger-to-update-or-throw.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/route-trigger/utils/from-update-route-trigger-input-to-flat-route-trigger-to-update-or-throw.util.ts @@ -25,9 +25,9 @@ export const fromUpdateRouteTriggerInputToFlatRouteTriggerToUpdateOrThrow = ({ return { ...existingFlatRouteTrigger, + updatedAt: new Date().toISOString(), path: updateRouteTriggerInput.update.path, isAuthRequired: updateRouteTriggerInput.update.isAuthRequired, httpMethod: updateRouteTriggerInput.update.httpMethod, - updatedAt: new Date(), }; }; diff --git a/packages/twenty-server/src/engine/metadata-modules/serverless-function/services/serverless-function-v2.service.ts b/packages/twenty-server/src/engine/metadata-modules/serverless-function/services/serverless-function-v2.service.ts index 79ac472b5f..c675efd562 100644 --- a/packages/twenty-server/src/engine/metadata-modules/serverless-function/services/serverless-function-v2.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/serverless-function/services/serverless-function-v2.service.ts @@ -179,7 +179,7 @@ export class ServerlessFunctionV2Service { const optimisticallyUpdatedFlatServerlessFunctionWithDeletedAt = { ...existingFlatServerlessFunction, - deletedAt: new Date(), + deletedAt: new Date().toISOString(), }; const validateAndBuildResult = diff --git a/packages/twenty-server/src/engine/metadata-modules/serverless-function/utils/from-create-serverless-function-input-to-flat-serverless-function.util.ts b/packages/twenty-server/src/engine/metadata-modules/serverless-function/utils/from-create-serverless-function-input-to-flat-serverless-function.util.ts index 3eb63f5506..1ce791d3cd 100644 --- a/packages/twenty-server/src/engine/metadata-modules/serverless-function/utils/from-create-serverless-function-input-to-flat-serverless-function.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/serverless-function/utils/from-create-serverless-function-input-to-flat-serverless-function.util.ts @@ -38,8 +38,8 @@ export const fromCreateServerlessFunctionInputToFlatServerlessFunction = ({ rawCreateServerlessFunctionInput.handlerName ?? DEFAULT_HANDLER_NAME, universalIdentifier: rawCreateServerlessFunctionInput.universalIdentifier ?? id, - createdAt: currentDate, - updatedAt: currentDate, + createdAt: currentDate.toISOString(), + updatedAt: currentDate.toISOString(), deletedAt: null, latestVersion: null, publishedVersions: [], diff --git a/packages/twenty-server/src/engine/metadata-modules/serverless-function/utils/from-serverless-function-entity-to-flat-serverless-function.type.ts b/packages/twenty-server/src/engine/metadata-modules/serverless-function/utils/from-serverless-function-entity-to-flat-serverless-function.type.ts index 17c7858fce..7c5adce3c4 100644 --- a/packages/twenty-server/src/engine/metadata-modules/serverless-function/utils/from-serverless-function-entity-to-flat-serverless-function.type.ts +++ b/packages/twenty-server/src/engine/metadata-modules/serverless-function/utils/from-serverless-function-entity-to-flat-serverless-function.type.ts @@ -19,6 +19,9 @@ export const fromServerlessFunctionEntityToFlatServerlessFunction = ( return { ...serverlessFunctionWithoutRelations, + createdAt: serverlessFunctionEntity.createdAt.toISOString(), + updatedAt: serverlessFunctionEntity.updatedAt.toISOString(), + deletedAt: serverlessFunctionEntity.deletedAt?.toISOString() ?? null, cronTriggerIds: serverlessFunctionEntity.cronTriggers.map((el) => el.id) ?? [], routeTriggerIds: diff --git a/packages/twenty-server/src/engine/metadata-modules/view-field/services/view-field-v2.service.ts b/packages/twenty-server/src/engine/metadata-modules/view-field/services/view-field-v2.service.ts index 2d123c400d..3e4d3ec05b 100644 --- a/packages/twenty-server/src/engine/metadata-modules/view-field/services/view-field-v2.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/view-field/services/view-field-v2.service.ts @@ -22,6 +22,7 @@ import { ViewFieldException, ViewFieldExceptionCode, } from 'src/engine/metadata-modules/view-field/exceptions/view-field.exception'; +import { fromFlatViewFieldToViewFieldDto } from 'src/engine/metadata-modules/view-field/utils/from-flat-view-field-to-view-field-dto.util'; import { WorkspaceMigrationBuilderExceptionV2 } from 'src/engine/workspace-manager/workspace-migration-v2/exceptions/workspace-migration-builder-exception-v2'; import { WorkspaceMigrationValidateBuildAndRunService } from 'src/engine/workspace-manager/workspace-migration-v2/services/workspace-migration-validate-build-and-run-service'; @@ -117,7 +118,7 @@ export class ViewFieldV2Service { return findManyFlatEntityByIdInFlatEntityMapsOrThrow({ flatEntityIds: flatViewFieldsToCreate.map((el) => el.id), flatEntityMaps: recomputedExistingFlatViewFieldMaps, - }); + }).map(fromFlatViewFieldToViewFieldDto); } async updateOne({ @@ -171,10 +172,12 @@ export class ViewFieldV2Service { }, ); - return findFlatEntityByIdInFlatEntityMapsOrThrow({ - flatEntityId: optimisticallyUpdatedFlatView.id, - flatEntityMaps: recomputedExistingFlatViewFieldMaps, - }); + return fromFlatViewFieldToViewFieldDto( + findFlatEntityByIdInFlatEntityMapsOrThrow({ + flatEntityId: optimisticallyUpdatedFlatView.id, + flatEntityMaps: recomputedExistingFlatViewFieldMaps, + }), + ); } async deleteOne({ @@ -228,10 +231,12 @@ export class ViewFieldV2Service { }, ); - return findFlatEntityByIdInFlatEntityMapsOrThrow({ - flatEntityId: optimisticallyUpdatedFlatViewWithDeletedAt.id, - flatEntityMaps: recomputedExistingFlatViewFieldMaps, - }); + return fromFlatViewFieldToViewFieldDto( + findFlatEntityByIdInFlatEntityMapsOrThrow({ + flatEntityId: optimisticallyUpdatedFlatViewWithDeletedAt.id, + flatEntityMaps: recomputedExistingFlatViewFieldMaps, + }), + ); } async destroyOne({ @@ -277,7 +282,7 @@ export class ViewFieldV2Service { ); } - return existingViewFieldToDelete; + return fromFlatViewFieldToViewFieldDto(existingViewFieldToDelete); } async findByWorkspaceId(workspaceId: string): Promise { diff --git a/packages/twenty-server/src/engine/metadata-modules/view-field/utils/from-flat-view-field-to-view-field-dto.util.ts b/packages/twenty-server/src/engine/metadata-modules/view-field/utils/from-flat-view-field-to-view-field-dto.util.ts new file mode 100644 index 0000000000..d20d743e95 --- /dev/null +++ b/packages/twenty-server/src/engine/metadata-modules/view-field/utils/from-flat-view-field-to-view-field-dto.util.ts @@ -0,0 +1,15 @@ +import { type FlatViewField } from 'src/engine/metadata-modules/flat-view-field/types/flat-view-field.type'; +import { type ViewFieldDTO } from 'src/engine/metadata-modules/view-field/dtos/view-field.dto'; + +export const fromFlatViewFieldToViewFieldDto = ( + flatViewField: FlatViewField, +): ViewFieldDTO => { + const { createdAt, updatedAt, deletedAt, ...rest } = flatViewField; + + return { + ...rest, + createdAt: new Date(createdAt), + updatedAt: new Date(updatedAt), + deletedAt: deletedAt ? new Date(deletedAt) : null, + }; +}; diff --git a/packages/twenty-server/src/engine/metadata-modules/view-filter/services/view-filter.service.ts b/packages/twenty-server/src/engine/metadata-modules/view-filter/services/view-filter.service.ts index 559d40c2bc..69c00c7f96 100644 --- a/packages/twenty-server/src/engine/metadata-modules/view-filter/services/view-filter.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/view-filter/services/view-filter.service.ts @@ -17,6 +17,7 @@ import { DestroyViewFilterInput } from 'src/engine/metadata-modules/view-filter/ import { UpdateViewFilterInput } from 'src/engine/metadata-modules/view-filter/dtos/inputs/update-view-filter.input'; import { ViewFilterDTO } from 'src/engine/metadata-modules/view-filter/dtos/view-filter.dto'; import { ViewFilterEntity } from 'src/engine/metadata-modules/view-filter/entities/view-filter.entity'; +import { fromFlatViewFilterToViewFilterDto } from 'src/engine/metadata-modules/view-filter/utils/from-flat-view-filter-to-view-filter-dto.util'; import { WorkspaceMigrationBuilderExceptionV2 } from 'src/engine/workspace-manager/workspace-migration-v2/exceptions/workspace-migration-builder-exception-v2'; import { WorkspaceMigrationValidateBuildAndRunService } from 'src/engine/workspace-manager/workspace-migration-v2/services/workspace-migration-validate-build-and-run-service'; @@ -86,10 +87,12 @@ export class ViewFilterService { }, ); - return findFlatEntityByIdInFlatEntityMapsOrThrow({ - flatEntityId: flatViewFilterToCreate.id, - flatEntityMaps: recomputedExistingFlatViewFilterMaps, - }); + return fromFlatViewFilterToViewFilterDto( + findFlatEntityByIdInFlatEntityMapsOrThrow({ + flatEntityId: flatViewFilterToCreate.id, + flatEntityMaps: recomputedExistingFlatViewFilterMaps, + }), + ); } async updateOne({ @@ -143,10 +146,12 @@ export class ViewFilterService { }, ); - return findFlatEntityByIdInFlatEntityMapsOrThrow({ - flatEntityId: optimisticallyUpdatedFlatViewFilter.id, - flatEntityMaps: recomputedExistingFlatViewFilterMaps, - }); + return fromFlatViewFilterToViewFilterDto( + findFlatEntityByIdInFlatEntityMapsOrThrow({ + flatEntityId: optimisticallyUpdatedFlatViewFilter.id, + flatEntityMaps: recomputedExistingFlatViewFilterMaps, + }), + ); } async deleteOne({ @@ -202,10 +207,12 @@ export class ViewFilterService { }, ); - return findFlatEntityByIdInFlatEntityMapsOrThrow({ - flatEntityId: optimisticallyUpdatedFlatViewFilterWithDeletedAt.id, - flatEntityMaps: recomputedExistingFlatViewFilterMaps, - }); + return fromFlatViewFilterToViewFilterDto( + findFlatEntityByIdInFlatEntityMapsOrThrow({ + flatEntityId: optimisticallyUpdatedFlatViewFilterWithDeletedAt.id, + flatEntityMaps: recomputedExistingFlatViewFilterMaps, + }), + ); } async destroyOne({ @@ -251,7 +258,7 @@ export class ViewFilterService { ); } - return existingViewFilterToDelete; + return fromFlatViewFilterToViewFilterDto(existingViewFilterToDelete); } async findByWorkspaceId(workspaceId: string): Promise { diff --git a/packages/twenty-server/src/engine/metadata-modules/view-filter/utils/from-flat-view-filter-to-view-filter-dto.util.ts b/packages/twenty-server/src/engine/metadata-modules/view-filter/utils/from-flat-view-filter-to-view-filter-dto.util.ts new file mode 100644 index 0000000000..565a62cf48 --- /dev/null +++ b/packages/twenty-server/src/engine/metadata-modules/view-filter/utils/from-flat-view-filter-to-view-filter-dto.util.ts @@ -0,0 +1,15 @@ +import { type FlatViewFilter } from 'src/engine/metadata-modules/flat-view-filter/types/flat-view-filter.type'; +import { type ViewFilterDTO } from 'src/engine/metadata-modules/view-filter/dtos/view-filter.dto'; + +export const fromFlatViewFilterToViewFilterDto = ( + flatViewFilter: FlatViewFilter, +): ViewFilterDTO => { + const { createdAt, updatedAt, deletedAt, ...rest } = flatViewFilter; + + return { + ...rest, + createdAt: new Date(createdAt), + updatedAt: new Date(updatedAt), + deletedAt: deletedAt ? new Date(deletedAt) : null, + }; +}; diff --git a/packages/twenty-server/src/engine/metadata-modules/view-group/services/view-group.service.ts b/packages/twenty-server/src/engine/metadata-modules/view-group/services/view-group.service.ts index f654012cec..c0e68199fc 100644 --- a/packages/twenty-server/src/engine/metadata-modules/view-group/services/view-group.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/view-group/services/view-group.service.ts @@ -22,6 +22,7 @@ import { ViewGroupException, ViewGroupExceptionCode, } from 'src/engine/metadata-modules/view-group/exceptions/view-group.exception'; +import { fromFlatViewGroupToViewGroupDto } from 'src/engine/metadata-modules/view-group/utils/from-flat-view-group-to-view-group-dto.util'; import { WorkspaceMigrationBuilderExceptionV2 } from 'src/engine/workspace-manager/workspace-migration-v2/exceptions/workspace-migration-builder-exception-v2'; import { WorkspaceMigrationValidateBuildAndRunService } from 'src/engine/workspace-manager/workspace-migration-v2/services/workspace-migration-validate-build-and-run-service'; @@ -138,7 +139,7 @@ export class ViewGroupService { return findManyFlatEntityByIdInFlatEntityMapsOrThrow({ flatEntityIds: flatViewGroupsToCreate.map((el) => el.id), flatEntityMaps: recomputedExistingFlatViewGroupMaps, - }); + }).map(fromFlatViewGroupToViewGroupDto); } async updateOne({ @@ -192,10 +193,12 @@ export class ViewGroupService { }, ); - return findFlatEntityByIdInFlatEntityMapsOrThrow({ - flatEntityId: optimisticallyUpdatedFlatViewGroup.id, - flatEntityMaps: recomputedExistingFlatViewGroupMaps, - }); + return fromFlatViewGroupToViewGroupDto( + findFlatEntityByIdInFlatEntityMapsOrThrow({ + flatEntityId: optimisticallyUpdatedFlatViewGroup.id, + flatEntityMaps: recomputedExistingFlatViewGroupMaps, + }), + ); } async deleteOne({ @@ -251,10 +254,12 @@ export class ViewGroupService { }, ); - return findFlatEntityByIdInFlatEntityMapsOrThrow({ - flatEntityId: optimisticallyUpdatedFlatViewGroupWithDeletedAt.id, - flatEntityMaps: recomputedExistingFlatViewGroupMaps, - }); + return fromFlatViewGroupToViewGroupDto( + findFlatEntityByIdInFlatEntityMapsOrThrow({ + flatEntityId: optimisticallyUpdatedFlatViewGroupWithDeletedAt.id, + flatEntityMaps: recomputedExistingFlatViewGroupMaps, + }), + ); } async destroyOne({ @@ -300,7 +305,7 @@ export class ViewGroupService { ); } - return existingViewGroupToDelete; + return fromFlatViewGroupToViewGroupDto(existingViewGroupToDelete); } async findByWorkspaceId(workspaceId: string): Promise { diff --git a/packages/twenty-server/src/engine/metadata-modules/view-group/utils/from-flat-view-group-to-view-group-dto.util.ts b/packages/twenty-server/src/engine/metadata-modules/view-group/utils/from-flat-view-group-to-view-group-dto.util.ts new file mode 100644 index 0000000000..eca1dfdb94 --- /dev/null +++ b/packages/twenty-server/src/engine/metadata-modules/view-group/utils/from-flat-view-group-to-view-group-dto.util.ts @@ -0,0 +1,15 @@ +import { type FlatViewGroup } from 'src/engine/metadata-modules/flat-view-group/types/flat-view-group.type'; +import { type ViewGroupDTO } from 'src/engine/metadata-modules/view-group/dtos/view-group.dto'; + +export const fromFlatViewGroupToViewGroupDto = ( + flatViewGroup: FlatViewGroup, +): ViewGroupDTO => { + const { createdAt, updatedAt, deletedAt, ...rest } = flatViewGroup; + + return { + ...rest, + createdAt: new Date(createdAt), + updatedAt: new Date(updatedAt), + deletedAt: deletedAt ? new Date(deletedAt) : null, + }; +}; diff --git a/packages/twenty-server/src/engine/metadata-modules/view/services/view.service.ts b/packages/twenty-server/src/engine/metadata-modules/view/services/view.service.ts index f7fae70788..7687d949ff 100644 --- a/packages/twenty-server/src/engine/metadata-modules/view/services/view.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/view/services/view.service.ts @@ -21,6 +21,7 @@ import { UpdateViewInput } from 'src/engine/metadata-modules/view/dtos/inputs/up import { ViewDTO } from 'src/engine/metadata-modules/view/dtos/view.dto'; import { ViewEntity } from 'src/engine/metadata-modules/view/entities/view.entity'; import { ViewVisibility } from 'src/engine/metadata-modules/view/enums/view-visibility.enum'; +import { fromFlatViewToViewDto } from 'src/engine/metadata-modules/view/utils/from-flat-view-to-view-dto.util'; import { WorkspaceMigrationBuilderExceptionV2 } from 'src/engine/workspace-manager/workspace-migration-v2/exceptions/workspace-migration-builder-exception-v2'; import { WorkspaceMigrationValidateBuildAndRunService } from 'src/engine/workspace-manager/workspace-migration-v2/services/workspace-migration-validate-build-and-run-service'; @@ -104,10 +105,12 @@ export class ViewService { }, ); - return findFlatEntityByIdInFlatEntityMapsOrThrow({ - flatEntityId: flatViewToCreate.id, - flatEntityMaps: recomputedExistingFlatViewMaps, - }); + return fromFlatViewToViewDto( + findFlatEntityByIdInFlatEntityMapsOrThrow({ + flatEntityId: flatViewToCreate.id, + flatEntityMaps: recomputedExistingFlatViewMaps, + }), + ); } async updateOne({ @@ -178,10 +181,12 @@ export class ViewService { }, ); - return findFlatEntityByIdInFlatEntityMapsOrThrow({ - flatEntityId: updateViewInput.id, - flatEntityMaps: recomputedExistingFlatViewMaps, - }); + return fromFlatViewToViewDto( + findFlatEntityByIdInFlatEntityMapsOrThrow({ + flatEntityId: updateViewInput.id, + flatEntityMaps: recomputedExistingFlatViewMaps, + }), + ); } async deleteOne({ @@ -235,10 +240,12 @@ export class ViewService { }, ); - return findFlatEntityByIdInFlatEntityMapsOrThrow({ - flatEntityId: deleteViewInput.id, - flatEntityMaps: recomputedExistingFlatViewMaps, - }); + return fromFlatViewToViewDto( + findFlatEntityByIdInFlatEntityMapsOrThrow({ + flatEntityId: deleteViewInput.id, + flatEntityMaps: recomputedExistingFlatViewMaps, + }), + ); } async destroyOne({ @@ -283,7 +290,7 @@ export class ViewService { ); } - return flatViewFromDestroyInput; + return fromFlatViewToViewDto(flatViewFromDestroyInput); } processViewNameWithTemplate( diff --git a/packages/twenty-server/src/engine/metadata-modules/view/utils/from-flat-view-to-view-dto.util.ts b/packages/twenty-server/src/engine/metadata-modules/view/utils/from-flat-view-to-view-dto.util.ts new file mode 100644 index 0000000000..d2c3e93042 --- /dev/null +++ b/packages/twenty-server/src/engine/metadata-modules/view/utils/from-flat-view-to-view-dto.util.ts @@ -0,0 +1,13 @@ +import { type FlatView } from 'src/engine/metadata-modules/flat-view/types/flat-view.type'; +import { type ViewDTO } from 'src/engine/metadata-modules/view/dtos/view.dto'; + +export const fromFlatViewToViewDto = (flatView: FlatView): ViewDTO => { + const { createdAt, updatedAt, deletedAt, ...rest } = flatView; + + return { + ...rest, + createdAt: new Date(createdAt), + updatedAt: new Date(updatedAt), + deletedAt: deletedAt ? new Date(deletedAt) : null, + }; +}; diff --git a/packages/twenty-server/src/engine/twenty-orm/entity-manager/workspace-entity-manager.spec.ts b/packages/twenty-server/src/engine/twenty-orm/entity-manager/workspace-entity-manager.spec.ts index 22deb35ba3..a7d9b7f25c 100644 --- a/packages/twenty-server/src/engine/twenty-orm/entity-manager/workspace-entity-manager.spec.ts +++ b/packages/twenty-server/src/engine/twenty-orm/entity-manager/workspace-entity-manager.spec.ts @@ -114,8 +114,8 @@ describe('WorkspaceEntityManager', () => { isLabelSyncedWithName: false, isUIReadOnly: false, duplicateCriteria: null, - createdAt: new Date(), - updatedAt: new Date(), + createdAt: new Date().toISOString(), + updatedAt: new Date().toISOString(), }; (getObjectMetadataFromEntityTarget as jest.Mock).mockReturnValue( diff --git a/packages/twenty-server/src/engine/twenty-orm/utils/__tests__/get-column-name-to-field-metadata-id.util.spec.ts b/packages/twenty-server/src/engine/twenty-orm/utils/__tests__/get-column-name-to-field-metadata-id.util.spec.ts index 469f35f44c..c32efd73e5 100644 --- a/packages/twenty-server/src/engine/twenty-orm/utils/__tests__/get-column-name-to-field-metadata-id.util.spec.ts +++ b/packages/twenty-server/src/engine/twenty-orm/utils/__tests__/get-column-name-to-field-metadata-id.util.spec.ts @@ -30,8 +30,8 @@ describe('getColumnNameToFieldMetadataIdMap', () => { viewIds: [], applicationId: null, isLabelSyncedWithName: false, - createdAt: new Date(), - updatedAt: new Date(), + createdAt: new Date().toISOString(), + updatedAt: new Date().toISOString(), shortcut: null, description: null, standardOverrides: null, diff --git a/packages/twenty-server/src/engine/twenty-orm/utils/__tests__/get-field-metadata-id-to-column-names-map.util.spec.ts b/packages/twenty-server/src/engine/twenty-orm/utils/__tests__/get-field-metadata-id-to-column-names-map.util.spec.ts index 7e8e9c90b9..35ba0ae57c 100644 --- a/packages/twenty-server/src/engine/twenty-orm/utils/__tests__/get-field-metadata-id-to-column-names-map.util.spec.ts +++ b/packages/twenty-server/src/engine/twenty-orm/utils/__tests__/get-field-metadata-id-to-column-names-map.util.spec.ts @@ -30,8 +30,8 @@ describe('getFieldMetadataIdToColumnNamesMap', () => { viewIds: [], applicationId: null, isLabelSyncedWithName: false, - createdAt: new Date(), - updatedAt: new Date(), + createdAt: new Date().toISOString(), + updatedAt: new Date().toISOString(), shortcut: null, description: null, standardOverrides: null, diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/index/create-standard-index-flat-metadata.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/index/create-standard-index-flat-metadata.util.ts index 693a3872e4..95b2b2f4d2 100644 --- a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/index/create-standard-index-flat-metadata.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/index/create-standard-index-flat-metadata.util.ts @@ -78,7 +78,7 @@ export const createStandardIndexFlatMetadata = < return generateFlatIndexMetadataWithNameOrThrow({ flatIndex: { - createdAt: now, + createdAt: now.toISOString(), applicationId: twentyStandardApplicationId, indexType, indexWhereClause, @@ -86,17 +86,17 @@ export const createStandardIndexFlatMetadata = < isUnique, objectMetadataId, universalIdentifier: indexDefinition.universalIdentifier, - updatedAt: now, + updatedAt: now.toISOString(), workspaceId, id: indexId, flatIndexFieldMetadatas: flatFieldMetadatas.map( ({ id: fieldMetadataId }, index) => ({ - createdAt: now, + createdAt: now.toISOString(), fieldMetadataId, id: v4(), indexMetadataId: indexId, order: index, - updatedAt: now, + updatedAt: now.toISOString(), }), ), }, diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/object-metadata/create-standard-object-flat-metadata.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/object-metadata/create-standard-object-flat-metadata.util.ts index 8304bef00e..945d496778 100644 --- a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/object-metadata/create-standard-object-flat-metadata.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/object-metadata/create-standard-object-flat-metadata.util.ts @@ -81,7 +81,7 @@ export const createStandardObjectFlatMetadata = < fieldMetadataIds: [], indexMetadataIds: [], viewIds: [], - createdAt: now, - updatedAt: now, + createdAt: now.toISOString(), + updatedAt: now.toISOString(), id: standardFieldMetadataIdByObjectAndFieldName[nameSingular].id, }); diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/types/extract-record-typeorm-non-nullable-date-properties.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/types/extract-record-typeorm-non-nullable-date-properties.type.ts new file mode 100644 index 0000000000..962d8fd50b --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/types/extract-record-typeorm-non-nullable-date-properties.type.ts @@ -0,0 +1,5 @@ +export type ExtractRecordTypeOrmNonNullableDateProperties = NonNullable< + { + [P in keyof T]: null extends T[P] ? never : T[P] extends Date ? P : never; + }[keyof T] +>; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/types/extract-record-typeorm-nullable-date-properties.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/types/extract-record-typeorm-nullable-date-properties.type.ts new file mode 100644 index 0000000000..8f1619f85e --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/types/extract-record-typeorm-nullable-date-properties.type.ts @@ -0,0 +1,9 @@ +export type ExtractRecordTypeOrmNullableDateProperties = NonNullable< + { + [P in keyof T]: null extends T[P] + ? NonNullable extends Date + ? P + : never + : never; + }[keyof T] +>; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/utils/add-flat-entity-to-flat-entity-maps-through-mutation-or-throw.util.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/utils/add-flat-entity-to-flat-entity-maps-through-mutation-or-throw.util.ts index 29815d3649..cfd5d86de8 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/utils/add-flat-entity-to-flat-entity-maps-through-mutation-or-throw.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/utils/add-flat-entity-to-flat-entity-maps-through-mutation-or-throw.util.ts @@ -5,17 +5,17 @@ import { FlatEntityMapsExceptionCode, } from 'src/engine/metadata-modules/flat-entity/exceptions/flat-entity-maps.exception'; import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type'; -import { type FlatEntity } from 'src/engine/metadata-modules/flat-entity/types/flat-entity.type'; +import { type SyncableFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/flat-entity.type'; type AddFlatEntityToFlatEntityMapsThroughMutationOrThrowArgs< - T extends FlatEntity, + T extends SyncableFlatEntity, > = { flatEntity: T; flatEntityMapsToMutate: FlatEntityMaps; }; export const addFlatEntityToFlatEntityMapsThroughMutationOrThrow = < - T extends FlatEntity, + T extends SyncableFlatEntity, >({ flatEntity, flatEntityMapsToMutate, diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/utils/delete-flat-entity-from-flat-entity-maps-through-mutation-or-throw.util.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/utils/delete-flat-entity-from-flat-entity-maps-through-mutation-or-throw.util.ts index 8b24c39666..88d9b27ae1 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/utils/delete-flat-entity-from-flat-entity-maps-through-mutation-or-throw.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/utils/delete-flat-entity-from-flat-entity-maps-through-mutation-or-throw.util.ts @@ -5,17 +5,17 @@ import { FlatEntityMapsExceptionCode, } from 'src/engine/metadata-modules/flat-entity/exceptions/flat-entity-maps.exception'; import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type'; -import { type FlatEntity } from 'src/engine/metadata-modules/flat-entity/types/flat-entity.type'; +import { type SyncableFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/flat-entity.type'; export type DeleteFlatEntityFromFlatEntityMapsThroughMutationOrThrowArgs< - T extends FlatEntity, + T extends SyncableFlatEntity, > = { entityToDeleteId: string; flatEntityMapsToMutate: FlatEntityMaps; }; export const deleteFlatEntityFromFlatEntityMapsThroughMutationOrThrow = < - T extends FlatEntity, + T extends SyncableFlatEntity, >({ flatEntityMapsToMutate, entityToDeleteId, diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/utils/replace-flat-entity-in-flat-entity-maps-through-mutation-or-throw.util.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/utils/replace-flat-entity-in-flat-entity-maps-through-mutation-or-throw.util.ts index 80eaa7175f..2ab7a46f5f 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/utils/replace-flat-entity-in-flat-entity-maps-through-mutation-or-throw.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/utils/replace-flat-entity-in-flat-entity-maps-through-mutation-or-throw.util.ts @@ -1,17 +1,17 @@ import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type'; -import { type FlatEntity } from 'src/engine/metadata-modules/flat-entity/types/flat-entity.type'; +import { type SyncableFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/flat-entity.type'; import { addFlatEntityToFlatEntityMapsThroughMutationOrThrow } from 'src/engine/workspace-manager/workspace-migration-v2/utils/add-flat-entity-to-flat-entity-maps-through-mutation-or-throw.util'; import { deleteFlatEntityFromFlatEntityMapsThroughMutationOrThrow } from 'src/engine/workspace-manager/workspace-migration-v2/utils/delete-flat-entity-from-flat-entity-maps-through-mutation-or-throw.util'; export type ReplaceFlatEntityInFlatEntityMapsThroughMutationOrThrowArgs< - T extends FlatEntity, + T extends SyncableFlatEntity, > = { flatEntity: T; flatEntityMapsToMutate: FlatEntityMaps; }; export const replaceFlatEntityInFlatEntityMapsThroughMutationOrThrow = < - T extends FlatEntity, + T extends SyncableFlatEntity, >({ flatEntity, flatEntityMapsToMutate, diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/types/failed-flat-entity-validation.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/types/failed-flat-entity-validation.type.ts index 37e1f50354..3af9312c23 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/types/failed-flat-entity-validation.type.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/types/failed-flat-entity-validation.type.ts @@ -1,6 +1,6 @@ import { type MessageDescriptor } from '@lingui/core'; -import { type FlatEntity } from 'src/engine/metadata-modules/flat-entity/types/flat-entity.type'; +import { type SyncableFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/flat-entity.type'; import { type WorkspaceMigrationActionTypeV2 } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-action-common-v2'; export type FlatEntityValidationError = { @@ -10,7 +10,7 @@ export type FlatEntityValidationError = { value?: unknown; }; -export type FailedFlatEntityValidation = { +export type FailedFlatEntityValidation = { type: WorkspaceMigrationActionTypeV2; errors: FlatEntityValidationError[]; flatEntityMinimalInformation: Partial; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/comparators/workspace-agent.comparator.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/comparators/workspace-agent.comparator.ts index d3e3928347..de044ea904 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/comparators/workspace-agent.comparator.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/comparators/workspace-agent.comparator.ts @@ -35,7 +35,7 @@ export class WorkspaceAgentComparator { }: WorkspaceAgentComparatorArgs): AgentComparatorResult[] { const results: AgentComparatorResult[] = []; - const keyFactory = (agent: FlatAgent) => agent.universalIdentifier; + const keyFactory = (agent: FlatAgent) => agent.universalIdentifier ?? ''; const fromAgentMap = transformMetadataForComparison(fromFlatAgents, { shouldIgnoreProperty: (property) => diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/factories/standard-role.factory.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/factories/standard-role.factory.ts index b107430b83..824d7ba7c3 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/factories/standard-role.factory.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/factories/standard-role.factory.ts @@ -31,7 +31,7 @@ export class StandardRoleFactory { ...flatRole, id: existingRole.id, universalIdentifier: roleDefinition.standardId || existingRole.id, - createdAt: existingRole.createdAt, + createdAt: existingRole.createdAt.toISOString(), }); } else { computedRoles.push({ diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-sync/interfaces/syncable-entity.interface.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-sync/interfaces/syncable-entity.interface.ts index a0f03a66d5..59110bb1a1 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-sync/interfaces/syncable-entity.interface.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-sync/interfaces/syncable-entity.interface.ts @@ -7,7 +7,8 @@ import type { ApplicationEntity } from 'src/engine/core-modules/application/appl }) export abstract class SyncableEntity { @Column({ nullable: true, type: 'uuid' }) - universalIdentifier: string | null; + // TODO should not be nullable + universalIdentifier: string; @Column({ nullable: true, type: 'uuid' }) applicationId: string | null; diff --git a/packages/twenty-server/src/modules/workflow/workflow-trigger/automated-trigger/listeners/__tests__/workflow-database-event-trigger.listener.spec.ts b/packages/twenty-server/src/modules/workflow/workflow-trigger/automated-trigger/listeners/__tests__/workflow-database-event-trigger.listener.spec.ts index 2012a17ae9..c23a1adf4c 100644 --- a/packages/twenty-server/src/modules/workflow/workflow-trigger/automated-trigger/listeners/__tests__/workflow-database-event-trigger.listener.spec.ts +++ b/packages/twenty-server/src/modules/workflow/workflow-trigger/automated-trigger/listeners/__tests__/workflow-database-event-trigger.listener.spec.ts @@ -36,8 +36,8 @@ describe('WorkflowDatabaseEventTriggerListener', () => { isRemote: false, isAuditLogged: true, isSearchable: true, - createdAt: new Date(), - updatedAt: new Date(), + createdAt: new Date().toISOString(), + updatedAt: new Date().toISOString(), icon: 'Icon123', universalIdentifier: 'test-object-metadata', fieldMetadataIds: [],