Deprecate FieldMetadataInterface (#13264)

# Introduction

From the moment replaced the FieldMetadataInterface definition to:
```ts
import { FieldMetadataType } from 'twenty-shared/types';

import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity';

export type FieldMetadataInterface<
  T extends FieldMetadataType = FieldMetadataType,
> = FieldMetadataEntity<T>;
```
After this PR merge will create a new one removing the type and
replacing it to `FieldMetadataEntity`.
Did not renamed it here to avoid conflicts on naming + type issues fixs
within the same PR

## Field metadata entity RELATION or MORPH
Relations fields cannot be null for those field metadata entity instance
anymore, but are never for the others see
`packages/twenty-server/src/engine/metadata-modules/field-metadata/types/field-metadata-entity-test.type.ts`
( introduced TypeScript tests )

## Concerns
- TS_VECTOR is the most at risk with the `generatedType` and
`asExpression` removal from interface

## What's next
- `FielMetadataInterface` removal and rename ( see introduction )
- Depcrecating `ObjectMetadataInterface`
- Refactor `FieldMetadataEntity` optional fiels to be nullable only
- TO DIG `never` occurences on settings, defaultValue etc
- Some interfaces will be replaced by the `FlatFieldMetadata` when
deprecating the current sync and comparators tools
This commit is contained in:
Paul Rastoin
2025-07-21 11:30:18 +02:00
committed by GitHub
parent c2a5f95675
commit 47b60bd49f
67 changed files with 1780 additions and 769 deletions
@@ -1,6 +1,10 @@
import { FieldMetadataType } from 'twenty-shared/types';
import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity';
import { ObjectMetadataItemWithFieldMaps } from 'src/engine/metadata-modules/types/object-metadata-item-with-field-maps';
import { getMockFieldMetadataEntity } from 'src/utils/__test__/get-field-metadata-entity.mock';
const workspaceId = '20202020-0000-0000-0000-000000000000';
export const mockObjectMetadataItemsWithFieldMaps: ObjectMetadataItemWithFieldMaps[] =
[
@@ -22,12 +26,13 @@ export const mockObjectMetadataItemsWithFieldMaps: ObjectMetadataItemWithFieldMa
isSearchable: true,
labelIdentifierFieldMetadataId: 'nameFieldMetadataId',
imageIdentifierFieldMetadataId: '',
workspaceId: '',
workspaceId,
indexMetadatas: [],
fieldsById: {
nameFieldMetadataId: {
nameFieldMetadataId: getMockFieldMetadataEntity({
workspaceId,
objectMetadataId: '20202020-8dec-43d5-b2ff-6eef05095bec',
id: 'nameFieldMetadataId',
objectMetadataId: '',
type: FieldMetadataType.FULL_NAME,
icon: 'test-field-icon',
name: 'name',
@@ -36,15 +41,14 @@ export const mockObjectMetadataItemsWithFieldMaps: ObjectMetadataItemWithFieldMa
lastName: "''",
firstName: "''",
},
description: 'Contacts name',
description: "Contact's name",
isCustom: false,
isNullable: true,
isUnique: false,
workspaceId: '',
isLabelSyncedWithName: true,
createdAt: new Date(),
updatedAt: new Date(),
},
}) as FieldMetadataEntity,
},
fieldIdByName: {
name: 'nameFieldMetadataId',
@@ -69,12 +73,13 @@ export const mockObjectMetadataItemsWithFieldMaps: ObjectMetadataItemWithFieldMa
isSearchable: true,
labelIdentifierFieldMetadataId: 'nameFieldMetadataId',
imageIdentifierFieldMetadataId: '',
workspaceId: '',
workspaceId,
indexMetadatas: [],
fieldsById: {
nameFieldMetadataId: {
nameFieldMetadataId: getMockFieldMetadataEntity({
workspaceId,
objectMetadataId: '20202020-c03c-45d6-a4b0-04afe1357c5c',
id: 'nameFieldMetadataId',
objectMetadataId: '',
type: FieldMetadataType.TEXT,
icon: 'test-field-icon',
name: 'name',
@@ -83,27 +88,30 @@ export const mockObjectMetadataItemsWithFieldMaps: ObjectMetadataItemWithFieldMa
isCustom: false,
isNullable: true,
isUnique: false,
workspaceId: '',
isLabelSyncedWithName: true,
createdAt: new Date(),
updatedAt: new Date(),
},
domainNameFieldMetadataId: {
}) as FieldMetadataEntity,
domainNameFieldMetadataId: getMockFieldMetadataEntity({
workspaceId,
objectMetadataId: '20202020-c03c-45d6-a4b0-04afe1357c5c',
id: 'domainNameFieldMetadataId',
objectMetadataId: '',
type: FieldMetadataType.LINKS,
icon: 'test-field-icon',
name: 'domainName',
label: 'Domain Name',
defaultValue: '',
defaultValue: {
primaryLinkLabel: '',
primaryLinkUrl: '',
secondaryLinks: [],
},
isCustom: false,
isNullable: true,
isUnique: false,
workspaceId: '',
isLabelSyncedWithName: true,
createdAt: new Date(),
updatedAt: new Date(),
},
}) as FieldMetadataEntity,
},
fieldIdByName: {
name: 'nameFieldMetadataId',
@@ -129,12 +137,13 @@ export const mockObjectMetadataItemsWithFieldMaps: ObjectMetadataItemWithFieldMa
isSearchable: true,
labelIdentifierFieldMetadataId: 'nameFieldMetadataId',
imageIdentifierFieldMetadataId: 'imageIdentifierFieldMetadataId',
workspaceId: '',
workspaceId,
indexMetadatas: [],
fieldsById: {
nameFieldMetadataId: {
nameFieldMetadataId: getMockFieldMetadataEntity({
workspaceId,
objectMetadataId: '20202020-3d75-4aab-bacd-ee176c5f63ca',
id: 'nameFieldMetadataId',
objectMetadataId: '',
type: FieldMetadataType.TEXT,
icon: 'test-field-icon',
name: 'name',
@@ -143,14 +152,14 @@ export const mockObjectMetadataItemsWithFieldMaps: ObjectMetadataItemWithFieldMa
isCustom: false,
isNullable: true,
isUnique: false,
workspaceId: '',
isLabelSyncedWithName: true,
createdAt: new Date(),
updatedAt: new Date(),
},
imageIdentifierFieldMetadataId: {
}) as FieldMetadataEntity,
imageIdentifierFieldMetadataId: getMockFieldMetadataEntity({
workspaceId,
objectMetadataId: '20202020-3d75-4aab-bacd-ee176c5f63ca',
id: 'imageIdentifierFieldMetadataId',
objectMetadataId: '',
type: FieldMetadataType.TEXT,
icon: 'test-field-icon',
name: 'imageIdentifierFieldName',
@@ -159,11 +168,10 @@ export const mockObjectMetadataItemsWithFieldMaps: ObjectMetadataItemWithFieldMa
isCustom: false,
isNullable: true,
isUnique: false,
workspaceId: '',
isLabelSyncedWithName: true,
createdAt: new Date(),
updatedAt: new Date(),
},
}) as FieldMetadataEntity,
},
fieldIdByName: {
name: 'nameFieldMetadataId',
@@ -189,7 +197,7 @@ export const mockObjectMetadataItemsWithFieldMaps: ObjectMetadataItemWithFieldMa
isSearchable: false,
labelIdentifierFieldMetadataId: '',
imageIdentifierFieldMetadataId: '',
workspaceId: '',
workspaceId,
indexMetadatas: [],
fieldsById: {},
fieldIdByName: {},
@@ -19,7 +19,7 @@ describe('computeSchemaComponents', () => {
).toMatchInlineSnapshot(`
{
"ObjectName": {
"description": undefined,
"description": "Object description",
"example": {
"fieldCurrency": {
"amountMicros": 284000000,
@@ -48,10 +48,13 @@ describe('computeSchemaComponents', () => {
"primaryPhoneCountryCode": "FR",
"primaryPhoneNumber": "06 10 20 30 40",
},
"fieldSelect": "OPTION_1",
"fieldSelect": [
"OPTION_1",
],
},
"properties": {
"fieldActor": {
"description": "Default field metadata entity description",
"properties": {
"source": {
"enum": [
@@ -70,6 +73,7 @@ describe('computeSchemaComponents', () => {
"type": "object",
},
"fieldAddress": {
"description": "Default field metadata entity description",
"properties": {
"addressCity": {
"type": "string",
@@ -99,15 +103,18 @@ describe('computeSchemaComponents', () => {
"type": "object",
},
"fieldArray": {
"description": "Default field metadata entity description",
"items": {
"type": "string",
},
"type": "array",
},
"fieldBoolean": {
"description": "Default field metadata entity description",
"type": "boolean",
},
"fieldCurrency": {
"description": "Default field metadata entity description",
"properties": {
"amountMicros": {
"type": "number",
@@ -119,14 +126,17 @@ describe('computeSchemaComponents', () => {
"type": "object",
},
"fieldDate": {
"description": "Default field metadata entity description",
"format": "date",
"type": "string",
},
"fieldDateTime": {
"description": "Default field metadata entity description",
"format": "date-time",
"type": "string",
},
"fieldEmails": {
"description": "Default field metadata entity description",
"properties": {
"additionalEmails": {
"items": {
@@ -142,6 +152,7 @@ describe('computeSchemaComponents', () => {
"type": "object",
},
"fieldFullName": {
"description": "Default field metadata entity description",
"properties": {
"firstName": {
"type": "string",
@@ -153,6 +164,7 @@ describe('computeSchemaComponents', () => {
"type": "object",
},
"fieldLinks": {
"description": "Default field metadata entity description",
"properties": {
"primaryLinkLabel": {
"type": "string",
@@ -180,6 +192,7 @@ describe('computeSchemaComponents', () => {
"type": "object",
},
"fieldMultiSelect": {
"description": "Default field metadata entity description",
"items": {
"enum": [
"OPTION_1",
@@ -190,12 +203,15 @@ describe('computeSchemaComponents', () => {
"type": "array",
},
"fieldNumber": {
"description": "Default field metadata entity description",
"type": "integer",
},
"fieldNumeric": {
"description": "Default field metadata entity description",
"type": "number",
},
"fieldPhones": {
"description": "Default field metadata entity description",
"properties": {
"additionalPhones": {
"items": {
@@ -216,9 +232,11 @@ describe('computeSchemaComponents', () => {
"type": "object",
},
"fieldPosition": {
"description": "Default field metadata entity description",
"type": "number",
},
"fieldRating": {
"description": "Default field metadata entity description",
"enum": [
"RATING_1",
"RATING_2",
@@ -226,6 +244,7 @@ describe('computeSchemaComponents', () => {
"type": "string",
},
"fieldRawJson": {
"description": "Default field metadata entity description",
"type": "object",
},
"fieldRelationId": {
@@ -233,9 +252,11 @@ describe('computeSchemaComponents', () => {
"type": "string",
},
"fieldRichText": {
"description": "Default field metadata entity description",
"type": "string",
},
"fieldSelect": {
"description": "Default field metadata entity description",
"enum": [
"OPTION_1",
"OPTION_2",
@@ -243,9 +264,11 @@ describe('computeSchemaComponents', () => {
"type": "string",
},
"fieldText": {
"description": "Default field metadata entity description",
"type": "string",
},
"fieldUuid": {
"description": "Default field metadata entity description",
"format": "uuid",
"type": "string",
},
@@ -256,9 +279,10 @@ describe('computeSchemaComponents', () => {
"type": "object",
},
"ObjectNameForResponse": {
"description": undefined,
"description": "Object description",
"properties": {
"fieldActor": {
"description": "Default field metadata entity description",
"properties": {
"name": {
"type": "string",
@@ -284,6 +308,7 @@ describe('computeSchemaComponents', () => {
"type": "object",
},
"fieldAddress": {
"description": "Default field metadata entity description",
"properties": {
"addressCity": {
"type": "string",
@@ -313,15 +338,18 @@ describe('computeSchemaComponents', () => {
"type": "object",
},
"fieldArray": {
"description": "Default field metadata entity description",
"items": {
"type": "string",
},
"type": "array",
},
"fieldBoolean": {
"description": "Default field metadata entity description",
"type": "boolean",
},
"fieldCurrency": {
"description": "Default field metadata entity description",
"properties": {
"amountMicros": {
"type": "number",
@@ -333,14 +361,17 @@ describe('computeSchemaComponents', () => {
"type": "object",
},
"fieldDate": {
"description": "Default field metadata entity description",
"format": "date",
"type": "string",
},
"fieldDateTime": {
"description": "Default field metadata entity description",
"format": "date-time",
"type": "string",
},
"fieldEmails": {
"description": "Default field metadata entity description",
"properties": {
"additionalEmails": {
"items": {
@@ -356,6 +387,7 @@ describe('computeSchemaComponents', () => {
"type": "object",
},
"fieldFullName": {
"description": "Default field metadata entity description",
"properties": {
"firstName": {
"type": "string",
@@ -367,6 +399,7 @@ describe('computeSchemaComponents', () => {
"type": "object",
},
"fieldLinks": {
"description": "Default field metadata entity description",
"properties": {
"primaryLinkLabel": {
"type": "string",
@@ -394,6 +427,7 @@ describe('computeSchemaComponents', () => {
"type": "object",
},
"fieldMultiSelect": {
"description": "Default field metadata entity description",
"items": {
"enum": [
"OPTION_1",
@@ -404,12 +438,15 @@ describe('computeSchemaComponents', () => {
"type": "array",
},
"fieldNumber": {
"description": "Default field metadata entity description",
"type": "integer",
},
"fieldNumeric": {
"description": "Default field metadata entity description",
"type": "number",
},
"fieldPhones": {
"description": "Default field metadata entity description",
"properties": {
"additionalPhones": {
"items": {
@@ -430,9 +467,11 @@ describe('computeSchemaComponents', () => {
"type": "object",
},
"fieldPosition": {
"description": "Default field metadata entity description",
"type": "number",
},
"fieldRating": {
"description": "Default field metadata entity description",
"enum": [
"RATING_1",
"RATING_2",
@@ -440,9 +479,11 @@ describe('computeSchemaComponents', () => {
"type": "string",
},
"fieldRawJson": {
"description": "Default field metadata entity description",
"type": "object",
},
"fieldRelation": {
"description": "Default field metadata entity description",
"oneOf": [
{
"$ref": "#/components/schemas/RelationTargetObjectForResponse",
@@ -455,9 +496,11 @@ describe('computeSchemaComponents', () => {
"type": "string",
},
"fieldRichText": {
"description": "Default field metadata entity description",
"type": "string",
},
"fieldSelect": {
"description": "Default field metadata entity description",
"enum": [
"OPTION_1",
"OPTION_2",
@@ -465,9 +508,11 @@ describe('computeSchemaComponents', () => {
"type": "string",
},
"fieldText": {
"description": "Default field metadata entity description",
"type": "string",
},
"fieldUuid": {
"description": "Default field metadata entity description",
"format": "uuid",
"type": "string",
},
@@ -475,7 +520,7 @@ describe('computeSchemaComponents', () => {
"type": "object",
},
"ObjectNameForUpdate": {
"description": undefined,
"description": "Object description",
"example": {
"fieldCurrency": {
"amountMicros": 253000000,
@@ -504,10 +549,13 @@ describe('computeSchemaComponents', () => {
"primaryPhoneCountryCode": "FR",
"primaryPhoneNumber": "06 10 20 30 40",
},
"fieldSelect": "OPTION_1",
"fieldSelect": [
"OPTION_1",
],
},
"properties": {
"fieldActor": {
"description": "Default field metadata entity description",
"properties": {
"source": {
"enum": [
@@ -526,6 +574,7 @@ describe('computeSchemaComponents', () => {
"type": "object",
},
"fieldAddress": {
"description": "Default field metadata entity description",
"properties": {
"addressCity": {
"type": "string",
@@ -555,15 +604,18 @@ describe('computeSchemaComponents', () => {
"type": "object",
},
"fieldArray": {
"description": "Default field metadata entity description",
"items": {
"type": "string",
},
"type": "array",
},
"fieldBoolean": {
"description": "Default field metadata entity description",
"type": "boolean",
},
"fieldCurrency": {
"description": "Default field metadata entity description",
"properties": {
"amountMicros": {
"type": "number",
@@ -575,14 +627,17 @@ describe('computeSchemaComponents', () => {
"type": "object",
},
"fieldDate": {
"description": "Default field metadata entity description",
"format": "date",
"type": "string",
},
"fieldDateTime": {
"description": "Default field metadata entity description",
"format": "date-time",
"type": "string",
},
"fieldEmails": {
"description": "Default field metadata entity description",
"properties": {
"additionalEmails": {
"items": {
@@ -598,6 +653,7 @@ describe('computeSchemaComponents', () => {
"type": "object",
},
"fieldFullName": {
"description": "Default field metadata entity description",
"properties": {
"firstName": {
"type": "string",
@@ -609,6 +665,7 @@ describe('computeSchemaComponents', () => {
"type": "object",
},
"fieldLinks": {
"description": "Default field metadata entity description",
"properties": {
"primaryLinkLabel": {
"type": "string",
@@ -636,6 +693,7 @@ describe('computeSchemaComponents', () => {
"type": "object",
},
"fieldMultiSelect": {
"description": "Default field metadata entity description",
"items": {
"enum": [
"OPTION_1",
@@ -646,12 +704,15 @@ describe('computeSchemaComponents', () => {
"type": "array",
},
"fieldNumber": {
"description": "Default field metadata entity description",
"type": "integer",
},
"fieldNumeric": {
"description": "Default field metadata entity description",
"type": "number",
},
"fieldPhones": {
"description": "Default field metadata entity description",
"properties": {
"additionalPhones": {
"items": {
@@ -672,9 +733,11 @@ describe('computeSchemaComponents', () => {
"type": "object",
},
"fieldPosition": {
"description": "Default field metadata entity description",
"type": "number",
},
"fieldRating": {
"description": "Default field metadata entity description",
"enum": [
"RATING_1",
"RATING_2",
@@ -682,6 +745,7 @@ describe('computeSchemaComponents', () => {
"type": "string",
},
"fieldRawJson": {
"description": "Default field metadata entity description",
"type": "object",
},
"fieldRelationId": {
@@ -689,9 +753,11 @@ describe('computeSchemaComponents', () => {
"type": "string",
},
"fieldRichText": {
"description": "Default field metadata entity description",
"type": "string",
},
"fieldSelect": {
"description": "Default field metadata entity description",
"enum": [
"OPTION_1",
"OPTION_2",
@@ -699,9 +765,11 @@ describe('computeSchemaComponents', () => {
"type": "string",
},
"fieldText": {
"description": "Default field metadata entity description",
"type": "string",
},
"fieldUuid": {
"description": "Default field metadata entity description",
"format": "uuid",
"type": "string",
},
@@ -81,11 +81,19 @@ export const generateRandomFieldValue = ({
}
case FieldMetadataType.SELECT: {
return isDefined(field.options[0].value) ? field.options[0].value : [];
if (!isDefined(field.options) || !isDefined(field.options[0].value)) {
return [];
}
return [field.options[0].value];
}
case FieldMetadataType.MULTI_SELECT: {
return isDefined(field.options[0].value) ? [field.options[0].value] : [];
if (!isDefined(field.options) || !isDefined(field.options[0].value)) {
return [];
}
return [field.options[0].value];
}
case FieldMetadataType.RELATION: