diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__mocks__/attachment-flat-fields.mock.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__mocks__/attachment-flat-fields.mock.ts index 5ba9f82557..ab601c9e37 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__mocks__/attachment-flat-fields.mock.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__mocks__/attachment-flat-fields.mock.ts @@ -4,6 +4,7 @@ import { DateDisplayFormat } from 'src/engine/metadata-modules/field-metadata/in import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface'; import { getFlatFieldMetadataMock } from 'src/engine/metadata-modules/flat-field-metadata/__mocks__/get-flat-field-metadata.mock'; +import { getMorphOrRelationTargetFlatFieldMetadataMock } from 'src/engine/metadata-modules/flat-field-metadata/__mocks__/get-morph-or-relation-target-flat-field-metadata-mock'; import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; import { RelationOnDeleteAction } from 'src/engine/metadata-modules/relation-metadata/relation-on-delete-action.type'; @@ -210,30 +211,31 @@ export const ATTACHMENT_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: '958b82d0-a290-4e10-898d-3d858fbf684f', relationTargetObjectMetadataId: '7d8264db-2b55-4b74-81ff-b7064ed43840', universalIdentifier: '20202020-6501-4ac5-a4ef-b2f8522ef6cd', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: '958b82d0-a290-4e10-898d-3d858fbf684f', - standardId: '20202020-000f-4947-917f-1b09851024fe', - objectMetadataId: '7d8264db-2b55-4b74-81ff-b7064ed43840', - type: FieldMetadataType.RELATION, - name: 'authoredAttachments', - label: 'Authored attachments', - defaultValue: null, - description: 'Attachments created by the workspace member', - icon: 'IconFileImport', - standardOverrides: null, - options: null, - settings: { relationType: RelationType.ONE_TO_MANY }, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: true, - relationTargetFieldMetadataId: '99724bb6-7a84-4b54-9b3f-dab730ab445a', - relationTargetObjectMetadataId: '819ed5ff-312f-4423-8e95-02a691cf5c27', - universalIdentifier: '20202020-000f-4947-917f-1b09851024fe', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: '958b82d0-a290-4e10-898d-3d858fbf684f', + standardId: '20202020-000f-4947-917f-1b09851024fe', + objectMetadataId: '7d8264db-2b55-4b74-81ff-b7064ed43840', + type: FieldMetadataType.RELATION, + name: 'authoredAttachments', + label: 'Authored attachments', + defaultValue: null, + description: 'Attachments created by the workspace member', + icon: 'IconFileImport', + standardOverrides: null, + options: null, + settings: { relationType: RelationType.ONE_TO_MANY }, + isCustom: false, + isActive: true, + isSystem: true, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: true, + relationTargetFieldMetadataId: '99724bb6-7a84-4b54-9b3f-dab730ab445a', + relationTargetObjectMetadataId: '819ed5ff-312f-4423-8e95-02a691cf5c27', + universalIdentifier: '20202020-000f-4947-917f-1b09851024fe', + }), }), task: getFlatFieldMetadataMock({ id: 'bd823f17-f923-4f0d-8533-51d7bc062975', @@ -262,30 +264,31 @@ export const ATTACHMENT_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: '00fd339a-6431-465d-9524-09b5c804f497', relationTargetObjectMetadataId: '3186920d-2a15-4b5f-96c7-2bf6567024b0', universalIdentifier: '20202020-51e5-4621-9cf8-215487951c4b', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: '00fd339a-6431-465d-9524-09b5c804f497', - standardId: '20202020-794d-4783-a8ff-cecdb15be139', - objectMetadataId: '3186920d-2a15-4b5f-96c7-2bf6567024b0', - type: FieldMetadataType.RELATION, - name: 'attachments', - label: 'Attachments', - defaultValue: null, - description: 'Task attachments', - icon: 'IconFileImport', - standardOverrides: null, - options: null, - settings: { relationType: RelationType.ONE_TO_MANY }, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: true, - relationTargetFieldMetadataId: 'bd823f17-f923-4f0d-8533-51d7bc062975', - relationTargetObjectMetadataId: '819ed5ff-312f-4423-8e95-02a691cf5c27', - universalIdentifier: '20202020-794d-4783-a8ff-cecdb15be139', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: '00fd339a-6431-465d-9524-09b5c804f497', + standardId: '20202020-794d-4783-a8ff-cecdb15be139', + objectMetadataId: '3186920d-2a15-4b5f-96c7-2bf6567024b0', + type: FieldMetadataType.RELATION, + name: 'attachments', + label: 'Attachments', + defaultValue: null, + description: 'Task attachments', + icon: 'IconFileImport', + standardOverrides: null, + options: null, + settings: { relationType: RelationType.ONE_TO_MANY }, + isCustom: false, + isActive: true, + isSystem: true, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: true, + relationTargetFieldMetadataId: 'bd823f17-f923-4f0d-8533-51d7bc062975', + relationTargetObjectMetadataId: '819ed5ff-312f-4423-8e95-02a691cf5c27', + universalIdentifier: '20202020-794d-4783-a8ff-cecdb15be139', + }), }), note: getFlatFieldMetadataMock({ id: '5a98eb2b-1120-42e3-afd3-09d7da642fba', @@ -314,30 +317,31 @@ export const ATTACHMENT_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: '4d4b3225-ddd2-4d76-a4d6-bcdd43a256e8', relationTargetObjectMetadataId: '1253e3e5-5b00-4a34-93b8-02f3dc6e2b7c', universalIdentifier: '20202020-4f4b-4503-a6fc-6b982f3dffb5', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: '4d4b3225-ddd2-4d76-a4d6-bcdd43a256e8', - standardId: '20202020-4986-4c92-bf19-39934b149b16', - objectMetadataId: '1253e3e5-5b00-4a34-93b8-02f3dc6e2b7c', - type: FieldMetadataType.RELATION, - name: 'attachments', - label: 'Attachments', - defaultValue: null, - description: 'Note attachments', - icon: 'IconFileImport', - standardOverrides: null, - options: null, - settings: { relationType: RelationType.ONE_TO_MANY }, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: true, - relationTargetFieldMetadataId: '5a98eb2b-1120-42e3-afd3-09d7da642fba', - relationTargetObjectMetadataId: '819ed5ff-312f-4423-8e95-02a691cf5c27', - universalIdentifier: '20202020-4986-4c92-bf19-39934b149b16', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: '4d4b3225-ddd2-4d76-a4d6-bcdd43a256e8', + standardId: '20202020-4986-4c92-bf19-39934b149b16', + objectMetadataId: '1253e3e5-5b00-4a34-93b8-02f3dc6e2b7c', + type: FieldMetadataType.RELATION, + name: 'attachments', + label: 'Attachments', + defaultValue: null, + description: 'Note attachments', + icon: 'IconFileImport', + standardOverrides: null, + options: null, + settings: { relationType: RelationType.ONE_TO_MANY }, + isCustom: false, + isActive: true, + isSystem: true, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: true, + relationTargetFieldMetadataId: '5a98eb2b-1120-42e3-afd3-09d7da642fba', + relationTargetObjectMetadataId: '819ed5ff-312f-4423-8e95-02a691cf5c27', + universalIdentifier: '20202020-4986-4c92-bf19-39934b149b16', + }), }), person: getFlatFieldMetadataMock({ id: '6938c2ec-ebcc-4f30-8d38-2c9c40228c53', @@ -366,30 +370,31 @@ export const ATTACHMENT_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: '367ad117-de09-466c-94f8-ce99d951b5ce', relationTargetObjectMetadataId: '843e0b67-9619-4628-91c4-2fa62256a611', universalIdentifier: '20202020-0158-4aa2-965c-5cdafe21ffa2', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: '367ad117-de09-466c-94f8-ce99d951b5ce', - standardId: '20202020-cd97-451f-87fa-bcb789bdbf3a', - objectMetadataId: '843e0b67-9619-4628-91c4-2fa62256a611', - type: FieldMetadataType.RELATION, - name: 'attachments', - label: 'Attachments', - defaultValue: null, - description: 'Attachments linked to the contact.', - icon: 'IconFileImport', - standardOverrides: null, - options: null, - settings: { relationType: RelationType.ONE_TO_MANY }, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: true, - relationTargetFieldMetadataId: '6938c2ec-ebcc-4f30-8d38-2c9c40228c53', - relationTargetObjectMetadataId: '819ed5ff-312f-4423-8e95-02a691cf5c27', - universalIdentifier: '20202020-cd97-451f-87fa-bcb789bdbf3a', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: '367ad117-de09-466c-94f8-ce99d951b5ce', + standardId: '20202020-cd97-451f-87fa-bcb789bdbf3a', + objectMetadataId: '843e0b67-9619-4628-91c4-2fa62256a611', + type: FieldMetadataType.RELATION, + name: 'attachments', + label: 'Attachments', + defaultValue: null, + description: 'Attachments linked to the contact.', + icon: 'IconFileImport', + standardOverrides: null, + options: null, + settings: { relationType: RelationType.ONE_TO_MANY }, + isCustom: false, + isActive: true, + isSystem: true, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: true, + relationTargetFieldMetadataId: '6938c2ec-ebcc-4f30-8d38-2c9c40228c53', + relationTargetObjectMetadataId: '819ed5ff-312f-4423-8e95-02a691cf5c27', + universalIdentifier: '20202020-cd97-451f-87fa-bcb789bdbf3a', + }), }), company: getFlatFieldMetadataMock({ id: '0bacf73b-f45b-4683-85b4-3e812e6228bf', @@ -418,30 +423,31 @@ export const ATTACHMENT_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: '44a572c5-d620-47f5-943a-346ae967e99e', relationTargetObjectMetadataId: '7f5c2c7a-bb23-46fb-b59d-9b7a52a8d1cc', universalIdentifier: '20202020-ceab-4a28-b546-73b06b4c08d5', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: '44a572c5-d620-47f5-943a-346ae967e99e', - standardId: '20202020-c1b5-4120-b0f0-987ca401ed53', - objectMetadataId: '7f5c2c7a-bb23-46fb-b59d-9b7a52a8d1cc', - type: FieldMetadataType.RELATION, - name: 'attachments', - label: 'Attachments', - defaultValue: null, - description: 'Attachments linked to the company', - icon: 'IconFileImport', - standardOverrides: null, - options: null, - settings: { relationType: RelationType.ONE_TO_MANY }, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: true, - relationTargetFieldMetadataId: '0bacf73b-f45b-4683-85b4-3e812e6228bf', - relationTargetObjectMetadataId: '819ed5ff-312f-4423-8e95-02a691cf5c27', - universalIdentifier: '20202020-c1b5-4120-b0f0-987ca401ed53', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: '44a572c5-d620-47f5-943a-346ae967e99e', + standardId: '20202020-c1b5-4120-b0f0-987ca401ed53', + objectMetadataId: '7f5c2c7a-bb23-46fb-b59d-9b7a52a8d1cc', + type: FieldMetadataType.RELATION, + name: 'attachments', + label: 'Attachments', + defaultValue: null, + description: 'Attachments linked to the company', + icon: 'IconFileImport', + standardOverrides: null, + options: null, + settings: { relationType: RelationType.ONE_TO_MANY }, + isCustom: false, + isActive: true, + isSystem: true, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: true, + relationTargetFieldMetadataId: '0bacf73b-f45b-4683-85b4-3e812e6228bf', + relationTargetObjectMetadataId: '819ed5ff-312f-4423-8e95-02a691cf5c27', + universalIdentifier: '20202020-c1b5-4120-b0f0-987ca401ed53', + }), }), opportunity: getFlatFieldMetadataMock({ id: 'da72fbe2-a5aa-42b5-b6bd-482a3919eb20', @@ -470,30 +476,31 @@ export const ATTACHMENT_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: '16515578-a6ce-48af-a303-2005bb8492f0', relationTargetObjectMetadataId: 'e6996bbf-dd41-423a-9324-8546f5b22fa7', universalIdentifier: '20202020-7374-499d-bea3-9354890755b5', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: '16515578-a6ce-48af-a303-2005bb8492f0', - standardId: '20202020-87c7-4118-83d6-2f4031005209', - objectMetadataId: 'e6996bbf-dd41-423a-9324-8546f5b22fa7', - type: FieldMetadataType.RELATION, - name: 'attachments', - label: 'Attachments', - defaultValue: null, - description: 'Attachments linked to the opportunity', - icon: 'IconFileImport', - standardOverrides: null, - options: null, - settings: { relationType: RelationType.ONE_TO_MANY }, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: true, - relationTargetFieldMetadataId: 'da72fbe2-a5aa-42b5-b6bd-482a3919eb20', - relationTargetObjectMetadataId: '819ed5ff-312f-4423-8e95-02a691cf5c27', - universalIdentifier: '20202020-87c7-4118-83d6-2f4031005209', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: '16515578-a6ce-48af-a303-2005bb8492f0', + standardId: '20202020-87c7-4118-83d6-2f4031005209', + objectMetadataId: 'e6996bbf-dd41-423a-9324-8546f5b22fa7', + type: FieldMetadataType.RELATION, + name: 'attachments', + label: 'Attachments', + defaultValue: null, + description: 'Attachments linked to the opportunity', + icon: 'IconFileImport', + standardOverrides: null, + options: null, + settings: { relationType: RelationType.ONE_TO_MANY }, + isCustom: false, + isActive: true, + isSystem: true, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: true, + relationTargetFieldMetadataId: 'da72fbe2-a5aa-42b5-b6bd-482a3919eb20', + relationTargetObjectMetadataId: '819ed5ff-312f-4423-8e95-02a691cf5c27', + universalIdentifier: '20202020-87c7-4118-83d6-2f4031005209', + }), }), rocket: getFlatFieldMetadataMock({ id: 'ba23019c-7f25-42c3-8138-622e61c42968', @@ -522,30 +529,31 @@ export const ATTACHMENT_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: 'f5984acf-5128-42ac-840f-9d2888423699', relationTargetObjectMetadataId: 'd78ec657-74a4-4652-a350-1f44ff62970a', universalIdentifier: '20202020-ca2d-47c0-8253-9d0b662fb01a', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: 'f5984acf-5128-42ac-840f-9d2888423699', - standardId: '20202020-8d59-46ca-b7b2-73d167712134', - objectMetadataId: 'd78ec657-74a4-4652-a350-1f44ff62970a', - type: FieldMetadataType.RELATION, - name: 'attachments', - label: 'Attachments', - defaultValue: null, - description: 'Attachments tied to the Rocket', - icon: 'IconFileImport', - standardOverrides: null, - options: null, - settings: { relationType: RelationType.ONE_TO_MANY }, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: false, - relationTargetFieldMetadataId: 'ba23019c-7f25-42c3-8138-622e61c42968', - relationTargetObjectMetadataId: '819ed5ff-312f-4423-8e95-02a691cf5c27', - universalIdentifier: '20202020-8d59-46ca-b7b2-73d167712134', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: 'f5984acf-5128-42ac-840f-9d2888423699', + standardId: '20202020-8d59-46ca-b7b2-73d167712134', + objectMetadataId: 'd78ec657-74a4-4652-a350-1f44ff62970a', + type: FieldMetadataType.RELATION, + name: 'attachments', + label: 'Attachments', + defaultValue: null, + description: 'Attachments tied to the Rocket', + icon: 'IconFileImport', + standardOverrides: null, + options: null, + settings: { relationType: RelationType.ONE_TO_MANY }, + isCustom: false, + isActive: true, + isSystem: true, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: false, + relationTargetFieldMetadataId: 'ba23019c-7f25-42c3-8138-622e61c42968', + relationTargetObjectMetadataId: '819ed5ff-312f-4423-8e95-02a691cf5c27', + universalIdentifier: '20202020-8d59-46ca-b7b2-73d167712134', + }), }), pet: getFlatFieldMetadataMock({ id: '317a33ef-117e-4953-86d4-c4a9670a2ce3', @@ -574,30 +582,31 @@ export const ATTACHMENT_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: '231903d0-3b14-47ed-9a88-fbf11031c451', relationTargetObjectMetadataId: 'd34e0f07-1b8c-4de0-938e-599cf05e1f7f', universalIdentifier: '20202020-b715-4658-8b6a-5359824dbddd', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: '231903d0-3b14-47ed-9a88-fbf11031c451', - standardId: '20202020-8d59-46ca-b7b2-73d167712134', - objectMetadataId: 'd34e0f07-1b8c-4de0-938e-599cf05e1f7f', - type: FieldMetadataType.RELATION, - name: 'attachments', - label: 'Attachments', - defaultValue: null, - description: 'Attachments tied to the Pet', - icon: 'IconFileImport', - standardOverrides: null, - options: null, - settings: { relationType: RelationType.ONE_TO_MANY }, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: false, - relationTargetFieldMetadataId: '317a33ef-117e-4953-86d4-c4a9670a2ce3', - relationTargetObjectMetadataId: '819ed5ff-312f-4423-8e95-02a691cf5c27', - universalIdentifier: '20202020-8d59-46ca-b7b2-73d167712134', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: '231903d0-3b14-47ed-9a88-fbf11031c451', + standardId: '20202020-8d59-46ca-b7b2-73d167712134', + objectMetadataId: 'd34e0f07-1b8c-4de0-938e-599cf05e1f7f', + type: FieldMetadataType.RELATION, + name: 'attachments', + label: 'Attachments', + defaultValue: null, + description: 'Attachments tied to the Pet', + icon: 'IconFileImport', + standardOverrides: null, + options: null, + settings: { relationType: RelationType.ONE_TO_MANY }, + isCustom: false, + isActive: true, + isSystem: true, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: false, + relationTargetFieldMetadataId: '317a33ef-117e-4953-86d4-c4a9670a2ce3', + relationTargetObjectMetadataId: '819ed5ff-312f-4423-8e95-02a691cf5c27', + universalIdentifier: '20202020-8d59-46ca-b7b2-73d167712134', + }), }), surveyResult: getFlatFieldMetadataMock({ id: 'a09463e6-5e56-4965-bc8a-2faa23a64672', @@ -626,29 +635,30 @@ export const ATTACHMENT_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: '3347ffcc-43d0-4697-a9ce-6fb9b0e677e1', relationTargetObjectMetadataId: '713da753-0340-49b5-b1fa-add34d2dc9a8', universalIdentifier: '20202020-58b5-4f6c-8402-06b2bf3ea064', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: '3347ffcc-43d0-4697-a9ce-6fb9b0e677e1', - standardId: '20202020-8d59-46ca-b7b2-73d167712134', - objectMetadataId: '713da753-0340-49b5-b1fa-add34d2dc9a8', - type: FieldMetadataType.RELATION, - name: 'attachments', - label: 'Attachments', - defaultValue: null, - description: 'Attachments tied to the Survey result', - icon: 'IconFileImport', - standardOverrides: null, - options: null, - settings: { relationType: RelationType.ONE_TO_MANY }, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: false, - relationTargetFieldMetadataId: 'a09463e6-5e56-4965-bc8a-2faa23a64672', - relationTargetObjectMetadataId: '819ed5ff-312f-4423-8e95-02a691cf5c27', - universalIdentifier: '20202020-8d59-46ca-b7b2-73d167712134', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: '3347ffcc-43d0-4697-a9ce-6fb9b0e677e1', + standardId: '20202020-8d59-46ca-b7b2-73d167712134', + objectMetadataId: '713da753-0340-49b5-b1fa-add34d2dc9a8', + type: FieldMetadataType.RELATION, + name: 'attachments', + label: 'Attachments', + defaultValue: null, + description: 'Attachments tied to the Survey result', + icon: 'IconFileImport', + standardOverrides: null, + options: null, + settings: { relationType: RelationType.ONE_TO_MANY }, + isCustom: false, + isActive: true, + isSystem: true, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: false, + relationTargetFieldMetadataId: 'a09463e6-5e56-4965-bc8a-2faa23a64672', + relationTargetObjectMetadataId: '819ed5ff-312f-4423-8e95-02a691cf5c27', + universalIdentifier: '20202020-8d59-46ca-b7b2-73d167712134', + }), }), } as const satisfies Record; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__mocks__/company-flat-fields.mock.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__mocks__/company-flat-fields.mock.ts index 2137824961..b060bfa517 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__mocks__/company-flat-fields.mock.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__mocks__/company-flat-fields.mock.ts @@ -4,6 +4,7 @@ import { DateDisplayFormat } from 'src/engine/metadata-modules/field-metadata/in import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface'; import { getFlatFieldMetadataMock } from 'src/engine/metadata-modules/flat-field-metadata/__mocks__/get-flat-field-metadata.mock'; +import { getMorphOrRelationTargetFlatFieldMetadataMock } from 'src/engine/metadata-modules/flat-field-metadata/__mocks__/get-morph-or-relation-target-flat-field-metadata-mock'; import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; import { RelationOnDeleteAction } from 'src/engine/metadata-modules/relation-metadata/relation-on-delete-action.type'; @@ -434,34 +435,35 @@ export const COMPANY_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: 'ee247ca6-fdaa-4a56-87a2-730cf84f5f29', relationTargetObjectMetadataId: '843e0b67-9619-4628-91c4-2fa62256a611', universalIdentifier: '20202020-3213-4ddf-9494-6422bcff8d7c', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: 'ee247ca6-fdaa-4a56-87a2-730cf84f5f29', - standardId: '20202020-e2f3-448e-b34c-2d625f0025fd', - objectMetadataId: '843e0b67-9619-4628-91c4-2fa62256a611', - type: FieldMetadataType.RELATION, - name: 'company', - label: 'Company', - defaultValue: null, - description: 'Contact’s company', - icon: 'IconBuildingSkyscraper', - standardOverrides: null, - options: null, - settings: { - onDelete: RelationOnDeleteAction.SET_NULL, - relationType: RelationType.MANY_TO_ONE, - joinColumnName: 'companyId', - }, - isCustom: false, - isActive: true, - isSystem: false, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: true, - relationTargetFieldMetadataId: 'b0563539-f027-40c5-a14c-ee7a25ff6fd9', - relationTargetObjectMetadataId: '7f5c2c7a-bb23-46fb-b59d-9b7a52a8d1cc', - universalIdentifier: '20202020-e2f3-448e-b34c-2d625f0025fd', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: 'ee247ca6-fdaa-4a56-87a2-730cf84f5f29', + standardId: '20202020-e2f3-448e-b34c-2d625f0025fd', + objectMetadataId: '843e0b67-9619-4628-91c4-2fa62256a611', + type: FieldMetadataType.RELATION, + name: 'company', + label: 'Company', + defaultValue: null, + description: 'Contact’s company', + icon: 'IconBuildingSkyscraper', + standardOverrides: null, + options: null, + settings: { + onDelete: RelationOnDeleteAction.SET_NULL, + relationType: RelationType.MANY_TO_ONE, + joinColumnName: 'companyId', + }, + isCustom: false, + isActive: true, + isSystem: false, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: true, + relationTargetFieldMetadataId: 'b0563539-f027-40c5-a14c-ee7a25ff6fd9', + relationTargetObjectMetadataId: '7f5c2c7a-bb23-46fb-b59d-9b7a52a8d1cc', + universalIdentifier: '20202020-e2f3-448e-b34c-2d625f0025fd', + }), }), accountOwner: getFlatFieldMetadataMock({ id: '86c6692b-bed5-4ef1-bad0-657e56a85eba', @@ -491,30 +493,31 @@ export const COMPANY_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: '1fe5453f-6042-4370-b388-c9a198bd0ab4', relationTargetObjectMetadataId: '7d8264db-2b55-4b74-81ff-b7064ed43840', universalIdentifier: '20202020-95b8-4e10-9881-edb5d4765f9d', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: '1fe5453f-6042-4370-b388-c9a198bd0ab4', - standardId: '20202020-dc29-4bd4-a3c1-29eafa324bee', - objectMetadataId: '7d8264db-2b55-4b74-81ff-b7064ed43840', - type: FieldMetadataType.RELATION, - name: 'accountOwnerForCompanies', - label: 'Account Owner For Companies', - defaultValue: null, - description: 'Account owner for companies', - icon: 'IconBriefcase', - standardOverrides: null, - options: null, - settings: { relationType: RelationType.ONE_TO_MANY }, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: true, - relationTargetFieldMetadataId: '86c6692b-bed5-4ef1-bad0-657e56a85eba', - relationTargetObjectMetadataId: '7f5c2c7a-bb23-46fb-b59d-9b7a52a8d1cc', - universalIdentifier: '20202020-dc29-4bd4-a3c1-29eafa324bee', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: '1fe5453f-6042-4370-b388-c9a198bd0ab4', + standardId: '20202020-dc29-4bd4-a3c1-29eafa324bee', + objectMetadataId: '7d8264db-2b55-4b74-81ff-b7064ed43840', + type: FieldMetadataType.RELATION, + name: 'accountOwnerForCompanies', + label: 'Account Owner For Companies', + defaultValue: null, + description: 'Account owner for companies', + icon: 'IconBriefcase', + standardOverrides: null, + options: null, + settings: { relationType: RelationType.ONE_TO_MANY }, + isCustom: false, + isActive: true, + isSystem: true, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: true, + relationTargetFieldMetadataId: '86c6692b-bed5-4ef1-bad0-657e56a85eba', + relationTargetObjectMetadataId: '7f5c2c7a-bb23-46fb-b59d-9b7a52a8d1cc', + universalIdentifier: '20202020-dc29-4bd4-a3c1-29eafa324bee', + }), }), taskTargets: getFlatFieldMetadataMock({ id: '4f9138da-cd36-4df4-98f9-ebabe036b141', @@ -539,34 +542,35 @@ export const COMPANY_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: 'ec11b025-1476-4e84-81c5-cf5b5c776edc', relationTargetObjectMetadataId: 'bb2b29b8-7f46-4106-a8ae-3a32df9c9166', universalIdentifier: '20202020-cb17-4a61-8f8f-3be6730480de', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: 'ec11b025-1476-4e84-81c5-cf5b5c776edc', - standardId: '20202020-4703-4a4e-948c-487b0c60a92c', - objectMetadataId: 'bb2b29b8-7f46-4106-a8ae-3a32df9c9166', - type: FieldMetadataType.RELATION, - name: 'company', - label: 'Company', - defaultValue: null, - description: 'TaskTarget company', - icon: 'IconBuildingSkyscraper', - standardOverrides: null, - options: null, - settings: { - onDelete: RelationOnDeleteAction.CASCADE, - relationType: RelationType.MANY_TO_ONE, - joinColumnName: 'companyId', - }, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: true, - relationTargetFieldMetadataId: '4f9138da-cd36-4df4-98f9-ebabe036b141', - relationTargetObjectMetadataId: '7f5c2c7a-bb23-46fb-b59d-9b7a52a8d1cc', - universalIdentifier: '20202020-4703-4a4e-948c-487b0c60a92c', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: 'ec11b025-1476-4e84-81c5-cf5b5c776edc', + standardId: '20202020-4703-4a4e-948c-487b0c60a92c', + objectMetadataId: 'bb2b29b8-7f46-4106-a8ae-3a32df9c9166', + type: FieldMetadataType.RELATION, + name: 'company', + label: 'Company', + defaultValue: null, + description: 'TaskTarget company', + icon: 'IconBuildingSkyscraper', + standardOverrides: null, + options: null, + settings: { + onDelete: RelationOnDeleteAction.CASCADE, + relationType: RelationType.MANY_TO_ONE, + joinColumnName: 'companyId', + }, + isCustom: false, + isActive: true, + isSystem: true, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: true, + relationTargetFieldMetadataId: '4f9138da-cd36-4df4-98f9-ebabe036b141', + relationTargetObjectMetadataId: '7f5c2c7a-bb23-46fb-b59d-9b7a52a8d1cc', + universalIdentifier: '20202020-4703-4a4e-948c-487b0c60a92c', + }), }), noteTargets: getFlatFieldMetadataMock({ id: '56b9dc8a-0379-42cf-ab31-8db7061f5a2a', @@ -591,34 +595,35 @@ export const COMPANY_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: 'd1d3f9eb-1447-4adb-bc2b-f133bc58ac35', relationTargetObjectMetadataId: '12e3cb51-c3de-4192-b0d5-965d48d001c0', universalIdentifier: '20202020-bae0-4556-a74a-a9c686f77a88', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: 'd1d3f9eb-1447-4adb-bc2b-f133bc58ac35', - standardId: 'c500fbc0-d6f2-4982-a959-5a755431696c', - objectMetadataId: '12e3cb51-c3de-4192-b0d5-965d48d001c0', - type: FieldMetadataType.RELATION, - name: 'company', - label: 'Company', - defaultValue: null, - description: 'NoteTarget company', - icon: 'IconBuildingSkyscraper', - standardOverrides: null, - options: null, - settings: { - onDelete: RelationOnDeleteAction.CASCADE, - relationType: RelationType.MANY_TO_ONE, - joinColumnName: 'companyId', - }, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: true, - relationTargetFieldMetadataId: '56b9dc8a-0379-42cf-ab31-8db7061f5a2a', - relationTargetObjectMetadataId: '7f5c2c7a-bb23-46fb-b59d-9b7a52a8d1cc', - universalIdentifier: 'c500fbc0-d6f2-4982-a959-5a755431696c', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: 'd1d3f9eb-1447-4adb-bc2b-f133bc58ac35', + standardId: 'c500fbc0-d6f2-4982-a959-5a755431696c', + objectMetadataId: '12e3cb51-c3de-4192-b0d5-965d48d001c0', + type: FieldMetadataType.RELATION, + name: 'company', + label: 'Company', + defaultValue: null, + description: 'NoteTarget company', + icon: 'IconBuildingSkyscraper', + standardOverrides: null, + options: null, + settings: { + onDelete: RelationOnDeleteAction.CASCADE, + relationType: RelationType.MANY_TO_ONE, + joinColumnName: 'companyId', + }, + isCustom: false, + isActive: true, + isSystem: true, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: true, + relationTargetFieldMetadataId: '56b9dc8a-0379-42cf-ab31-8db7061f5a2a', + relationTargetObjectMetadataId: '7f5c2c7a-bb23-46fb-b59d-9b7a52a8d1cc', + universalIdentifier: 'c500fbc0-d6f2-4982-a959-5a755431696c', + }), }), opportunities: getFlatFieldMetadataMock({ id: '3eda8c8e-74e4-401f-bb0e-470db5b267e6', @@ -643,34 +648,35 @@ export const COMPANY_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: '512890f1-4da0-4b96-bb71-5ccabefb82e7', relationTargetObjectMetadataId: 'e6996bbf-dd41-423a-9324-8546f5b22fa7', universalIdentifier: '20202020-add3-4658-8e23-d70dccb6d0ec', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: '512890f1-4da0-4b96-bb71-5ccabefb82e7', - standardId: '20202020-cbac-457e-b565-adece5fc815f', - objectMetadataId: 'e6996bbf-dd41-423a-9324-8546f5b22fa7', - type: FieldMetadataType.RELATION, - name: 'company', - label: 'Company', - defaultValue: null, - description: 'Opportunity company', - icon: 'IconBuildingSkyscraper', - standardOverrides: null, - options: null, - settings: { - onDelete: RelationOnDeleteAction.SET_NULL, - relationType: RelationType.MANY_TO_ONE, - joinColumnName: 'companyId', - }, - isCustom: false, - isActive: true, - isSystem: false, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: true, - relationTargetFieldMetadataId: '3eda8c8e-74e4-401f-bb0e-470db5b267e6', - relationTargetObjectMetadataId: '7f5c2c7a-bb23-46fb-b59d-9b7a52a8d1cc', - universalIdentifier: '20202020-cbac-457e-b565-adece5fc815f', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: '512890f1-4da0-4b96-bb71-5ccabefb82e7', + standardId: '20202020-cbac-457e-b565-adece5fc815f', + objectMetadataId: 'e6996bbf-dd41-423a-9324-8546f5b22fa7', + type: FieldMetadataType.RELATION, + name: 'company', + label: 'Company', + defaultValue: null, + description: 'Opportunity company', + icon: 'IconBuildingSkyscraper', + standardOverrides: null, + options: null, + settings: { + onDelete: RelationOnDeleteAction.SET_NULL, + relationType: RelationType.MANY_TO_ONE, + joinColumnName: 'companyId', + }, + isCustom: false, + isActive: true, + isSystem: false, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: true, + relationTargetFieldMetadataId: '3eda8c8e-74e4-401f-bb0e-470db5b267e6', + relationTargetObjectMetadataId: '7f5c2c7a-bb23-46fb-b59d-9b7a52a8d1cc', + universalIdentifier: '20202020-cbac-457e-b565-adece5fc815f', + }), }), favorites: getFlatFieldMetadataMock({ id: '72415216-fed4-450b-aa00-691e37718b01', @@ -695,34 +701,35 @@ export const COMPANY_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: '9a11532c-6839-46ed-a2f5-ed03f88b86f6', relationTargetObjectMetadataId: 'f4749ffb-dde8-44ff-8b01-d3fc82df0ba2', universalIdentifier: '20202020-4d1d-41ac-b13b-621631298d55', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: '9a11532c-6839-46ed-a2f5-ed03f88b86f6', - standardId: '20202020-cff5-4682-8bf9-069169e08279', - objectMetadataId: 'f4749ffb-dde8-44ff-8b01-d3fc82df0ba2', - type: FieldMetadataType.RELATION, - name: 'company', - label: 'Company', - defaultValue: null, - description: 'Favorite company', - icon: 'IconBuildingSkyscraper', - standardOverrides: null, - options: null, - settings: { - onDelete: RelationOnDeleteAction.CASCADE, - relationType: RelationType.MANY_TO_ONE, - joinColumnName: 'companyId', - }, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: true, - relationTargetFieldMetadataId: '72415216-fed4-450b-aa00-691e37718b01', - relationTargetObjectMetadataId: '7f5c2c7a-bb23-46fb-b59d-9b7a52a8d1cc', - universalIdentifier: '20202020-cff5-4682-8bf9-069169e08279', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: '9a11532c-6839-46ed-a2f5-ed03f88b86f6', + standardId: '20202020-cff5-4682-8bf9-069169e08279', + objectMetadataId: 'f4749ffb-dde8-44ff-8b01-d3fc82df0ba2', + type: FieldMetadataType.RELATION, + name: 'company', + label: 'Company', + defaultValue: null, + description: 'Favorite company', + icon: 'IconBuildingSkyscraper', + standardOverrides: null, + options: null, + settings: { + onDelete: RelationOnDeleteAction.CASCADE, + relationType: RelationType.MANY_TO_ONE, + joinColumnName: 'companyId', + }, + isCustom: false, + isActive: true, + isSystem: true, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: true, + relationTargetFieldMetadataId: '72415216-fed4-450b-aa00-691e37718b01', + relationTargetObjectMetadataId: '7f5c2c7a-bb23-46fb-b59d-9b7a52a8d1cc', + universalIdentifier: '20202020-cff5-4682-8bf9-069169e08279', + }), }), attachments: getFlatFieldMetadataMock({ id: '44a572c5-d620-47f5-943a-346ae967e99e', @@ -747,34 +754,35 @@ export const COMPANY_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: '0bacf73b-f45b-4683-85b4-3e812e6228bf', relationTargetObjectMetadataId: '819ed5ff-312f-4423-8e95-02a691cf5c27', universalIdentifier: '20202020-c1b5-4120-b0f0-987ca401ed53', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: '0bacf73b-f45b-4683-85b4-3e812e6228bf', - standardId: '20202020-ceab-4a28-b546-73b06b4c08d5', - objectMetadataId: '819ed5ff-312f-4423-8e95-02a691cf5c27', - type: FieldMetadataType.RELATION, - name: 'company', - label: 'Company', - defaultValue: null, - description: 'Attachment company', - icon: 'IconBuildingSkyscraper', - standardOverrides: null, - options: null, - settings: { - onDelete: RelationOnDeleteAction.CASCADE, - relationType: RelationType.MANY_TO_ONE, - joinColumnName: 'companyId', - }, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: true, - relationTargetFieldMetadataId: '44a572c5-d620-47f5-943a-346ae967e99e', - relationTargetObjectMetadataId: '7f5c2c7a-bb23-46fb-b59d-9b7a52a8d1cc', - universalIdentifier: '20202020-ceab-4a28-b546-73b06b4c08d5', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: '0bacf73b-f45b-4683-85b4-3e812e6228bf', + standardId: '20202020-ceab-4a28-b546-73b06b4c08d5', + objectMetadataId: '819ed5ff-312f-4423-8e95-02a691cf5c27', + type: FieldMetadataType.RELATION, + name: 'company', + label: 'Company', + defaultValue: null, + description: 'Attachment company', + icon: 'IconBuildingSkyscraper', + standardOverrides: null, + options: null, + settings: { + onDelete: RelationOnDeleteAction.CASCADE, + relationType: RelationType.MANY_TO_ONE, + joinColumnName: 'companyId', + }, + isCustom: false, + isActive: true, + isSystem: true, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: true, + relationTargetFieldMetadataId: '44a572c5-d620-47f5-943a-346ae967e99e', + relationTargetObjectMetadataId: '7f5c2c7a-bb23-46fb-b59d-9b7a52a8d1cc', + universalIdentifier: '20202020-ceab-4a28-b546-73b06b4c08d5', + }), }), timelineActivities: getFlatFieldMetadataMock({ id: 'cc78390f-f570-4c2c-9f19-2a8fef67f4f6', @@ -799,34 +807,35 @@ export const COMPANY_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: 'fd8cabe5-7dc8-4d6a-8053-43434488b3e4', relationTargetObjectMetadataId: '3090f830-c4b1-41a1-8e18-815760830bec', universalIdentifier: '20202020-0414-4daf-9c0d-64fe7b27f89f', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: 'fd8cabe5-7dc8-4d6a-8053-43434488b3e4', - standardId: '20202020-04ad-4221-a744-7a8278a5ce21', - objectMetadataId: '3090f830-c4b1-41a1-8e18-815760830bec', - type: FieldMetadataType.RELATION, - name: 'company', - label: 'Company', - defaultValue: null, - description: 'Event company', - icon: 'IconBuildingSkyscraper', - standardOverrides: null, - options: null, - settings: { - onDelete: RelationOnDeleteAction.CASCADE, - relationType: RelationType.MANY_TO_ONE, - joinColumnName: 'companyId', - }, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: true, - relationTargetFieldMetadataId: 'cc78390f-f570-4c2c-9f19-2a8fef67f4f6', - relationTargetObjectMetadataId: '7f5c2c7a-bb23-46fb-b59d-9b7a52a8d1cc', - universalIdentifier: '20202020-04ad-4221-a744-7a8278a5ce21', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: 'fd8cabe5-7dc8-4d6a-8053-43434488b3e4', + standardId: '20202020-04ad-4221-a744-7a8278a5ce21', + objectMetadataId: '3090f830-c4b1-41a1-8e18-815760830bec', + type: FieldMetadataType.RELATION, + name: 'company', + label: 'Company', + defaultValue: null, + description: 'Event company', + icon: 'IconBuildingSkyscraper', + standardOverrides: null, + options: null, + settings: { + onDelete: RelationOnDeleteAction.CASCADE, + relationType: RelationType.MANY_TO_ONE, + joinColumnName: 'companyId', + }, + isCustom: false, + isActive: true, + isSystem: true, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: true, + relationTargetFieldMetadataId: 'cc78390f-f570-4c2c-9f19-2a8fef67f4f6', + relationTargetObjectMetadataId: '7f5c2c7a-bb23-46fb-b59d-9b7a52a8d1cc', + universalIdentifier: '20202020-04ad-4221-a744-7a8278a5ce21', + }), }), tagline: getFlatFieldMetadataMock({ id: 'f869f4ed-e440-486a-8392-be33ab327cf4', diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__mocks__/favorite-flat-fields.mock.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__mocks__/favorite-flat-fields.mock.ts index 64896729d9..430750e5bd 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__mocks__/favorite-flat-fields.mock.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__mocks__/favorite-flat-fields.mock.ts @@ -4,6 +4,7 @@ import { DateDisplayFormat } from 'src/engine/metadata-modules/field-metadata/in import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface'; import { getFlatFieldMetadataMock } from 'src/engine/metadata-modules/flat-field-metadata/__mocks__/get-flat-field-metadata.mock'; +import { getMorphOrRelationTargetFlatFieldMetadataMock } from 'src/engine/metadata-modules/flat-field-metadata/__mocks__/get-morph-or-relation-target-flat-field-metadata-mock'; import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; import { RelationOnDeleteAction } from 'src/engine/metadata-modules/relation-metadata/relation-on-delete-action.type'; @@ -160,30 +161,31 @@ export const FAVORITE_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: 'a15a4b41-1849-4dea-aa43-f53caad016be', relationTargetObjectMetadataId: '7d8264db-2b55-4b74-81ff-b7064ed43840', universalIdentifier: '20202020-ce63-49cb-9676-fdc0c45892cd', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: 'a15a4b41-1849-4dea-aa43-f53caad016be', - standardId: '20202020-f3c1-4faf-b343-cf7681038757', - objectMetadataId: '7d8264db-2b55-4b74-81ff-b7064ed43840', - type: FieldMetadataType.RELATION, - name: 'favorites', - label: 'Favorites', - defaultValue: null, - description: 'Favorites linked to the workspace member', - icon: 'IconHeart', - standardOverrides: null, - options: null, - settings: { relationType: RelationType.ONE_TO_MANY }, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: true, - relationTargetFieldMetadataId: '07f2c3ba-63d1-4e44-bac4-bc4591e51bac', - relationTargetObjectMetadataId: 'f4749ffb-dde8-44ff-8b01-d3fc82df0ba2', - universalIdentifier: '20202020-f3c1-4faf-b343-cf7681038757', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: 'a15a4b41-1849-4dea-aa43-f53caad016be', + standardId: '20202020-f3c1-4faf-b343-cf7681038757', + objectMetadataId: '7d8264db-2b55-4b74-81ff-b7064ed43840', + type: FieldMetadataType.RELATION, + name: 'favorites', + label: 'Favorites', + defaultValue: null, + description: 'Favorites linked to the workspace member', + icon: 'IconHeart', + standardOverrides: null, + options: null, + settings: { relationType: RelationType.ONE_TO_MANY }, + isCustom: false, + isActive: true, + isSystem: true, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: true, + relationTargetFieldMetadataId: '07f2c3ba-63d1-4e44-bac4-bc4591e51bac', + relationTargetObjectMetadataId: 'f4749ffb-dde8-44ff-8b01-d3fc82df0ba2', + universalIdentifier: '20202020-f3c1-4faf-b343-cf7681038757', + }), }), person: getFlatFieldMetadataMock({ id: '013cec20-e9cc-42db-b9b9-ff6bd0f52abd', @@ -212,30 +214,31 @@ export const FAVORITE_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: 'a1a72bee-1c15-4598-ba23-67ba8e3e505d', relationTargetObjectMetadataId: '843e0b67-9619-4628-91c4-2fa62256a611', universalIdentifier: '20202020-c428-4f40-b6f3-86091511c41c', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: 'a1a72bee-1c15-4598-ba23-67ba8e3e505d', - standardId: '20202020-4073-4117-9cf1-203bcdc91cbd', - objectMetadataId: '843e0b67-9619-4628-91c4-2fa62256a611', - type: FieldMetadataType.RELATION, - name: 'favorites', - label: 'Favorites', - defaultValue: null, - description: 'Favorites linked to the contact', - icon: 'IconHeart', - standardOverrides: null, - options: null, - settings: { relationType: RelationType.ONE_TO_MANY }, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: true, - relationTargetFieldMetadataId: '013cec20-e9cc-42db-b9b9-ff6bd0f52abd', - relationTargetObjectMetadataId: 'f4749ffb-dde8-44ff-8b01-d3fc82df0ba2', - universalIdentifier: '20202020-4073-4117-9cf1-203bcdc91cbd', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: 'a1a72bee-1c15-4598-ba23-67ba8e3e505d', + standardId: '20202020-4073-4117-9cf1-203bcdc91cbd', + objectMetadataId: '843e0b67-9619-4628-91c4-2fa62256a611', + type: FieldMetadataType.RELATION, + name: 'favorites', + label: 'Favorites', + defaultValue: null, + description: 'Favorites linked to the contact', + icon: 'IconHeart', + standardOverrides: null, + options: null, + settings: { relationType: RelationType.ONE_TO_MANY }, + isCustom: false, + isActive: true, + isSystem: true, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: true, + relationTargetFieldMetadataId: '013cec20-e9cc-42db-b9b9-ff6bd0f52abd', + relationTargetObjectMetadataId: 'f4749ffb-dde8-44ff-8b01-d3fc82df0ba2', + universalIdentifier: '20202020-4073-4117-9cf1-203bcdc91cbd', + }), }), company: getFlatFieldMetadataMock({ id: '9a11532c-6839-46ed-a2f5-ed03f88b86f6', @@ -264,30 +267,31 @@ export const FAVORITE_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: '72415216-fed4-450b-aa00-691e37718b01', relationTargetObjectMetadataId: '7f5c2c7a-bb23-46fb-b59d-9b7a52a8d1cc', universalIdentifier: '20202020-cff5-4682-8bf9-069169e08279', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: '72415216-fed4-450b-aa00-691e37718b01', - standardId: '20202020-4d1d-41ac-b13b-621631298d55', - objectMetadataId: '7f5c2c7a-bb23-46fb-b59d-9b7a52a8d1cc', - type: FieldMetadataType.RELATION, - name: 'favorites', - label: 'Favorites', - defaultValue: null, - description: 'Favorites linked to the company', - icon: 'IconHeart', - standardOverrides: null, - options: null, - settings: { relationType: RelationType.ONE_TO_MANY }, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: true, - relationTargetFieldMetadataId: '9a11532c-6839-46ed-a2f5-ed03f88b86f6', - relationTargetObjectMetadataId: 'f4749ffb-dde8-44ff-8b01-d3fc82df0ba2', - universalIdentifier: '20202020-4d1d-41ac-b13b-621631298d55', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: '72415216-fed4-450b-aa00-691e37718b01', + standardId: '20202020-4d1d-41ac-b13b-621631298d55', + objectMetadataId: '7f5c2c7a-bb23-46fb-b59d-9b7a52a8d1cc', + type: FieldMetadataType.RELATION, + name: 'favorites', + label: 'Favorites', + defaultValue: null, + description: 'Favorites linked to the company', + icon: 'IconHeart', + standardOverrides: null, + options: null, + settings: { relationType: RelationType.ONE_TO_MANY }, + isCustom: false, + isActive: true, + isSystem: true, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: true, + relationTargetFieldMetadataId: '9a11532c-6839-46ed-a2f5-ed03f88b86f6', + relationTargetObjectMetadataId: 'f4749ffb-dde8-44ff-8b01-d3fc82df0ba2', + universalIdentifier: '20202020-4d1d-41ac-b13b-621631298d55', + }), }), favoriteFolder: getFlatFieldMetadataMock({ id: 'fabbe669-b8fc-49fe-8010-f13d01eb61f1', @@ -316,30 +320,31 @@ export const FAVORITE_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: '71b95076-6b8d-45c9-9a7c-ab981b81bd1b', relationTargetObjectMetadataId: '35763b74-1abe-4c4b-9eab-27693f0ee06d', universalIdentifier: '20202020-f658-4d12-8b4d-248356aa4bd9', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: '71b95076-6b8d-45c9-9a7c-ab981b81bd1b', - standardId: '20202020-b5e3-4b42-8af2-03cd4fd2e4d2', - objectMetadataId: '35763b74-1abe-4c4b-9eab-27693f0ee06d', - type: FieldMetadataType.RELATION, - name: 'favorites', - label: 'Favorites', - defaultValue: null, - description: 'Favorites in this folder', - icon: 'IconHeart', - standardOverrides: null, - options: null, - settings: { relationType: RelationType.ONE_TO_MANY }, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: true, - relationTargetFieldMetadataId: 'fabbe669-b8fc-49fe-8010-f13d01eb61f1', - relationTargetObjectMetadataId: 'f4749ffb-dde8-44ff-8b01-d3fc82df0ba2', - universalIdentifier: '20202020-b5e3-4b42-8af2-03cd4fd2e4d2', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: '71b95076-6b8d-45c9-9a7c-ab981b81bd1b', + standardId: '20202020-b5e3-4b42-8af2-03cd4fd2e4d2', + objectMetadataId: '35763b74-1abe-4c4b-9eab-27693f0ee06d', + type: FieldMetadataType.RELATION, + name: 'favorites', + label: 'Favorites', + defaultValue: null, + description: 'Favorites in this folder', + icon: 'IconHeart', + standardOverrides: null, + options: null, + settings: { relationType: RelationType.ONE_TO_MANY }, + isCustom: false, + isActive: true, + isSystem: true, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: true, + relationTargetFieldMetadataId: 'fabbe669-b8fc-49fe-8010-f13d01eb61f1', + relationTargetObjectMetadataId: 'f4749ffb-dde8-44ff-8b01-d3fc82df0ba2', + universalIdentifier: '20202020-b5e3-4b42-8af2-03cd4fd2e4d2', + }), }), opportunity: getFlatFieldMetadataMock({ id: '6380cf8e-4327-4d1e-ad21-1826ce4ecf05', @@ -368,30 +373,31 @@ export const FAVORITE_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: '87bb9924-a1cc-4357-9c8a-52141dabf266', relationTargetObjectMetadataId: 'e6996bbf-dd41-423a-9324-8546f5b22fa7', universalIdentifier: '20202020-dabc-48e1-8318-2781a2b32aa2', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: '87bb9924-a1cc-4357-9c8a-52141dabf266', - standardId: '20202020-a1c2-4500-aaae-83ba8a0e827a', - objectMetadataId: 'e6996bbf-dd41-423a-9324-8546f5b22fa7', - type: FieldMetadataType.RELATION, - name: 'favorites', - label: 'Favorites', - defaultValue: null, - description: 'Favorites linked to the opportunity', - icon: 'IconHeart', - standardOverrides: null, - options: null, - settings: { relationType: RelationType.ONE_TO_MANY }, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: true, - relationTargetFieldMetadataId: '6380cf8e-4327-4d1e-ad21-1826ce4ecf05', - relationTargetObjectMetadataId: 'f4749ffb-dde8-44ff-8b01-d3fc82df0ba2', - universalIdentifier: '20202020-a1c2-4500-aaae-83ba8a0e827a', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: '87bb9924-a1cc-4357-9c8a-52141dabf266', + standardId: '20202020-a1c2-4500-aaae-83ba8a0e827a', + objectMetadataId: 'e6996bbf-dd41-423a-9324-8546f5b22fa7', + type: FieldMetadataType.RELATION, + name: 'favorites', + label: 'Favorites', + defaultValue: null, + description: 'Favorites linked to the opportunity', + icon: 'IconHeart', + standardOverrides: null, + options: null, + settings: { relationType: RelationType.ONE_TO_MANY }, + isCustom: false, + isActive: true, + isSystem: true, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: true, + relationTargetFieldMetadataId: '6380cf8e-4327-4d1e-ad21-1826ce4ecf05', + relationTargetObjectMetadataId: 'f4749ffb-dde8-44ff-8b01-d3fc82df0ba2', + universalIdentifier: '20202020-a1c2-4500-aaae-83ba8a0e827a', + }), }), workflow: getFlatFieldMetadataMock({ id: '12c20527-9b1d-4922-9650-00cc31b26387', @@ -420,30 +426,31 @@ export const FAVORITE_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: 'b848abe8-276b-46c9-9eab-baf34d2a0583', relationTargetObjectMetadataId: '664c19a5-0693-45d4-a4e5-76c3717db83c', universalIdentifier: '20202020-b11b-4dc8-999a-6bd0a947b463', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: 'b848abe8-276b-46c9-9eab-baf34d2a0583', - standardId: '20202020-c554-4c41-be7a-cf9cd4b0d512', - objectMetadataId: '664c19a5-0693-45d4-a4e5-76c3717db83c', - type: FieldMetadataType.RELATION, - name: 'favorites', - label: 'Favorites', - defaultValue: null, - description: 'Favorites linked to the workflow', - icon: 'IconHeart', - standardOverrides: null, - options: null, - settings: { relationType: RelationType.ONE_TO_MANY }, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: true, - relationTargetFieldMetadataId: '12c20527-9b1d-4922-9650-00cc31b26387', - relationTargetObjectMetadataId: 'f4749ffb-dde8-44ff-8b01-d3fc82df0ba2', - universalIdentifier: '20202020-c554-4c41-be7a-cf9cd4b0d512', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: 'b848abe8-276b-46c9-9eab-baf34d2a0583', + standardId: '20202020-c554-4c41-be7a-cf9cd4b0d512', + objectMetadataId: '664c19a5-0693-45d4-a4e5-76c3717db83c', + type: FieldMetadataType.RELATION, + name: 'favorites', + label: 'Favorites', + defaultValue: null, + description: 'Favorites linked to the workflow', + icon: 'IconHeart', + standardOverrides: null, + options: null, + settings: { relationType: RelationType.ONE_TO_MANY }, + isCustom: false, + isActive: true, + isSystem: true, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: true, + relationTargetFieldMetadataId: '12c20527-9b1d-4922-9650-00cc31b26387', + relationTargetObjectMetadataId: 'f4749ffb-dde8-44ff-8b01-d3fc82df0ba2', + universalIdentifier: '20202020-c554-4c41-be7a-cf9cd4b0d512', + }), }), workflowVersion: getFlatFieldMetadataMock({ id: '5cb92f25-c067-4e19-afb3-c7cc038ed1a4', @@ -472,30 +479,31 @@ export const FAVORITE_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: 'ea6b6bda-6ba7-4549-b81a-1f3ced0d4b25', relationTargetObjectMetadataId: '99cf5f27-b41d-4f25-a23b-9e47d27dae9b', universalIdentifier: '20202020-e1b8-4caf-b55a-3ab4d4cbcd21', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: 'ea6b6bda-6ba7-4549-b81a-1f3ced0d4b25', - standardId: '20202020-b8e0-4e57-928d-b51671cc71f2', - objectMetadataId: '99cf5f27-b41d-4f25-a23b-9e47d27dae9b', - type: FieldMetadataType.RELATION, - name: 'favorites', - label: 'Favorites', - defaultValue: null, - description: 'Favorites linked to the workflow version', - icon: 'IconHeart', - standardOverrides: null, - options: null, - settings: { relationType: RelationType.ONE_TO_MANY }, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: true, - relationTargetFieldMetadataId: '5cb92f25-c067-4e19-afb3-c7cc038ed1a4', - relationTargetObjectMetadataId: 'f4749ffb-dde8-44ff-8b01-d3fc82df0ba2', - universalIdentifier: '20202020-b8e0-4e57-928d-b51671cc71f2', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: 'ea6b6bda-6ba7-4549-b81a-1f3ced0d4b25', + standardId: '20202020-b8e0-4e57-928d-b51671cc71f2', + objectMetadataId: '99cf5f27-b41d-4f25-a23b-9e47d27dae9b', + type: FieldMetadataType.RELATION, + name: 'favorites', + label: 'Favorites', + defaultValue: null, + description: 'Favorites linked to the workflow version', + icon: 'IconHeart', + standardOverrides: null, + options: null, + settings: { relationType: RelationType.ONE_TO_MANY }, + isCustom: false, + isActive: true, + isSystem: true, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: true, + relationTargetFieldMetadataId: '5cb92f25-c067-4e19-afb3-c7cc038ed1a4', + relationTargetObjectMetadataId: 'f4749ffb-dde8-44ff-8b01-d3fc82df0ba2', + universalIdentifier: '20202020-b8e0-4e57-928d-b51671cc71f2', + }), }), workflowRun: getFlatFieldMetadataMock({ id: 'a4bdd0d8-c36f-4519-812b-be4800ab14b0', @@ -524,30 +532,31 @@ export const FAVORITE_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: '444a6e9e-443d-4f04-a60d-32f76f17049c', relationTargetObjectMetadataId: '06d95e96-b050-443f-946e-dd276d291a2f', universalIdentifier: '20202020-db5a-4fe4-9a13-9afa22b1e762', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: '444a6e9e-443d-4f04-a60d-32f76f17049c', - standardId: '20202020-4baf-4604-b899-2f7fcfbbf90d', - objectMetadataId: '06d95e96-b050-443f-946e-dd276d291a2f', - type: FieldMetadataType.RELATION, - name: 'favorites', - label: 'Favorites', - defaultValue: null, - description: 'Favorites linked to the workflow run', - icon: 'IconHeart', - standardOverrides: null, - options: null, - settings: { relationType: RelationType.ONE_TO_MANY }, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: true, - relationTargetFieldMetadataId: 'a4bdd0d8-c36f-4519-812b-be4800ab14b0', - relationTargetObjectMetadataId: 'f4749ffb-dde8-44ff-8b01-d3fc82df0ba2', - universalIdentifier: '20202020-4baf-4604-b899-2f7fcfbbf90d', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: '444a6e9e-443d-4f04-a60d-32f76f17049c', + standardId: '20202020-4baf-4604-b899-2f7fcfbbf90d', + objectMetadataId: '06d95e96-b050-443f-946e-dd276d291a2f', + type: FieldMetadataType.RELATION, + name: 'favorites', + label: 'Favorites', + defaultValue: null, + description: 'Favorites linked to the workflow run', + icon: 'IconHeart', + standardOverrides: null, + options: null, + settings: { relationType: RelationType.ONE_TO_MANY }, + isCustom: false, + isActive: true, + isSystem: true, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: true, + relationTargetFieldMetadataId: 'a4bdd0d8-c36f-4519-812b-be4800ab14b0', + relationTargetObjectMetadataId: 'f4749ffb-dde8-44ff-8b01-d3fc82df0ba2', + universalIdentifier: '20202020-4baf-4604-b899-2f7fcfbbf90d', + }), }), task: getFlatFieldMetadataMock({ id: 'db16ab78-ea3f-4b67-93e3-6ad9ab1b7273', @@ -576,30 +585,31 @@ export const FAVORITE_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: '33e4eff0-ff0f-4530-802a-cd630481ee84', relationTargetObjectMetadataId: '3186920d-2a15-4b5f-96c7-2bf6567024b0', universalIdentifier: '20202020-1b1b-4b3b-8b1b-7f8d6a1d7d5c', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: '33e4eff0-ff0f-4530-802a-cd630481ee84', - standardId: '20202020-4d1d-41ac-b13b-621631298d65', - objectMetadataId: '3186920d-2a15-4b5f-96c7-2bf6567024b0', - type: FieldMetadataType.RELATION, - name: 'favorites', - label: 'Favorites', - defaultValue: null, - description: 'Favorites linked to the task', - icon: 'IconHeart', - standardOverrides: null, - options: null, - settings: { relationType: RelationType.ONE_TO_MANY }, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: true, - relationTargetFieldMetadataId: 'db16ab78-ea3f-4b67-93e3-6ad9ab1b7273', - relationTargetObjectMetadataId: 'f4749ffb-dde8-44ff-8b01-d3fc82df0ba2', - universalIdentifier: '20202020-4d1d-41ac-b13b-621631298d65', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: '33e4eff0-ff0f-4530-802a-cd630481ee84', + standardId: '20202020-4d1d-41ac-b13b-621631298d65', + objectMetadataId: '3186920d-2a15-4b5f-96c7-2bf6567024b0', + type: FieldMetadataType.RELATION, + name: 'favorites', + label: 'Favorites', + defaultValue: null, + description: 'Favorites linked to the task', + icon: 'IconHeart', + standardOverrides: null, + options: null, + settings: { relationType: RelationType.ONE_TO_MANY }, + isCustom: false, + isActive: true, + isSystem: true, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: true, + relationTargetFieldMetadataId: 'db16ab78-ea3f-4b67-93e3-6ad9ab1b7273', + relationTargetObjectMetadataId: 'f4749ffb-dde8-44ff-8b01-d3fc82df0ba2', + universalIdentifier: '20202020-4d1d-41ac-b13b-621631298d65', + }), }), note: getFlatFieldMetadataMock({ id: 'a61baf0f-2d43-4fda-9baf-efb000c17ecd', @@ -628,30 +638,31 @@ export const FAVORITE_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: '065a1ede-f773-48ca-84bf-70f61d838396', relationTargetObjectMetadataId: '1253e3e5-5b00-4a34-93b8-02f3dc6e2b7c', universalIdentifier: '20202020-1f25-43fe-8b00-af212fdde824', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: '065a1ede-f773-48ca-84bf-70f61d838396', - standardId: '20202020-4d1d-41ac-b13b-621631298d67', - objectMetadataId: '1253e3e5-5b00-4a34-93b8-02f3dc6e2b7c', - type: FieldMetadataType.RELATION, - name: 'favorites', - label: 'Favorites', - defaultValue: null, - description: 'Favorites linked to the note', - icon: 'IconHeart', - standardOverrides: null, - options: null, - settings: { relationType: RelationType.ONE_TO_MANY }, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: true, - relationTargetFieldMetadataId: 'a61baf0f-2d43-4fda-9baf-efb000c17ecd', - relationTargetObjectMetadataId: 'f4749ffb-dde8-44ff-8b01-d3fc82df0ba2', - universalIdentifier: '20202020-4d1d-41ac-b13b-621631298d67', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: '065a1ede-f773-48ca-84bf-70f61d838396', + standardId: '20202020-4d1d-41ac-b13b-621631298d67', + objectMetadataId: '1253e3e5-5b00-4a34-93b8-02f3dc6e2b7c', + type: FieldMetadataType.RELATION, + name: 'favorites', + label: 'Favorites', + defaultValue: null, + description: 'Favorites linked to the note', + icon: 'IconHeart', + standardOverrides: null, + options: null, + settings: { relationType: RelationType.ONE_TO_MANY }, + isCustom: false, + isActive: true, + isSystem: true, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: true, + relationTargetFieldMetadataId: 'a61baf0f-2d43-4fda-9baf-efb000c17ecd', + relationTargetObjectMetadataId: 'f4749ffb-dde8-44ff-8b01-d3fc82df0ba2', + universalIdentifier: '20202020-4d1d-41ac-b13b-621631298d67', + }), }), view: getFlatFieldMetadataMock({ id: 'accd216c-790e-4bd2-83bb-0700e06d0e5c', @@ -680,30 +691,31 @@ export const FAVORITE_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: '90a103ec-7dce-4bd4-aed4-e2c9d46ecf32', relationTargetObjectMetadataId: '8377fc0d-ec1c-4fb5-b6ae-9381d9b22a95', universalIdentifier: '20202020-5a93-4fa9-acce-e73481a0bbdf', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: '90a103ec-7dce-4bd4-aed4-e2c9d46ecf32', - standardId: '20202020-c818-4a86-8284-9ec0ef0a59a5', - objectMetadataId: '8377fc0d-ec1c-4fb5-b6ae-9381d9b22a95', - type: FieldMetadataType.RELATION, - name: 'favorites', - label: 'Favorites', - defaultValue: null, - description: 'Favorites linked to the view', - icon: 'IconHeart', - standardOverrides: null, - options: null, - settings: { relationType: RelationType.ONE_TO_MANY }, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: true, - relationTargetFieldMetadataId: 'accd216c-790e-4bd2-83bb-0700e06d0e5c', - relationTargetObjectMetadataId: 'f4749ffb-dde8-44ff-8b01-d3fc82df0ba2', - universalIdentifier: '20202020-c818-4a86-8284-9ec0ef0a59a5', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: '90a103ec-7dce-4bd4-aed4-e2c9d46ecf32', + standardId: '20202020-c818-4a86-8284-9ec0ef0a59a5', + objectMetadataId: '8377fc0d-ec1c-4fb5-b6ae-9381d9b22a95', + type: FieldMetadataType.RELATION, + name: 'favorites', + label: 'Favorites', + defaultValue: null, + description: 'Favorites linked to the view', + icon: 'IconHeart', + standardOverrides: null, + options: null, + settings: { relationType: RelationType.ONE_TO_MANY }, + isCustom: false, + isActive: true, + isSystem: true, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: true, + relationTargetFieldMetadataId: 'accd216c-790e-4bd2-83bb-0700e06d0e5c', + relationTargetObjectMetadataId: 'f4749ffb-dde8-44ff-8b01-d3fc82df0ba2', + universalIdentifier: '20202020-c818-4a86-8284-9ec0ef0a59a5', + }), }), rocket: getFlatFieldMetadataMock({ id: '9448627d-725d-499e-a071-90fd5cfcf0ea', @@ -732,30 +744,31 @@ export const FAVORITE_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: '14010360-f3c2-442e-b05f-43c30158f246', relationTargetObjectMetadataId: 'd78ec657-74a4-4652-a350-1f44ff62970a', universalIdentifier: '20202020-78f7-4d7d-86e9-7562ced0b381', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: '14010360-f3c2-442e-b05f-43c30158f246', - standardId: '20202020-a4a7-4686-b296-1c6c3482ee21', - objectMetadataId: 'd78ec657-74a4-4652-a350-1f44ff62970a', - type: FieldMetadataType.RELATION, - name: 'favorites', - label: 'Favorites', - defaultValue: null, - description: 'Favorites tied to the Rocket', - icon: 'IconHeart', - standardOverrides: null, - options: null, - settings: { relationType: RelationType.ONE_TO_MANY }, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: false, - relationTargetFieldMetadataId: '9448627d-725d-499e-a071-90fd5cfcf0ea', - relationTargetObjectMetadataId: 'f4749ffb-dde8-44ff-8b01-d3fc82df0ba2', - universalIdentifier: '20202020-a4a7-4686-b296-1c6c3482ee21', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: '14010360-f3c2-442e-b05f-43c30158f246', + standardId: '20202020-a4a7-4686-b296-1c6c3482ee21', + objectMetadataId: 'd78ec657-74a4-4652-a350-1f44ff62970a', + type: FieldMetadataType.RELATION, + name: 'favorites', + label: 'Favorites', + defaultValue: null, + description: 'Favorites tied to the Rocket', + icon: 'IconHeart', + standardOverrides: null, + options: null, + settings: { relationType: RelationType.ONE_TO_MANY }, + isCustom: false, + isActive: true, + isSystem: true, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: false, + relationTargetFieldMetadataId: '9448627d-725d-499e-a071-90fd5cfcf0ea', + relationTargetObjectMetadataId: 'f4749ffb-dde8-44ff-8b01-d3fc82df0ba2', + universalIdentifier: '20202020-a4a7-4686-b296-1c6c3482ee21', + }), }), pet: getFlatFieldMetadataMock({ id: 'd34b4048-bf0c-4c61-8ffe-59f1838a2cc4', @@ -784,30 +797,31 @@ export const FAVORITE_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: '80bc4e7a-6bd1-4f2b-98b1-6333c631cc1a', relationTargetObjectMetadataId: 'd34e0f07-1b8c-4de0-938e-599cf05e1f7f', universalIdentifier: '20202020-1bd7-4d10-80dc-968b9f5d1a8a', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: '80bc4e7a-6bd1-4f2b-98b1-6333c631cc1a', - standardId: '20202020-a4a7-4686-b296-1c6c3482ee21', - objectMetadataId: 'd34e0f07-1b8c-4de0-938e-599cf05e1f7f', - type: FieldMetadataType.RELATION, - name: 'favorites', - label: 'Favorites', - defaultValue: null, - description: 'Favorites tied to the Pet', - icon: 'IconHeart', - standardOverrides: null, - options: null, - settings: { relationType: RelationType.ONE_TO_MANY }, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: false, - relationTargetFieldMetadataId: 'd34b4048-bf0c-4c61-8ffe-59f1838a2cc4', - relationTargetObjectMetadataId: 'f4749ffb-dde8-44ff-8b01-d3fc82df0ba2', - universalIdentifier: '20202020-a4a7-4686-b296-1c6c3482ee21', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: '80bc4e7a-6bd1-4f2b-98b1-6333c631cc1a', + standardId: '20202020-a4a7-4686-b296-1c6c3482ee21', + objectMetadataId: 'd34e0f07-1b8c-4de0-938e-599cf05e1f7f', + type: FieldMetadataType.RELATION, + name: 'favorites', + label: 'Favorites', + defaultValue: null, + description: 'Favorites tied to the Pet', + icon: 'IconHeart', + standardOverrides: null, + options: null, + settings: { relationType: RelationType.ONE_TO_MANY }, + isCustom: false, + isActive: true, + isSystem: true, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: false, + relationTargetFieldMetadataId: 'd34b4048-bf0c-4c61-8ffe-59f1838a2cc4', + relationTargetObjectMetadataId: 'f4749ffb-dde8-44ff-8b01-d3fc82df0ba2', + universalIdentifier: '20202020-a4a7-4686-b296-1c6c3482ee21', + }), }), surveyResult: getFlatFieldMetadataMock({ id: '9cdfb5a1-bb9c-4a59-811d-f5a1034a8f8b', @@ -836,29 +850,30 @@ export const FAVORITE_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: '8e11aced-3a20-4551-baa1-b38b98a74e1c', relationTargetObjectMetadataId: '713da753-0340-49b5-b1fa-add34d2dc9a8', universalIdentifier: '20202020-d049-4912-80ee-43b09fe3b0ac', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: '8e11aced-3a20-4551-baa1-b38b98a74e1c', - standardId: '20202020-a4a7-4686-b296-1c6c3482ee21', - objectMetadataId: '713da753-0340-49b5-b1fa-add34d2dc9a8', - type: FieldMetadataType.RELATION, - name: 'favorites', - label: 'Favorites', - defaultValue: null, - description: 'Favorites tied to the Survey result', - icon: 'IconHeart', - standardOverrides: null, - options: null, - settings: { relationType: RelationType.ONE_TO_MANY }, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: false, - relationTargetFieldMetadataId: '9cdfb5a1-bb9c-4a59-811d-f5a1034a8f8b', - relationTargetObjectMetadataId: 'f4749ffb-dde8-44ff-8b01-d3fc82df0ba2', - universalIdentifier: '20202020-a4a7-4686-b296-1c6c3482ee21', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: '8e11aced-3a20-4551-baa1-b38b98a74e1c', + standardId: '20202020-a4a7-4686-b296-1c6c3482ee21', + objectMetadataId: '713da753-0340-49b5-b1fa-add34d2dc9a8', + type: FieldMetadataType.RELATION, + name: 'favorites', + label: 'Favorites', + defaultValue: null, + description: 'Favorites tied to the Survey result', + icon: 'IconHeart', + standardOverrides: null, + options: null, + settings: { relationType: RelationType.ONE_TO_MANY }, + isCustom: false, + isActive: true, + isSystem: true, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: false, + relationTargetFieldMetadataId: '9cdfb5a1-bb9c-4a59-811d-f5a1034a8f8b', + relationTargetObjectMetadataId: 'f4749ffb-dde8-44ff-8b01-d3fc82df0ba2', + universalIdentifier: '20202020-a4a7-4686-b296-1c6c3482ee21', + }), }), } as const satisfies Record; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__mocks__/favorite-folder-flat-fields.mock.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__mocks__/favorite-folder-flat-fields.mock.ts index a0ff075bf0..ca149daaa1 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__mocks__/favorite-folder-flat-fields.mock.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__mocks__/favorite-folder-flat-fields.mock.ts @@ -4,6 +4,7 @@ import { DateDisplayFormat } from 'src/engine/metadata-modules/field-metadata/in import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface'; import { getFlatFieldMetadataMock } from 'src/engine/metadata-modules/flat-field-metadata/__mocks__/get-flat-field-metadata.mock'; +import { getMorphOrRelationTargetFlatFieldMetadataMock } from 'src/engine/metadata-modules/flat-field-metadata/__mocks__/get-morph-or-relation-target-flat-field-metadata-mock'; import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; import { RelationOnDeleteAction } from 'src/engine/metadata-modules/relation-metadata/relation-on-delete-action.type'; @@ -181,33 +182,34 @@ export const FAVORITE_FOLDER_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: 'fabbe669-b8fc-49fe-8010-f13d01eb61f1', relationTargetObjectMetadataId: 'f4749ffb-dde8-44ff-8b01-d3fc82df0ba2', universalIdentifier: '20202020-b5e3-4b42-8af2-03cd4fd2e4d2', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: 'fabbe669-b8fc-49fe-8010-f13d01eb61f1', - standardId: '20202020-f658-4d12-8b4d-248356aa4bd9', - objectMetadataId: 'f4749ffb-dde8-44ff-8b01-d3fc82df0ba2', - type: FieldMetadataType.RELATION, - name: 'favoriteFolder', - label: 'Favorite Folder', - defaultValue: null, - description: 'The folder this favorite belongs to', - icon: 'IconFolder', - standardOverrides: null, - options: null, - settings: { - onDelete: RelationOnDeleteAction.SET_NULL, - relationType: RelationType.MANY_TO_ONE, - joinColumnName: 'favoriteFolderId', - }, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: true, - relationTargetFieldMetadataId: '71b95076-6b8d-45c9-9a7c-ab981b81bd1b', - relationTargetObjectMetadataId: '35763b74-1abe-4c4b-9eab-27693f0ee06d', - universalIdentifier: '20202020-f658-4d12-8b4d-248356aa4bd9', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: 'fabbe669-b8fc-49fe-8010-f13d01eb61f1', + standardId: '20202020-f658-4d12-8b4d-248356aa4bd9', + objectMetadataId: 'f4749ffb-dde8-44ff-8b01-d3fc82df0ba2', + type: FieldMetadataType.RELATION, + name: 'favoriteFolder', + label: 'Favorite Folder', + defaultValue: null, + description: 'The folder this favorite belongs to', + icon: 'IconFolder', + standardOverrides: null, + options: null, + settings: { + onDelete: RelationOnDeleteAction.SET_NULL, + relationType: RelationType.MANY_TO_ONE, + joinColumnName: 'favoriteFolderId', + }, + isCustom: false, + isActive: true, + isSystem: true, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: true, + relationTargetFieldMetadataId: '71b95076-6b8d-45c9-9a7c-ab981b81bd1b', + relationTargetObjectMetadataId: '35763b74-1abe-4c4b-9eab-27693f0ee06d', + universalIdentifier: '20202020-f658-4d12-8b4d-248356aa4bd9', + }), }), } as const satisfies Record; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__mocks__/get-morph-or-relation-target-flat-field-metadata-mock.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__mocks__/get-morph-or-relation-target-flat-field-metadata-mock.ts new file mode 100644 index 0000000000..b18275925f --- /dev/null +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__mocks__/get-morph-or-relation-target-flat-field-metadata-mock.ts @@ -0,0 +1,60 @@ +import { faker } from '@faker-js/faker'; +import { type NonNullableRequired } from 'twenty-shared/types'; + +import { type MorphOrRelationFieldMetadataType } from 'src/engine/metadata-modules/field-metadata/types/morph-or-relation-field-metadata-type.type'; +import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; +import { type FlatRelationTargetFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-relation-target-field-metadata.type'; + +type GetMorphOrRelationFlatFieldMetadataMockArgs = NonNullableRequired< + Pick< + FlatFieldMetadata, + | 'universalIdentifier' + | 'objectMetadataId' + | 'type' + | 'settings' + | 'relationTargetFieldMetadataId' + | 'relationTargetObjectMetadataId' + > +> & + Partial; + +export const getMorphOrRelationTargetFlatFieldMetadataMock = ({ + objectMetadataId, + settings, + type, + universalIdentifier, + relationTargetFieldMetadataId, + relationTargetObjectMetadataId, + ...overrides +}: GetMorphOrRelationFlatFieldMetadataMockArgs): FlatRelationTargetFieldMetadata => { + const createdAt = '2024-01-01T00:00:00.000Z' as unknown as Date; + + return { + createdAt, + updatedAt: createdAt, + description: 'default flat field metadata description', + icon: 'icon', + id: faker.string.uuid(), + isActive: true, + isCustom: true, + name: 'flatFieldMetadataName', + label: 'flat field metadata label', + isNullable: true, + isUnique: false, + isUIReadOnly: false, + isLabelSyncedWithName: false, + isSystem: false, + standardId: null, + standardOverrides: null, + workspaceId: faker.string.uuid(), + objectMetadataId, + type, + universalIdentifier, + settings, + relationTargetFieldMetadataId, + relationTargetObjectMetadataId, + ...overrides, + defaultValue: null, + options: null, + }; +}; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__mocks__/note-flat-fields.mock.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__mocks__/note-flat-fields.mock.ts index 7b4a2123c9..c57b7a2190 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__mocks__/note-flat-fields.mock.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__mocks__/note-flat-fields.mock.ts @@ -4,6 +4,7 @@ import { DateDisplayFormat } from 'src/engine/metadata-modules/field-metadata/in import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface'; import { getFlatFieldMetadataMock } from 'src/engine/metadata-modules/flat-field-metadata/__mocks__/get-flat-field-metadata.mock'; +import { getMorphOrRelationTargetFlatFieldMetadataMock } from 'src/engine/metadata-modules/flat-field-metadata/__mocks__/get-morph-or-relation-target-flat-field-metadata-mock'; import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; import { RelationOnDeleteAction } from 'src/engine/metadata-modules/relation-metadata/relation-on-delete-action.type'; @@ -260,34 +261,35 @@ export const NOTE_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: 'b1e812b7-604e-459b-9449-31fa414b315c', relationTargetObjectMetadataId: '12e3cb51-c3de-4192-b0d5-965d48d001c0', universalIdentifier: '20202020-1f25-43fe-8b00-af212fdde823', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: 'b1e812b7-604e-459b-9449-31fa414b315c', - standardId: '20202020-57f3-4f50-9599-fc0f671df003', - objectMetadataId: '12e3cb51-c3de-4192-b0d5-965d48d001c0', - type: FieldMetadataType.RELATION, - name: 'note', - label: 'Note', - defaultValue: null, - description: 'NoteTarget note', - icon: 'IconNotes', - standardOverrides: null, - options: null, - settings: { - onDelete: RelationOnDeleteAction.SET_NULL, - relationType: RelationType.MANY_TO_ONE, - joinColumnName: 'noteId', - }, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: true, - relationTargetFieldMetadataId: '3a13d398-b7e6-4871-a5f8-5446806b3e5b', - relationTargetObjectMetadataId: '1253e3e5-5b00-4a34-93b8-02f3dc6e2b7c', - universalIdentifier: '20202020-57f3-4f50-9599-fc0f671df003', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: 'b1e812b7-604e-459b-9449-31fa414b315c', + standardId: '20202020-57f3-4f50-9599-fc0f671df003', + objectMetadataId: '12e3cb51-c3de-4192-b0d5-965d48d001c0', + type: FieldMetadataType.RELATION, + name: 'note', + label: 'Note', + defaultValue: null, + description: 'NoteTarget note', + icon: 'IconNotes', + standardOverrides: null, + options: null, + settings: { + onDelete: RelationOnDeleteAction.SET_NULL, + relationType: RelationType.MANY_TO_ONE, + joinColumnName: 'noteId', + }, + isCustom: false, + isActive: true, + isSystem: true, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: true, + relationTargetFieldMetadataId: '3a13d398-b7e6-4871-a5f8-5446806b3e5b', + relationTargetObjectMetadataId: '1253e3e5-5b00-4a34-93b8-02f3dc6e2b7c', + universalIdentifier: '20202020-57f3-4f50-9599-fc0f671df003', + }), }), attachments: getFlatFieldMetadataMock({ id: '4d4b3225-ddd2-4d76-a4d6-bcdd43a256e8', @@ -312,34 +314,35 @@ export const NOTE_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: '5a98eb2b-1120-42e3-afd3-09d7da642fba', relationTargetObjectMetadataId: '819ed5ff-312f-4423-8e95-02a691cf5c27', universalIdentifier: '20202020-4986-4c92-bf19-39934b149b16', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: '5a98eb2b-1120-42e3-afd3-09d7da642fba', - standardId: '20202020-4f4b-4503-a6fc-6b982f3dffb5', - objectMetadataId: '819ed5ff-312f-4423-8e95-02a691cf5c27', - type: FieldMetadataType.RELATION, - name: 'note', - label: 'Note', - defaultValue: null, - description: 'Attachment note', - icon: 'IconNotes', - standardOverrides: null, - options: null, - settings: { - onDelete: RelationOnDeleteAction.SET_NULL, - relationType: RelationType.MANY_TO_ONE, - joinColumnName: 'noteId', - }, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: true, - relationTargetFieldMetadataId: '4d4b3225-ddd2-4d76-a4d6-bcdd43a256e8', - relationTargetObjectMetadataId: '1253e3e5-5b00-4a34-93b8-02f3dc6e2b7c', - universalIdentifier: '20202020-4f4b-4503-a6fc-6b982f3dffb5', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: '5a98eb2b-1120-42e3-afd3-09d7da642fba', + standardId: '20202020-4f4b-4503-a6fc-6b982f3dffb5', + objectMetadataId: '819ed5ff-312f-4423-8e95-02a691cf5c27', + type: FieldMetadataType.RELATION, + name: 'note', + label: 'Note', + defaultValue: null, + description: 'Attachment note', + icon: 'IconNotes', + standardOverrides: null, + options: null, + settings: { + onDelete: RelationOnDeleteAction.SET_NULL, + relationType: RelationType.MANY_TO_ONE, + joinColumnName: 'noteId', + }, + isCustom: false, + isActive: true, + isSystem: true, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: true, + relationTargetFieldMetadataId: '4d4b3225-ddd2-4d76-a4d6-bcdd43a256e8', + relationTargetObjectMetadataId: '1253e3e5-5b00-4a34-93b8-02f3dc6e2b7c', + universalIdentifier: '20202020-4f4b-4503-a6fc-6b982f3dffb5', + }), }), timelineActivities: getFlatFieldMetadataMock({ id: '1207d260-db2c-41d4-bb09-34ea1188978f', @@ -364,34 +367,35 @@ export const NOTE_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: '2b9f1c90-9e35-4ccc-8d84-b42de31ef127', relationTargetObjectMetadataId: '3090f830-c4b1-41a1-8e18-815760830bec', universalIdentifier: '20202020-7030-42f8-929c-1a57b25d6bce', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: '2b9f1c90-9e35-4ccc-8d84-b42de31ef127', - standardId: '20202020-ec55-4135-8da5-3a20badc0156', - objectMetadataId: '3090f830-c4b1-41a1-8e18-815760830bec', - type: FieldMetadataType.RELATION, - name: 'note', - label: 'Note', - defaultValue: null, - description: 'Event note', - icon: 'IconTargetArrow', - standardOverrides: null, - options: null, - settings: { - onDelete: RelationOnDeleteAction.SET_NULL, - relationType: RelationType.MANY_TO_ONE, - joinColumnName: 'noteId', - }, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: true, - relationTargetFieldMetadataId: '1207d260-db2c-41d4-bb09-34ea1188978f', - relationTargetObjectMetadataId: '1253e3e5-5b00-4a34-93b8-02f3dc6e2b7c', - universalIdentifier: '20202020-ec55-4135-8da5-3a20badc0156', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: '2b9f1c90-9e35-4ccc-8d84-b42de31ef127', + standardId: '20202020-ec55-4135-8da5-3a20badc0156', + objectMetadataId: '3090f830-c4b1-41a1-8e18-815760830bec', + type: FieldMetadataType.RELATION, + name: 'note', + label: 'Note', + defaultValue: null, + description: 'Event note', + icon: 'IconTargetArrow', + standardOverrides: null, + options: null, + settings: { + onDelete: RelationOnDeleteAction.SET_NULL, + relationType: RelationType.MANY_TO_ONE, + joinColumnName: 'noteId', + }, + isCustom: false, + isActive: true, + isSystem: true, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: true, + relationTargetFieldMetadataId: '1207d260-db2c-41d4-bb09-34ea1188978f', + relationTargetObjectMetadataId: '1253e3e5-5b00-4a34-93b8-02f3dc6e2b7c', + universalIdentifier: '20202020-ec55-4135-8da5-3a20badc0156', + }), }), favorites: getFlatFieldMetadataMock({ id: '065a1ede-f773-48ca-84bf-70f61d838396', @@ -416,33 +420,34 @@ export const NOTE_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: 'a61baf0f-2d43-4fda-9baf-efb000c17ecd', relationTargetObjectMetadataId: 'f4749ffb-dde8-44ff-8b01-d3fc82df0ba2', universalIdentifier: '20202020-4d1d-41ac-b13b-621631298d67', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: 'a61baf0f-2d43-4fda-9baf-efb000c17ecd', - standardId: '20202020-1f25-43fe-8b00-af212fdde824', - objectMetadataId: 'f4749ffb-dde8-44ff-8b01-d3fc82df0ba2', - type: FieldMetadataType.RELATION, - name: 'note', - label: 'Note', - defaultValue: null, - description: 'Favorite note', - icon: 'IconNotes', - standardOverrides: null, - options: null, - settings: { - onDelete: RelationOnDeleteAction.CASCADE, - relationType: RelationType.MANY_TO_ONE, - joinColumnName: 'noteId', - }, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: true, - relationTargetFieldMetadataId: '065a1ede-f773-48ca-84bf-70f61d838396', - relationTargetObjectMetadataId: '1253e3e5-5b00-4a34-93b8-02f3dc6e2b7c', - universalIdentifier: '20202020-1f25-43fe-8b00-af212fdde824', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: 'a61baf0f-2d43-4fda-9baf-efb000c17ecd', + standardId: '20202020-1f25-43fe-8b00-af212fdde824', + objectMetadataId: 'f4749ffb-dde8-44ff-8b01-d3fc82df0ba2', + type: FieldMetadataType.RELATION, + name: 'note', + label: 'Note', + defaultValue: null, + description: 'Favorite note', + icon: 'IconNotes', + standardOverrides: null, + options: null, + settings: { + onDelete: RelationOnDeleteAction.CASCADE, + relationType: RelationType.MANY_TO_ONE, + joinColumnName: 'noteId', + }, + isCustom: false, + isActive: true, + isSystem: true, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: true, + relationTargetFieldMetadataId: '065a1ede-f773-48ca-84bf-70f61d838396', + relationTargetObjectMetadataId: '1253e3e5-5b00-4a34-93b8-02f3dc6e2b7c', + universalIdentifier: '20202020-1f25-43fe-8b00-af212fdde824', + }), }), } as const satisfies Record; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__mocks__/notetarget-flat-fields.mock.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__mocks__/notetarget-flat-fields.mock.ts index 44eeed77e9..c728d32b68 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__mocks__/notetarget-flat-fields.mock.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__mocks__/notetarget-flat-fields.mock.ts @@ -4,6 +4,7 @@ import { DateDisplayFormat } from 'src/engine/metadata-modules/field-metadata/in import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface'; import { getFlatFieldMetadataMock } from 'src/engine/metadata-modules/flat-field-metadata/__mocks__/get-flat-field-metadata.mock'; +import { getMorphOrRelationTargetFlatFieldMetadataMock } from 'src/engine/metadata-modules/flat-field-metadata/__mocks__/get-morph-or-relation-target-flat-field-metadata-mock'; import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; import { RelationOnDeleteAction } from 'src/engine/metadata-modules/relation-metadata/relation-on-delete-action.type'; @@ -135,30 +136,31 @@ export const NOTETARGET_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: '3a13d398-b7e6-4871-a5f8-5446806b3e5b', relationTargetObjectMetadataId: '1253e3e5-5b00-4a34-93b8-02f3dc6e2b7c', universalIdentifier: '20202020-57f3-4f50-9599-fc0f671df003', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: '3a13d398-b7e6-4871-a5f8-5446806b3e5b', - standardId: '20202020-1f25-43fe-8b00-af212fdde823', - objectMetadataId: '1253e3e5-5b00-4a34-93b8-02f3dc6e2b7c', - type: FieldMetadataType.RELATION, - name: 'noteTargets', - label: 'Relations', - defaultValue: null, - description: 'Note targets', - icon: 'IconArrowUpRight', - standardOverrides: null, - options: null, - settings: { relationType: RelationType.ONE_TO_MANY }, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: false, - relationTargetFieldMetadataId: 'b1e812b7-604e-459b-9449-31fa414b315c', - relationTargetObjectMetadataId: '12e3cb51-c3de-4192-b0d5-965d48d001c0', - universalIdentifier: '20202020-1f25-43fe-8b00-af212fdde823', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: '3a13d398-b7e6-4871-a5f8-5446806b3e5b', + standardId: '20202020-1f25-43fe-8b00-af212fdde823', + objectMetadataId: '1253e3e5-5b00-4a34-93b8-02f3dc6e2b7c', + type: FieldMetadataType.RELATION, + name: 'noteTargets', + label: 'Relations', + defaultValue: null, + description: 'Note targets', + icon: 'IconArrowUpRight', + standardOverrides: null, + options: null, + settings: { relationType: RelationType.ONE_TO_MANY }, + isCustom: false, + isActive: true, + isSystem: true, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: false, + relationTargetFieldMetadataId: 'b1e812b7-604e-459b-9449-31fa414b315c', + relationTargetObjectMetadataId: '12e3cb51-c3de-4192-b0d5-965d48d001c0', + universalIdentifier: '20202020-1f25-43fe-8b00-af212fdde823', + }), }), person: getFlatFieldMetadataMock({ id: '560c71ff-254f-4baf-a4d1-054c53444f41', @@ -187,30 +189,31 @@ export const NOTETARGET_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: '60388ed8-45f6-4fb5-8752-81c73e13f4ab', relationTargetObjectMetadataId: '843e0b67-9619-4628-91c4-2fa62256a611', universalIdentifier: '20202020-38ca-4aab-92f5-8a605ca2e4c5', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: '60388ed8-45f6-4fb5-8752-81c73e13f4ab', - standardId: '20202020-c8fc-4258-8250-15905d3fcfec', - objectMetadataId: '843e0b67-9619-4628-91c4-2fa62256a611', - type: FieldMetadataType.RELATION, - name: 'noteTargets', - label: 'Notes', - defaultValue: null, - description: 'Notes tied to the contact', - icon: 'IconNotes', - standardOverrides: null, - options: null, - settings: { relationType: RelationType.ONE_TO_MANY }, - isCustom: false, - isActive: true, - isSystem: false, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: false, - relationTargetFieldMetadataId: '560c71ff-254f-4baf-a4d1-054c53444f41', - relationTargetObjectMetadataId: '12e3cb51-c3de-4192-b0d5-965d48d001c0', - universalIdentifier: '20202020-c8fc-4258-8250-15905d3fcfec', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: '60388ed8-45f6-4fb5-8752-81c73e13f4ab', + standardId: '20202020-c8fc-4258-8250-15905d3fcfec', + objectMetadataId: '843e0b67-9619-4628-91c4-2fa62256a611', + type: FieldMetadataType.RELATION, + name: 'noteTargets', + label: 'Notes', + defaultValue: null, + description: 'Notes tied to the contact', + icon: 'IconNotes', + standardOverrides: null, + options: null, + settings: { relationType: RelationType.ONE_TO_MANY }, + isCustom: false, + isActive: true, + isSystem: false, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: false, + relationTargetFieldMetadataId: '560c71ff-254f-4baf-a4d1-054c53444f41', + relationTargetObjectMetadataId: '12e3cb51-c3de-4192-b0d5-965d48d001c0', + universalIdentifier: '20202020-c8fc-4258-8250-15905d3fcfec', + }), }), company: getFlatFieldMetadataMock({ id: 'd1d3f9eb-1447-4adb-bc2b-f133bc58ac35', @@ -239,30 +242,31 @@ export const NOTETARGET_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: '56b9dc8a-0379-42cf-ab31-8db7061f5a2a', relationTargetObjectMetadataId: '7f5c2c7a-bb23-46fb-b59d-9b7a52a8d1cc', universalIdentifier: 'c500fbc0-d6f2-4982-a959-5a755431696c', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: '56b9dc8a-0379-42cf-ab31-8db7061f5a2a', - standardId: '20202020-bae0-4556-a74a-a9c686f77a88', - objectMetadataId: '7f5c2c7a-bb23-46fb-b59d-9b7a52a8d1cc', - type: FieldMetadataType.RELATION, - name: 'noteTargets', - label: 'Notes', - defaultValue: null, - description: 'Notes tied to the company', - icon: 'IconNotes', - standardOverrides: null, - options: null, - settings: { relationType: RelationType.ONE_TO_MANY }, - isCustom: false, - isActive: true, - isSystem: false, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: false, - relationTargetFieldMetadataId: 'd1d3f9eb-1447-4adb-bc2b-f133bc58ac35', - relationTargetObjectMetadataId: '12e3cb51-c3de-4192-b0d5-965d48d001c0', - universalIdentifier: '20202020-bae0-4556-a74a-a9c686f77a88', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: '56b9dc8a-0379-42cf-ab31-8db7061f5a2a', + standardId: '20202020-bae0-4556-a74a-a9c686f77a88', + objectMetadataId: '7f5c2c7a-bb23-46fb-b59d-9b7a52a8d1cc', + type: FieldMetadataType.RELATION, + name: 'noteTargets', + label: 'Notes', + defaultValue: null, + description: 'Notes tied to the company', + icon: 'IconNotes', + standardOverrides: null, + options: null, + settings: { relationType: RelationType.ONE_TO_MANY }, + isCustom: false, + isActive: true, + isSystem: false, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: false, + relationTargetFieldMetadataId: 'd1d3f9eb-1447-4adb-bc2b-f133bc58ac35', + relationTargetObjectMetadataId: '12e3cb51-c3de-4192-b0d5-965d48d001c0', + universalIdentifier: '20202020-bae0-4556-a74a-a9c686f77a88', + }), }), opportunity: getFlatFieldMetadataMock({ id: 'f42eac2a-8d99-4259-b69a-549abd553eda', @@ -291,30 +295,31 @@ export const NOTETARGET_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: '36210a54-a72e-4530-a1eb-a0420c53e551', relationTargetObjectMetadataId: 'e6996bbf-dd41-423a-9324-8546f5b22fa7', universalIdentifier: '20202020-4e42-417a-a705-76581c9ade79', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: '36210a54-a72e-4530-a1eb-a0420c53e551', - standardId: '20202020-dd3f-42d5-a382-db58aabf43d3', - objectMetadataId: 'e6996bbf-dd41-423a-9324-8546f5b22fa7', - type: FieldMetadataType.RELATION, - name: 'noteTargets', - label: 'Notes', - defaultValue: null, - description: 'Notes tied to the opportunity', - icon: 'IconNotes', - standardOverrides: null, - options: null, - settings: { relationType: RelationType.ONE_TO_MANY }, - isCustom: false, - isActive: true, - isSystem: false, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: false, - relationTargetFieldMetadataId: 'f42eac2a-8d99-4259-b69a-549abd553eda', - relationTargetObjectMetadataId: '12e3cb51-c3de-4192-b0d5-965d48d001c0', - universalIdentifier: '20202020-dd3f-42d5-a382-db58aabf43d3', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: '36210a54-a72e-4530-a1eb-a0420c53e551', + standardId: '20202020-dd3f-42d5-a382-db58aabf43d3', + objectMetadataId: 'e6996bbf-dd41-423a-9324-8546f5b22fa7', + type: FieldMetadataType.RELATION, + name: 'noteTargets', + label: 'Notes', + defaultValue: null, + description: 'Notes tied to the opportunity', + icon: 'IconNotes', + standardOverrides: null, + options: null, + settings: { relationType: RelationType.ONE_TO_MANY }, + isCustom: false, + isActive: true, + isSystem: false, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: false, + relationTargetFieldMetadataId: 'f42eac2a-8d99-4259-b69a-549abd553eda', + relationTargetObjectMetadataId: '12e3cb51-c3de-4192-b0d5-965d48d001c0', + universalIdentifier: '20202020-dd3f-42d5-a382-db58aabf43d3', + }), }), rocket: getFlatFieldMetadataMock({ id: '4212b3d7-dd9f-4da9-85f7-2fa69a42296f', @@ -343,30 +348,31 @@ export const NOTETARGET_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: 'c91376fb-20bd-47c7-8922-b64f7db51cfa', relationTargetObjectMetadataId: 'd78ec657-74a4-4652-a350-1f44ff62970a', universalIdentifier: '20202020-52b6-4d5e-8f21-ed8b7c09c4a9', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: 'c91376fb-20bd-47c7-8922-b64f7db51cfa', - standardId: '20202020-01fd-4f37-99dc-9427a444018a', - objectMetadataId: 'd78ec657-74a4-4652-a350-1f44ff62970a', - type: FieldMetadataType.RELATION, - name: 'noteTargets', - label: 'NoteTargets', - defaultValue: null, - description: 'NoteTargets tied to the Rocket', - icon: 'IconCheckbox', - standardOverrides: null, - options: null, - settings: { relationType: RelationType.ONE_TO_MANY }, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: false, - relationTargetFieldMetadataId: '4212b3d7-dd9f-4da9-85f7-2fa69a42296f', - relationTargetObjectMetadataId: '12e3cb51-c3de-4192-b0d5-965d48d001c0', - universalIdentifier: '20202020-01fd-4f37-99dc-9427a444018a', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: 'c91376fb-20bd-47c7-8922-b64f7db51cfa', + standardId: '20202020-01fd-4f37-99dc-9427a444018a', + objectMetadataId: 'd78ec657-74a4-4652-a350-1f44ff62970a', + type: FieldMetadataType.RELATION, + name: 'noteTargets', + label: 'NoteTargets', + defaultValue: null, + description: 'NoteTargets tied to the Rocket', + icon: 'IconCheckbox', + standardOverrides: null, + options: null, + settings: { relationType: RelationType.ONE_TO_MANY }, + isCustom: false, + isActive: true, + isSystem: true, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: false, + relationTargetFieldMetadataId: '4212b3d7-dd9f-4da9-85f7-2fa69a42296f', + relationTargetObjectMetadataId: '12e3cb51-c3de-4192-b0d5-965d48d001c0', + universalIdentifier: '20202020-01fd-4f37-99dc-9427a444018a', + }), }), pet: getFlatFieldMetadataMock({ id: 'd88d0737-e83a-47b1-b701-8edfe4a2ae2e', @@ -395,30 +401,31 @@ export const NOTETARGET_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: '98afd46e-0259-4c87-969d-16e7e660e007', relationTargetObjectMetadataId: 'd34e0f07-1b8c-4de0-938e-599cf05e1f7f', universalIdentifier: '20202020-c54e-4804-8b0d-8795e5166432', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: '98afd46e-0259-4c87-969d-16e7e660e007', - standardId: '20202020-01fd-4f37-99dc-9427a444018a', - objectMetadataId: 'd34e0f07-1b8c-4de0-938e-599cf05e1f7f', - type: FieldMetadataType.RELATION, - name: 'noteTargets', - label: 'NoteTargets', - defaultValue: null, - description: 'NoteTargets tied to the Pet', - icon: 'IconCheckbox', - standardOverrides: null, - options: null, - settings: { relationType: RelationType.ONE_TO_MANY }, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: false, - relationTargetFieldMetadataId: 'd88d0737-e83a-47b1-b701-8edfe4a2ae2e', - relationTargetObjectMetadataId: '12e3cb51-c3de-4192-b0d5-965d48d001c0', - universalIdentifier: '20202020-01fd-4f37-99dc-9427a444018a', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: '98afd46e-0259-4c87-969d-16e7e660e007', + standardId: '20202020-01fd-4f37-99dc-9427a444018a', + objectMetadataId: 'd34e0f07-1b8c-4de0-938e-599cf05e1f7f', + type: FieldMetadataType.RELATION, + name: 'noteTargets', + label: 'NoteTargets', + defaultValue: null, + description: 'NoteTargets tied to the Pet', + icon: 'IconCheckbox', + standardOverrides: null, + options: null, + settings: { relationType: RelationType.ONE_TO_MANY }, + isCustom: false, + isActive: true, + isSystem: true, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: false, + relationTargetFieldMetadataId: 'd88d0737-e83a-47b1-b701-8edfe4a2ae2e', + relationTargetObjectMetadataId: '12e3cb51-c3de-4192-b0d5-965d48d001c0', + universalIdentifier: '20202020-01fd-4f37-99dc-9427a444018a', + }), }), surveyResult: getFlatFieldMetadataMock({ id: '7f444190-cb0e-4417-9c61-e59d8969b7f7', @@ -447,29 +454,30 @@ export const NOTETARGET_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: '1135971a-b1fa-4e63-b480-69410c6a09cd', relationTargetObjectMetadataId: '713da753-0340-49b5-b1fa-add34d2dc9a8', universalIdentifier: '20202020-75c4-4165-8146-dfdc2a76b940', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: '1135971a-b1fa-4e63-b480-69410c6a09cd', - standardId: '20202020-01fd-4f37-99dc-9427a444018a', - objectMetadataId: '713da753-0340-49b5-b1fa-add34d2dc9a8', - type: FieldMetadataType.RELATION, - name: 'noteTargets', - label: 'NoteTargets', - defaultValue: null, - description: 'NoteTargets tied to the Survey result', - icon: 'IconCheckbox', - standardOverrides: null, - options: null, - settings: { relationType: RelationType.ONE_TO_MANY }, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: false, - relationTargetFieldMetadataId: '7f444190-cb0e-4417-9c61-e59d8969b7f7', - relationTargetObjectMetadataId: '12e3cb51-c3de-4192-b0d5-965d48d001c0', - universalIdentifier: '20202020-01fd-4f37-99dc-9427a444018a', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: '1135971a-b1fa-4e63-b480-69410c6a09cd', + standardId: '20202020-01fd-4f37-99dc-9427a444018a', + objectMetadataId: '713da753-0340-49b5-b1fa-add34d2dc9a8', + type: FieldMetadataType.RELATION, + name: 'noteTargets', + label: 'NoteTargets', + defaultValue: null, + description: 'NoteTargets tied to the Survey result', + icon: 'IconCheckbox', + standardOverrides: null, + options: null, + settings: { relationType: RelationType.ONE_TO_MANY }, + isCustom: false, + isActive: true, + isSystem: true, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: false, + relationTargetFieldMetadataId: '7f444190-cb0e-4417-9c61-e59d8969b7f7', + relationTargetObjectMetadataId: '12e3cb51-c3de-4192-b0d5-965d48d001c0', + universalIdentifier: '20202020-01fd-4f37-99dc-9427a444018a', + }), }), } as const satisfies Record; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__mocks__/opportunity-flat-fields.mock.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__mocks__/opportunity-flat-fields.mock.ts index b0201fcf1e..c8b7db1187 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__mocks__/opportunity-flat-fields.mock.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__mocks__/opportunity-flat-fields.mock.ts @@ -4,6 +4,7 @@ import { DateDisplayFormat } from 'src/engine/metadata-modules/field-metadata/in import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface'; import { getFlatFieldMetadataMock } from 'src/engine/metadata-modules/flat-field-metadata/__mocks__/get-flat-field-metadata.mock'; +import { getMorphOrRelationTargetFlatFieldMetadataMock } from 'src/engine/metadata-modules/flat-field-metadata/__mocks__/get-morph-or-relation-target-flat-field-metadata-mock'; import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; import { RelationOnDeleteAction } from 'src/engine/metadata-modules/relation-metadata/relation-on-delete-action.type'; @@ -350,31 +351,32 @@ export const OPPORTUNITY_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: '7580c1b1-e8f9-480b-bd41-38b20df35777', relationTargetObjectMetadataId: '843e0b67-9619-4628-91c4-2fa62256a611', universalIdentifier: '20202020-8dfb-42fc-92b6-01afb759ed16', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: '7580c1b1-e8f9-480b-bd41-38b20df35777', - standardId: '20202020-911b-4a7d-b67b-918aa9a5b33a', - objectMetadataId: '843e0b67-9619-4628-91c4-2fa62256a611', - type: FieldMetadataType.RELATION, - name: 'pointOfContactForOpportunities', - label: 'Opportunities', - defaultValue: null, - description: - 'List of opportunities for which that person is the point of contact', - icon: 'IconTargetArrow', - standardOverrides: null, - options: null, - settings: { relationType: RelationType.ONE_TO_MANY }, - isCustom: false, - isActive: true, - isSystem: false, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: false, - relationTargetFieldMetadataId: '0e55bf63-1ffb-4f74-89f2-edd5a6a6686c', - relationTargetObjectMetadataId: 'e6996bbf-dd41-423a-9324-8546f5b22fa7', - universalIdentifier: '20202020-911b-4a7d-b67b-918aa9a5b33a', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: '7580c1b1-e8f9-480b-bd41-38b20df35777', + standardId: '20202020-911b-4a7d-b67b-918aa9a5b33a', + objectMetadataId: '843e0b67-9619-4628-91c4-2fa62256a611', + type: FieldMetadataType.RELATION, + name: 'pointOfContactForOpportunities', + label: 'Opportunities', + defaultValue: null, + description: + 'List of opportunities for which that person is the point of contact', + icon: 'IconTargetArrow', + standardOverrides: null, + options: null, + settings: { relationType: RelationType.ONE_TO_MANY }, + isCustom: false, + isActive: true, + isSystem: false, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: false, + relationTargetFieldMetadataId: '0e55bf63-1ffb-4f74-89f2-edd5a6a6686c', + relationTargetObjectMetadataId: 'e6996bbf-dd41-423a-9324-8546f5b22fa7', + universalIdentifier: '20202020-911b-4a7d-b67b-918aa9a5b33a', + }), }), company: getFlatFieldMetadataMock({ id: '512890f1-4da0-4b96-bb71-5ccabefb82e7', @@ -403,30 +405,31 @@ export const OPPORTUNITY_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: '3eda8c8e-74e4-401f-bb0e-470db5b267e6', relationTargetObjectMetadataId: '7f5c2c7a-bb23-46fb-b59d-9b7a52a8d1cc', universalIdentifier: '20202020-cbac-457e-b565-adece5fc815f', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: '3eda8c8e-74e4-401f-bb0e-470db5b267e6', - standardId: '20202020-add3-4658-8e23-d70dccb6d0ec', - objectMetadataId: '7f5c2c7a-bb23-46fb-b59d-9b7a52a8d1cc', - type: FieldMetadataType.RELATION, - name: 'opportunities', - label: 'Opportunities', - defaultValue: null, - description: 'Opportunities linked to the company.', - icon: 'IconTargetArrow', - standardOverrides: null, - options: null, - settings: { relationType: RelationType.ONE_TO_MANY }, - isCustom: false, - isActive: true, - isSystem: false, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: true, - relationTargetFieldMetadataId: '512890f1-4da0-4b96-bb71-5ccabefb82e7', - relationTargetObjectMetadataId: 'e6996bbf-dd41-423a-9324-8546f5b22fa7', - universalIdentifier: '20202020-add3-4658-8e23-d70dccb6d0ec', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: '3eda8c8e-74e4-401f-bb0e-470db5b267e6', + standardId: '20202020-add3-4658-8e23-d70dccb6d0ec', + objectMetadataId: '7f5c2c7a-bb23-46fb-b59d-9b7a52a8d1cc', + type: FieldMetadataType.RELATION, + name: 'opportunities', + label: 'Opportunities', + defaultValue: null, + description: 'Opportunities linked to the company.', + icon: 'IconTargetArrow', + standardOverrides: null, + options: null, + settings: { relationType: RelationType.ONE_TO_MANY }, + isCustom: false, + isActive: true, + isSystem: false, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: true, + relationTargetFieldMetadataId: '512890f1-4da0-4b96-bb71-5ccabefb82e7', + relationTargetObjectMetadataId: 'e6996bbf-dd41-423a-9324-8546f5b22fa7', + universalIdentifier: '20202020-add3-4658-8e23-d70dccb6d0ec', + }), }), favorites: getFlatFieldMetadataMock({ id: '87bb9924-a1cc-4357-9c8a-52141dabf266', @@ -451,34 +454,35 @@ export const OPPORTUNITY_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: '6380cf8e-4327-4d1e-ad21-1826ce4ecf05', relationTargetObjectMetadataId: 'f4749ffb-dde8-44ff-8b01-d3fc82df0ba2', universalIdentifier: '20202020-a1c2-4500-aaae-83ba8a0e827a', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: '6380cf8e-4327-4d1e-ad21-1826ce4ecf05', - standardId: '20202020-dabc-48e1-8318-2781a2b32aa2', - objectMetadataId: 'f4749ffb-dde8-44ff-8b01-d3fc82df0ba2', - type: FieldMetadataType.RELATION, - name: 'opportunity', - label: 'Opportunity', - defaultValue: null, - description: 'Favorite opportunity', - icon: 'IconTargetArrow', - standardOverrides: null, - options: null, - settings: { - onDelete: RelationOnDeleteAction.CASCADE, - relationType: RelationType.MANY_TO_ONE, - joinColumnName: 'opportunityId', - }, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: true, - relationTargetFieldMetadataId: '87bb9924-a1cc-4357-9c8a-52141dabf266', - relationTargetObjectMetadataId: 'e6996bbf-dd41-423a-9324-8546f5b22fa7', - universalIdentifier: '20202020-dabc-48e1-8318-2781a2b32aa2', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: '6380cf8e-4327-4d1e-ad21-1826ce4ecf05', + standardId: '20202020-dabc-48e1-8318-2781a2b32aa2', + objectMetadataId: 'f4749ffb-dde8-44ff-8b01-d3fc82df0ba2', + type: FieldMetadataType.RELATION, + name: 'opportunity', + label: 'Opportunity', + defaultValue: null, + description: 'Favorite opportunity', + icon: 'IconTargetArrow', + standardOverrides: null, + options: null, + settings: { + onDelete: RelationOnDeleteAction.CASCADE, + relationType: RelationType.MANY_TO_ONE, + joinColumnName: 'opportunityId', + }, + isCustom: false, + isActive: true, + isSystem: true, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: true, + relationTargetFieldMetadataId: '87bb9924-a1cc-4357-9c8a-52141dabf266', + relationTargetObjectMetadataId: 'e6996bbf-dd41-423a-9324-8546f5b22fa7', + universalIdentifier: '20202020-dabc-48e1-8318-2781a2b32aa2', + }), }), taskTargets: getFlatFieldMetadataMock({ id: 'c0c9f9ac-0d40-4206-90e5-0d1e14f8a09f', @@ -503,34 +507,35 @@ export const OPPORTUNITY_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: '49afc8d8-dde3-4d19-aa6b-bd16a751b114', relationTargetObjectMetadataId: 'bb2b29b8-7f46-4106-a8ae-3a32df9c9166', universalIdentifier: '20202020-59c0-4179-a208-4a255f04a5be', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: '49afc8d8-dde3-4d19-aa6b-bd16a751b114', - standardId: '20202020-6cb2-4c01-a9a5-aca3dbc11d41', - objectMetadataId: 'bb2b29b8-7f46-4106-a8ae-3a32df9c9166', - type: FieldMetadataType.RELATION, - name: 'opportunity', - label: 'Opportunity', - defaultValue: null, - description: 'TaskTarget opportunity', - icon: 'IconTargetArrow', - standardOverrides: null, - options: null, - settings: { - onDelete: RelationOnDeleteAction.CASCADE, - relationType: RelationType.MANY_TO_ONE, - joinColumnName: 'opportunityId', - }, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: true, - relationTargetFieldMetadataId: 'c0c9f9ac-0d40-4206-90e5-0d1e14f8a09f', - relationTargetObjectMetadataId: 'e6996bbf-dd41-423a-9324-8546f5b22fa7', - universalIdentifier: '20202020-6cb2-4c01-a9a5-aca3dbc11d41', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: '49afc8d8-dde3-4d19-aa6b-bd16a751b114', + standardId: '20202020-6cb2-4c01-a9a5-aca3dbc11d41', + objectMetadataId: 'bb2b29b8-7f46-4106-a8ae-3a32df9c9166', + type: FieldMetadataType.RELATION, + name: 'opportunity', + label: 'Opportunity', + defaultValue: null, + description: 'TaskTarget opportunity', + icon: 'IconTargetArrow', + standardOverrides: null, + options: null, + settings: { + onDelete: RelationOnDeleteAction.CASCADE, + relationType: RelationType.MANY_TO_ONE, + joinColumnName: 'opportunityId', + }, + isCustom: false, + isActive: true, + isSystem: true, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: true, + relationTargetFieldMetadataId: 'c0c9f9ac-0d40-4206-90e5-0d1e14f8a09f', + relationTargetObjectMetadataId: 'e6996bbf-dd41-423a-9324-8546f5b22fa7', + universalIdentifier: '20202020-6cb2-4c01-a9a5-aca3dbc11d41', + }), }), noteTargets: getFlatFieldMetadataMock({ id: '36210a54-a72e-4530-a1eb-a0420c53e551', @@ -555,34 +560,35 @@ export const OPPORTUNITY_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: 'f42eac2a-8d99-4259-b69a-549abd553eda', relationTargetObjectMetadataId: '12e3cb51-c3de-4192-b0d5-965d48d001c0', universalIdentifier: '20202020-dd3f-42d5-a382-db58aabf43d3', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: 'f42eac2a-8d99-4259-b69a-549abd553eda', - standardId: '20202020-4e42-417a-a705-76581c9ade79', - objectMetadataId: '12e3cb51-c3de-4192-b0d5-965d48d001c0', - type: FieldMetadataType.RELATION, - name: 'opportunity', - label: 'Opportunity', - defaultValue: null, - description: 'NoteTarget opportunity', - icon: 'IconTargetArrow', - standardOverrides: null, - options: null, - settings: { - onDelete: RelationOnDeleteAction.CASCADE, - relationType: RelationType.MANY_TO_ONE, - joinColumnName: 'opportunityId', - }, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: true, - relationTargetFieldMetadataId: '36210a54-a72e-4530-a1eb-a0420c53e551', - relationTargetObjectMetadataId: 'e6996bbf-dd41-423a-9324-8546f5b22fa7', - universalIdentifier: '20202020-4e42-417a-a705-76581c9ade79', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: 'f42eac2a-8d99-4259-b69a-549abd553eda', + standardId: '20202020-4e42-417a-a705-76581c9ade79', + objectMetadataId: '12e3cb51-c3de-4192-b0d5-965d48d001c0', + type: FieldMetadataType.RELATION, + name: 'opportunity', + label: 'Opportunity', + defaultValue: null, + description: 'NoteTarget opportunity', + icon: 'IconTargetArrow', + standardOverrides: null, + options: null, + settings: { + onDelete: RelationOnDeleteAction.CASCADE, + relationType: RelationType.MANY_TO_ONE, + joinColumnName: 'opportunityId', + }, + isCustom: false, + isActive: true, + isSystem: true, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: true, + relationTargetFieldMetadataId: '36210a54-a72e-4530-a1eb-a0420c53e551', + relationTargetObjectMetadataId: 'e6996bbf-dd41-423a-9324-8546f5b22fa7', + universalIdentifier: '20202020-4e42-417a-a705-76581c9ade79', + }), }), attachments: getFlatFieldMetadataMock({ id: '16515578-a6ce-48af-a303-2005bb8492f0', @@ -607,34 +613,35 @@ export const OPPORTUNITY_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: 'da72fbe2-a5aa-42b5-b6bd-482a3919eb20', relationTargetObjectMetadataId: '819ed5ff-312f-4423-8e95-02a691cf5c27', universalIdentifier: '20202020-87c7-4118-83d6-2f4031005209', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: 'da72fbe2-a5aa-42b5-b6bd-482a3919eb20', - standardId: '20202020-7374-499d-bea3-9354890755b5', - objectMetadataId: '819ed5ff-312f-4423-8e95-02a691cf5c27', - type: FieldMetadataType.RELATION, - name: 'opportunity', - label: 'Opportunity', - defaultValue: null, - description: 'Attachment opportunity', - icon: 'IconBuildingSkyscraper', - standardOverrides: null, - options: null, - settings: { - onDelete: RelationOnDeleteAction.CASCADE, - relationType: RelationType.MANY_TO_ONE, - joinColumnName: 'opportunityId', - }, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: true, - relationTargetFieldMetadataId: '16515578-a6ce-48af-a303-2005bb8492f0', - relationTargetObjectMetadataId: 'e6996bbf-dd41-423a-9324-8546f5b22fa7', - universalIdentifier: '20202020-7374-499d-bea3-9354890755b5', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: 'da72fbe2-a5aa-42b5-b6bd-482a3919eb20', + standardId: '20202020-7374-499d-bea3-9354890755b5', + objectMetadataId: '819ed5ff-312f-4423-8e95-02a691cf5c27', + type: FieldMetadataType.RELATION, + name: 'opportunity', + label: 'Opportunity', + defaultValue: null, + description: 'Attachment opportunity', + icon: 'IconBuildingSkyscraper', + standardOverrides: null, + options: null, + settings: { + onDelete: RelationOnDeleteAction.CASCADE, + relationType: RelationType.MANY_TO_ONE, + joinColumnName: 'opportunityId', + }, + isCustom: false, + isActive: true, + isSystem: true, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: true, + relationTargetFieldMetadataId: '16515578-a6ce-48af-a303-2005bb8492f0', + relationTargetObjectMetadataId: 'e6996bbf-dd41-423a-9324-8546f5b22fa7', + universalIdentifier: '20202020-7374-499d-bea3-9354890755b5', + }), }), timelineActivities: getFlatFieldMetadataMock({ id: '7826944b-3b21-4448-892e-5a2a68161313', @@ -659,33 +666,34 @@ export const OPPORTUNITY_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: '026cbaa7-860c-4ed4-b878-8d78849e6c28', relationTargetObjectMetadataId: '3090f830-c4b1-41a1-8e18-815760830bec', universalIdentifier: '20202020-30e2-421f-96c7-19c69d1cf631', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: '026cbaa7-860c-4ed4-b878-8d78849e6c28', - standardId: '20202020-7664-4a35-a3df-580d389fd527', - objectMetadataId: '3090f830-c4b1-41a1-8e18-815760830bec', - type: FieldMetadataType.RELATION, - name: 'opportunity', - label: 'Opportunity', - defaultValue: null, - description: 'Event opportunity', - icon: 'IconTargetArrow', - standardOverrides: null, - options: null, - settings: { - onDelete: RelationOnDeleteAction.SET_NULL, - relationType: RelationType.MANY_TO_ONE, - joinColumnName: 'opportunityId', - }, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: true, - relationTargetFieldMetadataId: '7826944b-3b21-4448-892e-5a2a68161313', - relationTargetObjectMetadataId: 'e6996bbf-dd41-423a-9324-8546f5b22fa7', - universalIdentifier: '20202020-7664-4a35-a3df-580d389fd527', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: '026cbaa7-860c-4ed4-b878-8d78849e6c28', + standardId: '20202020-7664-4a35-a3df-580d389fd527', + objectMetadataId: '3090f830-c4b1-41a1-8e18-815760830bec', + type: FieldMetadataType.RELATION, + name: 'opportunity', + label: 'Opportunity', + defaultValue: null, + description: 'Event opportunity', + icon: 'IconTargetArrow', + standardOverrides: null, + options: null, + settings: { + onDelete: RelationOnDeleteAction.SET_NULL, + relationType: RelationType.MANY_TO_ONE, + joinColumnName: 'opportunityId', + }, + isCustom: false, + isActive: true, + isSystem: true, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: true, + relationTargetFieldMetadataId: '7826944b-3b21-4448-892e-5a2a68161313', + relationTargetObjectMetadataId: 'e6996bbf-dd41-423a-9324-8546f5b22fa7', + universalIdentifier: '20202020-7664-4a35-a3df-580d389fd527', + }), }), } as const satisfies Record; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__mocks__/person-flat-fields.mock.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__mocks__/person-flat-fields.mock.ts index 36001d722c..335be30679 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__mocks__/person-flat-fields.mock.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__mocks__/person-flat-fields.mock.ts @@ -4,6 +4,7 @@ import { DateDisplayFormat } from 'src/engine/metadata-modules/field-metadata/in import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface'; import { getFlatFieldMetadataMock } from 'src/engine/metadata-modules/flat-field-metadata/__mocks__/get-flat-field-metadata.mock'; +import { getMorphOrRelationTargetFlatFieldMetadataMock } from 'src/engine/metadata-modules/flat-field-metadata/__mocks__/get-morph-or-relation-target-flat-field-metadata-mock'; import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; import { RelationOnDeleteAction } from 'src/engine/metadata-modules/relation-metadata/relation-on-delete-action.type'; @@ -427,30 +428,31 @@ export const PERSON_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: 'b0563539-f027-40c5-a14c-ee7a25ff6fd9', relationTargetObjectMetadataId: '7f5c2c7a-bb23-46fb-b59d-9b7a52a8d1cc', universalIdentifier: '20202020-e2f3-448e-b34c-2d625f0025fd', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: 'b0563539-f027-40c5-a14c-ee7a25ff6fd9', - standardId: '20202020-3213-4ddf-9494-6422bcff8d7c', - objectMetadataId: '7f5c2c7a-bb23-46fb-b59d-9b7a52a8d1cc', - type: FieldMetadataType.RELATION, - name: 'people', - label: 'People', - defaultValue: null, - description: 'People linked to the company.', - icon: 'IconUsers', - standardOverrides: null, - options: null, - settings: { relationType: RelationType.ONE_TO_MANY }, - isCustom: false, - isActive: true, - isSystem: false, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: true, - relationTargetFieldMetadataId: 'ee247ca6-fdaa-4a56-87a2-730cf84f5f29', - relationTargetObjectMetadataId: '843e0b67-9619-4628-91c4-2fa62256a611', - universalIdentifier: '20202020-3213-4ddf-9494-6422bcff8d7c', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: 'b0563539-f027-40c5-a14c-ee7a25ff6fd9', + standardId: '20202020-3213-4ddf-9494-6422bcff8d7c', + objectMetadataId: '7f5c2c7a-bb23-46fb-b59d-9b7a52a8d1cc', + type: FieldMetadataType.RELATION, + name: 'people', + label: 'People', + defaultValue: null, + description: 'People linked to the company.', + icon: 'IconUsers', + standardOverrides: null, + options: null, + settings: { relationType: RelationType.ONE_TO_MANY }, + isCustom: false, + isActive: true, + isSystem: false, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: true, + relationTargetFieldMetadataId: 'ee247ca6-fdaa-4a56-87a2-730cf84f5f29', + relationTargetObjectMetadataId: '843e0b67-9619-4628-91c4-2fa62256a611', + universalIdentifier: '20202020-3213-4ddf-9494-6422bcff8d7c', + }), }), pointOfContactForOpportunities: getFlatFieldMetadataMock({ id: '7580c1b1-e8f9-480b-bd41-38b20df35777', @@ -476,34 +478,35 @@ export const PERSON_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: '0e55bf63-1ffb-4f74-89f2-edd5a6a6686c', relationTargetObjectMetadataId: 'e6996bbf-dd41-423a-9324-8546f5b22fa7', universalIdentifier: '20202020-911b-4a7d-b67b-918aa9a5b33a', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: '0e55bf63-1ffb-4f74-89f2-edd5a6a6686c', - standardId: '20202020-8dfb-42fc-92b6-01afb759ed16', - objectMetadataId: 'e6996bbf-dd41-423a-9324-8546f5b22fa7', - type: FieldMetadataType.RELATION, - name: 'pointOfContact', - label: 'Point of Contact', - defaultValue: null, - description: 'Opportunity point of contact', - icon: 'IconUser', - standardOverrides: null, - options: null, - settings: { - onDelete: RelationOnDeleteAction.SET_NULL, - relationType: RelationType.MANY_TO_ONE, - joinColumnName: 'pointOfContactId', - }, - isCustom: false, - isActive: true, - isSystem: false, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: true, - relationTargetFieldMetadataId: '7580c1b1-e8f9-480b-bd41-38b20df35777', - relationTargetObjectMetadataId: '843e0b67-9619-4628-91c4-2fa62256a611', - universalIdentifier: '20202020-8dfb-42fc-92b6-01afb759ed16', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: '0e55bf63-1ffb-4f74-89f2-edd5a6a6686c', + standardId: '20202020-8dfb-42fc-92b6-01afb759ed16', + objectMetadataId: 'e6996bbf-dd41-423a-9324-8546f5b22fa7', + type: FieldMetadataType.RELATION, + name: 'pointOfContact', + label: 'Point of Contact', + defaultValue: null, + description: 'Opportunity point of contact', + icon: 'IconUser', + standardOverrides: null, + options: null, + settings: { + onDelete: RelationOnDeleteAction.SET_NULL, + relationType: RelationType.MANY_TO_ONE, + joinColumnName: 'pointOfContactId', + }, + isCustom: false, + isActive: true, + isSystem: false, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: true, + relationTargetFieldMetadataId: '7580c1b1-e8f9-480b-bd41-38b20df35777', + relationTargetObjectMetadataId: '843e0b67-9619-4628-91c4-2fa62256a611', + universalIdentifier: '20202020-8dfb-42fc-92b6-01afb759ed16', + }), }), taskTargets: getFlatFieldMetadataMock({ id: '9609ca31-215e-47fd-9b3b-ab200acb2fa8', @@ -528,34 +531,35 @@ export const PERSON_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: '64225f87-96c4-4846-9462-e7aa3ad9e182', relationTargetObjectMetadataId: 'bb2b29b8-7f46-4106-a8ae-3a32df9c9166', universalIdentifier: '20202020-584b-4d3e-88b6-53ab1fa03c3a', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: '64225f87-96c4-4846-9462-e7aa3ad9e182', - standardId: '20202020-c8a0-4e85-a016-87e2349cfbec', - objectMetadataId: 'bb2b29b8-7f46-4106-a8ae-3a32df9c9166', - type: FieldMetadataType.RELATION, - name: 'person', - label: 'Person', - defaultValue: null, - description: 'TaskTarget person', - icon: 'IconUser', - standardOverrides: null, - options: null, - settings: { - onDelete: RelationOnDeleteAction.CASCADE, - relationType: RelationType.MANY_TO_ONE, - joinColumnName: 'personId', - }, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: true, - relationTargetFieldMetadataId: '9609ca31-215e-47fd-9b3b-ab200acb2fa8', - relationTargetObjectMetadataId: '843e0b67-9619-4628-91c4-2fa62256a611', - universalIdentifier: '20202020-c8a0-4e85-a016-87e2349cfbec', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: '64225f87-96c4-4846-9462-e7aa3ad9e182', + standardId: '20202020-c8a0-4e85-a016-87e2349cfbec', + objectMetadataId: 'bb2b29b8-7f46-4106-a8ae-3a32df9c9166', + type: FieldMetadataType.RELATION, + name: 'person', + label: 'Person', + defaultValue: null, + description: 'TaskTarget person', + icon: 'IconUser', + standardOverrides: null, + options: null, + settings: { + onDelete: RelationOnDeleteAction.CASCADE, + relationType: RelationType.MANY_TO_ONE, + joinColumnName: 'personId', + }, + isCustom: false, + isActive: true, + isSystem: true, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: true, + relationTargetFieldMetadataId: '9609ca31-215e-47fd-9b3b-ab200acb2fa8', + relationTargetObjectMetadataId: '843e0b67-9619-4628-91c4-2fa62256a611', + universalIdentifier: '20202020-c8a0-4e85-a016-87e2349cfbec', + }), }), noteTargets: getFlatFieldMetadataMock({ id: '60388ed8-45f6-4fb5-8752-81c73e13f4ab', @@ -580,34 +584,35 @@ export const PERSON_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: '560c71ff-254f-4baf-a4d1-054c53444f41', relationTargetObjectMetadataId: '12e3cb51-c3de-4192-b0d5-965d48d001c0', universalIdentifier: '20202020-c8fc-4258-8250-15905d3fcfec', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: '560c71ff-254f-4baf-a4d1-054c53444f41', - standardId: '20202020-38ca-4aab-92f5-8a605ca2e4c5', - objectMetadataId: '12e3cb51-c3de-4192-b0d5-965d48d001c0', - type: FieldMetadataType.RELATION, - name: 'person', - label: 'Person', - defaultValue: null, - description: 'NoteTarget person', - icon: 'IconUser', - standardOverrides: null, - options: null, - settings: { - onDelete: RelationOnDeleteAction.CASCADE, - relationType: RelationType.MANY_TO_ONE, - joinColumnName: 'personId', - }, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: true, - relationTargetFieldMetadataId: '60388ed8-45f6-4fb5-8752-81c73e13f4ab', - relationTargetObjectMetadataId: '843e0b67-9619-4628-91c4-2fa62256a611', - universalIdentifier: '20202020-38ca-4aab-92f5-8a605ca2e4c5', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: '560c71ff-254f-4baf-a4d1-054c53444f41', + standardId: '20202020-38ca-4aab-92f5-8a605ca2e4c5', + objectMetadataId: '12e3cb51-c3de-4192-b0d5-965d48d001c0', + type: FieldMetadataType.RELATION, + name: 'person', + label: 'Person', + defaultValue: null, + description: 'NoteTarget person', + icon: 'IconUser', + standardOverrides: null, + options: null, + settings: { + onDelete: RelationOnDeleteAction.CASCADE, + relationType: RelationType.MANY_TO_ONE, + joinColumnName: 'personId', + }, + isCustom: false, + isActive: true, + isSystem: true, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: true, + relationTargetFieldMetadataId: '60388ed8-45f6-4fb5-8752-81c73e13f4ab', + relationTargetObjectMetadataId: '843e0b67-9619-4628-91c4-2fa62256a611', + universalIdentifier: '20202020-38ca-4aab-92f5-8a605ca2e4c5', + }), }), favorites: getFlatFieldMetadataMock({ id: 'a1a72bee-1c15-4598-ba23-67ba8e3e505d', @@ -632,34 +637,35 @@ export const PERSON_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: '013cec20-e9cc-42db-b9b9-ff6bd0f52abd', relationTargetObjectMetadataId: 'f4749ffb-dde8-44ff-8b01-d3fc82df0ba2', universalIdentifier: '20202020-4073-4117-9cf1-203bcdc91cbd', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: '013cec20-e9cc-42db-b9b9-ff6bd0f52abd', - standardId: '20202020-c428-4f40-b6f3-86091511c41c', - objectMetadataId: 'f4749ffb-dde8-44ff-8b01-d3fc82df0ba2', - type: FieldMetadataType.RELATION, - name: 'person', - label: 'Person', - defaultValue: null, - description: 'Favorite person', - icon: 'IconUser', - standardOverrides: null, - options: null, - settings: { - onDelete: RelationOnDeleteAction.CASCADE, - relationType: RelationType.MANY_TO_ONE, - joinColumnName: 'personId', - }, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: true, - relationTargetFieldMetadataId: 'a1a72bee-1c15-4598-ba23-67ba8e3e505d', - relationTargetObjectMetadataId: '843e0b67-9619-4628-91c4-2fa62256a611', - universalIdentifier: '20202020-c428-4f40-b6f3-86091511c41c', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: '013cec20-e9cc-42db-b9b9-ff6bd0f52abd', + standardId: '20202020-c428-4f40-b6f3-86091511c41c', + objectMetadataId: 'f4749ffb-dde8-44ff-8b01-d3fc82df0ba2', + type: FieldMetadataType.RELATION, + name: 'person', + label: 'Person', + defaultValue: null, + description: 'Favorite person', + icon: 'IconUser', + standardOverrides: null, + options: null, + settings: { + onDelete: RelationOnDeleteAction.CASCADE, + relationType: RelationType.MANY_TO_ONE, + joinColumnName: 'personId', + }, + isCustom: false, + isActive: true, + isSystem: true, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: true, + relationTargetFieldMetadataId: 'a1a72bee-1c15-4598-ba23-67ba8e3e505d', + relationTargetObjectMetadataId: '843e0b67-9619-4628-91c4-2fa62256a611', + universalIdentifier: '20202020-c428-4f40-b6f3-86091511c41c', + }), }), attachments: getFlatFieldMetadataMock({ id: '367ad117-de09-466c-94f8-ce99d951b5ce', @@ -684,34 +690,35 @@ export const PERSON_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: '6938c2ec-ebcc-4f30-8d38-2c9c40228c53', relationTargetObjectMetadataId: '819ed5ff-312f-4423-8e95-02a691cf5c27', universalIdentifier: '20202020-cd97-451f-87fa-bcb789bdbf3a', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: '6938c2ec-ebcc-4f30-8d38-2c9c40228c53', - standardId: '20202020-0158-4aa2-965c-5cdafe21ffa2', - objectMetadataId: '819ed5ff-312f-4423-8e95-02a691cf5c27', - type: FieldMetadataType.RELATION, - name: 'person', - label: 'Person', - defaultValue: null, - description: 'Attachment person', - icon: 'IconUser', - standardOverrides: null, - options: null, - settings: { - onDelete: RelationOnDeleteAction.CASCADE, - relationType: RelationType.MANY_TO_ONE, - joinColumnName: 'personId', - }, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: true, - relationTargetFieldMetadataId: '367ad117-de09-466c-94f8-ce99d951b5ce', - relationTargetObjectMetadataId: '843e0b67-9619-4628-91c4-2fa62256a611', - universalIdentifier: '20202020-0158-4aa2-965c-5cdafe21ffa2', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: '6938c2ec-ebcc-4f30-8d38-2c9c40228c53', + standardId: '20202020-0158-4aa2-965c-5cdafe21ffa2', + objectMetadataId: '819ed5ff-312f-4423-8e95-02a691cf5c27', + type: FieldMetadataType.RELATION, + name: 'person', + label: 'Person', + defaultValue: null, + description: 'Attachment person', + icon: 'IconUser', + standardOverrides: null, + options: null, + settings: { + onDelete: RelationOnDeleteAction.CASCADE, + relationType: RelationType.MANY_TO_ONE, + joinColumnName: 'personId', + }, + isCustom: false, + isActive: true, + isSystem: true, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: true, + relationTargetFieldMetadataId: '367ad117-de09-466c-94f8-ce99d951b5ce', + relationTargetObjectMetadataId: '843e0b67-9619-4628-91c4-2fa62256a611', + universalIdentifier: '20202020-0158-4aa2-965c-5cdafe21ffa2', + }), }), messageParticipants: getFlatFieldMetadataMock({ id: '22dcab3c-939c-4b8d-bd7c-4c4d58588460', @@ -736,34 +743,35 @@ export const PERSON_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: 'e95d7d1a-9101-4048-b019-d2f8bc110328', relationTargetObjectMetadataId: 'edb170fd-a0c2-4619-b1a9-293cf07437c4', universalIdentifier: '20202020-498e-4c61-8158-fa04f0638334', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: 'e95d7d1a-9101-4048-b019-d2f8bc110328', - standardId: '20202020-249d-4e0f-82cd-1b9df5cd3da2', - objectMetadataId: 'edb170fd-a0c2-4619-b1a9-293cf07437c4', - type: FieldMetadataType.RELATION, - name: 'person', - label: 'Person', - defaultValue: null, - description: 'Person', - icon: 'IconUser', - standardOverrides: null, - options: null, - settings: { - onDelete: RelationOnDeleteAction.SET_NULL, - relationType: RelationType.MANY_TO_ONE, - joinColumnName: 'personId', - }, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: true, - relationTargetFieldMetadataId: '22dcab3c-939c-4b8d-bd7c-4c4d58588460', - relationTargetObjectMetadataId: '843e0b67-9619-4628-91c4-2fa62256a611', - universalIdentifier: '20202020-249d-4e0f-82cd-1b9df5cd3da2', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: 'e95d7d1a-9101-4048-b019-d2f8bc110328', + standardId: '20202020-249d-4e0f-82cd-1b9df5cd3da2', + objectMetadataId: 'edb170fd-a0c2-4619-b1a9-293cf07437c4', + type: FieldMetadataType.RELATION, + name: 'person', + label: 'Person', + defaultValue: null, + description: 'Person', + icon: 'IconUser', + standardOverrides: null, + options: null, + settings: { + onDelete: RelationOnDeleteAction.SET_NULL, + relationType: RelationType.MANY_TO_ONE, + joinColumnName: 'personId', + }, + isCustom: false, + isActive: true, + isSystem: true, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: true, + relationTargetFieldMetadataId: '22dcab3c-939c-4b8d-bd7c-4c4d58588460', + relationTargetObjectMetadataId: '843e0b67-9619-4628-91c4-2fa62256a611', + universalIdentifier: '20202020-249d-4e0f-82cd-1b9df5cd3da2', + }), }), calendarEventParticipants: getFlatFieldMetadataMock({ id: '9e82a873-2988-4d9d-af04-81f2d947f4ec', @@ -788,34 +796,35 @@ export const PERSON_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: 'e39f443d-3282-47a3-a24d-47ed604d58be', relationTargetObjectMetadataId: 'a4c662b6-e08d-40a5-ae55-82ed8f4edf78', universalIdentifier: '20202020-52ee-45e9-a702-b64b3753e3a9', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: 'e39f443d-3282-47a3-a24d-47ed604d58be', - standardId: '20202020-5761-4842-8186-e1898ef93966', - objectMetadataId: 'a4c662b6-e08d-40a5-ae55-82ed8f4edf78', - type: FieldMetadataType.RELATION, - name: 'person', - label: 'Person', - defaultValue: null, - description: 'Person', - icon: 'IconUser', - standardOverrides: null, - options: null, - settings: { - onDelete: RelationOnDeleteAction.SET_NULL, - relationType: RelationType.MANY_TO_ONE, - joinColumnName: 'personId', - }, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: true, - relationTargetFieldMetadataId: '9e82a873-2988-4d9d-af04-81f2d947f4ec', - relationTargetObjectMetadataId: '843e0b67-9619-4628-91c4-2fa62256a611', - universalIdentifier: '20202020-5761-4842-8186-e1898ef93966', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: 'e39f443d-3282-47a3-a24d-47ed604d58be', + standardId: '20202020-5761-4842-8186-e1898ef93966', + objectMetadataId: 'a4c662b6-e08d-40a5-ae55-82ed8f4edf78', + type: FieldMetadataType.RELATION, + name: 'person', + label: 'Person', + defaultValue: null, + description: 'Person', + icon: 'IconUser', + standardOverrides: null, + options: null, + settings: { + onDelete: RelationOnDeleteAction.SET_NULL, + relationType: RelationType.MANY_TO_ONE, + joinColumnName: 'personId', + }, + isCustom: false, + isActive: true, + isSystem: true, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: true, + relationTargetFieldMetadataId: '9e82a873-2988-4d9d-af04-81f2d947f4ec', + relationTargetObjectMetadataId: '843e0b67-9619-4628-91c4-2fa62256a611', + universalIdentifier: '20202020-5761-4842-8186-e1898ef93966', + }), }), timelineActivities: getFlatFieldMetadataMock({ id: 'b1457347-545b-4a42-9c68-bc655952229a', @@ -840,34 +849,35 @@ export const PERSON_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: 'dbd02754-4bef-4149-b39d-54759983ab47', relationTargetObjectMetadataId: '3090f830-c4b1-41a1-8e18-815760830bec', universalIdentifier: '20202020-a43e-4873-9c23-e522de906ce5', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: 'dbd02754-4bef-4149-b39d-54759983ab47', - standardId: '20202020-c414-45b9-a60a-ac27aa96229f', - objectMetadataId: '3090f830-c4b1-41a1-8e18-815760830bec', - type: FieldMetadataType.RELATION, - name: 'person', - label: 'Person', - defaultValue: null, - description: 'Event person', - icon: 'IconUser', - standardOverrides: null, - options: null, - settings: { - onDelete: RelationOnDeleteAction.CASCADE, - relationType: RelationType.MANY_TO_ONE, - joinColumnName: 'personId', - }, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: true, - relationTargetFieldMetadataId: 'b1457347-545b-4a42-9c68-bc655952229a', - relationTargetObjectMetadataId: '843e0b67-9619-4628-91c4-2fa62256a611', - universalIdentifier: '20202020-c414-45b9-a60a-ac27aa96229f', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: 'dbd02754-4bef-4149-b39d-54759983ab47', + standardId: '20202020-c414-45b9-a60a-ac27aa96229f', + objectMetadataId: '3090f830-c4b1-41a1-8e18-815760830bec', + type: FieldMetadataType.RELATION, + name: 'person', + label: 'Person', + defaultValue: null, + description: 'Event person', + icon: 'IconUser', + standardOverrides: null, + options: null, + settings: { + onDelete: RelationOnDeleteAction.CASCADE, + relationType: RelationType.MANY_TO_ONE, + joinColumnName: 'personId', + }, + isCustom: false, + isActive: true, + isSystem: true, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: true, + relationTargetFieldMetadataId: 'b1457347-545b-4a42-9c68-bc655952229a', + relationTargetObjectMetadataId: '843e0b67-9619-4628-91c4-2fa62256a611', + universalIdentifier: '20202020-c414-45b9-a60a-ac27aa96229f', + }), }), intro: getFlatFieldMetadataMock({ id: '94c95bfa-88bc-4271-87c2-08e6df084a15', diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__mocks__/pet-flat-fields.mock.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__mocks__/pet-flat-fields.mock.ts index 27dfd27614..91d3d5fa34 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__mocks__/pet-flat-fields.mock.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__mocks__/pet-flat-fields.mock.ts @@ -3,6 +3,7 @@ import { FieldMetadataType } from 'twenty-shared/types'; import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface'; import { getFlatFieldMetadataMock } from 'src/engine/metadata-modules/flat-field-metadata/__mocks__/get-flat-field-metadata.mock'; +import { getMorphOrRelationTargetFlatFieldMetadataMock } from 'src/engine/metadata-modules/flat-field-metadata/__mocks__/get-morph-or-relation-target-flat-field-metadata-mock'; import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; import { RelationOnDeleteAction } from 'src/engine/metadata-modules/relation-metadata/relation-on-delete-action.type'; @@ -30,34 +31,35 @@ export const PET_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: 'd88d0737-e83a-47b1-b701-8edfe4a2ae2e', relationTargetObjectMetadataId: '12e3cb51-c3de-4192-b0d5-965d48d001c0', universalIdentifier: '20202020-01fd-4f37-99dc-9427a444018a', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: 'd88d0737-e83a-47b1-b701-8edfe4a2ae2e', - standardId: '20202020-c54e-4804-8b0d-8795e5166432', - objectMetadataId: '12e3cb51-c3de-4192-b0d5-965d48d001c0', - type: FieldMetadataType.RELATION, - name: 'pet', - label: 'Pet', - defaultValue: null, - description: 'NoteTargets Pet', - icon: 'IconBuildingSkyscraper', - standardOverrides: null, - options: null, - settings: { - onDelete: RelationOnDeleteAction.CASCADE, - relationType: RelationType.MANY_TO_ONE, - joinColumnName: 'petId', - }, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: false, - relationTargetFieldMetadataId: '98afd46e-0259-4c87-969d-16e7e660e007', - relationTargetObjectMetadataId: 'd34e0f07-1b8c-4de0-938e-599cf05e1f7f', - universalIdentifier: '20202020-c54e-4804-8b0d-8795e5166432', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: 'd88d0737-e83a-47b1-b701-8edfe4a2ae2e', + standardId: '20202020-c54e-4804-8b0d-8795e5166432', + objectMetadataId: '12e3cb51-c3de-4192-b0d5-965d48d001c0', + type: FieldMetadataType.RELATION, + name: 'pet', + label: 'Pet', + defaultValue: null, + description: 'NoteTargets Pet', + icon: 'IconBuildingSkyscraper', + standardOverrides: null, + options: null, + settings: { + onDelete: RelationOnDeleteAction.CASCADE, + relationType: RelationType.MANY_TO_ONE, + joinColumnName: 'petId', + }, + isCustom: false, + isActive: true, + isSystem: true, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: false, + relationTargetFieldMetadataId: '98afd46e-0259-4c87-969d-16e7e660e007', + relationTargetObjectMetadataId: 'd34e0f07-1b8c-4de0-938e-599cf05e1f7f', + universalIdentifier: '20202020-c54e-4804-8b0d-8795e5166432', + }), }), id: getFlatFieldMetadataMock({ id: 'ce25501a-1cc6-44c5-9158-b602db0efaca', @@ -257,34 +259,35 @@ export const PET_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: '3cb86390-4ee7-42fa-bd1e-bd6326b47610', relationTargetObjectMetadataId: '3090f830-c4b1-41a1-8e18-815760830bec', universalIdentifier: '20202020-f1ef-4ba4-8f33-1a4577afa477', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: '3cb86390-4ee7-42fa-bd1e-bd6326b47610', - standardId: '20202020-d88f-4020-8c85-d6c600903762', - objectMetadataId: '3090f830-c4b1-41a1-8e18-815760830bec', - type: FieldMetadataType.RELATION, - name: 'pet', - label: 'Pet', - defaultValue: null, - description: 'TimelineActivities Pet', - icon: 'IconBuildingSkyscraper', - standardOverrides: null, - options: null, - settings: { - onDelete: RelationOnDeleteAction.CASCADE, - relationType: RelationType.MANY_TO_ONE, - joinColumnName: 'petId', - }, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: false, - relationTargetFieldMetadataId: '4eb74f21-1cb4-46b5-b3bb-4e41108e70d9', - relationTargetObjectMetadataId: 'd34e0f07-1b8c-4de0-938e-599cf05e1f7f', - universalIdentifier: '20202020-d88f-4020-8c85-d6c600903762', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: '3cb86390-4ee7-42fa-bd1e-bd6326b47610', + standardId: '20202020-d88f-4020-8c85-d6c600903762', + objectMetadataId: '3090f830-c4b1-41a1-8e18-815760830bec', + type: FieldMetadataType.RELATION, + name: 'pet', + label: 'Pet', + defaultValue: null, + description: 'TimelineActivities Pet', + icon: 'IconBuildingSkyscraper', + standardOverrides: null, + options: null, + settings: { + onDelete: RelationOnDeleteAction.CASCADE, + relationType: RelationType.MANY_TO_ONE, + joinColumnName: 'petId', + }, + isCustom: false, + isActive: true, + isSystem: true, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: false, + relationTargetFieldMetadataId: '4eb74f21-1cb4-46b5-b3bb-4e41108e70d9', + relationTargetObjectMetadataId: 'd34e0f07-1b8c-4de0-938e-599cf05e1f7f', + universalIdentifier: '20202020-d88f-4020-8c85-d6c600903762', + }), }), favorites: getFlatFieldMetadataMock({ id: '80bc4e7a-6bd1-4f2b-98b1-6333c631cc1a', @@ -309,34 +312,35 @@ export const PET_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: 'd34b4048-bf0c-4c61-8ffe-59f1838a2cc4', relationTargetObjectMetadataId: 'f4749ffb-dde8-44ff-8b01-d3fc82df0ba2', universalIdentifier: '20202020-a4a7-4686-b296-1c6c3482ee21', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: 'd34b4048-bf0c-4c61-8ffe-59f1838a2cc4', - standardId: '20202020-1bd7-4d10-80dc-968b9f5d1a8a', - objectMetadataId: 'f4749ffb-dde8-44ff-8b01-d3fc82df0ba2', - type: FieldMetadataType.RELATION, - name: 'pet', - label: 'Pet', - defaultValue: null, - description: 'Favorites Pet', - icon: 'IconBuildingSkyscraper', - standardOverrides: null, - options: null, - settings: { - onDelete: RelationOnDeleteAction.CASCADE, - relationType: RelationType.MANY_TO_ONE, - joinColumnName: 'petId', - }, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: false, - relationTargetFieldMetadataId: '80bc4e7a-6bd1-4f2b-98b1-6333c631cc1a', - relationTargetObjectMetadataId: 'd34e0f07-1b8c-4de0-938e-599cf05e1f7f', - universalIdentifier: '20202020-1bd7-4d10-80dc-968b9f5d1a8a', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: 'd34b4048-bf0c-4c61-8ffe-59f1838a2cc4', + standardId: '20202020-1bd7-4d10-80dc-968b9f5d1a8a', + objectMetadataId: 'f4749ffb-dde8-44ff-8b01-d3fc82df0ba2', + type: FieldMetadataType.RELATION, + name: 'pet', + label: 'Pet', + defaultValue: null, + description: 'Favorites Pet', + icon: 'IconBuildingSkyscraper', + standardOverrides: null, + options: null, + settings: { + onDelete: RelationOnDeleteAction.CASCADE, + relationType: RelationType.MANY_TO_ONE, + joinColumnName: 'petId', + }, + isCustom: false, + isActive: true, + isSystem: true, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: false, + relationTargetFieldMetadataId: '80bc4e7a-6bd1-4f2b-98b1-6333c631cc1a', + relationTargetObjectMetadataId: 'd34e0f07-1b8c-4de0-938e-599cf05e1f7f', + universalIdentifier: '20202020-1bd7-4d10-80dc-968b9f5d1a8a', + }), }), attachments: getFlatFieldMetadataMock({ id: '231903d0-3b14-47ed-9a88-fbf11031c451', @@ -361,34 +365,35 @@ export const PET_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: '317a33ef-117e-4953-86d4-c4a9670a2ce3', relationTargetObjectMetadataId: '819ed5ff-312f-4423-8e95-02a691cf5c27', universalIdentifier: '20202020-8d59-46ca-b7b2-73d167712134', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: '317a33ef-117e-4953-86d4-c4a9670a2ce3', - standardId: '20202020-b715-4658-8b6a-5359824dbddd', - objectMetadataId: '819ed5ff-312f-4423-8e95-02a691cf5c27', - type: FieldMetadataType.RELATION, - name: 'pet', - label: 'Pet', - defaultValue: null, - description: 'Attachments Pet', - icon: 'IconBuildingSkyscraper', - standardOverrides: null, - options: null, - settings: { - onDelete: RelationOnDeleteAction.CASCADE, - relationType: RelationType.MANY_TO_ONE, - joinColumnName: 'petId', - }, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: false, - relationTargetFieldMetadataId: '231903d0-3b14-47ed-9a88-fbf11031c451', - relationTargetObjectMetadataId: 'd34e0f07-1b8c-4de0-938e-599cf05e1f7f', - universalIdentifier: '20202020-b715-4658-8b6a-5359824dbddd', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: '317a33ef-117e-4953-86d4-c4a9670a2ce3', + standardId: '20202020-b715-4658-8b6a-5359824dbddd', + objectMetadataId: '819ed5ff-312f-4423-8e95-02a691cf5c27', + type: FieldMetadataType.RELATION, + name: 'pet', + label: 'Pet', + defaultValue: null, + description: 'Attachments Pet', + icon: 'IconBuildingSkyscraper', + standardOverrides: null, + options: null, + settings: { + onDelete: RelationOnDeleteAction.CASCADE, + relationType: RelationType.MANY_TO_ONE, + joinColumnName: 'petId', + }, + isCustom: false, + isActive: true, + isSystem: true, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: false, + relationTargetFieldMetadataId: '231903d0-3b14-47ed-9a88-fbf11031c451', + relationTargetObjectMetadataId: 'd34e0f07-1b8c-4de0-938e-599cf05e1f7f', + universalIdentifier: '20202020-b715-4658-8b6a-5359824dbddd', + }), }), taskTargets: getFlatFieldMetadataMock({ id: '3cae8259-ece8-4b81-9044-f5abae5ff25c', @@ -413,34 +418,35 @@ export const PET_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: '3955a4b4-1c10-4ce8-a92e-98e727ee7aec', relationTargetObjectMetadataId: 'bb2b29b8-7f46-4106-a8ae-3a32df9c9166', universalIdentifier: '20202020-0860-4566-b865-bff3c626c303', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: '3955a4b4-1c10-4ce8-a92e-98e727ee7aec', - standardId: '20202020-07d9-4d04-8b73-a39ab65943f1', - objectMetadataId: 'bb2b29b8-7f46-4106-a8ae-3a32df9c9166', - type: FieldMetadataType.RELATION, - name: 'pet', - label: 'Pet', - defaultValue: null, - description: 'TaskTargets Pet', - icon: 'IconBuildingSkyscraper', - standardOverrides: null, - options: null, - settings: { - onDelete: RelationOnDeleteAction.CASCADE, - relationType: RelationType.MANY_TO_ONE, - joinColumnName: 'petId', - }, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: false, - relationTargetFieldMetadataId: '3cae8259-ece8-4b81-9044-f5abae5ff25c', - relationTargetObjectMetadataId: 'd34e0f07-1b8c-4de0-938e-599cf05e1f7f', - universalIdentifier: '20202020-07d9-4d04-8b73-a39ab65943f1', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: '3955a4b4-1c10-4ce8-a92e-98e727ee7aec', + standardId: '20202020-07d9-4d04-8b73-a39ab65943f1', + objectMetadataId: 'bb2b29b8-7f46-4106-a8ae-3a32df9c9166', + type: FieldMetadataType.RELATION, + name: 'pet', + label: 'Pet', + defaultValue: null, + description: 'TaskTargets Pet', + icon: 'IconBuildingSkyscraper', + standardOverrides: null, + options: null, + settings: { + onDelete: RelationOnDeleteAction.CASCADE, + relationType: RelationType.MANY_TO_ONE, + joinColumnName: 'petId', + }, + isCustom: false, + isActive: true, + isSystem: true, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: false, + relationTargetFieldMetadataId: '3cae8259-ece8-4b81-9044-f5abae5ff25c', + relationTargetObjectMetadataId: 'd34e0f07-1b8c-4de0-938e-599cf05e1f7f', + universalIdentifier: '20202020-07d9-4d04-8b73-a39ab65943f1', + }), }), searchVector: getFlatFieldMetadataMock({ id: '0db37175-e573-43e4-bd83-fa71923fde0c', diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__mocks__/rocket-flat-fields.mock.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__mocks__/rocket-flat-fields.mock.ts index 9e1977f97f..d8f1aaeaa4 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__mocks__/rocket-flat-fields.mock.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__mocks__/rocket-flat-fields.mock.ts @@ -3,6 +3,7 @@ import { FieldMetadataType } from 'twenty-shared/types'; import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface'; import { getFlatFieldMetadataMock } from 'src/engine/metadata-modules/flat-field-metadata/__mocks__/get-flat-field-metadata.mock'; +import { getMorphOrRelationTargetFlatFieldMetadataMock } from 'src/engine/metadata-modules/flat-field-metadata/__mocks__/get-morph-or-relation-target-flat-field-metadata-mock'; import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; import { RelationOnDeleteAction } from 'src/engine/metadata-modules/relation-metadata/relation-on-delete-action.type'; @@ -205,34 +206,35 @@ export const ROCKET_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: 'eebb9590-817b-4a51-88f7-9792aa8e0a59', relationTargetObjectMetadataId: '3090f830-c4b1-41a1-8e18-815760830bec', universalIdentifier: '20202020-f1ef-4ba4-8f33-1a4577afa477', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: 'eebb9590-817b-4a51-88f7-9792aa8e0a59', - standardId: '20202020-0be6-444e-88f0-12e0c64ac27d', - objectMetadataId: '3090f830-c4b1-41a1-8e18-815760830bec', - type: FieldMetadataType.RELATION, - name: 'rocket', - label: 'Rocket', - defaultValue: null, - description: 'TimelineActivities Rocket', - icon: 'IconBuildingSkyscraper', - standardOverrides: null, - options: null, - settings: { - onDelete: RelationOnDeleteAction.CASCADE, - relationType: RelationType.MANY_TO_ONE, - joinColumnName: 'rocketId', - }, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: false, - relationTargetFieldMetadataId: '53a223cc-a445-420d-8698-1a9137039448', - relationTargetObjectMetadataId: 'd78ec657-74a4-4652-a350-1f44ff62970a', - universalIdentifier: '20202020-0be6-444e-88f0-12e0c64ac27d', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: 'eebb9590-817b-4a51-88f7-9792aa8e0a59', + standardId: '20202020-0be6-444e-88f0-12e0c64ac27d', + objectMetadataId: '3090f830-c4b1-41a1-8e18-815760830bec', + type: FieldMetadataType.RELATION, + name: 'rocket', + label: 'Rocket', + defaultValue: null, + description: 'TimelineActivities Rocket', + icon: 'IconBuildingSkyscraper', + standardOverrides: null, + options: null, + settings: { + onDelete: RelationOnDeleteAction.CASCADE, + relationType: RelationType.MANY_TO_ONE, + joinColumnName: 'rocketId', + }, + isCustom: false, + isActive: true, + isSystem: true, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: false, + relationTargetFieldMetadataId: '53a223cc-a445-420d-8698-1a9137039448', + relationTargetObjectMetadataId: 'd78ec657-74a4-4652-a350-1f44ff62970a', + universalIdentifier: '20202020-0be6-444e-88f0-12e0c64ac27d', + }), }), favorites: getFlatFieldMetadataMock({ id: '14010360-f3c2-442e-b05f-43c30158f246', @@ -257,34 +259,35 @@ export const ROCKET_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: '9448627d-725d-499e-a071-90fd5cfcf0ea', relationTargetObjectMetadataId: 'f4749ffb-dde8-44ff-8b01-d3fc82df0ba2', universalIdentifier: '20202020-a4a7-4686-b296-1c6c3482ee21', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: '9448627d-725d-499e-a071-90fd5cfcf0ea', - standardId: '20202020-78f7-4d7d-86e9-7562ced0b381', - objectMetadataId: 'f4749ffb-dde8-44ff-8b01-d3fc82df0ba2', - type: FieldMetadataType.RELATION, - name: 'rocket', - label: 'Rocket', - defaultValue: null, - description: 'Favorites Rocket', - icon: 'IconBuildingSkyscraper', - standardOverrides: null, - options: null, - settings: { - onDelete: RelationOnDeleteAction.CASCADE, - relationType: RelationType.MANY_TO_ONE, - joinColumnName: 'rocketId', - }, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: false, - relationTargetFieldMetadataId: '14010360-f3c2-442e-b05f-43c30158f246', - relationTargetObjectMetadataId: 'd78ec657-74a4-4652-a350-1f44ff62970a', - universalIdentifier: '20202020-78f7-4d7d-86e9-7562ced0b381', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: '9448627d-725d-499e-a071-90fd5cfcf0ea', + standardId: '20202020-78f7-4d7d-86e9-7562ced0b381', + objectMetadataId: 'f4749ffb-dde8-44ff-8b01-d3fc82df0ba2', + type: FieldMetadataType.RELATION, + name: 'rocket', + label: 'Rocket', + defaultValue: null, + description: 'Favorites Rocket', + icon: 'IconBuildingSkyscraper', + standardOverrides: null, + options: null, + settings: { + onDelete: RelationOnDeleteAction.CASCADE, + relationType: RelationType.MANY_TO_ONE, + joinColumnName: 'rocketId', + }, + isCustom: false, + isActive: true, + isSystem: true, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: false, + relationTargetFieldMetadataId: '14010360-f3c2-442e-b05f-43c30158f246', + relationTargetObjectMetadataId: 'd78ec657-74a4-4652-a350-1f44ff62970a', + universalIdentifier: '20202020-78f7-4d7d-86e9-7562ced0b381', + }), }), attachments: getFlatFieldMetadataMock({ id: 'f5984acf-5128-42ac-840f-9d2888423699', @@ -309,34 +312,35 @@ export const ROCKET_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: 'ba23019c-7f25-42c3-8138-622e61c42968', relationTargetObjectMetadataId: '819ed5ff-312f-4423-8e95-02a691cf5c27', universalIdentifier: '20202020-8d59-46ca-b7b2-73d167712134', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: 'ba23019c-7f25-42c3-8138-622e61c42968', - standardId: '20202020-ca2d-47c0-8253-9d0b662fb01a', - objectMetadataId: '819ed5ff-312f-4423-8e95-02a691cf5c27', - type: FieldMetadataType.RELATION, - name: 'rocket', - label: 'Rocket', - defaultValue: null, - description: 'Attachments Rocket', - icon: 'IconBuildingSkyscraper', - standardOverrides: null, - options: null, - settings: { - onDelete: RelationOnDeleteAction.CASCADE, - relationType: RelationType.MANY_TO_ONE, - joinColumnName: 'rocketId', - }, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: false, - relationTargetFieldMetadataId: 'f5984acf-5128-42ac-840f-9d2888423699', - relationTargetObjectMetadataId: 'd78ec657-74a4-4652-a350-1f44ff62970a', - universalIdentifier: '20202020-ca2d-47c0-8253-9d0b662fb01a', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: 'ba23019c-7f25-42c3-8138-622e61c42968', + standardId: '20202020-ca2d-47c0-8253-9d0b662fb01a', + objectMetadataId: '819ed5ff-312f-4423-8e95-02a691cf5c27', + type: FieldMetadataType.RELATION, + name: 'rocket', + label: 'Rocket', + defaultValue: null, + description: 'Attachments Rocket', + icon: 'IconBuildingSkyscraper', + standardOverrides: null, + options: null, + settings: { + onDelete: RelationOnDeleteAction.CASCADE, + relationType: RelationType.MANY_TO_ONE, + joinColumnName: 'rocketId', + }, + isCustom: false, + isActive: true, + isSystem: true, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: false, + relationTargetFieldMetadataId: 'f5984acf-5128-42ac-840f-9d2888423699', + relationTargetObjectMetadataId: 'd78ec657-74a4-4652-a350-1f44ff62970a', + universalIdentifier: '20202020-ca2d-47c0-8253-9d0b662fb01a', + }), }), noteTargets: getFlatFieldMetadataMock({ id: 'c91376fb-20bd-47c7-8922-b64f7db51cfa', @@ -361,34 +365,35 @@ export const ROCKET_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: '4212b3d7-dd9f-4da9-85f7-2fa69a42296f', relationTargetObjectMetadataId: '12e3cb51-c3de-4192-b0d5-965d48d001c0', universalIdentifier: '20202020-01fd-4f37-99dc-9427a444018a', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: '4212b3d7-dd9f-4da9-85f7-2fa69a42296f', - standardId: '20202020-52b6-4d5e-8f21-ed8b7c09c4a9', - objectMetadataId: '12e3cb51-c3de-4192-b0d5-965d48d001c0', - type: FieldMetadataType.RELATION, - name: 'rocket', - label: 'Rocket', - defaultValue: null, - description: 'NoteTargets Rocket', - icon: 'IconBuildingSkyscraper', - standardOverrides: null, - options: null, - settings: { - onDelete: RelationOnDeleteAction.CASCADE, - relationType: RelationType.MANY_TO_ONE, - joinColumnName: 'rocketId', - }, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: false, - relationTargetFieldMetadataId: 'c91376fb-20bd-47c7-8922-b64f7db51cfa', - relationTargetObjectMetadataId: 'd78ec657-74a4-4652-a350-1f44ff62970a', - universalIdentifier: '20202020-52b6-4d5e-8f21-ed8b7c09c4a9', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: '4212b3d7-dd9f-4da9-85f7-2fa69a42296f', + standardId: '20202020-52b6-4d5e-8f21-ed8b7c09c4a9', + objectMetadataId: '12e3cb51-c3de-4192-b0d5-965d48d001c0', + type: FieldMetadataType.RELATION, + name: 'rocket', + label: 'Rocket', + defaultValue: null, + description: 'NoteTargets Rocket', + icon: 'IconBuildingSkyscraper', + standardOverrides: null, + options: null, + settings: { + onDelete: RelationOnDeleteAction.CASCADE, + relationType: RelationType.MANY_TO_ONE, + joinColumnName: 'rocketId', + }, + isCustom: false, + isActive: true, + isSystem: true, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: false, + relationTargetFieldMetadataId: 'c91376fb-20bd-47c7-8922-b64f7db51cfa', + relationTargetObjectMetadataId: 'd78ec657-74a4-4652-a350-1f44ff62970a', + universalIdentifier: '20202020-52b6-4d5e-8f21-ed8b7c09c4a9', + }), }), taskTargets: getFlatFieldMetadataMock({ id: '80e3b587-69ec-48bc-a872-20105c3b7df4', @@ -413,34 +418,35 @@ export const ROCKET_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: 'a7e80fd8-76bc-45ed-b843-a2b87ef4d601', relationTargetObjectMetadataId: 'bb2b29b8-7f46-4106-a8ae-3a32df9c9166', universalIdentifier: '20202020-0860-4566-b865-bff3c626c303', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: 'a7e80fd8-76bc-45ed-b843-a2b87ef4d601', - standardId: '20202020-b98f-473d-85fb-8cebc40b9a50', - objectMetadataId: 'bb2b29b8-7f46-4106-a8ae-3a32df9c9166', - type: FieldMetadataType.RELATION, - name: 'rocket', - label: 'Rocket', - defaultValue: null, - description: 'TaskTargets Rocket', - icon: 'IconBuildingSkyscraper', - standardOverrides: null, - options: null, - settings: { - onDelete: RelationOnDeleteAction.CASCADE, - relationType: RelationType.MANY_TO_ONE, - joinColumnName: 'rocketId', - }, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: false, - relationTargetFieldMetadataId: '80e3b587-69ec-48bc-a872-20105c3b7df4', - relationTargetObjectMetadataId: 'd78ec657-74a4-4652-a350-1f44ff62970a', - universalIdentifier: '20202020-b98f-473d-85fb-8cebc40b9a50', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: 'a7e80fd8-76bc-45ed-b843-a2b87ef4d601', + standardId: '20202020-b98f-473d-85fb-8cebc40b9a50', + objectMetadataId: 'bb2b29b8-7f46-4106-a8ae-3a32df9c9166', + type: FieldMetadataType.RELATION, + name: 'rocket', + label: 'Rocket', + defaultValue: null, + description: 'TaskTargets Rocket', + icon: 'IconBuildingSkyscraper', + standardOverrides: null, + options: null, + settings: { + onDelete: RelationOnDeleteAction.CASCADE, + relationType: RelationType.MANY_TO_ONE, + joinColumnName: 'rocketId', + }, + isCustom: false, + isActive: true, + isSystem: true, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: false, + relationTargetFieldMetadataId: '80e3b587-69ec-48bc-a872-20105c3b7df4', + relationTargetObjectMetadataId: 'd78ec657-74a4-4652-a350-1f44ff62970a', + universalIdentifier: '20202020-b98f-473d-85fb-8cebc40b9a50', + }), }), searchVector: getFlatFieldMetadataMock({ id: 'e7609ea3-5a88-4d64-b0c1-eefd4602361a', diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__mocks__/task-flat-fields.mock.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__mocks__/task-flat-fields.mock.ts index 0073a86fdf..a2a141a577 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__mocks__/task-flat-fields.mock.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__mocks__/task-flat-fields.mock.ts @@ -4,6 +4,7 @@ import { DateDisplayFormat } from 'src/engine/metadata-modules/field-metadata/in import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface'; import { getFlatFieldMetadataMock } from 'src/engine/metadata-modules/flat-field-metadata/__mocks__/get-flat-field-metadata.mock'; +import { getMorphOrRelationTargetFlatFieldMetadataMock } from 'src/engine/metadata-modules/flat-field-metadata/__mocks__/get-morph-or-relation-target-flat-field-metadata-mock'; import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; import { RelationOnDeleteAction } from 'src/engine/metadata-modules/relation-metadata/relation-on-delete-action.type'; @@ -332,34 +333,35 @@ export const TASK_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: 'c906885c-315a-4783-942e-6caafecf2031', relationTargetObjectMetadataId: 'bb2b29b8-7f46-4106-a8ae-3a32df9c9166', universalIdentifier: '20202020-de9c-4d0e-a452-713d4a3e5fc7', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: 'c906885c-315a-4783-942e-6caafecf2031', - standardId: '20202020-e881-457a-8758-74aaef4ae78a', - objectMetadataId: 'bb2b29b8-7f46-4106-a8ae-3a32df9c9166', - type: FieldMetadataType.RELATION, - name: 'task', - label: 'Task', - defaultValue: null, - description: 'TaskTarget task', - icon: 'IconCheckbox', - standardOverrides: null, - options: null, - settings: { - onDelete: RelationOnDeleteAction.SET_NULL, - relationType: RelationType.MANY_TO_ONE, - joinColumnName: 'taskId', - }, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: true, - relationTargetFieldMetadataId: 'cd08bc00-d02c-48d4-a1ac-a0cfa13742b7', - relationTargetObjectMetadataId: '3186920d-2a15-4b5f-96c7-2bf6567024b0', - universalIdentifier: '20202020-e881-457a-8758-74aaef4ae78a', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: 'c906885c-315a-4783-942e-6caafecf2031', + standardId: '20202020-e881-457a-8758-74aaef4ae78a', + objectMetadataId: 'bb2b29b8-7f46-4106-a8ae-3a32df9c9166', + type: FieldMetadataType.RELATION, + name: 'task', + label: 'Task', + defaultValue: null, + description: 'TaskTarget task', + icon: 'IconCheckbox', + standardOverrides: null, + options: null, + settings: { + onDelete: RelationOnDeleteAction.SET_NULL, + relationType: RelationType.MANY_TO_ONE, + joinColumnName: 'taskId', + }, + isCustom: false, + isActive: true, + isSystem: true, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: true, + relationTargetFieldMetadataId: 'cd08bc00-d02c-48d4-a1ac-a0cfa13742b7', + relationTargetObjectMetadataId: '3186920d-2a15-4b5f-96c7-2bf6567024b0', + universalIdentifier: '20202020-e881-457a-8758-74aaef4ae78a', + }), }), attachments: getFlatFieldMetadataMock({ id: '00fd339a-6431-465d-9524-09b5c804f497', @@ -384,34 +386,35 @@ export const TASK_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: 'bd823f17-f923-4f0d-8533-51d7bc062975', relationTargetObjectMetadataId: '819ed5ff-312f-4423-8e95-02a691cf5c27', universalIdentifier: '20202020-794d-4783-a8ff-cecdb15be139', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: 'bd823f17-f923-4f0d-8533-51d7bc062975', - standardId: '20202020-51e5-4621-9cf8-215487951c4b', - objectMetadataId: '819ed5ff-312f-4423-8e95-02a691cf5c27', - type: FieldMetadataType.RELATION, - name: 'task', - label: 'Task', - defaultValue: null, - description: 'Attachment task', - icon: 'IconNotes', - standardOverrides: null, - options: null, - settings: { - onDelete: RelationOnDeleteAction.SET_NULL, - relationType: RelationType.MANY_TO_ONE, - joinColumnName: 'taskId', - }, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: true, - relationTargetFieldMetadataId: '00fd339a-6431-465d-9524-09b5c804f497', - relationTargetObjectMetadataId: '3186920d-2a15-4b5f-96c7-2bf6567024b0', - universalIdentifier: '20202020-51e5-4621-9cf8-215487951c4b', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: 'bd823f17-f923-4f0d-8533-51d7bc062975', + standardId: '20202020-51e5-4621-9cf8-215487951c4b', + objectMetadataId: '819ed5ff-312f-4423-8e95-02a691cf5c27', + type: FieldMetadataType.RELATION, + name: 'task', + label: 'Task', + defaultValue: null, + description: 'Attachment task', + icon: 'IconNotes', + standardOverrides: null, + options: null, + settings: { + onDelete: RelationOnDeleteAction.SET_NULL, + relationType: RelationType.MANY_TO_ONE, + joinColumnName: 'taskId', + }, + isCustom: false, + isActive: true, + isSystem: true, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: true, + relationTargetFieldMetadataId: '00fd339a-6431-465d-9524-09b5c804f497', + relationTargetObjectMetadataId: '3186920d-2a15-4b5f-96c7-2bf6567024b0', + universalIdentifier: '20202020-51e5-4621-9cf8-215487951c4b', + }), }), assignee: getFlatFieldMetadataMock({ id: '0e18f5e1-32c3-4daa-b282-ab64fb629b20', @@ -440,30 +443,31 @@ export const TASK_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: '68779392-f0ec-42b4-9d89-9645ae84039d', relationTargetObjectMetadataId: '7d8264db-2b55-4b74-81ff-b7064ed43840', universalIdentifier: '20202020-065a-4f42-a906-e20422c1753f', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: '68779392-f0ec-42b4-9d89-9645ae84039d', - standardId: '20202020-61dc-4a1c-99e8-38ebf8d2bbeb', - objectMetadataId: '7d8264db-2b55-4b74-81ff-b7064ed43840', - type: FieldMetadataType.RELATION, - name: 'assignedTasks', - label: 'Assigned tasks', - defaultValue: null, - description: 'Tasks assigned to the workspace member', - icon: 'IconCheckbox', - standardOverrides: null, - options: null, - settings: { relationType: RelationType.ONE_TO_MANY }, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: true, - relationTargetFieldMetadataId: '0e18f5e1-32c3-4daa-b282-ab64fb629b20', - relationTargetObjectMetadataId: '3186920d-2a15-4b5f-96c7-2bf6567024b0', - universalIdentifier: '20202020-61dc-4a1c-99e8-38ebf8d2bbeb', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: '68779392-f0ec-42b4-9d89-9645ae84039d', + standardId: '20202020-61dc-4a1c-99e8-38ebf8d2bbeb', + objectMetadataId: '7d8264db-2b55-4b74-81ff-b7064ed43840', + type: FieldMetadataType.RELATION, + name: 'assignedTasks', + label: 'Assigned tasks', + defaultValue: null, + description: 'Tasks assigned to the workspace member', + icon: 'IconCheckbox', + standardOverrides: null, + options: null, + settings: { relationType: RelationType.ONE_TO_MANY }, + isCustom: false, + isActive: true, + isSystem: true, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: true, + relationTargetFieldMetadataId: '0e18f5e1-32c3-4daa-b282-ab64fb629b20', + relationTargetObjectMetadataId: '3186920d-2a15-4b5f-96c7-2bf6567024b0', + universalIdentifier: '20202020-61dc-4a1c-99e8-38ebf8d2bbeb', + }), }), timelineActivities: getFlatFieldMetadataMock({ id: '3536b3af-76a2-44f5-9d89-1961a0a0a763', @@ -488,34 +492,35 @@ export const TASK_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: '187eaeb8-62c8-4925-815f-946b4768b786', relationTargetObjectMetadataId: '3090f830-c4b1-41a1-8e18-815760830bec', universalIdentifier: '20202020-c778-4278-99ee-23a2837aee64', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: '187eaeb8-62c8-4925-815f-946b4768b786', - standardId: '20202020-b2f5-415c-9135-a31dfe49501b', - objectMetadataId: '3090f830-c4b1-41a1-8e18-815760830bec', - type: FieldMetadataType.RELATION, - name: 'task', - label: 'Task', - defaultValue: null, - description: 'Event task', - icon: 'IconTargetArrow', - standardOverrides: null, - options: null, - settings: { - onDelete: RelationOnDeleteAction.SET_NULL, - relationType: RelationType.MANY_TO_ONE, - joinColumnName: 'taskId', - }, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: true, - relationTargetFieldMetadataId: '3536b3af-76a2-44f5-9d89-1961a0a0a763', - relationTargetObjectMetadataId: '3186920d-2a15-4b5f-96c7-2bf6567024b0', - universalIdentifier: '20202020-b2f5-415c-9135-a31dfe49501b', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: '187eaeb8-62c8-4925-815f-946b4768b786', + standardId: '20202020-b2f5-415c-9135-a31dfe49501b', + objectMetadataId: '3090f830-c4b1-41a1-8e18-815760830bec', + type: FieldMetadataType.RELATION, + name: 'task', + label: 'Task', + defaultValue: null, + description: 'Event task', + icon: 'IconTargetArrow', + standardOverrides: null, + options: null, + settings: { + onDelete: RelationOnDeleteAction.SET_NULL, + relationType: RelationType.MANY_TO_ONE, + joinColumnName: 'taskId', + }, + isCustom: false, + isActive: true, + isSystem: true, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: true, + relationTargetFieldMetadataId: '3536b3af-76a2-44f5-9d89-1961a0a0a763', + relationTargetObjectMetadataId: '3186920d-2a15-4b5f-96c7-2bf6567024b0', + universalIdentifier: '20202020-b2f5-415c-9135-a31dfe49501b', + }), }), favorites: getFlatFieldMetadataMock({ id: '33e4eff0-ff0f-4530-802a-cd630481ee84', @@ -540,33 +545,34 @@ export const TASK_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: 'db16ab78-ea3f-4b67-93e3-6ad9ab1b7273', relationTargetObjectMetadataId: 'f4749ffb-dde8-44ff-8b01-d3fc82df0ba2', universalIdentifier: '20202020-4d1d-41ac-b13b-621631298d65', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: 'db16ab78-ea3f-4b67-93e3-6ad9ab1b7273', - standardId: '20202020-1b1b-4b3b-8b1b-7f8d6a1d7d5c', - objectMetadataId: 'f4749ffb-dde8-44ff-8b01-d3fc82df0ba2', - type: FieldMetadataType.RELATION, - name: 'task', - label: 'Task', - defaultValue: null, - description: 'Favorite task', - icon: 'IconCheckbox', - standardOverrides: null, - options: null, - settings: { - onDelete: RelationOnDeleteAction.CASCADE, - relationType: RelationType.MANY_TO_ONE, - joinColumnName: 'taskId', - }, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: true, - relationTargetFieldMetadataId: '33e4eff0-ff0f-4530-802a-cd630481ee84', - relationTargetObjectMetadataId: '3186920d-2a15-4b5f-96c7-2bf6567024b0', - universalIdentifier: '20202020-1b1b-4b3b-8b1b-7f8d6a1d7d5c', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: 'db16ab78-ea3f-4b67-93e3-6ad9ab1b7273', + standardId: '20202020-1b1b-4b3b-8b1b-7f8d6a1d7d5c', + objectMetadataId: 'f4749ffb-dde8-44ff-8b01-d3fc82df0ba2', + type: FieldMetadataType.RELATION, + name: 'task', + label: 'Task', + defaultValue: null, + description: 'Favorite task', + icon: 'IconCheckbox', + standardOverrides: null, + options: null, + settings: { + onDelete: RelationOnDeleteAction.CASCADE, + relationType: RelationType.MANY_TO_ONE, + joinColumnName: 'taskId', + }, + isCustom: false, + isActive: true, + isSystem: true, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: true, + relationTargetFieldMetadataId: '33e4eff0-ff0f-4530-802a-cd630481ee84', + relationTargetObjectMetadataId: '3186920d-2a15-4b5f-96c7-2bf6567024b0', + universalIdentifier: '20202020-1b1b-4b3b-8b1b-7f8d6a1d7d5c', + }), }), } as const satisfies Record; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__mocks__/tasktarget-flat-fields.mock.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__mocks__/tasktarget-flat-fields.mock.ts index 0d67206070..16ec7ea928 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__mocks__/tasktarget-flat-fields.mock.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__mocks__/tasktarget-flat-fields.mock.ts @@ -4,6 +4,7 @@ import { DateDisplayFormat } from 'src/engine/metadata-modules/field-metadata/in import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface'; import { getFlatFieldMetadataMock } from 'src/engine/metadata-modules/flat-field-metadata/__mocks__/get-flat-field-metadata.mock'; +import { getMorphOrRelationTargetFlatFieldMetadataMock } from 'src/engine/metadata-modules/flat-field-metadata/__mocks__/get-morph-or-relation-target-flat-field-metadata-mock'; import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; import { RelationOnDeleteAction } from 'src/engine/metadata-modules/relation-metadata/relation-on-delete-action.type'; @@ -135,30 +136,31 @@ export const TASKTARGET_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: 'cd08bc00-d02c-48d4-a1ac-a0cfa13742b7', relationTargetObjectMetadataId: '3186920d-2a15-4b5f-96c7-2bf6567024b0', universalIdentifier: '20202020-e881-457a-8758-74aaef4ae78a', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: 'cd08bc00-d02c-48d4-a1ac-a0cfa13742b7', - standardId: '20202020-de9c-4d0e-a452-713d4a3e5fc7', - objectMetadataId: '3186920d-2a15-4b5f-96c7-2bf6567024b0', - type: FieldMetadataType.RELATION, - name: 'taskTargets', - label: 'Relations', - defaultValue: null, - description: 'Task targets', - icon: 'IconArrowUpRight', - standardOverrides: null, - options: null, - settings: { relationType: RelationType.ONE_TO_MANY }, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: false, - relationTargetFieldMetadataId: 'c906885c-315a-4783-942e-6caafecf2031', - relationTargetObjectMetadataId: 'bb2b29b8-7f46-4106-a8ae-3a32df9c9166', - universalIdentifier: '20202020-de9c-4d0e-a452-713d4a3e5fc7', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: 'cd08bc00-d02c-48d4-a1ac-a0cfa13742b7', + standardId: '20202020-de9c-4d0e-a452-713d4a3e5fc7', + objectMetadataId: '3186920d-2a15-4b5f-96c7-2bf6567024b0', + type: FieldMetadataType.RELATION, + name: 'taskTargets', + label: 'Relations', + defaultValue: null, + description: 'Task targets', + icon: 'IconArrowUpRight', + standardOverrides: null, + options: null, + settings: { relationType: RelationType.ONE_TO_MANY }, + isCustom: false, + isActive: true, + isSystem: true, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: false, + relationTargetFieldMetadataId: 'c906885c-315a-4783-942e-6caafecf2031', + relationTargetObjectMetadataId: 'bb2b29b8-7f46-4106-a8ae-3a32df9c9166', + universalIdentifier: '20202020-de9c-4d0e-a452-713d4a3e5fc7', + }), }), person: getFlatFieldMetadataMock({ id: '64225f87-96c4-4846-9462-e7aa3ad9e182', @@ -187,30 +189,31 @@ export const TASKTARGET_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: '9609ca31-215e-47fd-9b3b-ab200acb2fa8', relationTargetObjectMetadataId: '843e0b67-9619-4628-91c4-2fa62256a611', universalIdentifier: '20202020-c8a0-4e85-a016-87e2349cfbec', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: '9609ca31-215e-47fd-9b3b-ab200acb2fa8', - standardId: '20202020-584b-4d3e-88b6-53ab1fa03c3a', - objectMetadataId: '843e0b67-9619-4628-91c4-2fa62256a611', - type: FieldMetadataType.RELATION, - name: 'taskTargets', - label: 'Tasks', - defaultValue: null, - description: 'Tasks tied to the contact', - icon: 'IconCheckbox', - standardOverrides: null, - options: null, - settings: { relationType: RelationType.ONE_TO_MANY }, - isCustom: false, - isActive: true, - isSystem: false, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: false, - relationTargetFieldMetadataId: '64225f87-96c4-4846-9462-e7aa3ad9e182', - relationTargetObjectMetadataId: 'bb2b29b8-7f46-4106-a8ae-3a32df9c9166', - universalIdentifier: '20202020-584b-4d3e-88b6-53ab1fa03c3a', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: '9609ca31-215e-47fd-9b3b-ab200acb2fa8', + standardId: '20202020-584b-4d3e-88b6-53ab1fa03c3a', + objectMetadataId: '843e0b67-9619-4628-91c4-2fa62256a611', + type: FieldMetadataType.RELATION, + name: 'taskTargets', + label: 'Tasks', + defaultValue: null, + description: 'Tasks tied to the contact', + icon: 'IconCheckbox', + standardOverrides: null, + options: null, + settings: { relationType: RelationType.ONE_TO_MANY }, + isCustom: false, + isActive: true, + isSystem: false, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: false, + relationTargetFieldMetadataId: '64225f87-96c4-4846-9462-e7aa3ad9e182', + relationTargetObjectMetadataId: 'bb2b29b8-7f46-4106-a8ae-3a32df9c9166', + universalIdentifier: '20202020-584b-4d3e-88b6-53ab1fa03c3a', + }), }), company: getFlatFieldMetadataMock({ id: 'ec11b025-1476-4e84-81c5-cf5b5c776edc', @@ -239,30 +242,31 @@ export const TASKTARGET_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: '4f9138da-cd36-4df4-98f9-ebabe036b141', relationTargetObjectMetadataId: '7f5c2c7a-bb23-46fb-b59d-9b7a52a8d1cc', universalIdentifier: '20202020-4703-4a4e-948c-487b0c60a92c', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: '4f9138da-cd36-4df4-98f9-ebabe036b141', - standardId: '20202020-cb17-4a61-8f8f-3be6730480de', - objectMetadataId: '7f5c2c7a-bb23-46fb-b59d-9b7a52a8d1cc', - type: FieldMetadataType.RELATION, - name: 'taskTargets', - label: 'Tasks', - defaultValue: null, - description: 'Tasks tied to the company', - icon: 'IconCheckbox', - standardOverrides: null, - options: null, - settings: { relationType: RelationType.ONE_TO_MANY }, - isCustom: false, - isActive: true, - isSystem: false, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: false, - relationTargetFieldMetadataId: 'ec11b025-1476-4e84-81c5-cf5b5c776edc', - relationTargetObjectMetadataId: 'bb2b29b8-7f46-4106-a8ae-3a32df9c9166', - universalIdentifier: '20202020-cb17-4a61-8f8f-3be6730480de', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: '4f9138da-cd36-4df4-98f9-ebabe036b141', + standardId: '20202020-cb17-4a61-8f8f-3be6730480de', + objectMetadataId: '7f5c2c7a-bb23-46fb-b59d-9b7a52a8d1cc', + type: FieldMetadataType.RELATION, + name: 'taskTargets', + label: 'Tasks', + defaultValue: null, + description: 'Tasks tied to the company', + icon: 'IconCheckbox', + standardOverrides: null, + options: null, + settings: { relationType: RelationType.ONE_TO_MANY }, + isCustom: false, + isActive: true, + isSystem: false, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: false, + relationTargetFieldMetadataId: 'ec11b025-1476-4e84-81c5-cf5b5c776edc', + relationTargetObjectMetadataId: 'bb2b29b8-7f46-4106-a8ae-3a32df9c9166', + universalIdentifier: '20202020-cb17-4a61-8f8f-3be6730480de', + }), }), opportunity: getFlatFieldMetadataMock({ id: '49afc8d8-dde3-4d19-aa6b-bd16a751b114', @@ -291,30 +295,31 @@ export const TASKTARGET_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: 'c0c9f9ac-0d40-4206-90e5-0d1e14f8a09f', relationTargetObjectMetadataId: 'e6996bbf-dd41-423a-9324-8546f5b22fa7', universalIdentifier: '20202020-6cb2-4c01-a9a5-aca3dbc11d41', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: 'c0c9f9ac-0d40-4206-90e5-0d1e14f8a09f', - standardId: '20202020-59c0-4179-a208-4a255f04a5be', - objectMetadataId: 'e6996bbf-dd41-423a-9324-8546f5b22fa7', - type: FieldMetadataType.RELATION, - name: 'taskTargets', - label: 'Tasks', - defaultValue: null, - description: 'Tasks tied to the opportunity', - icon: 'IconCheckbox', - standardOverrides: null, - options: null, - settings: { relationType: RelationType.ONE_TO_MANY }, - isCustom: false, - isActive: true, - isSystem: false, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: false, - relationTargetFieldMetadataId: '49afc8d8-dde3-4d19-aa6b-bd16a751b114', - relationTargetObjectMetadataId: 'bb2b29b8-7f46-4106-a8ae-3a32df9c9166', - universalIdentifier: '20202020-59c0-4179-a208-4a255f04a5be', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: 'c0c9f9ac-0d40-4206-90e5-0d1e14f8a09f', + standardId: '20202020-59c0-4179-a208-4a255f04a5be', + objectMetadataId: 'e6996bbf-dd41-423a-9324-8546f5b22fa7', + type: FieldMetadataType.RELATION, + name: 'taskTargets', + label: 'Tasks', + defaultValue: null, + description: 'Tasks tied to the opportunity', + icon: 'IconCheckbox', + standardOverrides: null, + options: null, + settings: { relationType: RelationType.ONE_TO_MANY }, + isCustom: false, + isActive: true, + isSystem: false, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: false, + relationTargetFieldMetadataId: '49afc8d8-dde3-4d19-aa6b-bd16a751b114', + relationTargetObjectMetadataId: 'bb2b29b8-7f46-4106-a8ae-3a32df9c9166', + universalIdentifier: '20202020-59c0-4179-a208-4a255f04a5be', + }), }), rocket: getFlatFieldMetadataMock({ id: 'a7e80fd8-76bc-45ed-b843-a2b87ef4d601', @@ -343,30 +348,31 @@ export const TASKTARGET_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: '80e3b587-69ec-48bc-a872-20105c3b7df4', relationTargetObjectMetadataId: 'd78ec657-74a4-4652-a350-1f44ff62970a', universalIdentifier: '20202020-b98f-473d-85fb-8cebc40b9a50', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: '80e3b587-69ec-48bc-a872-20105c3b7df4', - standardId: '20202020-0860-4566-b865-bff3c626c303', - objectMetadataId: 'd78ec657-74a4-4652-a350-1f44ff62970a', - type: FieldMetadataType.RELATION, - name: 'taskTargets', - label: 'TaskTargets', - defaultValue: null, - description: 'TaskTargets tied to the Rocket', - icon: 'IconCheckbox', - standardOverrides: null, - options: null, - settings: { relationType: RelationType.ONE_TO_MANY }, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: false, - relationTargetFieldMetadataId: 'a7e80fd8-76bc-45ed-b843-a2b87ef4d601', - relationTargetObjectMetadataId: 'bb2b29b8-7f46-4106-a8ae-3a32df9c9166', - universalIdentifier: '20202020-0860-4566-b865-bff3c626c303', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: '80e3b587-69ec-48bc-a872-20105c3b7df4', + standardId: '20202020-0860-4566-b865-bff3c626c303', + objectMetadataId: 'd78ec657-74a4-4652-a350-1f44ff62970a', + type: FieldMetadataType.RELATION, + name: 'taskTargets', + label: 'TaskTargets', + defaultValue: null, + description: 'TaskTargets tied to the Rocket', + icon: 'IconCheckbox', + standardOverrides: null, + options: null, + settings: { relationType: RelationType.ONE_TO_MANY }, + isCustom: false, + isActive: true, + isSystem: true, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: false, + relationTargetFieldMetadataId: 'a7e80fd8-76bc-45ed-b843-a2b87ef4d601', + relationTargetObjectMetadataId: 'bb2b29b8-7f46-4106-a8ae-3a32df9c9166', + universalIdentifier: '20202020-0860-4566-b865-bff3c626c303', + }), }), pet: getFlatFieldMetadataMock({ id: '3955a4b4-1c10-4ce8-a92e-98e727ee7aec', @@ -395,30 +401,31 @@ export const TASKTARGET_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: '3cae8259-ece8-4b81-9044-f5abae5ff25c', relationTargetObjectMetadataId: 'd34e0f07-1b8c-4de0-938e-599cf05e1f7f', universalIdentifier: '20202020-07d9-4d04-8b73-a39ab65943f1', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: '3cae8259-ece8-4b81-9044-f5abae5ff25c', - standardId: '20202020-0860-4566-b865-bff3c626c303', - objectMetadataId: 'd34e0f07-1b8c-4de0-938e-599cf05e1f7f', - type: FieldMetadataType.RELATION, - name: 'taskTargets', - label: 'TaskTargets', - defaultValue: null, - description: 'TaskTargets tied to the Pet', - icon: 'IconCheckbox', - standardOverrides: null, - options: null, - settings: { relationType: RelationType.ONE_TO_MANY }, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: false, - relationTargetFieldMetadataId: '3955a4b4-1c10-4ce8-a92e-98e727ee7aec', - relationTargetObjectMetadataId: 'bb2b29b8-7f46-4106-a8ae-3a32df9c9166', - universalIdentifier: '20202020-0860-4566-b865-bff3c626c303', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: '3cae8259-ece8-4b81-9044-f5abae5ff25c', + standardId: '20202020-0860-4566-b865-bff3c626c303', + objectMetadataId: 'd34e0f07-1b8c-4de0-938e-599cf05e1f7f', + type: FieldMetadataType.RELATION, + name: 'taskTargets', + label: 'TaskTargets', + defaultValue: null, + description: 'TaskTargets tied to the Pet', + icon: 'IconCheckbox', + standardOverrides: null, + options: null, + settings: { relationType: RelationType.ONE_TO_MANY }, + isCustom: false, + isActive: true, + isSystem: true, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: false, + relationTargetFieldMetadataId: '3955a4b4-1c10-4ce8-a92e-98e727ee7aec', + relationTargetObjectMetadataId: 'bb2b29b8-7f46-4106-a8ae-3a32df9c9166', + universalIdentifier: '20202020-0860-4566-b865-bff3c626c303', + }), }), surveyResult: getFlatFieldMetadataMock({ id: 'caa8b6cf-c668-4fb0-abf9-e49645668020', @@ -447,29 +454,30 @@ export const TASKTARGET_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: 'c4004fb2-3464-4302-b3c3-a32a1879fed7', relationTargetObjectMetadataId: '713da753-0340-49b5-b1fa-add34d2dc9a8', universalIdentifier: '20202020-c376-450d-8a49-a573f23eafd8', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: 'c4004fb2-3464-4302-b3c3-a32a1879fed7', - standardId: '20202020-0860-4566-b865-bff3c626c303', - objectMetadataId: '713da753-0340-49b5-b1fa-add34d2dc9a8', - type: FieldMetadataType.RELATION, - name: 'taskTargets', - label: 'TaskTargets', - defaultValue: null, - description: 'TaskTargets tied to the Survey result', - icon: 'IconCheckbox', - standardOverrides: null, - options: null, - settings: { relationType: RelationType.ONE_TO_MANY }, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: false, - relationTargetFieldMetadataId: 'caa8b6cf-c668-4fb0-abf9-e49645668020', - relationTargetObjectMetadataId: 'bb2b29b8-7f46-4106-a8ae-3a32df9c9166', - universalIdentifier: '20202020-0860-4566-b865-bff3c626c303', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: 'c4004fb2-3464-4302-b3c3-a32a1879fed7', + standardId: '20202020-0860-4566-b865-bff3c626c303', + objectMetadataId: '713da753-0340-49b5-b1fa-add34d2dc9a8', + type: FieldMetadataType.RELATION, + name: 'taskTargets', + label: 'TaskTargets', + defaultValue: null, + description: 'TaskTargets tied to the Survey result', + icon: 'IconCheckbox', + standardOverrides: null, + options: null, + settings: { relationType: RelationType.ONE_TO_MANY }, + isCustom: false, + isActive: true, + isSystem: true, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: false, + relationTargetFieldMetadataId: 'caa8b6cf-c668-4fb0-abf9-e49645668020', + relationTargetObjectMetadataId: 'bb2b29b8-7f46-4106-a8ae-3a32df9c9166', + universalIdentifier: '20202020-0860-4566-b865-bff3c626c303', + }), }), } as const satisfies Record; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__mocks__/timelineactivity-flat-fields.mock.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__mocks__/timelineactivity-flat-fields.mock.ts index 922ef9fdd8..007aed7273 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__mocks__/timelineactivity-flat-fields.mock.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__mocks__/timelineactivity-flat-fields.mock.ts @@ -4,6 +4,7 @@ import { DateDisplayFormat } from 'src/engine/metadata-modules/field-metadata/in import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface'; import { getFlatFieldMetadataMock } from 'src/engine/metadata-modules/flat-field-metadata/__mocks__/get-flat-field-metadata.mock'; +import { getMorphOrRelationTargetFlatFieldMetadataMock } from 'src/engine/metadata-modules/flat-field-metadata/__mocks__/get-morph-or-relation-target-flat-field-metadata-mock'; import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; import { RelationOnDeleteAction } from 'src/engine/metadata-modules/relation-metadata/relation-on-delete-action.type'; @@ -285,30 +286,31 @@ export const TIMELINEACTIVITY_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: 'b2172f26-093d-4c9f-86c3-f0bcfaf54ad6', relationTargetObjectMetadataId: '7d8264db-2b55-4b74-81ff-b7064ed43840', universalIdentifier: '20202020-af23-4479-9a30-868edc474b36', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: 'b2172f26-093d-4c9f-86c3-f0bcfaf54ad6', - standardId: '20202020-e15b-47b8-94fe-8200e3c66615', - objectMetadataId: '7d8264db-2b55-4b74-81ff-b7064ed43840', - type: FieldMetadataType.RELATION, - name: 'timelineActivities', - label: 'Events', - defaultValue: null, - description: 'Events linked to the workspace member', - icon: 'IconTimelineEvent', - standardOverrides: null, - options: null, - settings: { relationType: RelationType.ONE_TO_MANY }, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: false, - relationTargetFieldMetadataId: 'c8d9c315-034a-4ffd-a6b3-e6386092d0a8', - relationTargetObjectMetadataId: '3090f830-c4b1-41a1-8e18-815760830bec', - universalIdentifier: '20202020-e15b-47b8-94fe-8200e3c66615', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: 'b2172f26-093d-4c9f-86c3-f0bcfaf54ad6', + standardId: '20202020-e15b-47b8-94fe-8200e3c66615', + objectMetadataId: '7d8264db-2b55-4b74-81ff-b7064ed43840', + type: FieldMetadataType.RELATION, + name: 'timelineActivities', + label: 'Events', + defaultValue: null, + description: 'Events linked to the workspace member', + icon: 'IconTimelineEvent', + standardOverrides: null, + options: null, + settings: { relationType: RelationType.ONE_TO_MANY }, + isCustom: false, + isActive: true, + isSystem: true, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: false, + relationTargetFieldMetadataId: 'c8d9c315-034a-4ffd-a6b3-e6386092d0a8', + relationTargetObjectMetadataId: '3090f830-c4b1-41a1-8e18-815760830bec', + universalIdentifier: '20202020-e15b-47b8-94fe-8200e3c66615', + }), }), person: getFlatFieldMetadataMock({ id: 'dbd02754-4bef-4149-b39d-54759983ab47', @@ -337,30 +339,31 @@ export const TIMELINEACTIVITY_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: 'b1457347-545b-4a42-9c68-bc655952229a', relationTargetObjectMetadataId: '843e0b67-9619-4628-91c4-2fa62256a611', universalIdentifier: '20202020-c414-45b9-a60a-ac27aa96229f', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: 'b1457347-545b-4a42-9c68-bc655952229a', - standardId: '20202020-a43e-4873-9c23-e522de906ce5', - objectMetadataId: '843e0b67-9619-4628-91c4-2fa62256a611', - type: FieldMetadataType.RELATION, - name: 'timelineActivities', - label: 'Events', - defaultValue: null, - description: 'Events linked to the person', - icon: 'IconTimelineEvent', - standardOverrides: null, - options: null, - settings: { relationType: RelationType.ONE_TO_MANY }, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: false, - relationTargetFieldMetadataId: 'dbd02754-4bef-4149-b39d-54759983ab47', - relationTargetObjectMetadataId: '3090f830-c4b1-41a1-8e18-815760830bec', - universalIdentifier: '20202020-a43e-4873-9c23-e522de906ce5', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: 'b1457347-545b-4a42-9c68-bc655952229a', + standardId: '20202020-a43e-4873-9c23-e522de906ce5', + objectMetadataId: '843e0b67-9619-4628-91c4-2fa62256a611', + type: FieldMetadataType.RELATION, + name: 'timelineActivities', + label: 'Events', + defaultValue: null, + description: 'Events linked to the person', + icon: 'IconTimelineEvent', + standardOverrides: null, + options: null, + settings: { relationType: RelationType.ONE_TO_MANY }, + isCustom: false, + isActive: true, + isSystem: true, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: false, + relationTargetFieldMetadataId: 'dbd02754-4bef-4149-b39d-54759983ab47', + relationTargetObjectMetadataId: '3090f830-c4b1-41a1-8e18-815760830bec', + universalIdentifier: '20202020-a43e-4873-9c23-e522de906ce5', + }), }), company: getFlatFieldMetadataMock({ id: 'fd8cabe5-7dc8-4d6a-8053-43434488b3e4', @@ -389,30 +392,31 @@ export const TIMELINEACTIVITY_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: 'cc78390f-f570-4c2c-9f19-2a8fef67f4f6', relationTargetObjectMetadataId: '7f5c2c7a-bb23-46fb-b59d-9b7a52a8d1cc', universalIdentifier: '20202020-04ad-4221-a744-7a8278a5ce21', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: 'cc78390f-f570-4c2c-9f19-2a8fef67f4f6', - standardId: '20202020-0414-4daf-9c0d-64fe7b27f89f', - objectMetadataId: '7f5c2c7a-bb23-46fb-b59d-9b7a52a8d1cc', - type: FieldMetadataType.RELATION, - name: 'timelineActivities', - label: 'Timeline Activities', - defaultValue: null, - description: 'Timeline Activities linked to the company', - icon: 'IconIconTimelineEvent', - standardOverrides: null, - options: null, - settings: { relationType: RelationType.ONE_TO_MANY }, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: true, - relationTargetFieldMetadataId: 'fd8cabe5-7dc8-4d6a-8053-43434488b3e4', - relationTargetObjectMetadataId: '3090f830-c4b1-41a1-8e18-815760830bec', - universalIdentifier: '20202020-0414-4daf-9c0d-64fe7b27f89f', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: 'cc78390f-f570-4c2c-9f19-2a8fef67f4f6', + standardId: '20202020-0414-4daf-9c0d-64fe7b27f89f', + objectMetadataId: '7f5c2c7a-bb23-46fb-b59d-9b7a52a8d1cc', + type: FieldMetadataType.RELATION, + name: 'timelineActivities', + label: 'Timeline Activities', + defaultValue: null, + description: 'Timeline Activities linked to the company', + icon: 'IconIconTimelineEvent', + standardOverrides: null, + options: null, + settings: { relationType: RelationType.ONE_TO_MANY }, + isCustom: false, + isActive: true, + isSystem: true, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: true, + relationTargetFieldMetadataId: 'fd8cabe5-7dc8-4d6a-8053-43434488b3e4', + relationTargetObjectMetadataId: '3090f830-c4b1-41a1-8e18-815760830bec', + universalIdentifier: '20202020-0414-4daf-9c0d-64fe7b27f89f', + }), }), opportunity: getFlatFieldMetadataMock({ id: '026cbaa7-860c-4ed4-b878-8d78849e6c28', @@ -441,30 +445,31 @@ export const TIMELINEACTIVITY_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: '7826944b-3b21-4448-892e-5a2a68161313', relationTargetObjectMetadataId: 'e6996bbf-dd41-423a-9324-8546f5b22fa7', universalIdentifier: '20202020-7664-4a35-a3df-580d389fd527', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: '7826944b-3b21-4448-892e-5a2a68161313', - standardId: '20202020-30e2-421f-96c7-19c69d1cf631', - objectMetadataId: 'e6996bbf-dd41-423a-9324-8546f5b22fa7', - type: FieldMetadataType.RELATION, - name: 'timelineActivities', - label: 'Timeline Activities', - defaultValue: null, - description: 'Timeline Activities linked to the opportunity.', - icon: 'IconTimelineEvent', - standardOverrides: null, - options: null, - settings: { relationType: RelationType.ONE_TO_MANY }, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: true, - relationTargetFieldMetadataId: '026cbaa7-860c-4ed4-b878-8d78849e6c28', - relationTargetObjectMetadataId: '3090f830-c4b1-41a1-8e18-815760830bec', - universalIdentifier: '20202020-30e2-421f-96c7-19c69d1cf631', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: '7826944b-3b21-4448-892e-5a2a68161313', + standardId: '20202020-30e2-421f-96c7-19c69d1cf631', + objectMetadataId: 'e6996bbf-dd41-423a-9324-8546f5b22fa7', + type: FieldMetadataType.RELATION, + name: 'timelineActivities', + label: 'Timeline Activities', + defaultValue: null, + description: 'Timeline Activities linked to the opportunity.', + icon: 'IconTimelineEvent', + standardOverrides: null, + options: null, + settings: { relationType: RelationType.ONE_TO_MANY }, + isCustom: false, + isActive: true, + isSystem: true, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: true, + relationTargetFieldMetadataId: '026cbaa7-860c-4ed4-b878-8d78849e6c28', + relationTargetObjectMetadataId: '3090f830-c4b1-41a1-8e18-815760830bec', + universalIdentifier: '20202020-30e2-421f-96c7-19c69d1cf631', + }), }), note: getFlatFieldMetadataMock({ id: '2b9f1c90-9e35-4ccc-8d84-b42de31ef127', @@ -493,30 +498,31 @@ export const TIMELINEACTIVITY_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: '1207d260-db2c-41d4-bb09-34ea1188978f', relationTargetObjectMetadataId: '1253e3e5-5b00-4a34-93b8-02f3dc6e2b7c', universalIdentifier: '20202020-ec55-4135-8da5-3a20badc0156', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: '1207d260-db2c-41d4-bb09-34ea1188978f', - standardId: '20202020-7030-42f8-929c-1a57b25d6bce', - objectMetadataId: '1253e3e5-5b00-4a34-93b8-02f3dc6e2b7c', - type: FieldMetadataType.RELATION, - name: 'timelineActivities', - label: 'Timeline Activities', - defaultValue: null, - description: 'Timeline Activities linked to the note.', - icon: 'IconTimelineEvent', - standardOverrides: null, - options: null, - settings: { relationType: RelationType.ONE_TO_MANY }, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: true, - relationTargetFieldMetadataId: '2b9f1c90-9e35-4ccc-8d84-b42de31ef127', - relationTargetObjectMetadataId: '3090f830-c4b1-41a1-8e18-815760830bec', - universalIdentifier: '20202020-7030-42f8-929c-1a57b25d6bce', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: '1207d260-db2c-41d4-bb09-34ea1188978f', + standardId: '20202020-7030-42f8-929c-1a57b25d6bce', + objectMetadataId: '1253e3e5-5b00-4a34-93b8-02f3dc6e2b7c', + type: FieldMetadataType.RELATION, + name: 'timelineActivities', + label: 'Timeline Activities', + defaultValue: null, + description: 'Timeline Activities linked to the note.', + icon: 'IconTimelineEvent', + standardOverrides: null, + options: null, + settings: { relationType: RelationType.ONE_TO_MANY }, + isCustom: false, + isActive: true, + isSystem: true, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: true, + relationTargetFieldMetadataId: '2b9f1c90-9e35-4ccc-8d84-b42de31ef127', + relationTargetObjectMetadataId: '3090f830-c4b1-41a1-8e18-815760830bec', + universalIdentifier: '20202020-7030-42f8-929c-1a57b25d6bce', + }), }), task: getFlatFieldMetadataMock({ id: '187eaeb8-62c8-4925-815f-946b4768b786', @@ -545,30 +551,31 @@ export const TIMELINEACTIVITY_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: '3536b3af-76a2-44f5-9d89-1961a0a0a763', relationTargetObjectMetadataId: '3186920d-2a15-4b5f-96c7-2bf6567024b0', universalIdentifier: '20202020-b2f5-415c-9135-a31dfe49501b', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: '3536b3af-76a2-44f5-9d89-1961a0a0a763', - standardId: '20202020-c778-4278-99ee-23a2837aee64', - objectMetadataId: '3186920d-2a15-4b5f-96c7-2bf6567024b0', - type: FieldMetadataType.RELATION, - name: 'timelineActivities', - label: 'Timeline Activities', - defaultValue: null, - description: 'Timeline Activities linked to the task.', - icon: 'IconTimelineEvent', - standardOverrides: null, - options: null, - settings: { relationType: RelationType.ONE_TO_MANY }, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: true, - relationTargetFieldMetadataId: '187eaeb8-62c8-4925-815f-946b4768b786', - relationTargetObjectMetadataId: '3090f830-c4b1-41a1-8e18-815760830bec', - universalIdentifier: '20202020-c778-4278-99ee-23a2837aee64', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: '3536b3af-76a2-44f5-9d89-1961a0a0a763', + standardId: '20202020-c778-4278-99ee-23a2837aee64', + objectMetadataId: '3186920d-2a15-4b5f-96c7-2bf6567024b0', + type: FieldMetadataType.RELATION, + name: 'timelineActivities', + label: 'Timeline Activities', + defaultValue: null, + description: 'Timeline Activities linked to the task.', + icon: 'IconTimelineEvent', + standardOverrides: null, + options: null, + settings: { relationType: RelationType.ONE_TO_MANY }, + isCustom: false, + isActive: true, + isSystem: true, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: true, + relationTargetFieldMetadataId: '187eaeb8-62c8-4925-815f-946b4768b786', + relationTargetObjectMetadataId: '3090f830-c4b1-41a1-8e18-815760830bec', + universalIdentifier: '20202020-c778-4278-99ee-23a2837aee64', + }), }), workflow: getFlatFieldMetadataMock({ id: '9973da2e-cc65-41b2-8f52-4130cfa31fc6', @@ -597,30 +604,31 @@ export const TIMELINEACTIVITY_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: '384db7b5-3551-4774-9258-7082b26b502a', relationTargetObjectMetadataId: '664c19a5-0693-45d4-a4e5-76c3717db83c', universalIdentifier: '20202020-616c-4ad3-a2e9-c477c341e295', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: '384db7b5-3551-4774-9258-7082b26b502a', - standardId: '20202020-906e-486a-a798-131a5f081faf', - objectMetadataId: '664c19a5-0693-45d4-a4e5-76c3717db83c', - type: FieldMetadataType.RELATION, - name: 'timelineActivities', - label: 'Timeline Activities', - defaultValue: null, - description: 'Timeline activities linked to the workflow', - icon: null, - standardOverrides: null, - options: null, - settings: { relationType: RelationType.ONE_TO_MANY }, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: true, - relationTargetFieldMetadataId: '9973da2e-cc65-41b2-8f52-4130cfa31fc6', - relationTargetObjectMetadataId: '3090f830-c4b1-41a1-8e18-815760830bec', - universalIdentifier: '20202020-906e-486a-a798-131a5f081faf', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: '384db7b5-3551-4774-9258-7082b26b502a', + standardId: '20202020-906e-486a-a798-131a5f081faf', + objectMetadataId: '664c19a5-0693-45d4-a4e5-76c3717db83c', + type: FieldMetadataType.RELATION, + name: 'timelineActivities', + label: 'Timeline Activities', + defaultValue: null, + description: 'Timeline activities linked to the workflow', + icon: null, + standardOverrides: null, + options: null, + settings: { relationType: RelationType.ONE_TO_MANY }, + isCustom: false, + isActive: true, + isSystem: true, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: true, + relationTargetFieldMetadataId: '9973da2e-cc65-41b2-8f52-4130cfa31fc6', + relationTargetObjectMetadataId: '3090f830-c4b1-41a1-8e18-815760830bec', + universalIdentifier: '20202020-906e-486a-a798-131a5f081faf', + }), }), workflowVersion: getFlatFieldMetadataMock({ id: '7e5b7033-8c4f-4bdc-9156-6954c268fbb8', @@ -649,30 +657,31 @@ export const TIMELINEACTIVITY_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: '767ab66d-f3d7-4bac-b0be-f738f8c6fda7', relationTargetObjectMetadataId: '99cf5f27-b41d-4f25-a23b-9e47d27dae9b', universalIdentifier: '20202020-74f1-4711-a129-e14ca0ecd744', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: '767ab66d-f3d7-4bac-b0be-f738f8c6fda7', - standardId: '20202020-fcb0-4695-b17e-3b43a421c633', - objectMetadataId: '99cf5f27-b41d-4f25-a23b-9e47d27dae9b', - type: FieldMetadataType.RELATION, - name: 'timelineActivities', - label: 'Timeline Activities', - defaultValue: null, - description: 'Timeline activities linked to the version', - icon: null, - standardOverrides: null, - options: null, - settings: { relationType: RelationType.ONE_TO_MANY }, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: true, - relationTargetFieldMetadataId: '7e5b7033-8c4f-4bdc-9156-6954c268fbb8', - relationTargetObjectMetadataId: '3090f830-c4b1-41a1-8e18-815760830bec', - universalIdentifier: '20202020-fcb0-4695-b17e-3b43a421c633', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: '767ab66d-f3d7-4bac-b0be-f738f8c6fda7', + standardId: '20202020-fcb0-4695-b17e-3b43a421c633', + objectMetadataId: '99cf5f27-b41d-4f25-a23b-9e47d27dae9b', + type: FieldMetadataType.RELATION, + name: 'timelineActivities', + label: 'Timeline Activities', + defaultValue: null, + description: 'Timeline activities linked to the version', + icon: null, + standardOverrides: null, + options: null, + settings: { relationType: RelationType.ONE_TO_MANY }, + isCustom: false, + isActive: true, + isSystem: true, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: true, + relationTargetFieldMetadataId: '7e5b7033-8c4f-4bdc-9156-6954c268fbb8', + relationTargetObjectMetadataId: '3090f830-c4b1-41a1-8e18-815760830bec', + universalIdentifier: '20202020-fcb0-4695-b17e-3b43a421c633', + }), }), workflowRun: getFlatFieldMetadataMock({ id: '1cd2b19c-f5c5-40b4-ad41-cc7aa3e955b2', @@ -701,30 +710,31 @@ export const TIMELINEACTIVITY_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: 'c17fe20f-fcd1-4b21-ac5c-c595473a3af8', relationTargetObjectMetadataId: '06d95e96-b050-443f-946e-dd276d291a2f', universalIdentifier: '20202020-96f0-401b-9186-a3a0759225ac', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: 'c17fe20f-fcd1-4b21-ac5c-c595473a3af8', - standardId: '20202020-af4d-4eb0-babc-eb960a45b356', - objectMetadataId: '06d95e96-b050-443f-946e-dd276d291a2f', - type: FieldMetadataType.RELATION, - name: 'timelineActivities', - label: 'Timeline Activities', - defaultValue: null, - description: 'Timeline activities linked to the run', - icon: null, - standardOverrides: null, - options: null, - settings: { relationType: RelationType.ONE_TO_MANY }, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: true, - relationTargetFieldMetadataId: '1cd2b19c-f5c5-40b4-ad41-cc7aa3e955b2', - relationTargetObjectMetadataId: '3090f830-c4b1-41a1-8e18-815760830bec', - universalIdentifier: '20202020-af4d-4eb0-babc-eb960a45b356', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: 'c17fe20f-fcd1-4b21-ac5c-c595473a3af8', + standardId: '20202020-af4d-4eb0-babc-eb960a45b356', + objectMetadataId: '06d95e96-b050-443f-946e-dd276d291a2f', + type: FieldMetadataType.RELATION, + name: 'timelineActivities', + label: 'Timeline Activities', + defaultValue: null, + description: 'Timeline activities linked to the run', + icon: null, + standardOverrides: null, + options: null, + settings: { relationType: RelationType.ONE_TO_MANY }, + isCustom: false, + isActive: true, + isSystem: true, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: true, + relationTargetFieldMetadataId: '1cd2b19c-f5c5-40b4-ad41-cc7aa3e955b2', + relationTargetObjectMetadataId: '3090f830-c4b1-41a1-8e18-815760830bec', + universalIdentifier: '20202020-af4d-4eb0-babc-eb960a45b356', + }), }), rocket: getFlatFieldMetadataMock({ id: 'eebb9590-817b-4a51-88f7-9792aa8e0a59', @@ -753,30 +763,31 @@ export const TIMELINEACTIVITY_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: '53a223cc-a445-420d-8698-1a9137039448', relationTargetObjectMetadataId: 'd78ec657-74a4-4652-a350-1f44ff62970a', universalIdentifier: '20202020-0be6-444e-88f0-12e0c64ac27d', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: '53a223cc-a445-420d-8698-1a9137039448', - standardId: '20202020-f1ef-4ba4-8f33-1a4577afa477', - objectMetadataId: 'd78ec657-74a4-4652-a350-1f44ff62970a', - type: FieldMetadataType.RELATION, - name: 'timelineActivities', - label: 'TimelineActivities', - defaultValue: null, - description: 'TimelineActivities tied to the Rocket', - icon: 'IconTimelineEvent', - standardOverrides: null, - options: null, - settings: { relationType: RelationType.ONE_TO_MANY }, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: false, - relationTargetFieldMetadataId: 'eebb9590-817b-4a51-88f7-9792aa8e0a59', - relationTargetObjectMetadataId: '3090f830-c4b1-41a1-8e18-815760830bec', - universalIdentifier: '20202020-f1ef-4ba4-8f33-1a4577afa477', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: '53a223cc-a445-420d-8698-1a9137039448', + standardId: '20202020-f1ef-4ba4-8f33-1a4577afa477', + objectMetadataId: 'd78ec657-74a4-4652-a350-1f44ff62970a', + type: FieldMetadataType.RELATION, + name: 'timelineActivities', + label: 'TimelineActivities', + defaultValue: null, + description: 'TimelineActivities tied to the Rocket', + icon: 'IconTimelineEvent', + standardOverrides: null, + options: null, + settings: { relationType: RelationType.ONE_TO_MANY }, + isCustom: false, + isActive: true, + isSystem: true, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: false, + relationTargetFieldMetadataId: 'eebb9590-817b-4a51-88f7-9792aa8e0a59', + relationTargetObjectMetadataId: '3090f830-c4b1-41a1-8e18-815760830bec', + universalIdentifier: '20202020-f1ef-4ba4-8f33-1a4577afa477', + }), }), pet: getFlatFieldMetadataMock({ id: '3cb86390-4ee7-42fa-bd1e-bd6326b47610', @@ -805,30 +816,31 @@ export const TIMELINEACTIVITY_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: '4eb74f21-1cb4-46b5-b3bb-4e41108e70d9', relationTargetObjectMetadataId: 'd34e0f07-1b8c-4de0-938e-599cf05e1f7f', universalIdentifier: '20202020-d88f-4020-8c85-d6c600903762', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: '4eb74f21-1cb4-46b5-b3bb-4e41108e70d9', - standardId: '20202020-f1ef-4ba4-8f33-1a4577afa477', - objectMetadataId: 'd34e0f07-1b8c-4de0-938e-599cf05e1f7f', - type: FieldMetadataType.RELATION, - name: 'timelineActivities', - label: 'TimelineActivities', - defaultValue: null, - description: 'TimelineActivities tied to the Pet', - icon: 'IconTimelineEvent', - standardOverrides: null, - options: null, - settings: { relationType: RelationType.ONE_TO_MANY }, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: false, - relationTargetFieldMetadataId: '3cb86390-4ee7-42fa-bd1e-bd6326b47610', - relationTargetObjectMetadataId: '3090f830-c4b1-41a1-8e18-815760830bec', - universalIdentifier: '20202020-f1ef-4ba4-8f33-1a4577afa477', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: '4eb74f21-1cb4-46b5-b3bb-4e41108e70d9', + standardId: '20202020-f1ef-4ba4-8f33-1a4577afa477', + objectMetadataId: 'd34e0f07-1b8c-4de0-938e-599cf05e1f7f', + type: FieldMetadataType.RELATION, + name: 'timelineActivities', + label: 'TimelineActivities', + defaultValue: null, + description: 'TimelineActivities tied to the Pet', + icon: 'IconTimelineEvent', + standardOverrides: null, + options: null, + settings: { relationType: RelationType.ONE_TO_MANY }, + isCustom: false, + isActive: true, + isSystem: true, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: false, + relationTargetFieldMetadataId: '3cb86390-4ee7-42fa-bd1e-bd6326b47610', + relationTargetObjectMetadataId: '3090f830-c4b1-41a1-8e18-815760830bec', + universalIdentifier: '20202020-f1ef-4ba4-8f33-1a4577afa477', + }), }), surveyResult: getFlatFieldMetadataMock({ id: '06010d88-dc3c-4172-92c9-8c73924f950d', @@ -857,29 +869,30 @@ export const TIMELINEACTIVITY_FLAT_FIELDS_MOCK = { relationTargetFieldMetadataId: 'd544ccb4-b0df-43bb-b70c-57ae477838c4', relationTargetObjectMetadataId: '713da753-0340-49b5-b1fa-add34d2dc9a8', universalIdentifier: '20202020-d13a-4342-8df0-df48bd783787', - flatRelationTargetFieldMetadata: getFlatFieldMetadataMock({ - id: 'd544ccb4-b0df-43bb-b70c-57ae477838c4', - standardId: '20202020-f1ef-4ba4-8f33-1a4577afa477', - objectMetadataId: '713da753-0340-49b5-b1fa-add34d2dc9a8', - type: FieldMetadataType.RELATION, - name: 'timelineActivities', - label: 'TimelineActivities', - defaultValue: null, - description: 'TimelineActivities tied to the Survey result', - icon: 'IconTimelineEvent', - standardOverrides: null, - options: null, - settings: { relationType: RelationType.ONE_TO_MANY }, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - isUnique: false, - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', - isLabelSyncedWithName: false, - relationTargetFieldMetadataId: '06010d88-dc3c-4172-92c9-8c73924f950d', - relationTargetObjectMetadataId: '3090f830-c4b1-41a1-8e18-815760830bec', - universalIdentifier: '20202020-f1ef-4ba4-8f33-1a4577afa477', - }), + flatRelationTargetFieldMetadata: + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: 'd544ccb4-b0df-43bb-b70c-57ae477838c4', + standardId: '20202020-f1ef-4ba4-8f33-1a4577afa477', + objectMetadataId: '713da753-0340-49b5-b1fa-add34d2dc9a8', + type: FieldMetadataType.RELATION, + name: 'timelineActivities', + label: 'TimelineActivities', + defaultValue: null, + description: 'TimelineActivities tied to the Survey result', + icon: 'IconTimelineEvent', + standardOverrides: null, + options: null, + settings: { relationType: RelationType.ONE_TO_MANY }, + isCustom: false, + isActive: true, + isSystem: true, + isNullable: true, + isUnique: false, + workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + isLabelSyncedWithName: false, + relationTargetFieldMetadataId: '06010d88-dc3c-4172-92c9-8c73924f950d', + relationTargetObjectMetadataId: '3090f830-c4b1-41a1-8e18-815760830bec', + universalIdentifier: '20202020-f1ef-4ba4-8f33-1a4577afa477', + }), }), } as const satisfies Record; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/services/flat-field-metadata-validator.service.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/services/flat-field-metadata-validator.service.ts index 83db46c1fa..51c5fbcb96 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/services/flat-field-metadata-validator.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/services/flat-field-metadata-validator.service.ts @@ -12,7 +12,6 @@ import { FlatFieldMetadataRelationPropertiesToCompare } from 'src/engine/metadat import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; import { compareTwoFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/compare-two-flat-field-metadata.util'; import { isFlatFieldMetadataNameSyncedWithLabel } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-name-synced-with-label.util'; -import { isFlatFieldMetadataEntityOfType } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-of-type.util'; import { isMorphOrRelationFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-morph-or-relation-flat-field-metadata.util'; import { validateFlatFieldMetadataNameAvailability } from 'src/engine/metadata-modules/flat-field-metadata/validators/utils/validate-flat-field-metadata-name-availability.util'; import { validateFlatFieldMetadataName } from 'src/engine/metadata-modules/flat-field-metadata/validators/utils/validate-flat-field-metadata-name.util'; @@ -96,16 +95,7 @@ export class FlatFieldMetadataValidatorService { toFlatFieldMetadata: updatedFlatFieldMetadata, }); - if ( - isFlatFieldMetadataEntityOfType( - updatedFlatFieldMetadata, - FieldMetadataType.RELATION, - ) || - isFlatFieldMetadataEntityOfType( - updatedFlatFieldMetadata, - FieldMetadataType.MORPH_RELATION, - ) - ) { + if (isMorphOrRelationFlatFieldMetadata(updatedFlatFieldMetadata)) { const relationNonEditableUpdatedProperties = updates.flatMap( ({ property }) => !FLAT_FIELD_METADATA_RELATION_PROPERTIES_TO_COMPARE.includes( diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type.ts index 42792e1bfb..147f1faea7 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type.ts @@ -2,6 +2,7 @@ import { type FieldMetadataType } from 'twenty-shared/types'; import { type FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity'; import { type AssignTypeIfIsRelationFieldMetadataType } from 'src/engine/metadata-modules/field-metadata/types/assign-type-if-is-relation-field-metadata-type.type'; +import { type MorphOrRelationFieldMetadataType } from 'src/engine/metadata-modules/field-metadata/types/morph-or-relation-field-metadata-type.type'; import { type FlatObjectMetadataWithoutFields } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type'; export const fieldMetadataRelationProperties = [ @@ -20,7 +21,7 @@ export type FlatFieldMetadata = universalIdentifier: string; flatRelationTargetFieldMetadata: AssignTypeIfIsRelationFieldMetadataType< Omit< - FlatFieldMetadata, + FlatFieldMetadata, 'flatRelationTargetFieldMetadata' | 'flatRelationTargetObjectMetadata' >, T diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/compute-flat-field-metadata-related-flat-field-metadata.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/compute-flat-field-metadata-related-flat-field-metadata.util.ts index 9a68d841a4..c3dca49f10 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/compute-flat-field-metadata-related-flat-field-metadata.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/compute-flat-field-metadata-related-flat-field-metadata.util.ts @@ -3,7 +3,7 @@ import { FieldMetadataType } from 'twenty-shared/types'; import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; import { findFlatFieldMetadatasRelatedToMorphRelationOrThrow } from 'src/engine/metadata-modules/flat-field-metadata/utils/find-flat-field-metadatas-related-to-morph-relation-or-throw.util'; import { findRelationFlatFieldMetadataTargetFlatFieldMetadataOrThrow } from 'src/engine/metadata-modules/flat-field-metadata/utils/find-relation-flat-field-metadatas-target-flat-field-metadata-or-throw.util'; -import { isFlatFieldMetadataEntityOfType } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-of-type.util'; +import { isFlatFieldMetadataOfType } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-of-type.util'; import { type FlatObjectMetadataMaps } from 'src/engine/metadata-modules/flat-object-metadata-maps/types/flat-object-metadata-maps.type'; export const computeFlatFieldMetadataRelatedFlatFieldMetadata = ({ @@ -14,10 +14,7 @@ export const computeFlatFieldMetadataRelatedFlatFieldMetadata = ({ flatObjectMetadataMaps: FlatObjectMetadataMaps; }): FlatFieldMetadata[] => { if ( - isFlatFieldMetadataEntityOfType( - flatFieldMetadata, - FieldMetadataType.RELATION, - ) + isFlatFieldMetadataOfType(flatFieldMetadata, FieldMetadataType.RELATION) ) { return [ findRelationFlatFieldMetadataTargetFlatFieldMetadataOrThrow({ @@ -28,7 +25,7 @@ export const computeFlatFieldMetadataRelatedFlatFieldMetadata = ({ } if ( - isFlatFieldMetadataEntityOfType( + isFlatFieldMetadataOfType( flatFieldMetadata, FieldMetadataType.MORPH_RELATION, ) diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/find-flat-field-metadatas-related-to-morph-relation-or-throw.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/find-flat-field-metadatas-related-to-morph-relation-or-throw.util.ts index 7c05880752..83d00782b5 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/find-flat-field-metadatas-related-to-morph-relation-or-throw.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/find-flat-field-metadatas-related-to-morph-relation-or-throw.util.ts @@ -4,7 +4,7 @@ import { isDefined } from 'twenty-shared/utils'; import { type MorphOrRelationFieldMetadataType } from 'src/engine/metadata-modules/field-metadata/types/morph-or-relation-field-metadata-type.type'; import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; import { findRelationFlatFieldMetadataTargetFlatFieldMetadataOrThrow } from 'src/engine/metadata-modules/flat-field-metadata/utils/find-relation-flat-field-metadatas-target-flat-field-metadata-or-throw.util'; -import { isFlatFieldMetadataEntityOfType } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-of-type.util'; +import { isFlatFieldMetadataOfType } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-of-type.util'; import { FlatObjectMetadataMapsException, FlatObjectMetadataMapsExceptionCode, @@ -47,7 +47,7 @@ export const findFlatFieldMetadatasRelatedToMorphRelationOrThrow = ({ return flatObjectMetadataWithFlatFieldMaps.flatFieldMetadatas.flatMap( (flatFieldMetadata) => { if ( - !isFlatFieldMetadataEntityOfType( + !isFlatFieldMetadataOfType( flatFieldMetadata, FieldMetadataType.MORPH_RELATION, ) || diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/find-relation-flat-field-metadatas-target-flat-field-metadata-or-throw.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/find-relation-flat-field-metadatas-target-flat-field-metadata-or-throw.util.ts index 24f1a1b715..930155cde6 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/find-relation-flat-field-metadatas-target-flat-field-metadata-or-throw.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/find-relation-flat-field-metadatas-target-flat-field-metadata-or-throw.util.ts @@ -1,4 +1,3 @@ -import { FieldMetadataType } from 'twenty-shared/types'; import { isDefined } from 'twenty-shared/utils'; import { @@ -7,7 +6,7 @@ import { } from 'src/engine/metadata-modules/field-metadata/field-metadata.exception'; import { type MorphOrRelationFieldMetadataType } from 'src/engine/metadata-modules/field-metadata/types/morph-or-relation-field-metadata-type.type'; import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; -import { isFlatFieldMetadataEntityOfType } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-of-type.util'; +import { isMorphOrRelationFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-morph-or-relation-flat-field-metadata.util'; import { type FlatObjectMetadataMaps } from 'src/engine/metadata-modules/flat-object-metadata-maps/types/flat-object-metadata-maps.type'; export type GetRelationFlatFieldMetadatasUtilArgs = { @@ -18,7 +17,7 @@ export type GetRelationFlatFieldMetadatasUtilArgs = { export const findRelationFlatFieldMetadataTargetFlatFieldMetadataOrThrow = ({ flatObjectMetadataMaps, flatFieldMetadata, -}: GetRelationFlatFieldMetadatasUtilArgs): FlatFieldMetadata => { +}: GetRelationFlatFieldMetadatasUtilArgs): FlatFieldMetadata => { const { relationTargetFieldMetadataId, relationTargetObjectMetadataId } = flatFieldMetadata; @@ -41,14 +40,9 @@ export const findRelationFlatFieldMetadataTargetFlatFieldMetadataOrThrow = ({ ); } - if ( - !isFlatFieldMetadataEntityOfType( - relatedFlatFieldMetadata, - FieldMetadataType.RELATION, - ) - ) { + if (!isMorphOrRelationFlatFieldMetadata(relatedFlatFieldMetadata)) { throw new FieldMetadataException( - `Relation target field metadata is not a relation field metadata`, + `Relation target field metadata is not a relation or morph relation field metadata`, FieldMetadataExceptionCode.FIELD_METADATA_RELATION_MALFORMED, ); } diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/from-morph-relation-create-field-input-to-flat-field-metadatas.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/from-morph-relation-create-field-input-to-flat-field-metadatas.util.ts index 78ff48c967..3067875448 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/from-morph-relation-create-field-input-to-flat-field-metadatas.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/from-morph-relation-create-field-input-to-flat-field-metadatas.util.ts @@ -55,6 +55,7 @@ export const fromMorphRelationCreateFieldInputToFlatFieldMetadatas = async ({ await validateMorphRelationCreationPayload({ existingFlatObjectMetadataMaps, morphRelationCreationPayload: rawMorphCreationPayload, + objectMetadataId: sourceFlatObjectMetadata.id, }); if (morphRelationCreationPayloadValidation.status === 'fail') { diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/is-composite-flat-field-metadata.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/is-composite-flat-field-metadata.util.ts index 0e81f8a14c..e2cfe0357b 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/is-composite-flat-field-metadata.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/is-composite-flat-field-metadata.util.ts @@ -3,9 +3,9 @@ import { type CompositeFieldMetadataType, } from 'src/engine/metadata-modules/field-metadata/types/composite-field-metadata-type.type'; import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; -import { isFlatFieldMetadataEntityOfTypes } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-of-types.util'; +import { isFlatFieldMetadataOfTypes } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-of-types.util'; export const isCompositeFlatFieldMetadata = ( flatFieldMetadata: FlatFieldMetadata, ): flatFieldMetadata is FlatFieldMetadata => - isFlatFieldMetadataEntityOfTypes(flatFieldMetadata, COMPOSITE_FIELD_TYPES); + isFlatFieldMetadataOfTypes(flatFieldMetadata, COMPOSITE_FIELD_TYPES); diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/is-enum-flat-field-metadata.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/is-enum-flat-field-metadata.util.ts index f7f488f45e..36e321d295 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/is-enum-flat-field-metadata.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/is-enum-flat-field-metadata.util.ts @@ -3,9 +3,9 @@ import { type EnumFieldMetadataType, } from 'src/engine/metadata-modules/field-metadata/types/enum-field-metadata-type.type'; import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; -import { isFlatFieldMetadataEntityOfTypes } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-of-types.util'; +import { isFlatFieldMetadataOfTypes } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-of-types.util'; export const isEnumFlatFieldMetadata = ( flatFieldMetadata: FlatFieldMetadata, ): flatFieldMetadata is FlatFieldMetadata => - isFlatFieldMetadataEntityOfTypes(flatFieldMetadata, ENUM_FIELD_TYPES); + isFlatFieldMetadataOfTypes(flatFieldMetadata, ENUM_FIELD_TYPES); diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-jsonb-property.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-jsonb-property.util.ts index 6f3e637cfe..55bffa0763 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-jsonb-property.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-jsonb-property.util.ts @@ -2,7 +2,7 @@ import { FieldMetadataType } from 'twenty-shared/types'; import { FLAT_FIELD_METADATA_JSONB_PROPERTIES } from 'src/engine/metadata-modules/flat-field-metadata/constants/flat-field-metadata-jsonb-properties.constant'; import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; -import { isFlatFieldMetadataEntityOfTypes } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-of-types.util'; +import { isFlatFieldMetadataOfTypes } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-of-types.util'; export const isFlatFieldMetadataJsonbProperty = ({ flatFieldMetadata, @@ -12,7 +12,7 @@ export const isFlatFieldMetadataJsonbProperty = ({ property: keyof FlatFieldMetadata; }): boolean => { if (property === 'defaultValue') { - return isFlatFieldMetadataEntityOfTypes(flatFieldMetadata, [ + return isFlatFieldMetadataOfTypes(flatFieldMetadata, [ FieldMetadataType.LINKS, FieldMetadataType.PHONES, FieldMetadataType.EMAILS, diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-of-type.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-of-type.util.ts index 4c9fa82586..3214f3deb7 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-of-type.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-of-type.util.ts @@ -2,7 +2,7 @@ import { type FieldMetadataType } from 'twenty-shared/types'; import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; -export function isFlatFieldMetadataEntityOfType< +export function isFlatFieldMetadataOfType< Field extends FlatFieldMetadata, Type extends FieldMetadataType, >( diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-of-types.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-of-types.util.ts index e49d32e600..681896c458 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-of-types.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-of-types.util.ts @@ -2,7 +2,7 @@ import { type FieldMetadataType } from 'twenty-shared/types'; import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; -export function isFlatFieldMetadataEntityOfTypes< +export function isFlatFieldMetadataOfTypes< Field extends FlatFieldMetadata, Types extends FieldMetadataType[], >( diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/is-morph-or-relation-flat-field-metadata.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/is-morph-or-relation-flat-field-metadata.util.ts index e39047c14c..34cbab308b 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/is-morph-or-relation-flat-field-metadata.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/is-morph-or-relation-flat-field-metadata.util.ts @@ -3,11 +3,11 @@ import { type MorphOrRelationFieldMetadataType, } from 'src/engine/metadata-modules/field-metadata/types/morph-or-relation-field-metadata-type.type'; import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; -import { isFlatFieldMetadataEntityOfTypes } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-of-types.util'; +import { isFlatFieldMetadataOfTypes } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-of-types.util'; export const isMorphOrRelationFlatFieldMetadata = ( flatFieldMetadata: FlatFieldMetadata, ): flatFieldMetadata is FlatFieldMetadata => - isFlatFieldMetadataEntityOfTypes(flatFieldMetadata, [ + isFlatFieldMetadataOfTypes(flatFieldMetadata, [ ...MORPH_OR_RELATION_FIELD_TYPES, ]); diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/validators/utils/validate-flat-field-metadata-name-availability.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/validators/utils/validate-flat-field-metadata-name-availability.util.ts index 24585a7ed2..95be2f2bf0 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/validators/utils/validate-flat-field-metadata-name-availability.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/validators/utils/validate-flat-field-metadata-name-availability.util.ts @@ -1,4 +1,5 @@ import { t } from '@lingui/core/macro'; +import { FieldMetadataType } from 'twenty-shared/types'; import { isDefined } from 'twenty-shared/utils'; import { compositeTypeDefinitions } from 'src/engine/metadata-modules/field-metadata/composite-types'; @@ -7,9 +8,9 @@ import { computeCompositeColumnName } from 'src/engine/metadata-modules/field-me import { isCompositeFieldMetadataType } from 'src/engine/metadata-modules/field-metadata/utils/is-composite-field-metadata-type.util'; import { type FlatFieldMetadataValidationError } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata-validation-error.type'; import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; +import { isFlatFieldMetadataOfType } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-of-type.util'; import { isMorphOrRelationFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-morph-or-relation-flat-field-metadata.util'; import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type'; -import { isMorphOrRelationFieldMetadataType } from 'src/engine/utils/is-morph-or-relation-field-metadata-type.util'; const getReservedCompositeFieldNames = ( flatObjectMetadata: FlatObjectMetadata, @@ -45,17 +46,23 @@ export const validateFlatFieldMetadataNameAvailability = ({ const errors: FlatFieldMetadataValidationError[] = []; const reservedCompositeFieldsNames = getReservedCompositeFieldNames(flatObjectMetadata); - const flatFieldMetadataName = flatFieldMetadata.name; if ( - !isMorphOrRelationFlatFieldMetadata(flatFieldMetadata) && - flatObjectMetadata.flatFieldMetadatas.some( - (field) => - field.name === flatFieldMetadataName || - (isMorphOrRelationFieldMetadataType(field.type) && - `${field.name}Id` === flatFieldMetadataName), - ) + !isFlatFieldMetadataOfType( + flatFieldMetadata, + FieldMetadataType.MORPH_RELATION, + ) && + flatObjectMetadata.flatFieldMetadatas.some((existingFlatFieldMetadata) => { + const firstDegreeCollision = + existingFlatFieldMetadata.name === flatFieldMetadataName; + const relationJoinColumnCollision = + isMorphOrRelationFlatFieldMetadata(existingFlatFieldMetadata) && + existingFlatFieldMetadata.flatRelationTargetFieldMetadata.settings + .joinColumnName === flatFieldMetadataName; + + return firstDegreeCollision || relationJoinColumnCollision; + }) ) { errors.push({ code: FieldMetadataExceptionCode.NOT_AVAILABLE, diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/validators/utils/validate-morph-relation-creation-payload.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/validators/utils/validate-morph-relation-creation-payload.util.ts index 2d5d077ca2..42a5ae72ed 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/validators/utils/validate-morph-relation-creation-payload.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/validators/utils/validate-morph-relation-creation-payload.util.ts @@ -20,10 +20,12 @@ type RelationCreationPayloadAndObjectMetadata = { type ValidateMorphRelationCreationPayloadUtilArgs = { morphRelationCreationPayload: RelationCreationPayload[]; existingFlatObjectMetadataMaps: FlatObjectMetadataMaps; + objectMetadataId: string; }; export const validateMorphRelationCreationPayload = async ({ existingFlatObjectMetadataMaps, morphRelationCreationPayload, + objectMetadataId, }: ValidateMorphRelationCreationPayloadUtilArgs): Promise< FieldInputTranspilationResult > => { @@ -65,6 +67,18 @@ export const validateMorphRelationCreationPayload = async ({ ...new Set(allRelatedObjectMetadataIds), ]; + if (allRelatedObjectMetadataIdsSet.includes(objectMetadataId)) { + return { + status: 'fail', + error: { + code: FieldMetadataExceptionCode.FIELD_METADATA_RELATION_MALFORMED, + message: + 'Morph relation creation payloads must not target source object metadata', + userFriendlyMessage: t`Morph relation creation payloads must only contain relation to other object metadata`, + }, + }; + } + if ( allRelatedObjectMetadataIds.length !== allRelatedObjectMetadataIdsSet.length ) { diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/__tests__/utils/expect-flat-field-metadata-to-be-in-flat-object-metadata-maps.util.test.ts b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/__tests__/utils/expect-flat-field-metadata-to-be-in-flat-object-metadata-maps.util.test.ts index 89ac046c0e..6dab9f58d1 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/__tests__/utils/expect-flat-field-metadata-to-be-in-flat-object-metadata-maps.util.test.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/__tests__/utils/expect-flat-field-metadata-to-be-in-flat-object-metadata-maps.util.test.ts @@ -3,7 +3,7 @@ import { FieldMetadataType } from 'twenty-shared/types'; import { isDefined } from 'twenty-shared/utils'; import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; -import { isFlatFieldMetadataEntityOfType } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-of-type.util'; +import { isFlatFieldMetadataOfType } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-of-type.util'; import { type FlatObjectMetadataMaps } from 'src/engine/metadata-modules/flat-object-metadata-maps/types/flat-object-metadata-maps.type'; type ExpectFlatFieldMetadataToBeInFlatObjectMetadataMapsArgs = { @@ -21,10 +21,7 @@ export const expectFlatFieldMetadataToBeInFlatObjectMetadataMaps = ({ jestExpectToBeDefined(matchingFlatObjectMetadata); if ( - isFlatFieldMetadataEntityOfType( - flatFieldMetadata, - FieldMetadataType.RELATION, - ) && + isFlatFieldMetadataOfType(flatFieldMetadata, FieldMetadataType.RELATION) && isDefined(flatFieldMetadata.settings.joinColumnName) ) { expect( diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/add-flat-field-metadata-to-flat-object-metadata-with-flat-field-maps-or-throw.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/add-flat-field-metadata-to-flat-object-metadata-with-flat-field-maps-or-throw.util.ts index 189cfe4290..183d9165bc 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/add-flat-field-metadata-to-flat-object-metadata-with-flat-field-maps-or-throw.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/add-flat-field-metadata-to-flat-object-metadata-with-flat-field-maps-or-throw.util.ts @@ -1,8 +1,7 @@ -import { FieldMetadataType } from 'twenty-shared/types'; import { isDefined } from 'twenty-shared/utils'; import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; -import { isFlatFieldMetadataEntityOfType } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-of-type.util'; +import { isMorphOrRelationFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-morph-or-relation-flat-field-metadata.util'; import { FlatObjectMetadataMapsException, FlatObjectMetadataMapsExceptionCode, @@ -36,17 +35,8 @@ export const addFlatFieldMetadataToFlatObjectMetadataWithFlatFieldMapsOrThrow = | FlatFieldMetadataMaps['fieldIdByJoinColumnName'] | undefined = undefined; - if ( - isFlatFieldMetadataEntityOfType( - flatFieldMetadata, - FieldMetadataType.RELATION, - ) || - isFlatFieldMetadataEntityOfType( - flatFieldMetadata, - FieldMetadataType.MORPH_RELATION, - ) - ) { - if (isDefined(flatFieldMetadata.settings?.joinColumnName)) { + if (isMorphOrRelationFlatFieldMetadata(flatFieldMetadata)) { + if (isDefined(flatFieldMetadata.settings.joinColumnName)) { updatedFieldIdByJoinColumnName = { [flatFieldMetadata.settings.joinColumnName]: flatFieldMetadata.id, }; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/from-cached-field-metadata-entity-to-flat-field-metadata.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/from-cached-field-metadata-entity-to-flat-field-metadata.util.ts index 8a89554ec4..5b2bfa45dd 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/from-cached-field-metadata-entity-to-flat-field-metadata.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/from-cached-field-metadata-entity-to-flat-field-metadata.util.ts @@ -1,6 +1,7 @@ import { FieldMetadataType } from 'twenty-shared/types'; import { isDefined } from 'twenty-shared/utils'; +import { type MorphOrRelationFieldMetadataType } from 'src/engine/metadata-modules/field-metadata/types/morph-or-relation-field-metadata-type.type'; import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; import { type FlatRelationTargetFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-relation-target-field-metadata.type'; import { fromObjectMetadataItemWithFieldMapsToFlatObjectMetadataWithoutFields } from 'src/engine/metadata-modules/flat-object-metadata/utils/from-object-metadata-item-with-field-maps-to-flat-object-metadata-without-fields.util'; @@ -12,10 +13,8 @@ import { } from 'src/engine/metadata-modules/workspace-metadata-cache/exceptions/workspace-metadata-cache.exception'; import { isCachedFieldMetadataEntityOfType } from 'src/engine/utils/is-cached-field-metadata-of-type.util'; -const fromCachedRelationFieldMetadataEntityToFlatRelationTargetFieldMetadata = < - T extends FieldMetadataType.RELATION | FieldMetadataType.MORPH_RELATION, ->( - cachedFieldMetadataEntity: CachedFieldMetadataEntity, +const fromCachedRelationFieldMetadataEntityToFlatRelationTargetFieldMetadata = ( + cachedFieldMetadataEntity: CachedFieldMetadataEntity, ): FlatRelationTargetFieldMetadata => { return { ...cachedFieldMetadataEntity, diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/from-delete-object-input-to-flat-field-metadatas-to-delete.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/from-delete-object-input-to-flat-field-metadatas-to-delete.util.ts index 336f6c1d2a..52b4e9b07c 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/from-delete-object-input-to-flat-field-metadatas-to-delete.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/from-delete-object-input-to-flat-field-metadatas-to-delete.util.ts @@ -4,7 +4,8 @@ import { } from 'twenty-shared/utils'; import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; -import { computeFlatFieldMetadataRelatedFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/compute-flat-field-metadata-related-flat-field-metadata.util'; +import { findRelationFlatFieldMetadataTargetFlatFieldMetadataOrThrow } from 'src/engine/metadata-modules/flat-field-metadata/utils/find-relation-flat-field-metadatas-target-flat-field-metadata-or-throw.util'; +import { isMorphOrRelationFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-morph-or-relation-flat-field-metadata.util'; import { type FlatObjectMetadataMaps } from 'src/engine/metadata-modules/flat-object-metadata-maps/types/flat-object-metadata-maps.type'; import { findFlatObjectMetadataInFlatObjectMetadataMaps } from 'src/engine/metadata-modules/flat-object-metadata-maps/utils/find-flat-object-metadata-in-flat-object-metadata-maps.util'; import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type'; @@ -46,13 +47,17 @@ export const fromDeleteObjectInputToFlatFieldMetadatasToDelete = ({ const flatFieldMetadatasToDelete = flatObjectMetadataToDelete.flatFieldMetadatas.flatMap( (flatFieldMetadata) => { - const relatedFlatFieldMetadata = - computeFlatFieldMetadataRelatedFlatFieldMetadata({ - flatFieldMetadata, - flatObjectMetadataMaps: existingFlatObjectMetadataMaps, - }); + if (isMorphOrRelationFlatFieldMetadata(flatFieldMetadata)) { + const relationTargetFlatFieldMetadata = + findRelationFlatFieldMetadataTargetFlatFieldMetadataOrThrow({ + flatFieldMetadata, + flatObjectMetadataMaps: existingFlatObjectMetadataMaps, + }); - return [flatFieldMetadata, ...relatedFlatFieldMetadata]; + return [flatFieldMetadata, relationTargetFlatFieldMetadata]; + } + + return [flatFieldMetadata]; }, ); diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/get-flat-object-metadata-many-to-one-target-morph-relation-flat-field-metadatas-or-throw.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/get-flat-object-metadata-many-to-one-target-morph-relation-flat-field-metadatas-or-throw.util.ts index de725e99e8..01876338c0 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/get-flat-object-metadata-many-to-one-target-morph-relation-flat-field-metadatas-or-throw.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/get-flat-object-metadata-many-to-one-target-morph-relation-flat-field-metadatas-or-throw.util.ts @@ -3,7 +3,7 @@ import { FieldMetadataType } from 'twenty-shared/types'; import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface'; import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; -import { isFlatFieldMetadataEntityOfType } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-of-type.util'; +import { isFlatFieldMetadataOfType } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-of-type.util'; import { type FlatObjectMetadataMaps } from 'src/engine/metadata-modules/flat-object-metadata-maps/types/flat-object-metadata-maps.type'; import { findFlatFieldMetadataInFlatObjectMetadataMapsOrThrow } from 'src/engine/metadata-modules/flat-object-metadata-maps/utils/find-flat-field-metadata-in-flat-object-metadata-maps-or-throw.util'; import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type'; @@ -23,13 +23,13 @@ export const getFlatObjectMetadataManyToOneTargetMorphRelationFlatFieldMetadatas ( flatFieldMetadata, ): flatFieldMetadata is FlatFieldMetadata => - isFlatFieldMetadataEntityOfType( + isFlatFieldMetadataOfType( flatFieldMetadata, FieldMetadataType.RELATION, ) && flatFieldMetadata.settings.relationType === RelationType.MANY_TO_ONE && - isFlatFieldMetadataEntityOfType( + isFlatFieldMetadataOfType( flatFieldMetadata.flatRelationTargetFieldMetadata, FieldMetadataType.MORPH_RELATION, ), diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/__tests__/__snapshots__/workspace-migration-builder.spec.ts.snap b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/__tests__/__snapshots__/workspace-migration-builder.spec.ts.snap index 008c5f66ae..d3f6bf6147 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/__tests__/__snapshots__/workspace-migration-builder.spec.ts.snap +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/__tests__/__snapshots__/workspace-migration-builder.spec.ts.snap @@ -75,7 +75,11 @@ exports[`Workspace migration builder field actions test suite It should build an "options": null, "relationTargetFieldMetadataId": Any, "relationTargetObjectMetadataId": Any, - "settings": null, + "settings": { + "joinColumnName": "sourceWhatever", + "onDelete": undefined, + "relationType": "ONE_TO_MANY", + }, "standardId": null, "standardOverrides": null, "type": "RELATION", @@ -126,7 +130,11 @@ exports[`Workspace migration builder field actions test suite It should build an "options": null, "relationTargetFieldMetadataId": Any, "relationTargetObjectMetadataId": Any, - "settings": null, + "settings": { + "joinColumnName": "whatever", + "onDelete": undefined, + "relationType": "MANY_TO_ONE", + }, "standardId": null, "standardOverrides": null, "type": "RELATION", @@ -145,33 +153,6 @@ exports[`Workspace migration builder field actions test suite It should build an "createdAt": Any, "defaultValue": null, "description": "default flat field metadata description", - "flatRelationTargetFieldMetadata": { - "createdAt": Any, - "defaultValue": null, - "description": "default flat field metadata description", - "icon": "icon", - "id": Any, - "isActive": true, - "isCustom": true, - "isLabelSyncedWithName": false, - "isNullable": true, - "isSystem": false, - "isUIReadOnly": false, - "isUnique": false, - "label": "flat field metadata label", - "name": "flatFieldMetadataName", - "objectMetadataId": Any, - "options": null, - "relationTargetFieldMetadataId": Any, - "relationTargetObjectMetadataId": Any, - "settings": null, - "standardId": null, - "standardOverrides": null, - "type": "RELATION", - "universalIdentifier": Any, - "updatedAt": Any, - "workspaceId": Any, - }, "flatRelationTargetObjectMetadata": { "createdAt": Any, "description": "A rocket", @@ -215,7 +196,11 @@ exports[`Workspace migration builder field actions test suite It should build an "options": null, "relationTargetFieldMetadataId": Any, "relationTargetObjectMetadataId": Any, - "settings": null, + "settings": { + "joinColumnName": "whatever", + "onDelete": undefined, + "relationType": "MANY_TO_ONE", + }, "standardId": null, "standardOverrides": null, "type": "RELATION", @@ -266,7 +251,11 @@ exports[`Workspace migration builder field actions test suite It should build an "options": null, "relationTargetFieldMetadataId": Any, "relationTargetObjectMetadataId": Any, - "settings": null, + "settings": { + "joinColumnName": "sourceWhatever", + "onDelete": undefined, + "relationType": "ONE_TO_MANY", + }, "standardId": null, "standardOverrides": null, "type": "RELATION", @@ -647,8 +636,6 @@ exports[`Workspace migration builder object actions test suite It should build a "createdAt": Any, "defaultValue": null, "description": "TimelineActivities Rocket", - "flatRelationTargetFieldMetadata": null, - "flatRelationTargetObjectMetadata": null, "icon": "IconBuildingSkyscraper", "id": Any, "isActive": true, @@ -713,8 +700,6 @@ exports[`Workspace migration builder object actions test suite It should build a "createdAt": Any, "defaultValue": null, "description": "Favorites Rocket", - "flatRelationTargetFieldMetadata": null, - "flatRelationTargetObjectMetadata": null, "icon": "IconBuildingSkyscraper", "id": Any, "isActive": true, @@ -779,8 +764,6 @@ exports[`Workspace migration builder object actions test suite It should build a "createdAt": Any, "defaultValue": null, "description": "Attachments Rocket", - "flatRelationTargetFieldMetadata": null, - "flatRelationTargetObjectMetadata": null, "icon": "IconBuildingSkyscraper", "id": Any, "isActive": true, @@ -845,8 +828,6 @@ exports[`Workspace migration builder object actions test suite It should build a "createdAt": Any, "defaultValue": null, "description": "NoteTargets Rocket", - "flatRelationTargetFieldMetadata": null, - "flatRelationTargetObjectMetadata": null, "icon": "IconBuildingSkyscraper", "id": Any, "isActive": true, @@ -911,8 +892,6 @@ exports[`Workspace migration builder object actions test suite It should build a "createdAt": Any, "defaultValue": null, "description": "TaskTargets Rocket", - "flatRelationTargetFieldMetadata": null, - "flatRelationTargetObjectMetadata": null, "icon": "IconBuildingSkyscraper", "id": Any, "isActive": true, @@ -1126,8 +1105,6 @@ exports[`Workspace migration builder object actions test suite It should build a "createdAt": Any, "defaultValue": null, "description": "NoteTargets Pet", - "flatRelationTargetFieldMetadata": null, - "flatRelationTargetObjectMetadata": null, "icon": "IconBuildingSkyscraper", "id": Any, "isActive": true, @@ -1419,8 +1396,6 @@ exports[`Workspace migration builder object actions test suite It should build a "createdAt": Any, "defaultValue": null, "description": "TimelineActivities Pet", - "flatRelationTargetFieldMetadata": null, - "flatRelationTargetObjectMetadata": null, "icon": "IconBuildingSkyscraper", "id": Any, "isActive": true, @@ -1485,8 +1460,6 @@ exports[`Workspace migration builder object actions test suite It should build a "createdAt": Any, "defaultValue": null, "description": "Favorites Pet", - "flatRelationTargetFieldMetadata": null, - "flatRelationTargetObjectMetadata": null, "icon": "IconBuildingSkyscraper", "id": Any, "isActive": true, @@ -1551,8 +1524,6 @@ exports[`Workspace migration builder object actions test suite It should build a "createdAt": Any, "defaultValue": null, "description": "Attachments Pet", - "flatRelationTargetFieldMetadata": null, - "flatRelationTargetObjectMetadata": null, "icon": "IconBuildingSkyscraper", "id": Any, "isActive": true, @@ -1617,8 +1588,6 @@ exports[`Workspace migration builder object actions test suite It should build a "createdAt": Any, "defaultValue": null, "description": "TaskTargets Pet", - "flatRelationTargetFieldMetadata": null, - "flatRelationTargetObjectMetadata": null, "icon": "IconBuildingSkyscraper", "id": Any, "isActive": true, @@ -2811,8 +2780,6 @@ exports[`Workspace migration builder object actions test suite It should build a "createdAt": Any, "defaultValue": null, "description": "TimelineActivities Rocket", - "flatRelationTargetFieldMetadata": null, - "flatRelationTargetObjectMetadata": null, "icon": "IconBuildingSkyscraper", "id": Any, "isActive": true, @@ -2877,8 +2844,6 @@ exports[`Workspace migration builder object actions test suite It should build a "createdAt": Any, "defaultValue": null, "description": "Favorites Rocket", - "flatRelationTargetFieldMetadata": null, - "flatRelationTargetObjectMetadata": null, "icon": "IconBuildingSkyscraper", "id": Any, "isActive": true, @@ -2943,8 +2908,6 @@ exports[`Workspace migration builder object actions test suite It should build a "createdAt": Any, "defaultValue": null, "description": "Attachments Rocket", - "flatRelationTargetFieldMetadata": null, - "flatRelationTargetObjectMetadata": null, "icon": "IconBuildingSkyscraper", "id": Any, "isActive": true, @@ -3009,8 +2972,6 @@ exports[`Workspace migration builder object actions test suite It should build a "createdAt": Any, "defaultValue": null, "description": "NoteTargets Rocket", - "flatRelationTargetFieldMetadata": null, - "flatRelationTargetObjectMetadata": null, "icon": "IconBuildingSkyscraper", "id": Any, "isActive": true, @@ -3075,8 +3036,6 @@ exports[`Workspace migration builder object actions test suite It should build a "createdAt": Any, "defaultValue": null, "description": "TaskTargets Rocket", - "flatRelationTargetFieldMetadata": null, - "flatRelationTargetObjectMetadata": null, "icon": "IconBuildingSkyscraper", "id": Any, "isActive": true, diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/__tests__/common/workspace-migration-builder-field-test-case.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/__tests__/common/workspace-migration-builder-field-test-case.ts index 07697f41d8..82b429d4cd 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/__tests__/common/workspace-migration-builder-field-test-case.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/__tests__/common/workspace-migration-builder-field-test-case.ts @@ -6,8 +6,10 @@ import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfa import { COMPANY_FLAT_FIELDS_MOCK } from 'src/engine/metadata-modules/flat-field-metadata/__mocks__/company-flat-fields.mock'; import { getFlatFieldMetadataMock } from 'src/engine/metadata-modules/flat-field-metadata/__mocks__/get-flat-field-metadata.mock'; +import { getMorphOrRelationTargetFlatFieldMetadataMock } from 'src/engine/metadata-modules/flat-field-metadata/__mocks__/get-morph-or-relation-target-flat-field-metadata-mock'; import { OPPORTUNITY_FLAT_FIELDS_MOCK } from 'src/engine/metadata-modules/flat-field-metadata/__mocks__/opportunity-flat-fields.mock'; import { PET_FLAT_FIELDS_MOCK } from 'src/engine/metadata-modules/flat-field-metadata/__mocks__/pet-flat-fields.mock'; +import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; import { FLAT_OBJECT_METADATA_MAPS_MOCKS } from 'src/engine/metadata-modules/flat-object-metadata-maps/mocks/flat-object-metadata-maps.mock'; import { addFlatFieldMetadataInFlatObjectMetadataMapsOrThrow } from 'src/engine/metadata-modules/flat-object-metadata-maps/utils/add-flat-field-metadata-in-flat-object-metadata-maps-or-throw.util'; import { deleteFieldFromFlatObjectMetadataMapsOrThrow } from 'src/engine/metadata-modules/flat-object-metadata-maps/utils/delete-field-from-flat-object-metadata-maps-or-throw.util'; @@ -27,39 +29,54 @@ const relationTestCases: WorkspaceMigrationBuilderTestCase[] = [ input: () => { const targetRelationId = faker.string.uuid(); const sourceRelationId = faker.string.uuid(); - const sourceRelationFlatField = getFlatFieldMetadataMock({ - id: sourceRelationId, - universalIdentifier: 'field-metadata-unique-identifier-1', - objectMetadataId: PET_FLAT_OBJECT_MOCK.id, - type: FieldMetadataType.RELATION, - relationTargetFieldMetadataId: targetRelationId, - relationTargetObjectMetadataId: ROCKET_FLAT_OBJECT_MOCK.id, - flatRelationTargetFieldMetadata: undefined, - flatRelationTargetObjectMetadata: - fromFlatObjectMetadataToFlatObjectMetadataWithoutFields( - ROCKET_FLAT_OBJECT_MOCK, - ), - }); + const draftSourceRelationFlatField = + getMorphOrRelationTargetFlatFieldMetadataMock({ + id: sourceRelationId, + universalIdentifier: 'field-metadata-unique-identifier-1', + objectMetadataId: PET_FLAT_OBJECT_MOCK.id, + type: FieldMetadataType.RELATION, + settings: { + relationType: RelationType.MANY_TO_ONE, + joinColumnName: 'whatever', + onDelete: undefined, + }, + relationTargetFieldMetadataId: targetRelationId, + relationTargetObjectMetadataId: ROCKET_FLAT_OBJECT_MOCK.id, + flatRelationTargetObjectMetadata: + fromFlatObjectMetadataToFlatObjectMetadataWithoutFields( + ROCKET_FLAT_OBJECT_MOCK, + ), + }); const targetRelationFlatField = getFlatFieldMetadataMock({ id: targetRelationId, universalIdentifier: 'field-metadata-unique-identifier-2', objectMetadataId: ROCKET_FLAT_OBJECT_MOCK.id, type: FieldMetadataType.RELATION, + settings: { + relationType: RelationType.ONE_TO_MANY, + joinColumnName: 'sourceWhatever', + onDelete: undefined, + }, relationTargetFieldMetadataId: sourceRelationId, relationTargetObjectMetadataId: PET_FLAT_OBJECT_MOCK.id, - flatRelationTargetFieldMetadata: sourceRelationFlatField, + flatRelationTargetFieldMetadata: draftSourceRelationFlatField, flatRelationTargetObjectMetadata: fromFlatObjectMetadataToFlatObjectMetadataWithoutFields( PET_FLAT_OBJECT_MOCK, ), }); - sourceRelationFlatField.flatRelationTargetFieldMetadata = - removePropertiesFromRecord(targetRelationFlatField, [ - 'flatRelationTargetFieldMetadata', - 'flatRelationTargetObjectMetadata', - ]); + const sourceRelationFlatField = getFlatFieldMetadataMock({ + ...draftSourceRelationFlatField, + flatRelationTargetFieldMetadata: removePropertiesFromRecord( + targetRelationFlatField as FlatFieldMetadata, + [ + 'flatRelationTargetFieldMetadata', + 'flatRelationTargetObjectMetadata', + ], + ), + }); const toFlatObjectMetadataMaps = [ sourceRelationFlatField, targetRelationFlatField, diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/utils/generate-column-definitions.util.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/utils/generate-column-definitions.util.ts index 3e98fbd667..469f01f54b 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/utils/generate-column-definitions.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/utils/generate-column-definitions.util.ts @@ -11,7 +11,8 @@ import { import { getCompositeTypeOrThrow } from 'src/engine/metadata-modules/field-metadata/utils/get-composite-type-or-throw.util'; import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; import { isCompositeFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-composite-flat-field-metadata.util'; -import { isFlatFieldMetadataEntityOfType } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-of-type.util'; +import { isFlatFieldMetadataOfType } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-of-type.util'; +import { isMorphOrRelationFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-morph-or-relation-flat-field-metadata.util'; import { type FlatObjectMetadataWithoutFields } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type'; import { fieldMetadataTypeToColumnType } from 'src/engine/metadata-modules/workspace-migration/utils/field-metadata-type-to-column-type.util'; import { type WorkspaceSchemaColumnDefinition } from 'src/engine/twenty-orm/workspace-schema-manager/types/workspace-schema-column-definition.type'; @@ -181,24 +182,12 @@ export const generateColumnDefinitions = ({ } if ( - isFlatFieldMetadataEntityOfType( - flatFieldMetadata, - FieldMetadataType.TS_VECTOR, - ) + isFlatFieldMetadataOfType(flatFieldMetadata, FieldMetadataType.TS_VECTOR) ) { return [generateTsVectorColumnDefinition(flatFieldMetadata)]; } - if ( - isFlatFieldMetadataEntityOfType( - flatFieldMetadata, - FieldMetadataType.RELATION, - ) || - isFlatFieldMetadataEntityOfType( - flatFieldMetadata, - FieldMetadataType.MORPH_RELATION, - ) - ) { + if (isMorphOrRelationFlatFieldMetadata(flatFieldMetadata)) { const relationColumn = generateRelationColumnDefinition(flatFieldMetadata); return relationColumn ? [relationColumn] : []; diff --git a/packages/twenty-server/test/integration/metadata/suites/field-metadata/morph-relation/__snapshots__/failing-create-one-field-metadata-morph-relation-v2.integration-spec.ts.snap b/packages/twenty-server/test/integration/metadata/suites/field-metadata/morph-relation/__snapshots__/failing-create-one-field-metadata-morph-relation-v2.integration-spec.ts.snap new file mode 100644 index 0000000000..9f952ec7ce --- /dev/null +++ b/packages/twenty-server/test/integration/metadata/suites/field-metadata/morph-relation/__snapshots__/failing-create-one-field-metadata-morph-relation-v2.integration-spec.ts.snap @@ -0,0 +1,622 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`failing createOne FieldMetadataService morph relation fields v2 Morh relation collision tests suite it should fail to create a already existing morph relation with samefield 1`] = ` +{ + "extensions": { + "code": "BAD_USER_INPUT", + "errors": { + "fieldMetadata": [ + { + "errors": [ + { + "code": "NOT_AVAILABLE", + "message": "Name "toto" is not available as it is already used by another field", + "userFriendlyMessage": "Name "toto" is not available as it is already used by another field", + "value": "toto", + }, + ], + "id": Any, + "name": "toto", + "objectMetadataId": Any, + "operation": "create_field", + }, + { + "errors": [ + { + "code": "NOT_AVAILABLE", + "message": "Name "tata" is not available as it is already used by another field", + "userFriendlyMessage": "Name "tata" is not available as it is already used by another field", + "value": "tata", + }, + ], + "id": Any, + "name": "tata", + "objectMetadataId": Any, + "operation": "create_field", + }, + ], + "objectMetadata": [], + }, + "message": "Validation failed for 0 object(s) and 2 field(s)", + "summary": { + "invalidFields": 2, + "invalidObjects": 0, + "totalErrors": 2, + }, + "userFriendlyMessage": "Validation failed for 0 object(s) and 2 field(s)", + }, + "message": "Multiple validation errors occurred while creating fields", + "name": "GraphQLError", +} +`; + +exports[`failing createOne FieldMetadataService morph relation fields v2 Morh relation collision tests suite it should fail to create a field with name than result in existing morph relation field join column 1`] = ` +{ + "extensions": { + "code": "BAD_USER_INPUT", + "errors": { + "fieldMetadata": [ + { + "errors": [ + { + "code": "NOT_AVAILABLE", + "message": "Name "fieldNamePersonForMorphRelationSecondId" is not available as it is already used by another field", + "userFriendlyMessage": "Name "fieldNamePersonForMorphRelationSecondId" is not available as it is already used by another field", + "value": "fieldNamePersonForMorphRelationSecondId", + }, + ], + "id": Any, + "name": "fieldNamePersonForMorphRelationSecondId", + "objectMetadataId": Any, + "operation": "create_field", + }, + ], + "objectMetadata": [], + }, + "message": "Validation failed for 0 object(s) and 1 field(s)", + "summary": { + "invalidFields": 1, + "invalidObjects": 0, + "totalErrors": 1, + }, + "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + }, + "message": "Multiple validation errors occurred while creating fields", + "name": "GraphQLError", +} +`; + +exports[`failing createOne FieldMetadataService morph relation fields v2 it should fail to create a MORPH_RELATION field on source object itself 1`] = ` +{ + "extensions": { + "code": "BAD_USER_INPUT", + "errors": { + "fieldMetadata": [ + { + "errors": [ + { + "code": "FIELD_METADATA_RELATION_MALFORMED", + "message": "Morph relation creation payloads must not target source object metadata", + "userFriendlyMessage": "Morph relation creation payloads must only contain relation to other object metadata", + }, + ], + "operation": "create_field", + }, + ], + "objectMetadata": [], + }, + "message": "Validation failed for 0 object(s) and 1 field(s)", + "summary": { + "invalidFields": 1, + "invalidObjects": 0, + "totalErrors": 1, + }, + "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + }, + "message": "Multiple validation errors occurred while creating field", + "name": "GraphQLError", +} +`; + +exports[`failing createOne FieldMetadataService morph relation fields v2 it should fail to create a MORPH_RELATION field that has several references to same object 1`] = ` +{ + "extensions": { + "code": "BAD_USER_INPUT", + "errors": { + "fieldMetadata": [ + { + "errors": [ + { + "code": "FIELD_METADATA_RELATION_MALFORMED", + "message": "Morph relation creation payloads must have only relation to the same object metadata", + "userFriendlyMessage": "Morph relation creation payloads must only contain relation to the same object metadata", + }, + ], + "operation": "create_field", + }, + ], + "objectMetadata": [], + }, + "message": "Validation failed for 0 object(s) and 1 field(s)", + "summary": { + "invalidFields": 1, + "invalidObjects": 0, + "totalErrors": 1, + }, + "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + }, + "message": "Multiple validation errors occurred while creating field", + "name": "GraphQLError", +} +`; + +exports[`failing createOne FieldMetadataService morph relation fields v2 it should fail to create a MORPH_RELATION field when targetFieldLabel contains only whitespace 1`] = ` +{ + "extensions": { + "code": "BAD_USER_INPUT", + "errors": { + "fieldMetadata": [ + { + "errors": [ + { + "code": "INVALID_FIELD_INPUT", + "message": "Name is too short", + "userFriendlyMessage": "Name is too short", + "value": "", + }, + { + "code": "INVALID_FIELD_INPUT", + "message": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", + "userFriendlyMessage": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", + "value": "", + }, + ], + "id": Any, + "name": "", + "objectMetadataId": Any, + "operation": "create_field", + }, + ], + "objectMetadata": [], + }, + "message": "Validation failed for 0 object(s) and 1 field(s)", + "summary": { + "invalidFields": 1, + "invalidObjects": 0, + "totalErrors": 1, + }, + "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + }, + "message": "Multiple validation errors occurred while creating fields", + "name": "GraphQLError", +} +`; + +exports[`failing createOne FieldMetadataService morph relation fields v2 it should fail to create a MORPH_RELATION field when targetFieldLabel exceeds maximum length 1`] = ` +{ + "extensions": { + "code": "BAD_USER_INPUT", + "errors": { + "fieldMetadata": [ + { + "errors": [ + { + "code": "INVALID_FIELD_INPUT", + "message": "Name is too long", + "userFriendlyMessage": "Name is too long", + "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + }, + ], + "id": Any, + "name": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "objectMetadataId": Any, + "operation": "create_field", + }, + ], + "objectMetadata": [], + }, + "message": "Validation failed for 0 object(s) and 1 field(s)", + "summary": { + "invalidFields": 1, + "invalidObjects": 0, + "totalErrors": 1, + }, + "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + }, + "message": "Multiple validation errors occurred while creating fields", + "name": "GraphQLError", +} +`; + +exports[`failing createOne FieldMetadataService morph relation fields v2 it should fail to create a MORPH_RELATION field when targetFieldLabel has a first degree conflicts with an existing field on target object metadata id 1`] = ` +{ + "extensions": { + "code": "BAD_USER_INPUT", + "errors": { + "fieldMetadata": [ + { + "errors": [ + { + "code": "NOT_AVAILABLE", + "message": "Name "name" is not available as it is already used by another field", + "userFriendlyMessage": "Name "name" is not available as it is already used by another field", + "value": "name", + }, + ], + "id": Any, + "name": "name", + "objectMetadataId": Any, + "operation": "create_field", + }, + ], + "objectMetadata": [], + }, + "message": "Validation failed for 0 object(s) and 1 field(s)", + "summary": { + "invalidFields": 1, + "invalidObjects": 0, + "totalErrors": 1, + }, + "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + }, + "message": "Multiple validation errors occurred while creating fields", + "name": "GraphQLError", +} +`; + +exports[`failing createOne FieldMetadataService morph relation fields v2 it should fail to create a MORPH_RELATION field when targetFieldLabel is empty 1`] = ` +{ + "extensions": { + "code": "BAD_USER_INPUT", + "errors": { + "fieldMetadata": [ + { + "errors": [ + { + "code": "INVALID_FIELD_INPUT", + "message": "Name is too short", + "userFriendlyMessage": "Name is too short", + "value": "", + }, + { + "code": "INVALID_FIELD_INPUT", + "message": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", + "userFriendlyMessage": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", + "value": "", + }, + ], + "id": Any, + "name": "", + "objectMetadataId": Any, + "operation": "create_field", + }, + ], + "objectMetadata": [], + }, + "message": "Validation failed for 0 object(s) and 1 field(s)", + "summary": { + "invalidFields": 1, + "invalidObjects": 0, + "totalErrors": 1, + }, + "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + }, + "message": "Multiple validation errors occurred while creating fields", + "name": "GraphQLError", +} +`; + +exports[`failing createOne FieldMetadataService morph relation fields v2 it should fail to create a MORPH_RELATION field when targetObjectMetadataId is unknown 1`] = ` +{ + "extensions": { + "code": "BAD_USER_INPUT", + "errors": { + "fieldMetadata": [ + { + "errors": [ + { + "code": "FIELD_METADATA_RELATION_MALFORMED", + "message": "Morph relation input transpilation failed", + "userFriendlyMessage": "Invalid morph relation input", + "value": [ + { + "targetFieldIcon": "Icon123", + "targetFieldLabel": "test", + "targetObjectMetadataId": Any, + "type": "ONE_TO_MANY", + }, + ], + }, + ], + "operation": "create_field", + }, + ], + "objectMetadata": [], + }, + "message": "Validation failed for 0 object(s) and 1 field(s)", + "summary": { + "invalidFields": 1, + "invalidObjects": 0, + "totalErrors": 1, + }, + "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + }, + "message": "Multiple validation errors occurred while creating field", + "name": "GraphQLError", +} +`; + +exports[`failing createOne FieldMetadataService morph relation fields v2 it should fail to create a MORPH_RELATION field when type is a wrong value 1`] = ` +{ + "extensions": { + "code": "BAD_USER_INPUT", + "errors": { + "fieldMetadata": [ + { + "errors": [ + { + "code": "FIELD_METADATA_RELATION_MALFORMED", + "message": "Morph relation input transpilation failed", + "userFriendlyMessage": "Invalid morph relation input", + "value": [ + { + "targetFieldIcon": "Icon123", + "targetFieldLabel": "test", + "targetObjectMetadataId": Any, + "type": "wrong", + }, + ], + }, + ], + "operation": "create_field", + }, + ], + "objectMetadata": [], + }, + "message": "Validation failed for 0 object(s) and 1 field(s)", + "summary": { + "invalidFields": 1, + "invalidObjects": 0, + "totalErrors": 1, + }, + "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + }, + "message": "Multiple validation errors occurred while creating field", + "name": "GraphQLError", +} +`; + +exports[`failing createOne FieldMetadataService morph relation fields v2 it should fail to create a MORPH_RELATION field when type is not provided 1`] = ` +{ + "extensions": { + "code": "BAD_USER_INPUT", + "errors": { + "fieldMetadata": [ + { + "errors": [ + { + "code": "FIELD_METADATA_RELATION_MALFORMED", + "message": "Morph relation input transpilation failed", + "userFriendlyMessage": "Invalid morph relation input", + "value": [ + { + "targetFieldIcon": "Icon123", + "targetFieldLabel": "test", + "targetObjectMetadataId": Any, + }, + ], + }, + ], + "operation": "create_field", + }, + ], + "objectMetadata": [], + }, + "message": "Validation failed for 0 object(s) and 1 field(s)", + "summary": { + "invalidFields": 1, + "invalidObjects": 0, + "totalErrors": 1, + }, + "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + }, + "message": "Multiple validation errors occurred while creating field", + "name": "GraphQLError", +} +`; + +exports[`failing createOne FieldMetadataService morph relation fields v2 it should fail to create a MORPH_RELATION field with empty morphRelationCreationPayload 1`] = ` +{ + "extensions": { + "code": "BAD_USER_INPUT", + "errors": { + "fieldMetadata": [ + { + "errors": [ + { + "code": "FIELD_METADATA_RELATION_MALFORMED", + "message": "Morph relation creation payloads are empty", + "userFriendlyMessage": "At least one relation is require", + }, + ], + "operation": "create_field", + }, + ], + "objectMetadata": [], + }, + "message": "Validation failed for 0 object(s) and 1 field(s)", + "summary": { + "invalidFields": 1, + "invalidObjects": 0, + "totalErrors": 1, + }, + "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + }, + "message": "Multiple validation errors occurred while creating field", + "name": "GraphQLError", +} +`; + +exports[`failing createOne FieldMetadataService morph relation fields v2 it should fail to create a MORPH_RELATION field with malformed morphRelationCreationPayload occurrence 1`] = ` +{ + "extensions": { + "code": "BAD_USER_INPUT", + "errors": { + "fieldMetadata": [ + { + "errors": [ + { + "code": "FIELD_METADATA_RELATION_MALFORMED", + "message": "Morph relation creation payloads must have the same relation type", + "userFriendlyMessage": "Morph relation creation payloads must have the same relation type", + }, + ], + "operation": "create_field", + }, + ], + "objectMetadata": [], + }, + "message": "Validation failed for 0 object(s) and 1 field(s)", + "summary": { + "invalidFields": 1, + "invalidObjects": 0, + "totalErrors": 1, + }, + "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + }, + "message": "Multiple validation errors occurred while creating field", + "name": "GraphQLError", +} +`; + +exports[`failing createOne FieldMetadataService morph relation fields v2 it should fail to create a MORPH_RELATION field with many relation types 1`] = ` +{ + "extensions": { + "code": "BAD_USER_INPUT", + "errors": { + "fieldMetadata": [ + { + "errors": [ + { + "code": "FIELD_METADATA_RELATION_MALFORMED", + "message": "Morph relation creation payloads must have the same relation type", + "userFriendlyMessage": "Morph relation creation payloads must have the same relation type", + }, + ], + "operation": "create_field", + }, + ], + "objectMetadata": [], + }, + "message": "Validation failed for 0 object(s) and 1 field(s)", + "summary": { + "invalidFields": 1, + "invalidObjects": 0, + "totalErrors": 1, + }, + "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + }, + "message": "Multiple validation errors occurred while creating field", + "name": "GraphQLError", +} +`; + +exports[`failing createOne FieldMetadataService morph relation fields v2 it should fail to create a MORPH_RELATION field with not an array morphRelationCreationPayload 1`] = ` +{ + "extensions": { + "code": "BAD_USER_INPUT", + "errors": { + "fieldMetadata": [ + { + "errors": [ + { + "code": "FIELD_METADATA_RELATION_MALFORMED", + "message": "Morph relation input transpilation failed", + "userFriendlyMessage": "Invalid morph relation input", + "value": [ + "not-an-array", + ], + }, + ], + "operation": "create_field", + }, + ], + "objectMetadata": [], + }, + "message": "Validation failed for 0 object(s) and 1 field(s)", + "summary": { + "invalidFields": 1, + "invalidObjects": 0, + "totalErrors": 1, + }, + "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + }, + "message": "Multiple validation errors occurred while creating field", + "name": "GraphQLError", +} +`; + +exports[`failing createOne FieldMetadataService morph relation fields v2 it should fail to create a MORPH_RELATION field with null morphRelationCreationPayload 1`] = ` +{ + "extensions": { + "code": "BAD_USER_INPUT", + "errors": { + "fieldMetadata": [ + { + "errors": [ + { + "code": "INVALID_FIELD_INPUT", + "message": "Relation creation payload is required", + "userFriendlyMessage": "Relation creation payload is required", + "value": null, + }, + ], + "operation": "create_field", + }, + ], + "objectMetadata": [], + }, + "message": "Validation failed for 0 object(s) and 1 field(s)", + "summary": { + "invalidFields": 1, + "invalidObjects": 0, + "totalErrors": 1, + }, + "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + }, + "message": "Multiple validation errors occurred while creating field", + "name": "GraphQLError", +} +`; + +exports[`failing createOne FieldMetadataService morph relation fields v2 it should fail to create a MORPH_RELATION field with undefined morphRelationCreationPayload 1`] = ` +{ + "extensions": { + "code": "BAD_USER_INPUT", + "errors": { + "fieldMetadata": [ + { + "errors": [ + { + "code": "INVALID_FIELD_INPUT", + "message": "Relation creation payload is required", + "userFriendlyMessage": "Relation creation payload is required", + }, + ], + "operation": "create_field", + }, + ], + "objectMetadata": [], + }, + "message": "Validation failed for 0 object(s) and 1 field(s)", + "summary": { + "invalidFields": 1, + "invalidObjects": 0, + "totalErrors": 1, + }, + "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + }, + "message": "Multiple validation errors occurred while creating field", + "name": "GraphQLError", +} +`; diff --git a/packages/twenty-server/test/integration/metadata/suites/field-metadata/morph-relation/failing-create-one-field-metadata-morph-relation-v2.integration-spec.ts b/packages/twenty-server/test/integration/metadata/suites/field-metadata/morph-relation/failing-create-one-field-metadata-morph-relation-v2.integration-spec.ts new file mode 100644 index 0000000000..94f28058d1 --- /dev/null +++ b/packages/twenty-server/test/integration/metadata/suites/field-metadata/morph-relation/failing-create-one-field-metadata-morph-relation-v2.integration-spec.ts @@ -0,0 +1,567 @@ +import { faker } from '@faker-js/faker'; +import { createOneFieldMetadata } from 'test/integration/metadata/suites/field-metadata/utils/create-one-field-metadata.util'; +import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util'; +import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util'; +import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util'; +import { updateFeatureFlag } from 'test/integration/metadata/suites/utils/update-feature-flag.util'; +import { extractRecordIdsAndDatesAsExpectAny } from 'test/utils/extract-record-ids-and-dates-as-expect-any'; +import { + eachTestingContextFilter, + type EachTestingContext, +} from 'twenty-shared/testing'; +import { FieldMetadataType } from 'twenty-shared/types'; + +import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface'; + +import { FeatureFlagKey } from 'src/engine/core-modules/feature-flag/enums/feature-flag-key.enum'; +import { type CreateFieldInput } from 'src/engine/metadata-modules/field-metadata/dtos/create-field.input'; +import { SEED_APPLE_WORKSPACE_ID } from 'src/engine/workspace-manager/dev-seeder/core/utils/seed-workspaces.util'; + +type FailingTestCases = EachTestingContext< + (args: { + createdObjectMetadataPersonId: string; + createdObjectMetadataOpportunityId: string; + createdObjectMetadataCompanyId: string; + }) => Omit< + CreateFieldInput, + 'morphRelationsCreationPayload' | 'workspaceId' + > & + Required> +>[]; + +const morphCreationPayloadMalformedFailingTestCases: FailingTestCases = [ + { + title: 'with empty morphRelationCreationPayload', + context: ({ createdObjectMetadataCompanyId }) => ({ + label: 'field label', + name: 'fieldName', + objectMetadataId: createdObjectMetadataCompanyId, + type: FieldMetadataType.MORPH_RELATION, + morphRelationsCreationPayload: [], + }), + }, + { + title: 'with undefined morphRelationCreationPayload', + context: ({ createdObjectMetadataCompanyId }) => ({ + label: 'field label', + name: 'fieldName', + objectMetadataId: createdObjectMetadataCompanyId, + type: FieldMetadataType.MORPH_RELATION, + morphRelationsCreationPayload: undefined as any, + }), + }, + { + title: 'with null morphRelationCreationPayload', + context: ({ createdObjectMetadataCompanyId }) => ({ + label: 'field label', + name: 'fieldName', + objectMetadataId: createdObjectMetadataCompanyId, + type: FieldMetadataType.MORPH_RELATION, + morphRelationsCreationPayload: null as any, + }), + }, + { + title: 'with not an array morphRelationCreationPayload', + context: ({ createdObjectMetadataCompanyId }) => ({ + label: 'field label', + name: 'fieldName', + objectMetadataId: createdObjectMetadataCompanyId, + type: FieldMetadataType.MORPH_RELATION, + morphRelationsCreationPayload: 'not-an-array' as any, + }), + }, + { + title: 'with malformed morphRelationCreationPayload occurrence', + context: ({ + createdObjectMetadataCompanyId, + createdObjectMetadataOpportunityId, + }) => ({ + label: 'field label', + name: 'fieldName', + objectMetadataId: createdObjectMetadataCompanyId, + type: FieldMetadataType.MORPH_RELATION, + morphRelationsCreationPayload: [ + { + targetFieldIcon: 'Icon123', + targetFieldLabel: 'toto', + targetObjectMetadataId: createdObjectMetadataOpportunityId, + type: RelationType.ONE_TO_MANY, + }, + { + targetFieldIcon: 'Icon123', + }, + { + targetFieldIcon: 'Icon123', + targetFieldLabel: 'titi', + targetObjectMetadataId: createdObjectMetadataOpportunityId, + type: RelationType.ONE_TO_MANY, + }, + ], + }), + }, +]; + +const morphCreationPayloadFailingIntegrityValidationFailingTestCases: FailingTestCases = + [ + { + title: 'with many relation types', + context: ({ + createdObjectMetadataCompanyId, + createdObjectMetadataOpportunityId, + createdObjectMetadataPersonId, + }) => ({ + label: 'field label', + name: 'fieldName', + objectMetadataId: createdObjectMetadataCompanyId, + type: FieldMetadataType.MORPH_RELATION, + morphRelationsCreationPayload: [ + { + targetFieldIcon: 'Icon123', + targetFieldLabel: 'toto', + targetObjectMetadataId: createdObjectMetadataOpportunityId, + type: RelationType.MANY_TO_ONE, + }, + { + targetFieldIcon: 'Icon123', + targetFieldLabel: 'tata', + targetObjectMetadataId: createdObjectMetadataPersonId, + type: RelationType.ONE_TO_MANY, + }, + ], + }), + }, + { + title: 'on source object itself', + context: ({ + createdObjectMetadataCompanyId, + createdObjectMetadataOpportunityId, + createdObjectMetadataPersonId, + }) => ({ + label: 'field label', + name: 'fieldName', + objectMetadataId: createdObjectMetadataCompanyId, + type: FieldMetadataType.MORPH_RELATION, + morphRelationsCreationPayload: [ + { + targetFieldIcon: 'Icon123', + targetFieldLabel: 'toto', + targetObjectMetadataId: createdObjectMetadataOpportunityId, + type: RelationType.ONE_TO_MANY, + }, + { + targetFieldIcon: 'Icon123', + targetFieldLabel: 'tata', + targetObjectMetadataId: createdObjectMetadataPersonId, + type: RelationType.ONE_TO_MANY, + }, + { + targetFieldIcon: 'Icon123', + targetFieldLabel: 'tata', + targetObjectMetadataId: createdObjectMetadataCompanyId, + type: RelationType.ONE_TO_MANY, + }, + ], + }), + }, + { + title: 'that has several references to same object', + context: ({ + createdObjectMetadataCompanyId, + createdObjectMetadataOpportunityId, + createdObjectMetadataPersonId, + }) => ({ + label: 'field label', + name: 'fieldName', + objectMetadataId: createdObjectMetadataCompanyId, + type: FieldMetadataType.MORPH_RELATION, + morphRelationsCreationPayload: [ + { + targetFieldIcon: 'Icon123', + targetFieldLabel: 'toto', + targetObjectMetadataId: createdObjectMetadataOpportunityId, + type: RelationType.ONE_TO_MANY, + }, + { + targetFieldIcon: 'Icon123', + targetFieldLabel: 'tata', + targetObjectMetadataId: createdObjectMetadataPersonId, + type: RelationType.ONE_TO_MANY, + }, + { + targetFieldIcon: 'Icon123', + targetFieldLabel: 'titi', + targetObjectMetadataId: createdObjectMetadataOpportunityId, + type: RelationType.ONE_TO_MANY, + }, + ], + }), + }, + ]; + +const relationCreationPayloadEdgeCasesFailingTestsCases: FailingTestCases = [ + { + title: 'when targetFieldLabel is empty', + context: ({ + createdObjectMetadataCompanyId, + createdObjectMetadataOpportunityId, + }) => ({ + label: 'field label', + name: 'fieldName', + objectMetadataId: createdObjectMetadataCompanyId, + type: FieldMetadataType.MORPH_RELATION, + morphRelationsCreationPayload: [ + { + targetFieldIcon: 'Icon123', + targetFieldLabel: '', + targetObjectMetadataId: createdObjectMetadataOpportunityId, + type: RelationType.ONE_TO_MANY, + }, + ], + }), + }, + { + title: 'when targetFieldLabel exceeds maximum length', + context: ({ + createdObjectMetadataCompanyId, + createdObjectMetadataOpportunityId, + }) => ({ + label: 'field label', + name: 'fieldName', + objectMetadataId: createdObjectMetadataCompanyId, + type: FieldMetadataType.MORPH_RELATION, + morphRelationsCreationPayload: [ + { + targetFieldIcon: 'Icon123', + targetFieldLabel: 'A'.repeat(64), + targetObjectMetadataId: createdObjectMetadataOpportunityId, + type: RelationType.ONE_TO_MANY, + }, + ], + }), + }, + { + title: 'when targetObjectMetadataId is unknown', + context: ({ createdObjectMetadataCompanyId }) => ({ + label: 'field label', + name: 'fieldName', + objectMetadataId: createdObjectMetadataCompanyId, + type: FieldMetadataType.MORPH_RELATION, + morphRelationsCreationPayload: [ + { + targetFieldIcon: 'Icon123', + targetFieldLabel: 'test', + targetObjectMetadataId: faker.string.uuid(), + type: RelationType.ONE_TO_MANY, + }, + ], + }), + }, + { + title: 'when targetFieldLabel contains only whitespace', + context: ({ + createdObjectMetadataCompanyId, + createdObjectMetadataOpportunityId, + }) => ({ + label: 'field label', + name: 'fieldName', + objectMetadataId: createdObjectMetadataCompanyId, + type: FieldMetadataType.MORPH_RELATION, + morphRelationsCreationPayload: [ + { + targetFieldIcon: 'Icon123', + targetFieldLabel: ' ', + targetObjectMetadataId: createdObjectMetadataOpportunityId, + type: RelationType.ONE_TO_MANY, + }, + ], + }), + }, + { + title: + 'when targetFieldLabel has a first degree conflicts with an existing field on target object metadata id', + context: ({ + createdObjectMetadataCompanyId, + createdObjectMetadataOpportunityId, + }) => ({ + label: 'field label', + name: 'fieldName', + objectMetadataId: createdObjectMetadataCompanyId, + type: FieldMetadataType.MORPH_RELATION, + morphRelationsCreationPayload: [ + { + targetFieldIcon: 'Icon123', + targetFieldLabel: 'name', + targetObjectMetadataId: createdObjectMetadataOpportunityId, + type: RelationType.ONE_TO_MANY, + }, + ], + }), + }, + { + title: 'when type is not provided', + context: ({ + createdObjectMetadataCompanyId, + createdObjectMetadataOpportunityId, + }) => ({ + label: 'field label', + name: 'fieldName', + objectMetadataId: createdObjectMetadataCompanyId, + type: FieldMetadataType.MORPH_RELATION, + morphRelationsCreationPayload: [ + { + targetFieldIcon: 'Icon123', + targetFieldLabel: 'test', + targetObjectMetadataId: createdObjectMetadataOpportunityId, + type: undefined as unknown as RelationType, + }, + ], + }), + }, + { + title: 'when type is a wrong value', + context: ({ + createdObjectMetadataCompanyId, + createdObjectMetadataOpportunityId, + }) => ({ + label: 'field label', + name: 'fieldName', + objectMetadataId: createdObjectMetadataCompanyId, + type: FieldMetadataType.MORPH_RELATION, + morphRelationsCreationPayload: [ + { + targetFieldIcon: 'Icon123', + targetFieldLabel: 'test', + targetObjectMetadataId: createdObjectMetadataOpportunityId, + type: 'wrong' as RelationType, + }, + ], + }), + }, +]; + +const failingTestCases: FailingTestCases = [ + ...morphCreationPayloadMalformedFailingTestCases, + ...morphCreationPayloadFailingIntegrityValidationFailingTestCases, + ...relationCreationPayloadEdgeCasesFailingTestsCases, +]; + +describe('failing createOne FieldMetadataService morph relation fields v2', () => { + let createdObjectMetadataPersonId: string; + let createdObjectMetadataOpportunityId: string; + let createdObjectMetadataCompanyId: string; + + beforeAll(async () => { + await updateFeatureFlag({ + expectToFail: false, + featureFlag: FeatureFlagKey.IS_WORKSPACE_MIGRATION_V2_ENABLED, + value: true, + workspaceId: SEED_APPLE_WORKSPACE_ID, + }); + + const { + data: { + createOneObject: { id: objectMetadataPersonId }, + }, + } = await createOneObjectMetadata({ + expectToFail: false, + input: { + nameSingular: 'personForMorphRelationSecond', + namePlural: 'peopleForMorphRelationSecond', + labelSingular: 'Person For Morph Relation', + labelPlural: 'People For Morph Relation', + icon: 'IconPerson', + }, + }); + + createdObjectMetadataPersonId = objectMetadataPersonId; + + const { + data: { + createOneObject: { id: objectMetadataCompanyId }, + }, + } = await createOneObjectMetadata({ + expectToFail: false, + input: { + nameSingular: 'companyForMorphRelationSecond', + namePlural: 'companiesForMorphRelationSecond', + labelSingular: 'Company For Morph Relation', + labelPlural: 'Companies For Morph Relation', + icon: 'IconCompany', + }, + }); + + createdObjectMetadataCompanyId = objectMetadataCompanyId; + + const { + data: { + createOneObject: { id: objectMetadataOpportunityId }, + }, + } = await createOneObjectMetadata({ + expectToFail: false, + input: { + nameSingular: 'opportunityForMorphRelationSecond', + namePlural: 'opportunitiesForMorphRelationSecond', + labelSingular: 'Opportunity For Morph Relation', + labelPlural: 'Opportunities For Morph Relation', + icon: 'IconOpportunity', + }, + }); + + createdObjectMetadataOpportunityId = objectMetadataOpportunityId; + }); + + afterAll(async () => { + const createdObjectMetadataIds = [ + createdObjectMetadataPersonId, + createdObjectMetadataOpportunityId, + createdObjectMetadataCompanyId, + ]; + + try { + for (const objectMetadataId of createdObjectMetadataIds) { + await updateOneObjectMetadata({ + expectToFail: false, + input: { + idToUpdate: objectMetadataId, + updatePayload: { isActive: false }, + }, + }); + await deleteOneObjectMetadata({ + expectToFail: false, + input: { idToDelete: objectMetadataId }, + }); + } + } finally { + await updateFeatureFlag({ + expectToFail: false, + featureFlag: FeatureFlagKey.IS_WORKSPACE_MIGRATION_V2_ENABLED, + value: false, + workspaceId: SEED_APPLE_WORKSPACE_ID, + }); + } + }); + + it.each(eachTestingContextFilter(failingTestCases))( + 'it should fail to create a MORPH_RELATION field $title', + async ({ context }) => { + const contextPayload = context({ + createdObjectMetadataOpportunityId, + createdObjectMetadataPersonId, + createdObjectMetadataCompanyId, + }); + + const { errors } = await createOneFieldMetadata({ + input: contextPayload, + expectToFail: true, + }); + + expect(errors.length).toBe(1); + const [firstError] = errors; + + expect(firstError).toMatchSnapshot( + extractRecordIdsAndDatesAsExpectAny(firstError), + ); + expect(firstError.extensions.code).not.toBe('INTERNAL_SERVER_ERROR'); + }, + ); + + describe('Morh relation collision tests suite', () => { + beforeAll(async () => { + const morphRelationCreateFieldInput: Omit< + CreateFieldInput, + 'workspaceId' + > = { + label: 'field label', + name: 'fieldName', + objectMetadataId: createdObjectMetadataCompanyId, + type: FieldMetadataType.MORPH_RELATION, + morphRelationsCreationPayload: [ + { + targetFieldIcon: 'Icon123', + targetFieldLabel: 'toto', + targetObjectMetadataId: createdObjectMetadataOpportunityId, + type: RelationType.MANY_TO_ONE, + }, + { + targetFieldIcon: 'Icon123', + targetFieldLabel: 'tata', + targetObjectMetadataId: createdObjectMetadataPersonId, + type: RelationType.MANY_TO_ONE, + }, + ], + }; + + await createOneFieldMetadata({ + input: morphRelationCreateFieldInput, + expectToFail: false, + gqlFields: ` + id + name + `, + }); + }); + + it('it should fail to create a field with name than result in existing morph relation field join column', async () => { + const { errors } = await createOneFieldMetadata({ + input: { + label: 'colliding field label', + name: `fieldNamePersonForMorphRelationSecondId`, + objectMetadataId: createdObjectMetadataPersonId, + type: FieldMetadataType.TEXT, + }, + expectToFail: true, + }); + + expect(errors.length).toBe(1); + const [firstError] = errors; + + expect(firstError).toMatchSnapshot( + extractRecordIdsAndDatesAsExpectAny(firstError), + ); + expect(firstError.extensions.code).not.toBe('INTERNAL_SERVER_ERROR'); + }); + + it('it should fail to create a already existing morph relation with samefield', async () => { + const morphRelationCreateFieldInput: Omit< + CreateFieldInput, + 'workspaceId' + > = { + label: 'field label', + name: 'differentFromExisting', + objectMetadataId: createdObjectMetadataCompanyId, + type: FieldMetadataType.MORPH_RELATION, + morphRelationsCreationPayload: [ + { + targetFieldIcon: 'Icon123', + targetFieldLabel: 'toto', + targetObjectMetadataId: createdObjectMetadataOpportunityId, + type: RelationType.ONE_TO_MANY, + }, + { + targetFieldIcon: 'Icon123', + targetFieldLabel: 'tata', + targetObjectMetadataId: createdObjectMetadataPersonId, + type: RelationType.ONE_TO_MANY, + }, + ], + }; + + const { errors } = await createOneFieldMetadata({ + input: morphRelationCreateFieldInput, + expectToFail: true, + gqlFields: ` + id + name + `, + }); + + expect(errors.length).toBe(1); + const [firstError] = errors; + + expect(firstError).toMatchSnapshot( + extractRecordIdsAndDatesAsExpectAny(firstError), + ); + expect(firstError.extensions.code).not.toBe('INTERNAL_SERVER_ERROR'); + }); + }); +}); diff --git a/packages/twenty-server/test/integration/metadata/suites/field-metadata/morph-relation/successful-create-one-field-metadata-morph-relation-v2.integration-spec.ts b/packages/twenty-server/test/integration/metadata/suites/field-metadata/morph-relation/successful-create-one-field-metadata-morph-relation-v2.integration-spec.ts index 26df0d101e..cba21a4d83 100644 --- a/packages/twenty-server/test/integration/metadata/suites/field-metadata/morph-relation/successful-create-one-field-metadata-morph-relation-v2.integration-spec.ts +++ b/packages/twenty-server/test/integration/metadata/suites/field-metadata/morph-relation/successful-create-one-field-metadata-morph-relation-v2.integration-spec.ts @@ -1,6 +1,7 @@ import { createOneFieldMetadata } from 'test/integration/metadata/suites/field-metadata/utils/create-one-field-metadata.util'; import { deleteOneFieldMetadata } from 'test/integration/metadata/suites/field-metadata/utils/delete-one-field-metadata.util'; import { updateOneFieldMetadata } from 'test/integration/metadata/suites/field-metadata/utils/update-one-field-metadata.util'; +import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util'; import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util'; import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util'; import { updateFeatureFlag } from 'test/integration/metadata/suites/utils/update-feature-flag.util'; @@ -10,7 +11,6 @@ import { } from 'twenty-shared/testing'; import { FieldMetadataType } from 'twenty-shared/types'; import { isDefined } from 'twenty-shared/utils'; -import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util'; import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface'; @@ -20,7 +20,76 @@ import { type FieldMetadataDTO } from 'src/engine/metadata-modules/field-metadat import { type RelationDTO } from 'src/engine/metadata-modules/field-metadata/dtos/relation.dto'; import { SEED_APPLE_WORKSPACE_ID } from 'src/engine/workspace-manager/dev-seeder/core/utils/seed-workspaces.util'; -describe('createOne FieldMetadataService morph relation fields', () => { +type EachTestingContextArray = EachTestingContext< + (args: { + createdObjectMetadataPersonId: string; + createdObjectMetadataOpportunityId: string; + createdObjectMetadataCompanyId: string; + }) => Omit< + CreateFieldInput, + 'morphRelationsCreationPayload' | 'workspaceId' + > & + Required> +>[]; + +const successfulTestCases: EachTestingContextArray = [ + { + title: 'should create a MORPH_RELATION field type MANY_TO_ONE', + context: ({ + createdObjectMetadataCompanyId, + createdObjectMetadataOpportunityId, + createdObjectMetadataPersonId, + }) => ({ + label: 'field label', + name: 'fieldName', + objectMetadataId: createdObjectMetadataCompanyId, + type: FieldMetadataType.MORPH_RELATION, + morphRelationsCreationPayload: [ + { + targetFieldIcon: 'Icon123', + targetFieldLabel: 'toto', + targetObjectMetadataId: createdObjectMetadataOpportunityId, + type: RelationType.MANY_TO_ONE, + }, + { + targetFieldIcon: 'Icon123', + targetFieldLabel: 'tata', + targetObjectMetadataId: createdObjectMetadataPersonId, + type: RelationType.MANY_TO_ONE, + }, + ], + }), + }, + { + title: 'should create a MORPH_RELATION field type ONE_TO_MANY', + context: ({ + createdObjectMetadataCompanyId, + createdObjectMetadataOpportunityId, + createdObjectMetadataPersonId, + }) => ({ + label: 'field label', + name: 'fieldName', + objectMetadataId: createdObjectMetadataCompanyId, + type: FieldMetadataType.MORPH_RELATION, + morphRelationsCreationPayload: [ + { + targetFieldIcon: 'Icon123', + targetFieldLabel: 'toto', + targetObjectMetadataId: createdObjectMetadataOpportunityId, + type: RelationType.ONE_TO_MANY, + }, + { + targetFieldIcon: 'Icon123', + targetFieldLabel: 'tata', + targetObjectMetadataId: createdObjectMetadataPersonId, + type: RelationType.ONE_TO_MANY, + }, + ], + }), + }, +]; + +describe('successful createOne FieldMetadataService morph relation fields v2', () => { let createdObjectMetadataPersonId: string; let createdObjectMetadataOpportunityId: string; let createdObjectMetadataCompanyId: string; @@ -87,43 +156,34 @@ describe('createOne FieldMetadataService morph relation fields', () => { }); afterAll(async () => { - await Promise.all( - [ - createdObjectMetadataPersonId, - createdObjectMetadataOpportunityId, - createdObjectMetadataCompanyId, - ].map( - async (objectMetadataId) => - await updateOneObjectMetadata({ - expectToFail: false, - input: { - idToUpdate: objectMetadataId, - updatePayload: { isActive: false }, - }, - }), - ), - ); + const createdObjectMetadataIds = [ + createdObjectMetadataPersonId, + createdObjectMetadataOpportunityId, + createdObjectMetadataCompanyId, + ]; - await Promise.all( - [ - createdObjectMetadataPersonId, - createdObjectMetadataOpportunityId, - createdObjectMetadataCompanyId, - ].map( - async (objectMetadataId) => - await deleteOneObjectMetadata({ - expectToFail: false, - input: { idToDelete: objectMetadataId }, - }), - ), - ); - - await updateFeatureFlag({ - expectToFail: false, - featureFlag: FeatureFlagKey.IS_WORKSPACE_MIGRATION_V2_ENABLED, - value: false, - workspaceId: SEED_APPLE_WORKSPACE_ID, - }); + try { + for (const objectMetadataId of createdObjectMetadataIds) { + await updateOneObjectMetadata({ + expectToFail: false, + input: { + idToUpdate: objectMetadataId, + updatePayload: { isActive: false }, + }, + }); + await deleteOneObjectMetadata({ + expectToFail: false, + input: { idToDelete: objectMetadataId }, + }); + } + } finally { + await updateFeatureFlag({ + expectToFail: false, + featureFlag: FeatureFlagKey.IS_WORKSPACE_MIGRATION_V2_ENABLED, + value: false, + workspaceId: SEED_APPLE_WORKSPACE_ID, + }); + } }); afterEach(async () => { @@ -151,76 +211,7 @@ describe('createOne FieldMetadataService morph relation fields', () => { createdFieldMetadataId = undefined; }); - type EachTestingContextArray = EachTestingContext< - (args: { - createdObjectMetadataPersonId: string; - createdObjectMetadataOpportunityId: string; - createdObjectMetadataCompanyId: string; - }) => Omit< - CreateFieldInput, - 'morphRelationsCreationPayload' | 'workspaceId' - > & - Required> - >[]; - - const eachTestingContextArray: EachTestingContextArray = [ - { - title: 'should create a MORPH_RELATION field type MANY_TO_ONE', - context: ({ - createdObjectMetadataCompanyId, - createdObjectMetadataOpportunityId, - createdObjectMetadataPersonId, - }) => ({ - label: 'field label', - name: 'fieldName', - objectMetadataId: createdObjectMetadataCompanyId, - type: FieldMetadataType.MORPH_RELATION, - morphRelationsCreationPayload: [ - { - targetFieldIcon: 'Icon123', - targetFieldLabel: 'toto', - targetObjectMetadataId: createdObjectMetadataOpportunityId, - type: RelationType.MANY_TO_ONE, - }, - { - targetFieldIcon: 'Icon123', - targetFieldLabel: 'tata', - targetObjectMetadataId: createdObjectMetadataPersonId, - type: RelationType.MANY_TO_ONE, - }, - ], - }), - }, - { - title: 'should create a MORPH_RELATION field type ONE_TO_MANY', - context: ({ - createdObjectMetadataCompanyId, - createdObjectMetadataOpportunityId, - createdObjectMetadataPersonId, - }) => ({ - label: 'field label', - name: 'fieldName', - objectMetadataId: createdObjectMetadataCompanyId, - type: FieldMetadataType.MORPH_RELATION, - morphRelationsCreationPayload: [ - { - targetFieldIcon: 'Icon123', - targetFieldLabel: 'toto', - targetObjectMetadataId: createdObjectMetadataOpportunityId, - type: RelationType.ONE_TO_MANY, - }, - { - targetFieldIcon: 'Icon123', - targetFieldLabel: 'tata', - targetObjectMetadataId: createdObjectMetadataPersonId, - type: RelationType.ONE_TO_MANY, - }, - ], - }), - }, - ]; - - it.each(eachTestingContextFilter(eachTestingContextArray))( + it.each(eachTestingContextFilter(successfulTestCases))( '$title', async ({ context }) => { const contextPayload = context({ diff --git a/packages/twenty-server/test/integration/metadata/suites/field-metadata/morph-relation/successful-update-one-field-metadata-morph-relation-v2.integration-spec.ts b/packages/twenty-server/test/integration/metadata/suites/field-metadata/morph-relation/successful-update-one-field-metadata-morph-relation-v2.integration-spec.ts index 9b337b071b..b317db0191 100644 --- a/packages/twenty-server/test/integration/metadata/suites/field-metadata/morph-relation/successful-update-one-field-metadata-morph-relation-v2.integration-spec.ts +++ b/packages/twenty-server/test/integration/metadata/suites/field-metadata/morph-relation/successful-update-one-field-metadata-morph-relation-v2.integration-spec.ts @@ -1,11 +1,11 @@ import { createOneFieldMetadata } from 'test/integration/metadata/suites/field-metadata/utils/create-one-field-metadata.util'; import { deleteOneFieldMetadata } from 'test/integration/metadata/suites/field-metadata/utils/delete-one-field-metadata.util'; import { updateOneFieldMetadata } from 'test/integration/metadata/suites/field-metadata/utils/update-one-field-metadata.util'; +import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util'; import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util'; import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util'; import { updateFeatureFlag } from 'test/integration/metadata/suites/utils/update-feature-flag.util'; import { FieldMetadataType } from 'twenty-shared/types'; -import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util'; import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface'; @@ -79,43 +79,34 @@ describe('updateOne FieldMetadataService morph relation fields v2', () => { }); afterAll(async () => { - await Promise.all( - [ - createdObjectMetadataPersonId, - createdObjectMetadataOpportunityId, - createdObjectMetadataCompanyId, - ].map( - async (objectMetadataId) => - await updateOneObjectMetadata({ - expectToFail: false, - input: { - idToUpdate: objectMetadataId, - updatePayload: { isActive: false }, - }, - }), - ), - ); + const createdObjectMetadataIds = [ + createdObjectMetadataPersonId, + createdObjectMetadataOpportunityId, + createdObjectMetadataCompanyId, + ]; - await Promise.all( - [ - createdObjectMetadataPersonId, - createdObjectMetadataOpportunityId, - createdObjectMetadataCompanyId, - ].map( - async (objectMetadataId) => - await deleteOneObjectMetadata({ - expectToFail: false, - input: { idToDelete: objectMetadataId }, - }), - ), - ); - - await updateFeatureFlag({ - expectToFail: false, - featureFlag: FeatureFlagKey.IS_WORKSPACE_MIGRATION_V2_ENABLED, - value: false, - workspaceId: SEED_APPLE_WORKSPACE_ID, - }); + try { + for (const objectMetadataId of createdObjectMetadataIds) { + await updateOneObjectMetadata({ + expectToFail: false, + input: { + idToUpdate: objectMetadataId, + updatePayload: { isActive: false }, + }, + }); + await deleteOneObjectMetadata({ + expectToFail: false, + input: { idToDelete: objectMetadataId }, + }); + } + } finally { + await updateFeatureFlag({ + expectToFail: false, + featureFlag: FeatureFlagKey.IS_WORKSPACE_MIGRATION_V2_ENABLED, + value: false, + workspaceId: SEED_APPLE_WORKSPACE_ID, + }); + } }); beforeEach(async () => { diff --git a/packages/twenty-server/test/integration/metadata/suites/field-metadata/update-one-field-metadata.integration-spec.ts b/packages/twenty-server/test/integration/metadata/suites/field-metadata/update-one-field-metadata.integration-spec.ts index 5ce60b2485..07d9a027a8 100644 --- a/packages/twenty-server/test/integration/metadata/suites/field-metadata/update-one-field-metadata.integration-spec.ts +++ b/packages/twenty-server/test/integration/metadata/suites/field-metadata/update-one-field-metadata.integration-spec.ts @@ -4,9 +4,9 @@ import { LISTING_NAME_PLURAL, LISTING_NAME_SINGULAR, } from 'test/integration/metadata/suites/object-metadata/constants/test-object-names.constant'; +import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util'; import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util'; import { FieldMetadataType } from 'twenty-shared/types'; -import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util'; describe('updateOne', () => { describe('successful fieldMetadataService name/label sync', () => { diff --git a/packages/twenty-server/test/integration/metadata/suites/object-metadata/failing-create-one-object-metadata-v2.integration-spec.ts b/packages/twenty-server/test/integration/metadata/suites/object-metadata/failing-create-one-object-metadata-v2.integration-spec.ts index 876645e2af..75822de30a 100644 --- a/packages/twenty-server/test/integration/metadata/suites/object-metadata/failing-create-one-object-metadata-v2.integration-spec.ts +++ b/packages/twenty-server/test/integration/metadata/suites/object-metadata/failing-create-one-object-metadata-v2.integration-spec.ts @@ -1,11 +1,10 @@ -import { makeGraphqlAPIRequest } from 'test/integration/graphql/utils/make-graphql-api-request.util'; -import { updateFeatureFlagFactory } from 'test/integration/graphql/utils/update-feature-flag-factory.util'; import { OBJECT_METADATA_LABEL_FAILING_TEST_CASES } from 'test/integration/metadata/suites/object-metadata/common/object-metadata-label-failing-tests-cases'; import { OBJECT_METADATA_NAMES_FAILING_TEST_CASES } from 'test/integration/metadata/suites/object-metadata/common/object-metadata-names-failing-tests-cases'; import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util'; import { getMockCreateObjectInput } from 'test/integration/metadata/suites/object-metadata/utils/generate-mock-create-object-metadata-input'; import { extractRecordIdsAndDatesAsExpectAny } from 'test/utils/extract-record-ids-and-dates-as-expect-any'; import { eachTestingContextFilter } from 'twenty-shared/testing'; +import { updateFeatureFlag } from 'test/integration/metadata/suites/utils/update-feature-flag.util'; import { FeatureFlagKey } from 'src/engine/core-modules/feature-flag/enums/feature-flag-key.enum'; import { SEED_APPLE_WORKSPACE_ID } from 'src/engine/workspace-manager/dev-seeder/core/utils/seed-workspaces.util'; @@ -17,23 +16,21 @@ const allTestsUseCases = [ describe('Object metadata creation should fail v2', () => { beforeAll(async () => { - const enableWorkspaceMigrationV2 = updateFeatureFlagFactory( - SEED_APPLE_WORKSPACE_ID, - FeatureFlagKey.IS_WORKSPACE_MIGRATION_V2_ENABLED, - true, - ); - - await makeGraphqlAPIRequest(enableWorkspaceMigrationV2); + await updateFeatureFlag({ + expectToFail: false, + featureFlag: FeatureFlagKey.IS_WORKSPACE_MIGRATION_V2_ENABLED, + value: true, + workspaceId: SEED_APPLE_WORKSPACE_ID, + }); }); afterAll(async () => { - const enablePermissionsQuery = updateFeatureFlagFactory( - SEED_APPLE_WORKSPACE_ID, - FeatureFlagKey.IS_WORKSPACE_MIGRATION_V2_ENABLED, - false, - ); - - await makeGraphqlAPIRequest(enablePermissionsQuery); + await updateFeatureFlag({ + expectToFail: false, + featureFlag: FeatureFlagKey.IS_WORKSPACE_MIGRATION_V2_ENABLED, + value: false, + workspaceId: SEED_APPLE_WORKSPACE_ID, + }); }); it.each(eachTestingContextFilter(allTestsUseCases))( '$title', diff --git a/packages/twenty-server/test/utils/extract-record-ids-and-dates-as-expect-any.ts b/packages/twenty-server/test/utils/extract-record-ids-and-dates-as-expect-any.ts index 51cbc7f03a..d0bb4a0c69 100644 --- a/packages/twenty-server/test/utils/extract-record-ids-and-dates-as-expect-any.ts +++ b/packages/twenty-server/test/utils/extract-record-ids-and-dates-as-expect-any.ts @@ -8,9 +8,7 @@ export const extractRecordIdsAndDatesAsExpectAny = ( } if (typeof record !== 'object') { - throw new Error( - 'extractRecordIdsAndDatesAsExpectAny should be called with an array or a record only', - ); + return record; } return Object.entries(record).reduce((acc, [key, value]) => {