diff --git a/eslint.config.mjs b/eslint.config.mjs index d599977a70..ef7a65920c 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -60,7 +60,7 @@ export default [ }, { sourceTag: 'scope:sdk', - onlyDependOnLibsWithTags: ['scope:sdk'], + onlyDependOnLibsWithTags: ['scope:sdk', 'scope:shared'], }, { sourceTag: 'scope:shared', diff --git a/packages/twenty-apps/hello-world/src/objects/postCard.ts b/packages/twenty-apps/hello-world/src/objects/postCard.ts index 9b5b6aa2cf..90122bc849 100644 --- a/packages/twenty-apps/hello-world/src/objects/postCard.ts +++ b/packages/twenty-apps/hello-world/src/objects/postCard.ts @@ -1,4 +1,16 @@ -import { ObjectMetadata } from 'twenty-sdk/application'; +import { + BaseObjectMetadata, + FieldMetadata, + ObjectMetadata, + FieldMetadataType, +} from 'twenty-sdk/application'; + +enum PostCardStatus { + DRAFT = 'DRAFT', + SENT = 'SENT', + DELIVERED = 'DELIVERED', + RETURNED = 'RETURNED', +} @ObjectMetadata({ universalIdentifier: '54b589ca-eeed-4950-a176-358418b85c05', @@ -9,4 +21,76 @@ import { ObjectMetadata } from 'twenty-sdk/application'; description: ' A post card object', icon: 'IconMail', }) -export class PostCard {} +export class PostCard extends BaseObjectMetadata { + @FieldMetadata({ + universalIdentifier: '58a0a314-d7ea-4865-9850-7fb84e72f30b', + type: FieldMetadataType.TEXT, + label: 'Content', + description: "Postcard's content", + icon: 'IconAbc', + }) + content: string; + + @FieldMetadata({ + universalIdentifier: 'c6aa31f3-da76-4ac6-889f-475e226009ac', + type: FieldMetadataType.FULL_NAME, + label: 'Recipient name', + icon: 'IconUser', + }) + recipientName: string; + + @FieldMetadata({ + universalIdentifier: '95045777-a0ad-49ec-98f9-22f9fc0c8266', + type: FieldMetadataType.ADDRESS, + label: 'Recipient address', + icon: 'IconHome', + }) + recipientAddress: string; + + @FieldMetadata({ + universalIdentifier: '87b675b8-dd8c-4448-b4ca-20e5a2234a1e', + type: FieldMetadataType.SELECT, + label: 'Status', + icon: 'IconSend', + defaultValue: `'${PostCardStatus.DRAFT}'`, + options: [ + { + value: PostCardStatus.DRAFT, + label: 'Draft', + position: 0, + color: 'gray', + }, + { + value: PostCardStatus.SENT, + label: 'Sent', + position: 1, + color: 'orange', + }, + { + value: PostCardStatus.DELIVERED, + label: 'Delivered', + position: 2, + color: 'green', + }, + { + value: PostCardStatus.RETURNED, + label: 'Returned', + position: 3, + color: 'orange', + }, + ], + }) + status: PostCardStatus; + + // notes?: string // optional internal notes or comments + + @FieldMetadata({ + universalIdentifier: 'e06abe72-5b44-4e7f-93be-afc185a3c433', + type: FieldMetadataType.DATE_TIME, + label: 'Delivered at', + icon: 'IconCheck', + isNullable: true, + defaultValue: null, + }) + deliveredAt?: Date; +} diff --git a/packages/twenty-apps/hello-world/tsconfig.json b/packages/twenty-apps/hello-world/tsconfig.json index 17d258af13..2750650a88 100644 --- a/packages/twenty-apps/hello-world/tsconfig.json +++ b/packages/twenty-apps/hello-world/tsconfig.json @@ -9,7 +9,11 @@ "emitDecoratorMetadata": true, "experimentalDecorators": true, "importHelpers": true, - "strict": true, + "allowUnreachableCode": false, + "strictNullChecks": true, + "alwaysStrict": true, + "noImplicitAny": true, + "strictBindCallApply": false, "target": "es2018", "module": "esnext", "lib": ["es2020", "dom"], diff --git a/packages/twenty-cli/src/constants/base-application-project/tsconfig.json b/packages/twenty-cli/src/constants/base-application-project/tsconfig.json index 434ea6a985..9054b04575 100644 --- a/packages/twenty-cli/src/constants/base-application-project/tsconfig.json +++ b/packages/twenty-cli/src/constants/base-application-project/tsconfig.json @@ -10,7 +10,11 @@ "emitDecoratorMetadata": true, "experimentalDecorators": true, "importHelpers": true, - "strict": true, + "allowUnreachableCode": false, + "strictNullChecks": true, + "alwaysStrict": true, + "noImplicitAny": true, + "strictBindCallApply": false, "target": "es2018", "module": "esnext", "lib": ["es2020", "dom"], diff --git a/packages/twenty-cli/src/types/config.types.ts b/packages/twenty-cli/src/types/config.types.ts index d5499dde17..9ee4946326 100644 --- a/packages/twenty-cli/src/types/config.types.ts +++ b/packages/twenty-cli/src/types/config.types.ts @@ -73,6 +73,19 @@ export type ServerlessFunctionTriggerManifest = { export type Sources = { [key: string]: string | Sources }; +export type FieldMetadata = { + universalIdentifier: string; + type: string; + label: string; + description?: string; + icon?: string; + defaultValue?: any; + options?: any; + settings?: any; + isNullable?: boolean; + isFieldUiReadOnly?: boolean; +}; + export type ObjectManifest = { universalIdentifier: string; nameSingular: string; @@ -81,6 +94,7 @@ export type ObjectManifest = { labelPlural: string; description?: string; icon?: string; + fields: FieldMetadata[]; }; export interface ApiResponse { diff --git a/packages/twenty-cli/src/utils/__tests__/load-manifest.spec.ts b/packages/twenty-cli/src/utils/__tests__/load-manifest.spec.ts index fde3010c4c..3526c5ffe0 100644 --- a/packages/twenty-cli/src/utils/__tests__/load-manifest.spec.ts +++ b/packages/twenty-cli/src/utils/__tests__/load-manifest.spec.ts @@ -20,6 +20,7 @@ const tsLibMock = `declare module 'tslib' { export const __spreadArray: any; export const __assign: any; }`; + const twentySdkTypesMock = ` declare module 'twenty-sdk/application' { export type SyncableEntityOptions = { universalIdentifier: string }; @@ -76,6 +77,18 @@ declare module 'twenty-sdk/application' { export const ObjectMetadata = (_: ObjectMetadataOptions): ClassDecorator => { return () => {}; }; + + export class BaseObjectMetadata {} + + export enum FieldMetadataType { + TEXT = 'TEXT', + FULL_NAME = 'FULL_NAME', + ADDRESS = 'ADDRESS', + SELECT = 'SELECT', + DATE_TIME = 'DATE_TIME', + } + + export const FieldMetadata: (_: any) => PropertyDecorator; } `; @@ -111,7 +124,19 @@ export const config: ServerlessFunctionConfig = { ] };`; -const objectMock = `import { ObjectMetadata } from 'twenty-sdk/application'; +const objectMock = `import { + ObjectMetadata, + BaseObjectMetadata, + FieldMetadata, + FieldMetadataType +} from 'twenty-sdk/application'; + +enum PostCardStatus { + DRAFT = 'DRAFT', + SENT = 'SENT', + DELIVERED = 'DELIVERED', + RETURNED = 'RETURNED', +} @ObjectMetadata({ universalIdentifier: '54b589ca-eeed-4950-a176-358418b85c05', @@ -122,7 +147,72 @@ const objectMock = `import { ObjectMetadata } from 'twenty-sdk/application'; description: ' A post card object', icon: 'IconMail', }) -export class PostCard {} +export class PostCard extends BaseObjectMetadata { + @FieldMetadata({ + universalIdentifier: '58a0a314-d7ea-4865-9850-7fb84e72f30b', + type: FieldMetadataType.TEXT, + label: 'Content', + description: "Postcard's content", + }) + content: string; + + @FieldMetadata({ + universalIdentifier: 'c6aa31f3-da76-4ac6-889f-475e226009ac', + type: FieldMetadataType.FULL_NAME, + label: 'Recipient name', + }) + recipientName: string; + + @FieldMetadata({ + universalIdentifier: '95045777-a0ad-49ec-98f9-22f9fc0c8266', + type: FieldMetadataType.ADDRESS, + label: 'Recipient address', + }) + recipientAddress: string; + + @FieldMetadata({ + universalIdentifier: '87b675b8-dd8c-4448-b4ca-20e5a2234a1e', + type: FieldMetadataType.SELECT, + label: 'Status', + defaultValue: \`'\${PostCardStatus.DRAFT}'\`, + options: [ + { + value: PostCardStatus.DRAFT, + label: 'Draft', + position: 0, + color: 'gray', + }, + { + value: PostCardStatus.SENT, + label: 'Sent', + position: 1, + color: 'orange', + }, + { + value: PostCardStatus.DELIVERED, + label: 'Delivered', + position: 2, + color: 'green', + }, + { + value: PostCardStatus.RETURNED, + label: 'Returned', + position: 3, + color: 'orange', + }, + ], + }) + status: 'draft' | 'sent' | 'delivered' | 'returned'; + + @FieldMetadata({ + universalIdentifier: 'e06abe72-5b44-4e7f-93be-afc185a3c433', + type: FieldMetadataType.DATE_TIME, + label: 'Delivered at', + isNullable: true, + defaultValue: null, + }) + deliveredAt?: Date; +} `; describe('loadManifest (integration)', () => { @@ -178,10 +268,11 @@ describe('loadManifest (integration)', () => { description: 'My app description', }); - // objects collected from @ObjectMetadata + expect(manifest.objects.length).toBe(1); + for (const object of manifest.objects) { // eslint-disable-next-line @typescript-eslint/no-unused-vars - const { universalIdentifier: _, ...otherInfo } = object; + const { universalIdentifier: _, fields, ...otherInfo } = object; expect(otherInfo).toEqual({ description: ' A post card object', icon: 'IconMail', @@ -190,6 +281,61 @@ describe('loadManifest (integration)', () => { namePlural: 'postCards', nameSingular: 'postCard', }); + + expect(Array.isArray(fields)).toBe(true); + + expect(fields).toEqual([ + { + universalIdentifier: '58a0a314-d7ea-4865-9850-7fb84e72f30b', + type: 'TEXT', + label: 'Content', + description: "Postcard's content", + name: 'content', + }, + { + universalIdentifier: 'c6aa31f3-da76-4ac6-889f-475e226009ac', + type: 'FULL_NAME', + label: 'Recipient name', + name: 'recipientName', + }, + { + universalIdentifier: '95045777-a0ad-49ec-98f9-22f9fc0c8266', + type: 'ADDRESS', + label: 'Recipient address', + name: 'recipientAddress', + }, + { + universalIdentifier: '87b675b8-dd8c-4448-b4ca-20e5a2234a1e', + type: 'SELECT', + label: 'Status', + defaultValue: "'DRAFT'", + options: [ + { value: 'DRAFT', label: 'Draft', position: 0, color: 'gray' }, + { value: 'SENT', label: 'Sent', position: 1, color: 'orange' }, + { + value: 'DELIVERED', + label: 'Delivered', + position: 2, + color: 'green', + }, + { + value: 'RETURNED', + label: 'Returned', + position: 3, + color: 'orange', + }, + ], + name: 'status', + }, + { + universalIdentifier: 'e06abe72-5b44-4e7f-93be-afc185a3c433', + type: 'DATE_TIME', + label: 'Delivered at', + isNullable: true, + defaultValue: null, + name: 'deliveredAt', + }, + ]); } // serverless functions diff --git a/packages/twenty-cli/src/utils/load-manifest.ts b/packages/twenty-cli/src/utils/load-manifest.ts index 91d951a438..121018e614 100644 --- a/packages/twenty-cli/src/utils/load-manifest.ts +++ b/packages/twenty-cli/src/utils/load-manifest.ts @@ -31,6 +31,9 @@ import { isFunctionExpression, isExportAssignment, Modifier, + isPropertyDeclaration, + isNoSubstitutionTemplateLiteral, + isTemplateExpression, } from 'typescript'; import { AppManifest, @@ -39,6 +42,7 @@ import { PackageJson, ServerlessFunctionManifest, Sources, + FieldMetadata, } from '../types/config.types'; import { posix, relative, sep, resolve, join } from 'path'; import { parseJsoncFile, parseTextFile } from '../utils/jsonc-parser'; @@ -96,6 +100,25 @@ const exprToValue = (expr: Expression): JSONValue => { if (expr.kind === SyntaxKind.FalseKeyword) return false; if (expr.kind === SyntaxKind.NullKeyword) return null; + if (isPropertyAccessExpression(expr)) { + if (isIdentifier(expr.expression) && isIdentifier(expr.name)) { + return expr.name.text; + } + return String(expr.getText()); + } + + if (isNoSubstitutionTemplateLiteral(expr)) { + return expr.text; + } + if (isTemplateExpression(expr)) { + let out = expr.head.text; + for (const span of expr.templateSpans) { + const v = exprToValue(span.expression); + out += String(v) + span.literal.text; + } + return out; + } + if (isArrayLiteralExpression(expr)) { return expr.elements.map((e) => e.kind === SyntaxKind.SpreadElement ? [] : exprToValue(e), @@ -155,7 +178,42 @@ const collectObjects = (program: Program) => { if (objectDec) { const cfg = getFirstArgObject(objectDec); if (cfg && typeof cfg === 'object' && !Array.isArray(cfg)) { - manifest.push({ ...(cfg as any) } as ObjectManifest); + const fields: Array> = []; + + for (const member of node.members) { + if (!isPropertyDeclaration(member)) { + continue; + } + + const fieldDec = getDecorators(member)?.find((d) => + isDecoratorNamed(d, 'FieldMetadata'), + ); + + if (!fieldDec) { + continue; + } + + const fieldCfg = getFirstArgObject(fieldDec); + + if (!fieldCfg) { + continue; + } + + // Try to attach the TypeScript property name as "name" + let name: string | undefined; + if (member.name && isIdentifier(member.name)) { + name = member.name.text; + } else { + // fallback to AST text if not a simple identifier + name = member.name?.getText?.() ?? undefined; + } + + fields.push({ + ...(fieldCfg as FieldMetadata), + ...(name ? { name } : {}), + }); + } + manifest.push({ ...(cfg as any), fields } as ObjectManifest); } } } diff --git a/packages/twenty-front/src/modules/object-record/read-only/utils/__tests__/isObjectMetadataReadOnly.test.ts b/packages/twenty-front/src/modules/object-record/read-only/utils/__tests__/isObjectMetadataReadOnly.test.ts index 50c975b7df..3d7a7cdf06 100644 --- a/packages/twenty-front/src/modules/object-record/read-only/utils/__tests__/isObjectMetadataReadOnly.test.ts +++ b/packages/twenty-front/src/modules/object-record/read-only/utils/__tests__/isObjectMetadataReadOnly.test.ts @@ -65,7 +65,7 @@ describe('isObjectMetadataReadOnly', () => { expect(result).toBe(true); }); - it('should return true if object is managed by application', () => { + it('should return false if object is managed by application', () => { const result = isObjectMetadataReadOnly({ objectMetadataItem: { applicationId: 'applicationId', @@ -74,7 +74,7 @@ describe('isObjectMetadataReadOnly', () => { }, }); - expect(result).toBe(true); + expect(result).toBe(false); }); it('should return false if object is custom', () => { diff --git a/packages/twenty-front/src/modules/object-record/read-only/utils/__tests__/isObjectMetadataSettingsReadOnly.test.ts b/packages/twenty-front/src/modules/object-record/read-only/utils/__tests__/isObjectMetadataSettingsReadOnly.test.ts new file mode 100644 index 0000000000..5ba8306e0c --- /dev/null +++ b/packages/twenty-front/src/modules/object-record/read-only/utils/__tests__/isObjectMetadataSettingsReadOnly.test.ts @@ -0,0 +1,36 @@ +import { isObjectMetadataSettingsReadOnly } from '@/object-record/read-only/utils/isObjectMetadataSettingsReadOnly'; + +describe('isObjectMetadataSettingsReadOnly', () => { + it('should return false if object can be updated and is not UI read only and is not remote', () => { + const result = isObjectMetadataSettingsReadOnly({ + objectPermissions: { + canUpdateObjectRecords: true, + objectMetadataId: '123', + restrictedFields: {}, + }, + objectMetadataItem: { + isUIReadOnly: false, + isRemote: false, + }, + }); + + expect(result).toBe(false); + }); + + it('should return true if object is managed by application', () => { + const result = isObjectMetadataSettingsReadOnly({ + objectPermissions: { + canUpdateObjectRecords: true, + objectMetadataId: '123', + restrictedFields: {}, + }, + objectMetadataItem: { + applicationId: 'applicationId', + isUIReadOnly: false, + isRemote: false, + }, + }); + + expect(result).toBe(true); + }); +}); diff --git a/packages/twenty-front/src/modules/object-record/read-only/utils/isFieldMetadataReadOnly.ts b/packages/twenty-front/src/modules/object-record/read-only/utils/isFieldMetadataReadOnly.ts deleted file mode 100644 index adc92f1556..0000000000 --- a/packages/twenty-front/src/modules/object-record/read-only/utils/isFieldMetadataReadOnly.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { type FieldMetadataItem } from '@/object-metadata/types/FieldMetadataItem'; -import { type ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem'; -import { isFieldMetadataReadOnlyByPermissions } from '@/object-record/read-only/utils/internal/isFieldMetadataReadOnlyByPermissions'; -import { isObjectMetadataReadOnly } from '@/object-record/read-only/utils/isObjectMetadataReadOnly'; -import { type ObjectPermission } from '~/generated/graphql'; - -type IsFieldMetadataReadOnlyParams = { - objectPermissions: ObjectPermission; - objectMetadataItem: Pick; - fieldMetadataItem: Pick; -}; - -export const isFieldMetadataReadOnly = ({ - objectPermissions, - objectMetadataItem, - fieldMetadataItem, -}: IsFieldMetadataReadOnlyParams) => { - const objectMetadataReadOnly = isObjectMetadataReadOnly({ - objectPermissions, - objectMetadataItem, - }); - - const fieldReadOnlyByPermissions = isFieldMetadataReadOnlyByPermissions({ - objectPermissions, - fieldMetadataId: fieldMetadataItem.id, - }); - - return ( - objectMetadataReadOnly || - fieldMetadataItem.isUIReadOnly || - fieldReadOnlyByPermissions - ); -}; diff --git a/packages/twenty-front/src/modules/object-record/read-only/utils/isObjectMetadataReadOnly.ts b/packages/twenty-front/src/modules/object-record/read-only/utils/isObjectMetadataReadOnly.ts index 39fe559e90..254e6da5b4 100644 --- a/packages/twenty-front/src/modules/object-record/read-only/utils/isObjectMetadataReadOnly.ts +++ b/packages/twenty-front/src/modules/object-record/read-only/utils/isObjectMetadataReadOnly.ts @@ -17,8 +17,7 @@ export const isObjectMetadataReadOnly = ({ return ( (isDefined(objectPermissions) && !objectPermissions.canUpdateObjectRecords) || - objectMetadataItem?.isUIReadOnly || - objectMetadataItem?.isRemote || - isDefined(objectMetadataItem?.applicationId) + (isDefined(objectMetadataItem) && + (objectMetadataItem.isUIReadOnly || objectMetadataItem.isRemote)) ); }; diff --git a/packages/twenty-front/src/modules/object-record/read-only/utils/isObjectMetadataSettingsReadOnly.ts b/packages/twenty-front/src/modules/object-record/read-only/utils/isObjectMetadataSettingsReadOnly.ts new file mode 100644 index 0000000000..7b8877271f --- /dev/null +++ b/packages/twenty-front/src/modules/object-record/read-only/utils/isObjectMetadataSettingsReadOnly.ts @@ -0,0 +1,22 @@ +import { type ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem'; +import { type ObjectPermission } from '~/generated/graphql'; +import { isDefined } from 'twenty-shared/utils'; +import { isObjectMetadataReadOnly } from '@/object-record/read-only/utils/isObjectMetadataReadOnly'; + +type IsObjectMetadataReadOnlyParams = { + objectPermissions?: ObjectPermission; + objectMetadataItem?: Pick< + ObjectMetadataItem, + 'isUIReadOnly' | 'isRemote' | 'applicationId' + >; +}; + +export const isObjectMetadataSettingsReadOnly = ({ + objectPermissions, + objectMetadataItem, +}: IsObjectMetadataReadOnlyParams) => { + return ( + isObjectMetadataReadOnly({ objectPermissions, objectMetadataItem }) || + isDefined(objectMetadataItem?.applicationId) + ); +}; diff --git a/packages/twenty-front/src/modules/settings/data-model/object-details/components/SettingsObjectFieldItemTableRow.tsx b/packages/twenty-front/src/modules/settings/data-model/object-details/components/SettingsObjectFieldItemTableRow.tsx index 1e91a9fc8b..c94318f373 100644 --- a/packages/twenty-front/src/modules/settings/data-model/object-details/components/SettingsObjectFieldItemTableRow.tsx +++ b/packages/twenty-front/src/modules/settings/data-model/object-details/components/SettingsObjectFieldItemTableRow.tsx @@ -4,7 +4,6 @@ import { useGetRelationMetadata } from '@/object-metadata/hooks/useGetRelationMe import { useUpdateOneObjectMetadataItem } from '@/object-metadata/hooks/useUpdateOneObjectMetadataItem'; import { type FieldMetadataItem } from '@/object-metadata/types/FieldMetadataItem'; import { isLabelIdentifierField } from '@/object-metadata/utils/isLabelIdentifierField'; -import { isObjectMetadataReadOnly } from '@/object-record/read-only/utils/isObjectMetadataReadOnly'; import { SettingsObjectFieldActiveActionDropdown } from '@/settings/data-model/object-details/components/SettingsObjectFieldActiveActionDropdown'; import { SettingsObjectFieldInactiveActionDropdown } from '@/settings/data-model/object-details/components/SettingsObjectFieldDisabledActionDropdown'; import { settingsObjectFieldsFamilyState } from '@/settings/data-model/object-details/states/settingsObjectFieldsFamilyState'; @@ -31,6 +30,7 @@ import { type SettingsObjectDetailTableItem } from '~/pages/settings/data-model/ import { RELATION_TYPES } from '../../constants/RelationTypes'; import { SettingsObjectFieldDataType } from './SettingsObjectFieldDataType'; +import { isObjectMetadataSettingsReadOnly } from '@/object-record/read-only/utils/isObjectMetadataSettingsReadOnly'; type SettingsObjectFieldItemTableRowProps = { settingsObjectDetailTableItem: SettingsObjectDetailTableItem; @@ -66,7 +66,7 @@ export const SettingsObjectFieldItemTableRow = ({ const { fieldMetadataItem, identifierType, objectMetadataItem } = settingsObjectDetailTableItem; - const readonly = isObjectMetadataReadOnly({ + const readonly = isObjectMetadataSettingsReadOnly({ objectMetadataItem, }); diff --git a/packages/twenty-front/src/modules/settings/data-model/object-details/components/SettingsUpdateDataModelObjectAboutForm.tsx b/packages/twenty-front/src/modules/settings/data-model/object-details/components/SettingsUpdateDataModelObjectAboutForm.tsx index 246e235b38..415592b0fe 100644 --- a/packages/twenty-front/src/modules/settings/data-model/object-details/components/SettingsUpdateDataModelObjectAboutForm.tsx +++ b/packages/twenty-front/src/modules/settings/data-model/object-details/components/SettingsUpdateDataModelObjectAboutForm.tsx @@ -1,6 +1,5 @@ import { useUpdateOneObjectMetadataItem } from '@/object-metadata/hooks/useUpdateOneObjectMetadataItem'; import { type ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem'; -import { isObjectMetadataReadOnly } from '@/object-record/read-only/utils/isObjectMetadataReadOnly'; import { SettingsDataModelObjectAboutForm } from '@/settings/data-model/objects/forms/components/SettingsDataModelObjectAboutForm'; import { type SettingsDataModelObjectAboutFormValues, @@ -12,6 +11,7 @@ import { useSetRecoilState } from 'recoil'; import { SettingsPath } from 'twenty-shared/types'; import { useNavigateSettings } from '~/hooks/useNavigateSettings'; import { updatedObjectNamePluralState } from '~/pages/settings/data-model/states/updatedObjectNamePluralState'; +import { isObjectMetadataSettingsReadOnly } from '@/object-record/read-only/utils/isObjectMetadataSettingsReadOnly'; type SettingsUpdateDataModelObjectAboutFormProps = { objectMetadataItem: ObjectMetadataItem; @@ -20,7 +20,7 @@ type SettingsUpdateDataModelObjectAboutFormProps = { export const SettingsUpdateDataModelObjectAboutForm = ({ objectMetadataItem, }: SettingsUpdateDataModelObjectAboutFormProps) => { - const readonly = isObjectMetadataReadOnly({ objectMetadataItem }); + const readonly = isObjectMetadataSettingsReadOnly({ objectMetadataItem }); const navigate = useNavigateSettings(); const setUpdatedObjectNamePlural = useSetRecoilState( updatedObjectNamePluralState, diff --git a/packages/twenty-front/src/modules/settings/data-model/object-details/components/tabs/ObjectFields.tsx b/packages/twenty-front/src/modules/settings/data-model/object-details/components/tabs/ObjectFields.tsx index 54c6ead8a5..2c0a160c08 100644 --- a/packages/twenty-front/src/modules/settings/data-model/object-details/components/tabs/ObjectFields.tsx +++ b/packages/twenty-front/src/modules/settings/data-model/object-details/components/tabs/ObjectFields.tsx @@ -9,7 +9,7 @@ import { H2Title, IconPlus } from 'twenty-ui/display'; import { Button } from 'twenty-ui/input'; import { Section } from 'twenty-ui/layout'; import { UndecoratedLink } from 'twenty-ui/navigation'; -import { isObjectMetadataReadOnly } from '@/object-record/read-only/utils/isObjectMetadataReadOnly'; +import { isObjectMetadataSettingsReadOnly } from '@/object-record/read-only/utils/isObjectMetadataSettingsReadOnly'; const StyledDiv = styled.div` display: flex; @@ -22,7 +22,7 @@ type ObjectFieldsProps = { }; export const ObjectFields = ({ objectMetadataItem }: ObjectFieldsProps) => { - const readonly = isObjectMetadataReadOnly({ + const readonly = isObjectMetadataSettingsReadOnly({ objectMetadataItem, }); diff --git a/packages/twenty-front/src/modules/settings/data-model/object-details/components/tabs/ObjectSettings.tsx b/packages/twenty-front/src/modules/settings/data-model/object-details/components/tabs/ObjectSettings.tsx index 9454fa0d2b..4ce80f5450 100644 --- a/packages/twenty-front/src/modules/settings/data-model/object-details/components/tabs/ObjectSettings.tsx +++ b/packages/twenty-front/src/modules/settings/data-model/object-details/components/tabs/ObjectSettings.tsx @@ -1,7 +1,6 @@ import { type ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem'; import { useUpdateOneObjectMetadataItem } from '@/object-metadata/hooks/useUpdateOneObjectMetadataItem'; -import { isObjectMetadataReadOnly } from '@/object-record/read-only/utils/isObjectMetadataReadOnly'; import { SettingsUpdateDataModelObjectAboutForm } from '@/settings/data-model/object-details/components/SettingsUpdateDataModelObjectAboutForm'; import { SettingsDataModelObjectSettingsFormCard } from '@/settings/data-model/objects/forms/components/SettingsDataModelObjectSettingsFormCard'; import styled from '@emotion/styled'; @@ -11,6 +10,7 @@ import { H2Title, IconArchive } from 'twenty-ui/display'; import { Button } from 'twenty-ui/input'; import { Section } from 'twenty-ui/layout'; import { useNavigateSettings } from '~/hooks/useNavigateSettings'; +import { isObjectMetadataSettingsReadOnly } from '@/object-record/read-only/utils/isObjectMetadataSettingsReadOnly'; type ObjectSettingsProps = { objectMetadataItem: ObjectMetadataItem; @@ -28,7 +28,7 @@ const StyledFormSection = styled(Section)` export const ObjectSettings = ({ objectMetadataItem }: ObjectSettingsProps) => { const { t } = useLingui(); - const readonly = isObjectMetadataReadOnly({ objectMetadataItem }); + const readonly = isObjectMetadataSettingsReadOnly({ objectMetadataItem }); const navigate = useNavigateSettings(); const { updateOneObjectMetadataItem } = useUpdateOneObjectMetadataItem(); diff --git a/packages/twenty-front/src/modules/settings/data-model/objects/forms/components/SettingsDataModelObjectIdentifiersForm.tsx b/packages/twenty-front/src/modules/settings/data-model/objects/forms/components/SettingsDataModelObjectIdentifiersForm.tsx index b9545a7ec7..e115aa7aae 100644 --- a/packages/twenty-front/src/modules/settings/data-model/objects/forms/components/SettingsDataModelObjectIdentifiersForm.tsx +++ b/packages/twenty-front/src/modules/settings/data-model/objects/forms/components/SettingsDataModelObjectIdentifiersForm.tsx @@ -2,7 +2,6 @@ import { useUpdateOneObjectMetadataItem } from '@/object-metadata/hooks/useUpdat import { type ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem'; import { getActiveFieldMetadataItems } from '@/object-metadata/utils/getActiveFieldMetadataItems'; import { objectMetadataItemSchema } from '@/object-metadata/validation-schemas/objectMetadataItemSchema'; -import { isObjectMetadataReadOnly } from '@/object-record/read-only/utils/isObjectMetadataReadOnly'; import { Select } from '@/ui/input/components/Select'; import styled from '@emotion/styled'; import { zodResolver } from '@hookform/resolvers/zod'; @@ -14,6 +13,7 @@ import { isLabelIdentifierFieldMetadataTypes } from 'twenty-shared/utils'; import { IconCircleOff, IconPlus, useIcons } from 'twenty-ui/display'; import { type SelectOption } from 'twenty-ui/input'; import { type z } from 'zod'; +import { isObjectMetadataSettingsReadOnly } from '@/object-record/read-only/utils/isObjectMetadataSettingsReadOnly'; export const settingsDataModelObjectIdentifiersFormSchema = objectMetadataItemSchema.pick({ @@ -42,7 +42,7 @@ const StyledContainer = styled.div` export const SettingsDataModelObjectIdentifiersForm = ({ objectMetadataItem, }: SettingsDataModelObjectIdentifiersFormProps) => { - const readonly = isObjectMetadataReadOnly({ objectMetadataItem }); + const readonly = isObjectMetadataSettingsReadOnly({ objectMetadataItem }); const formConfig = useForm({ mode: 'onTouched', resolver: zodResolver(settingsDataModelObjectIdentifiersFormSchema), diff --git a/packages/twenty-front/src/pages/settings/data-model/SettingsObjectDetailPage.tsx b/packages/twenty-front/src/pages/settings/data-model/SettingsObjectDetailPage.tsx index ee025d3dcb..820a8bb31e 100644 --- a/packages/twenty-front/src/pages/settings/data-model/SettingsObjectDetailPage.tsx +++ b/packages/twenty-front/src/pages/settings/data-model/SettingsObjectDetailPage.tsx @@ -14,7 +14,6 @@ import styled from '@emotion/styled'; import { useRecoilState, useRecoilValue } from 'recoil'; import { AppPath, SettingsPath } from 'twenty-shared/types'; -import { isObjectMetadataReadOnly } from '@/object-record/read-only/utils/isObjectMetadataReadOnly'; import { SettingsItemTypeTag } from '@/settings/components/SettingsItemTypeTag'; import { activeTabIdComponentState } from '@/ui/layout/tab-list/states/activeTabIdComponentState'; import { useRecoilComponentValue } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValue'; @@ -35,6 +34,7 @@ import { FeatureFlagKey } from '~/generated/graphql'; import { useNavigateApp } from '~/hooks/useNavigateApp'; import { SETTINGS_OBJECT_DETAIL_TABS } from '~/pages/settings/data-model/constants/SettingsObjectDetailTabs'; import { updatedObjectNamePluralState } from '~/pages/settings/data-model/states/updatedObjectNamePluralState'; +import { isObjectMetadataSettingsReadOnly } from '@/object-record/read-only/utils/isObjectMetadataSettingsReadOnly'; const StyledContentContainer = styled.div` flex: 1; @@ -67,7 +67,7 @@ export const SettingsObjectDetailPage = () => { findActiveObjectMetadataItemByNamePlural(objectNamePlural) ?? findActiveObjectMetadataItemByNamePlural(updatedObjectNamePlural); - const readonly = isObjectMetadataReadOnly({ objectMetadataItem }); + const readonly = isObjectMetadataSettingsReadOnly({ objectMetadataItem }); const activeTabId = useRecoilComponentValue( activeTabIdComponentState, diff --git a/packages/twenty-front/src/pages/settings/data-model/SettingsObjectFieldEdit.tsx b/packages/twenty-front/src/pages/settings/data-model/SettingsObjectFieldEdit.tsx index faa75d399a..2b067240af 100644 --- a/packages/twenty-front/src/pages/settings/data-model/SettingsObjectFieldEdit.tsx +++ b/packages/twenty-front/src/pages/settings/data-model/SettingsObjectFieldEdit.tsx @@ -12,7 +12,6 @@ import { useUpdateOneFieldMetadataItem } from '@/object-metadata/hooks/useUpdate import { CoreObjectNamePlural } from '@/object-metadata/types/CoreObjectNamePlural'; import { formatFieldMetadataItemInput } from '@/object-metadata/utils/formatFieldMetadataItemInput'; import { isLabelIdentifierField } from '@/object-metadata/utils/isLabelIdentifierField'; -import { isObjectMetadataReadOnly } from '@/object-record/read-only/utils/isObjectMetadataReadOnly'; import { SaveAndCancelButtons } from '@/settings/components/SaveAndCancelButtons/SaveAndCancelButtons'; import { SettingsPageContainer } from '@/settings/components/SettingsPageContainer'; import { FIELD_NAME_MAXIMUM_LENGTH } from '@/settings/data-model/constants/FieldNameMaximumLength'; @@ -34,6 +33,7 @@ import { Section } from 'twenty-ui/layout'; import { FieldMetadataType } from '~/generated-metadata/graphql'; import { useNavigateApp } from '~/hooks/useNavigateApp'; import { useNavigateSettings } from '~/hooks/useNavigateSettings'; +import { isObjectMetadataSettingsReadOnly } from '@/object-record/read-only/utils/isObjectMetadataSettingsReadOnly'; //TODO: fix this type export type SettingsDataModelFieldEditFormValues = z.infer< @@ -64,7 +64,7 @@ export const SettingsObjectFieldEdit = () => { const objectMetadataItem = findObjectMetadataItemByNamePlural(objectNamePlural); - const readonly = isObjectMetadataReadOnly({ objectMetadataItem }); + const readonly = isObjectMetadataSettingsReadOnly({ objectMetadataItem }); const { deactivateMetadataField, activateMetadataField } = useFieldMetadataItem(); diff --git a/packages/twenty-sdk/src/application/types/application-config.ts b/packages/twenty-sdk/src/application/application-config.ts similarity index 76% rename from packages/twenty-sdk/src/application/types/application-config.ts rename to packages/twenty-sdk/src/application/application-config.ts index 098ca4e928..2671a8f60c 100644 --- a/packages/twenty-sdk/src/application/types/application-config.ts +++ b/packages/twenty-sdk/src/application/application-config.ts @@ -1,4 +1,4 @@ -import { type SyncableEntityOptions } from '@/application/types/syncable-entity-options.type'; +import { type SyncableEntityOptions } from '@/application/syncable-entity-options.type'; type ApplicationVariable = SyncableEntityOptions & { value?: string; diff --git a/packages/twenty-sdk/src/application/base-object-metadata.ts b/packages/twenty-sdk/src/application/base-object-metadata.ts new file mode 100644 index 0000000000..b01794a4b8 --- /dev/null +++ b/packages/twenty-sdk/src/application/base-object-metadata.ts @@ -0,0 +1,23 @@ +export abstract class BaseObjectMetadata { + id: string; + + name: string; + + createdBy: string; + + position: number; + + searchVector: string | null; + + //taskTargets + //noteTargets + //attachments + //favorites + //timelineActivities + + createdAt: string; + + updatedAt: string; + + deletedAt: string | null; +} diff --git a/packages/twenty-sdk/src/application/field-metadata-type.ts b/packages/twenty-sdk/src/application/field-metadata-type.ts new file mode 100644 index 0000000000..f465b97d66 --- /dev/null +++ b/packages/twenty-sdk/src/application/field-metadata-type.ts @@ -0,0 +1 @@ +export { FieldMetadataType } from 'twenty-shared/types'; diff --git a/packages/twenty-sdk/src/application/field-metadata.decorator.ts b/packages/twenty-sdk/src/application/field-metadata.decorator.ts new file mode 100644 index 0000000000..d796d81484 --- /dev/null +++ b/packages/twenty-sdk/src/application/field-metadata.decorator.ts @@ -0,0 +1,31 @@ +import { type SyncableEntityOptions } from '@/application/syncable-entity-options.type'; + +import { + type FieldMetadataType, + type FieldMetadataSettings, + type FieldMetadataOptions, + type FieldMetadataDefaultValue, +} from 'twenty-shared/types'; + +type FieldOptions< + T extends FieldMetadataType = Exclude< + FieldMetadataType, + // Use @WorkspaceRelation or @WorkspaceDynamicRelation for relation fields + FieldMetadataType.RELATION + >, +> = SyncableEntityOptions & { + type: T; + label: string; + description?: string; + icon?: string; + defaultValue?: FieldMetadataDefaultValue; + options?: FieldMetadataOptions; + settings?: FieldMetadataSettings; + isNullable?: boolean; +}; + +export const FieldMetadata = ( + _: FieldOptions, +): PropertyDecorator => { + return () => {}; +}; diff --git a/packages/twenty-sdk/src/application/index.ts b/packages/twenty-sdk/src/application/index.ts index 2e91c59a22..0d911aa241 100644 --- a/packages/twenty-sdk/src/application/index.ts +++ b/packages/twenty-sdk/src/application/index.ts @@ -7,7 +7,10 @@ * |___/ */ -export { ObjectMetadata } from './decorators/object-metadata.decorator'; -export type { ApplicationConfig } from './types/application-config'; -export type { ServerlessFunctionConfig } from './types/serverless-function-config'; -export type { SyncableEntityOptions } from './types/syncable-entity-options.type'; +export type { ApplicationConfig } from './application-config'; +export { BaseObjectMetadata } from './base-object-metadata'; +export { FieldMetadataType } from './field-metadata-type'; +export { FieldMetadata } from './field-metadata.decorator'; +export { ObjectMetadata } from './object-metadata.decorator'; +export type { ServerlessFunctionConfig } from './serverless-function-config'; +export type { SyncableEntityOptions } from './syncable-entity-options.type'; diff --git a/packages/twenty-sdk/src/application/decorators/object-metadata.decorator.ts b/packages/twenty-sdk/src/application/object-metadata.decorator.ts similarity index 75% rename from packages/twenty-sdk/src/application/decorators/object-metadata.decorator.ts rename to packages/twenty-sdk/src/application/object-metadata.decorator.ts index 6b00c1ce86..f066a96761 100644 --- a/packages/twenty-sdk/src/application/decorators/object-metadata.decorator.ts +++ b/packages/twenty-sdk/src/application/object-metadata.decorator.ts @@ -1,4 +1,4 @@ -import { type SyncableEntityOptions } from '@/application/types/syncable-entity-options.type'; +import { type SyncableEntityOptions } from '@/application/syncable-entity-options.type'; type ObjectMetadataOptions = SyncableEntityOptions & { nameSingular: string; diff --git a/packages/twenty-sdk/src/application/types/serverless-function-config.ts b/packages/twenty-sdk/src/application/serverless-function-config.ts similarity index 85% rename from packages/twenty-sdk/src/application/types/serverless-function-config.ts rename to packages/twenty-sdk/src/application/serverless-function-config.ts index 067eeb4a38..a06afe43e3 100644 --- a/packages/twenty-sdk/src/application/types/serverless-function-config.ts +++ b/packages/twenty-sdk/src/application/serverless-function-config.ts @@ -1,4 +1,4 @@ -import { type SyncableEntityOptions } from '@/application/types/syncable-entity-options.type'; +import { type SyncableEntityOptions } from '@/application/syncable-entity-options.type'; type RouteTrigger = { type: 'route'; diff --git a/packages/twenty-sdk/src/application/types/syncable-entity-options.type.ts b/packages/twenty-sdk/src/application/syncable-entity-options.type.ts similarity index 100% rename from packages/twenty-sdk/src/application/types/syncable-entity-options.type.ts rename to packages/twenty-sdk/src/application/syncable-entity-options.type.ts diff --git a/packages/twenty-sdk/tsconfig.json b/packages/twenty-sdk/tsconfig.json index 2650d04272..4287c94286 100644 --- a/packages/twenty-sdk/tsconfig.json +++ b/packages/twenty-sdk/tsconfig.json @@ -8,8 +8,12 @@ "moduleResolution": "node", "emitDecoratorMetadata": true, "experimentalDecorators": true, - "strict": true, "importHelpers": true, + "allowUnreachableCode": false, + "strictNullChecks": true, + "alwaysStrict": true, + "noImplicitAny": true, + "strictBindCallApply": false, "target": "es2018", "module": "esnext", "lib": ["es2020", "dom"], diff --git a/packages/twenty-server/src/engine/api/__mocks__/object-metadata-item.mock.ts b/packages/twenty-server/src/engine/api/__mocks__/object-metadata-item.mock.ts index a5ec16eae6..75146f7260 100644 --- a/packages/twenty-server/src/engine/api/__mocks__/object-metadata-item.mock.ts +++ b/packages/twenty-server/src/engine/api/__mocks__/object-metadata-item.mock.ts @@ -1,6 +1,5 @@ -import { FieldMetadataType } from 'twenty-shared/types'; +import { FieldMetadataType, RelationOnDeleteAction } from 'twenty-shared/types'; -import { RelationOnDeleteAction } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-on-delete-action.interface'; import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface'; import { FieldActorSource } from 'src/engine/metadata-modules/field-metadata/composite-types/actor.composite-type'; diff --git a/packages/twenty-server/src/engine/api/common/common-query-runners/common-merge-many-query-runner.service.ts b/packages/twenty-server/src/engine/api/common/common-query-runners/common-merge-many-query-runner.service.ts index 33059e504e..8caae1efef 100644 --- a/packages/twenty-server/src/engine/api/common/common-query-runners/common-merge-many-query-runner.service.ts +++ b/packages/twenty-server/src/engine/api/common/common-query-runners/common-merge-many-query-runner.service.ts @@ -8,13 +8,13 @@ import { FieldMetadataType, ObjectRecord, RelationType, + FieldMetadataRelationSettings, } from 'twenty-shared/types'; import { isDefined } from 'twenty-shared/utils'; import { FindOptionsRelations, In, ObjectLiteral } from 'typeorm'; import { v4 as uuidv4 } from 'uuid'; import { WorkspaceAuthContext } from 'src/engine/api/common/interfaces/workspace-auth-context.interface'; -import { FieldMetadataRelationSettings } from 'src/engine/metadata-modules/field-metadata/interfaces/field-metadata-settings.interface'; import { CommonBaseQueryRunnerService } from 'src/engine/api/common/common-query-runners/common-base-query-runner.service'; import { diff --git a/packages/twenty-server/src/engine/api/graphql/workspace-schema-builder/services/type-mapper.service.ts b/packages/twenty-server/src/engine/api/graphql/workspace-schema-builder/services/type-mapper.service.ts index dfda32e7f9..7408fa9cd4 100644 --- a/packages/twenty-server/src/engine/api/graphql/workspace-schema-builder/services/type-mapper.service.ts +++ b/packages/twenty-server/src/engine/api/graphql/workspace-schema-builder/services/type-mapper.service.ts @@ -14,14 +14,14 @@ import { type GraphQLType, } from 'graphql'; import GraphQLJSON from 'graphql-type-json'; -import { FieldMetadataType } from 'twenty-shared/types'; import { isDefined } from 'twenty-shared/utils'; - -import { FieldMetadataDefaultValue } from 'src/engine/metadata-modules/field-metadata/interfaces/field-metadata-default-value.interface'; import { + FieldMetadataType, type FieldMetadataSettings, NumberDataType, -} from 'src/engine/metadata-modules/field-metadata/interfaces/field-metadata-settings.interface'; +} from 'twenty-shared/types'; + +import { FieldMetadataDefaultValue } from 'src/engine/metadata-modules/field-metadata/interfaces/field-metadata-default-value.interface'; import { AggregateOperations } from 'src/engine/api/graphql/graphql-query-runner/constants/aggregate-operations.constant'; import { OrderByDirectionType } from 'src/engine/api/graphql/workspace-schema-builder/graphql-types/enum'; diff --git a/packages/twenty-server/src/engine/api/graphql/workspace-schema-builder/utils/get-number-filter-type.util.ts b/packages/twenty-server/src/engine/api/graphql/workspace-schema-builder/utils/get-number-filter-type.util.ts index eb6b33ebc7..8ac200a24b 100644 --- a/packages/twenty-server/src/engine/api/graphql/workspace-schema-builder/utils/get-number-filter-type.util.ts +++ b/packages/twenty-server/src/engine/api/graphql/workspace-schema-builder/utils/get-number-filter-type.util.ts @@ -1,6 +1,5 @@ import { type GraphQLInputObjectType } from 'graphql'; - -import { NumberDataType } from 'src/engine/metadata-modules/field-metadata/interfaces/field-metadata-settings.interface'; +import { NumberDataType } from 'twenty-shared/types'; import { BigIntFilterType, diff --git a/packages/twenty-server/src/engine/api/graphql/workspace-schema-builder/utils/get-number-scalar-type.util.ts b/packages/twenty-server/src/engine/api/graphql/workspace-schema-builder/utils/get-number-scalar-type.util.ts index faca393320..be6f604cbd 100644 --- a/packages/twenty-server/src/engine/api/graphql/workspace-schema-builder/utils/get-number-scalar-type.util.ts +++ b/packages/twenty-server/src/engine/api/graphql/workspace-schema-builder/utils/get-number-scalar-type.util.ts @@ -1,7 +1,6 @@ import { GraphQLInt, GraphQLFloat, type GraphQLScalarType } from 'graphql'; import { GraphQLBigInt } from 'graphql-scalars'; - -import { NumberDataType } from 'src/engine/metadata-modules/field-metadata/interfaces/field-metadata-settings.interface'; +import { NumberDataType } from 'twenty-shared/types'; export const getNumberScalarType = ( dataType: NumberDataType, diff --git a/packages/twenty-server/src/engine/core-modules/application/application-exception-filter.ts b/packages/twenty-server/src/engine/core-modules/application/application-exception-filter.ts index dbdffdc667..a6e95b68b3 100644 --- a/packages/twenty-server/src/engine/core-modules/application/application-exception-filter.ts +++ b/packages/twenty-server/src/engine/core-modules/application/application-exception-filter.ts @@ -13,6 +13,7 @@ export class ApplicationExceptionFilter implements ExceptionFilter { catch(exception: ApplicationException) { switch (exception.code) { case ApplicationExceptionCode.OBJECT_NOT_FOUND: + case ApplicationExceptionCode.FIELD_NOT_FOUND: case ApplicationExceptionCode.ENTITY_NOT_FOUND: case ApplicationExceptionCode.APPLICATION_NOT_FOUND: case ApplicationExceptionCode.SERVERLESS_FUNCTION_NOT_FOUND: diff --git a/packages/twenty-server/src/engine/core-modules/application/application-sync.service.ts b/packages/twenty-server/src/engine/core-modules/application/application-sync.service.ts index a8a2e9b4c5..0a8923c16a 100644 --- a/packages/twenty-server/src/engine/core-modules/application/application-sync.service.ts +++ b/packages/twenty-server/src/engine/core-modules/application/application-sync.service.ts @@ -13,12 +13,12 @@ import { import { ApplicationService } from 'src/engine/core-modules/application/application.service'; import { ApplicationInput } from 'src/engine/core-modules/application/dtos/application.input'; import { + FieldManifest, ObjectManifest, ServerlessFunctionManifest, ServerlessFunctionTriggerManifest, } from 'src/engine/core-modules/application/types/application.types'; import { ApplicationVariableEntityService } from 'src/engine/core-modules/applicationVariable/application-variable.service'; -import { Sources } from 'src/engine/core-modules/file-storage/types/source.type'; import { CronTriggerV2Service } from 'src/engine/metadata-modules/cron-trigger/services/cron-trigger-v2.service'; import { FlatCronTrigger } from 'src/engine/metadata-modules/cron-trigger/types/flat-cron-trigger.type'; import { DataSourceService } from 'src/engine/metadata-modules/data-source/data-source.service'; @@ -35,6 +35,11 @@ import { ServerlessFunctionLayerService } from 'src/engine/metadata-modules/serv import { ServerlessFunctionV2Service } from 'src/engine/metadata-modules/serverless-function/services/serverless-function-v2.service'; import { FlatServerlessFunction } from 'src/engine/metadata-modules/serverless-function/types/flat-serverless-function.type'; import { WorkspaceMigrationValidateBuildAndRunService } from 'src/engine/workspace-manager/workspace-migration-v2/services/workspace-migration-validate-build-and-run-service'; +import { Sources } from 'src/engine/core-modules/file-storage/types/source.type'; +import { FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; +import { FieldMetadataServiceV2 } from 'src/engine/metadata-modules/field-metadata/services/field-metadata.service-v2'; +import { CreateFieldInput } from 'src/engine/metadata-modules/field-metadata/dtos/create-field.input'; +import { computeMetadataNameFromLabel } from 'src/engine/metadata-modules/utils/validate-name-and-label-are-sync-or-throw.util'; @Injectable() export class ApplicationSyncService { @@ -45,6 +50,7 @@ export class ApplicationSyncService { private readonly applicationVariableService: ApplicationVariableEntityService, private readonly serverlessFunctionLayerService: ServerlessFunctionLayerService, private readonly objectMetadataServiceV2: ObjectMetadataServiceV2, + private readonly fieldMetadataServiceV2: FieldMetadataServiceV2, private readonly serverlessFunctionV2Service: ServerlessFunctionV2Service, private readonly flatEntityMapsCacheService: WorkspaceManyOrAllFlatEntityMapsCacheService, private readonly dataSourceService: DataSourceService, @@ -155,6 +161,131 @@ export class ApplicationSyncService { return application; } + private async syncFields({ + objectId, + fieldsToSync, + workspaceId, + applicationId, + }: { + objectId: string; + workspaceId: string; + applicationId: string; + fieldsToSync?: FieldManifest[]; + }) { + if (!isDefined(fieldsToSync)) { + return; + } + + const { flatFieldMetadataMaps: existingFlatFieldMetadataMaps } = + await this.flatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps( + { + workspaceId, + flatMapsKeys: ['flatFieldMetadataMaps'], + }, + ); + + const existingFields = Object.values( + existingFlatFieldMetadataMaps.byId, + ).filter( + (field) => isDefined(field) && field.objectMetadataId === objectId, + ) as FlatFieldMetadata[]; + + const fieldsToSyncUniversalIds = fieldsToSync.map( + (field) => field.universalIdentifier, + ); + + const existingFieldsStandardIds = existingFields.map( + (field) => field.universalIdentifier, + ); + + const fieldsToDelete = existingFields.filter( + (field) => + isDefined(field.universalIdentifier) && + !fieldsToSyncUniversalIds.includes(field.universalIdentifier) && + field.isCustom === true, + ); + + const fieldsToUpdate = existingFields.filter( + (field) => + isDefined(field.universalIdentifier) && + fieldsToSyncUniversalIds.includes(field.universalIdentifier), + ); + + const fieldsToCreate = fieldsToSync.filter( + (fieldToSync) => + !existingFieldsStandardIds.includes(fieldToSync.universalIdentifier), + ); + + for (const fieldToDelete of fieldsToDelete) { + await this.fieldMetadataServiceV2.updateOne({ + updateFieldInput: { + id: fieldToDelete.id, + isActive: false, + }, + workspaceId, + }); + await this.fieldMetadataServiceV2.deleteOneField({ + deleteOneFieldInput: { id: fieldToDelete.id }, + workspaceId, + }); + } + + for (const fieldToUpdate of fieldsToUpdate) { + const fieldToSync = fieldsToSync.find( + (field) => + field.universalIdentifier === fieldToUpdate.universalIdentifier, + ); + + if (!fieldToSync) { + throw new ApplicationException( + `Failed to find field to sync with universalIdentifier ${fieldToUpdate.universalIdentifier}`, + ApplicationExceptionCode.FIELD_NOT_FOUND, + ); + } + + const updateFieldInput = { + id: fieldToUpdate.id, + label: fieldToSync.label, + description: fieldToSync.description ?? undefined, + icon: fieldToSync.icon ?? undefined, + defaultValue: fieldToSync.defaultValue ?? undefined, + options: fieldToSync.options ?? undefined, + settings: fieldToSync.settings ?? undefined, + isNullable: fieldToSync.isNullable ?? true, + }; + + await this.fieldMetadataServiceV2.updateOne({ + updateFieldInput, + workspaceId, + }); + } + + for (const fieldToCreate of fieldsToCreate) { + const createFieldInput: CreateFieldInput = { + name: computeMetadataNameFromLabel(fieldToCreate.label), + type: fieldToCreate.type, + label: fieldToCreate.label, + description: fieldToCreate.description ?? undefined, + icon: fieldToCreate.icon ?? undefined, + defaultValue: fieldToCreate.defaultValue ?? undefined, + options: fieldToCreate.options ?? undefined, + settings: fieldToCreate.settings ?? undefined, + isNullable: fieldToCreate.isNullable ?? true, + objectMetadataId: objectId, + universalIdentifier: fieldToCreate.universalIdentifier, + standardId: fieldToCreate.universalIdentifier, + applicationId, + isCustom: true, + workspaceId, + }; + + await this.fieldMetadataServiceV2.createOne({ + createFieldInput, + workspaceId, + }); + } + } + private async syncObjects({ objectsToSync, workspaceId, @@ -243,6 +374,13 @@ export class ApplicationSyncService { updateObjectInput, workspaceId, }); + + await this.syncFields({ + fieldsToSync: objectToSync.fields, + objectId: objectToUpdate.id, + workspaceId, + applicationId, + }); } const dataSourceMetadata = @@ -264,10 +402,17 @@ export class ApplicationSyncService { applicationId, }; - await this.objectMetadataServiceV2.createOne({ + const createdObject = await this.objectMetadataServiceV2.createOne({ createObjectInput, workspaceId, }); + + await this.syncFields({ + fieldsToSync: objectToCreate.fields, + objectId: createdObject.id, + workspaceId, + applicationId, + }); } } diff --git a/packages/twenty-server/src/engine/core-modules/application/application.exception.ts b/packages/twenty-server/src/engine/core-modules/application/application.exception.ts index e3e7d6c36f..e65020760e 100644 --- a/packages/twenty-server/src/engine/core-modules/application/application.exception.ts +++ b/packages/twenty-server/src/engine/core-modules/application/application.exception.ts @@ -4,6 +4,7 @@ export class ApplicationException extends CustomException UUIDScalarType) objectMetadataId: string; + @HideField() + universalIdentifier?: string; + + @HideField() + standardId?: string; + + @HideField() + applicationId?: string; + @Field(() => Boolean, { nullable: true }) @IsOptional() isRemoteCreation?: boolean; diff --git a/packages/twenty-server/src/engine/metadata-modules/field-metadata/dtos/field-metadata.dto.ts b/packages/twenty-server/src/engine/metadata-modules/field-metadata/dtos/field-metadata.dto.ts index b31dc9ffa9..0b7504c3ef 100644 --- a/packages/twenty-server/src/engine/metadata-modules/field-metadata/dtos/field-metadata.dto.ts +++ b/packages/twenty-server/src/engine/metadata-modules/field-metadata/dtos/field-metadata.dto.ts @@ -23,11 +23,13 @@ import { IsUUID, } from 'class-validator'; import { GraphQLJSON } from 'graphql-type-json'; -import { FieldMetadataType } from 'twenty-shared/types'; +import { + FieldMetadataType, + FieldMetadataSettings, + FieldMetadataOptions, +} from 'twenty-shared/types'; import { FieldMetadataDefaultValue } from 'src/engine/metadata-modules/field-metadata/interfaces/field-metadata-default-value.interface'; -import { FieldMetadataOptions } from 'src/engine/metadata-modules/field-metadata/interfaces/field-metadata-options.interface'; -import { FieldMetadataSettings } from 'src/engine/metadata-modules/field-metadata/interfaces/field-metadata-settings.interface'; import { UUIDScalarType } from 'src/engine/api/graphql/workspace-schema-builder/graphql-types/scalars'; import { IsValidMetadataName } from 'src/engine/decorators/metadata/is-valid-metadata-name.decorator'; diff --git a/packages/twenty-server/src/engine/metadata-modules/field-metadata/field-metadata.entity.ts b/packages/twenty-server/src/engine/metadata-modules/field-metadata/field-metadata.entity.ts index d7e2cf9478..51b949f2b2 100644 --- a/packages/twenty-server/src/engine/metadata-modules/field-metadata/field-metadata.entity.ts +++ b/packages/twenty-server/src/engine/metadata-modules/field-metadata/field-metadata.entity.ts @@ -1,4 +1,8 @@ -import { FieldMetadataType } from 'twenty-shared/types'; +import { + FieldMetadataType, + FieldMetadataSettings, + FieldMetadataOptions, +} from 'twenty-shared/types'; import { Check, Column, @@ -16,8 +20,6 @@ import { } from 'typeorm'; import { FieldMetadataDefaultValue } from 'src/engine/metadata-modules/field-metadata/interfaces/field-metadata-default-value.interface'; -import { FieldMetadataOptions } from 'src/engine/metadata-modules/field-metadata/interfaces/field-metadata-options.interface'; -import { FieldMetadataSettings } from 'src/engine/metadata-modules/field-metadata/interfaces/field-metadata-settings.interface'; import { SyncableEntity } from 'src/engine/workspace-manager/workspace-sync/interfaces/syncable-entity.interface'; import { type FieldStandardOverridesDTO } from 'src/engine/metadata-modules/field-metadata/dtos/field-standard-overrides.dto'; diff --git a/packages/twenty-server/src/engine/metadata-modules/field-metadata/interfaces/composite-type.interface.ts b/packages/twenty-server/src/engine/metadata-modules/field-metadata/interfaces/composite-type.interface.ts index 68d02b758c..cd55f0ff8c 100644 --- a/packages/twenty-server/src/engine/metadata-modules/field-metadata/interfaces/composite-type.interface.ts +++ b/packages/twenty-server/src/engine/metadata-modules/field-metadata/interfaces/composite-type.interface.ts @@ -1,6 +1,7 @@ -import { type FieldMetadataType } from 'twenty-shared/types'; - -import { type FieldMetadataOptions } from 'src/engine/metadata-modules/field-metadata/interfaces/field-metadata-options.interface'; +import { + type FieldMetadataType, + type FieldMetadataOptions, +} from 'twenty-shared/types'; export interface CompositeProperty< Type extends FieldMetadataType = FieldMetadataType, diff --git a/packages/twenty-server/src/engine/metadata-modules/field-metadata/services/field-metadata-enum-validation.service.ts b/packages/twenty-server/src/engine/metadata-modules/field-metadata/services/field-metadata-enum-validation.service.ts index 6307f2ac1d..3b05c57d60 100644 --- a/packages/twenty-server/src/engine/metadata-modules/field-metadata/services/field-metadata-enum-validation.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/field-metadata/services/field-metadata-enum-validation.service.ts @@ -6,12 +6,11 @@ import { isNonEmptyString } from '@sniptt/guards'; import { type EnumFieldMetadataType, FieldMetadataType, + type FieldMetadataOptions, } from 'twenty-shared/types'; import { assertUnreachable, isDefined } from 'twenty-shared/utils'; import { z } from 'zod'; -import { type FieldMetadataOptions } from 'src/engine/metadata-modules/field-metadata/interfaces/field-metadata-options.interface'; - import { type CreateFieldInput } from 'src/engine/metadata-modules/field-metadata/dtos/create-field.input'; import { type FieldMetadataComplexOption, diff --git a/packages/twenty-server/src/engine/metadata-modules/field-metadata/services/field-metadata-relation.service.ts b/packages/twenty-server/src/engine/metadata-modules/field-metadata/services/field-metadata-relation.service.ts index ea1d05845c..5f16673417 100644 --- a/packages/twenty-server/src/engine/metadata-modules/field-metadata/services/field-metadata-relation.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/field-metadata/services/field-metadata-relation.service.ts @@ -2,12 +2,15 @@ import { Injectable } from '@nestjs/common'; import { msg } from '@lingui/core/macro'; import { IsEnum, IsString, IsUUID } from 'class-validator'; -import { FieldMetadataType } from 'twenty-shared/types'; -import { isDefined } from 'twenty-shared/utils'; +import { + type FieldMetadataSettings, + FieldMetadataType, + RelationOnDeleteAction, +} from 'twenty-shared/types'; import { type Repository } from 'typeorm'; import { v4 } from 'uuid'; +import { isDefined } from 'twenty-shared/utils'; -import { type FieldMetadataSettings } from 'src/engine/metadata-modules/field-metadata/interfaces/field-metadata-settings.interface'; import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface'; import { type CreateFieldInput } from 'src/engine/metadata-modules/field-metadata/dtos/create-field.input'; @@ -20,7 +23,6 @@ import { import { computeMorphOrRelationFieldJoinColumnName } from 'src/engine/metadata-modules/field-metadata/utils/compute-morph-or-relation-field-join-column-name.util'; import { prepareCustomFieldMetadataForCreation } from 'src/engine/metadata-modules/field-metadata/utils/prepare-field-metadata-for-creation.util'; import { validateRelationCreationPayloadOrThrow } from 'src/engine/metadata-modules/field-metadata/utils/validate-relation-creation-payload-or-throw.util'; -import { RelationOnDeleteAction } from 'src/engine/metadata-modules/relation-metadata/relation-on-delete-action.type'; import { type ObjectMetadataItemWithFieldMaps } from 'src/engine/metadata-modules/types/object-metadata-item-with-field-maps'; import { type ObjectMetadataMaps } from 'src/engine/metadata-modules/types/object-metadata-maps'; import { validateFieldNameAvailabilityOrThrow } from 'src/engine/metadata-modules/utils/validate-field-name-availability.utils'; diff --git a/packages/twenty-server/src/engine/metadata-modules/field-metadata/services/field-metadata-validation.service.ts b/packages/twenty-server/src/engine/metadata-modules/field-metadata/services/field-metadata-validation.service.ts index 07c5834ad0..8b466787ca 100644 --- a/packages/twenty-server/src/engine/metadata-modules/field-metadata/services/field-metadata-validation.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/field-metadata/services/field-metadata-validation.service.ts @@ -17,11 +17,10 @@ import { ALLOWED_ADDRESS_SUBFIELDS, type AllowedAddressSubField, FieldMetadataType, + type FieldMetadataSettings, } from 'twenty-shared/types'; import { isDefined } from 'twenty-shared/utils'; -import { type FieldMetadataSettings } from 'src/engine/metadata-modules/field-metadata/interfaces/field-metadata-settings.interface'; - import { type CreateFieldInput } from 'src/engine/metadata-modules/field-metadata/dtos/create-field.input'; import { type UpdateFieldInput } from 'src/engine/metadata-modules/field-metadata/dtos/update-field.input'; import { type FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity'; diff --git a/packages/twenty-server/src/engine/metadata-modules/field-metadata/services/field-metadata.service-v2.ts b/packages/twenty-server/src/engine/metadata-modules/field-metadata/services/field-metadata.service-v2.ts index d352068cdc..6b55e82951 100644 --- a/packages/twenty-server/src/engine/metadata-modules/field-metadata/services/field-metadata.service-v2.ts +++ b/packages/twenty-server/src/engine/metadata-modules/field-metadata/services/field-metadata.service-v2.ts @@ -57,9 +57,11 @@ export class FieldMetadataServiceV2 { public async deleteOneField({ deleteOneFieldInput, workspaceId, + isSystemBuild = false, }: { deleteOneFieldInput: DeleteOneFieldInput; workspaceId: string; + isSystemBuild?: boolean; }): Promise { const { flatObjectMetadataMaps: existingFlatObjectMetadataMaps, @@ -94,7 +96,7 @@ export class FieldMetadataServiceV2 { flatObjectMetadataMaps: existingFlatObjectMetadataMaps, }, buildOptions: { - isSystemBuild: false, + isSystemBuild, inferDeletionFromMissingEntities: { fieldMetadata: true, index: true, @@ -134,7 +136,7 @@ export class FieldMetadataServiceV2 { updateFieldInput, workspaceId, }: { - updateFieldInput: UpdateFieldInput; + updateFieldInput: Omit; workspaceId: string; }): Promise { const { @@ -164,7 +166,7 @@ export class FieldMetadataServiceV2 { flatFieldMetadataMaps: existingFlatFieldMetadataMaps, flatIndexMaps: existingFlatIndexMaps, flatObjectMetadataMaps: existingFlatObjectMetadataMaps, - updateFieldInput, + updateFieldInput: { ...updateFieldInput, workspaceId }, flatViewFilterMaps: existingFlatViewFilterMaps, flatViewGroupMaps: existingFlatViewGroupMaps, flatViewMaps: existingFlatViewMaps, diff --git a/packages/twenty-server/src/engine/metadata-modules/field-metadata/types/field-metadata-entity-test.type.ts b/packages/twenty-server/src/engine/metadata-modules/field-metadata/types/field-metadata-entity-test.type.ts index 42cd3a23c2..1168906237 100644 --- a/packages/twenty-server/src/engine/metadata-modules/field-metadata/types/field-metadata-entity-test.type.ts +++ b/packages/twenty-server/src/engine/metadata-modules/field-metadata/types/field-metadata-entity-test.type.ts @@ -3,6 +3,12 @@ import { type FieldMetadataMultiItemSettings, type FieldMetadataType, type NullablePartial, + type AllFieldMetadataSettings, + type FieldMetadataDateSettings, + type FieldMetadataDateTimeSettings, + type FieldMetadataNumberSettings, + type FieldMetadataRelationSettings, + type FieldMetadataTextSettings, } from 'twenty-shared/types'; import { type Relation as TypeOrmRelation } from 'typeorm'; @@ -10,14 +16,6 @@ import { type FieldMetadataDefaultValueForAnyType, type FieldMetadataDefaultValueForType, } from 'src/engine/metadata-modules/field-metadata/interfaces/field-metadata-default-value.interface'; -import { - type AllFieldMetadataSettings, - type FieldMetadataDateSettings, - type FieldMetadataDateTimeSettings, - type FieldMetadataNumberSettings, - type FieldMetadataRelationSettings, - type FieldMetadataTextSettings, -} from 'src/engine/metadata-modules/field-metadata/interfaces/field-metadata-settings.interface'; import { type FieldMetadataComplexOption, diff --git a/packages/twenty-server/src/engine/metadata-modules/field-metadata/utils/__tests__/field-metadata-validation.service.spec.ts b/packages/twenty-server/src/engine/metadata-modules/field-metadata/utils/__tests__/field-metadata-validation.service.spec.ts index 2b814c686d..ccb8d3a22c 100644 --- a/packages/twenty-server/src/engine/metadata-modules/field-metadata/utils/__tests__/field-metadata-validation.service.spec.ts +++ b/packages/twenty-server/src/engine/metadata-modules/field-metadata/utils/__tests__/field-metadata-validation.service.spec.ts @@ -1,8 +1,9 @@ import { Test, type TestingModule } from '@nestjs/testing'; -import { FieldMetadataType } from 'twenty-shared/types'; - -import { type FieldMetadataSettings } from 'src/engine/metadata-modules/field-metadata/interfaces/field-metadata-settings.interface'; +import { + type FieldMetadataSettings, + FieldMetadataType, +} from 'twenty-shared/types'; import { FieldMetadataException } from 'src/engine/metadata-modules/field-metadata/field-metadata.exception'; import { FieldMetadataEnumValidationService } from 'src/engine/metadata-modules/field-metadata/services/field-metadata-enum-validation.service'; diff --git a/packages/twenty-server/src/engine/metadata-modules/field-metadata/utils/validate-options-for-type.util.ts b/packages/twenty-server/src/engine/metadata-modules/field-metadata/utils/validate-options-for-type.util.ts index 1714daeb50..1b31566a23 100644 --- a/packages/twenty-server/src/engine/metadata-modules/field-metadata/utils/validate-options-for-type.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/field-metadata/utils/validate-options-for-type.util.ts @@ -1,8 +1,9 @@ import { plainToInstance } from 'class-transformer'; import { validateSync } from 'class-validator'; -import { FieldMetadataType } from 'twenty-shared/types'; - -import { type FieldMetadataOptions } from 'src/engine/metadata-modules/field-metadata/interfaces/field-metadata-options.interface'; +import { + FieldMetadataType, + type FieldMetadataOptions, +} from 'twenty-shared/types'; import { FieldMetadataComplexOption, diff --git a/packages/twenty-server/src/engine/metadata-modules/field-metadata/validators/is-field-metadata-options.validator.ts b/packages/twenty-server/src/engine/metadata-modules/field-metadata/validators/is-field-metadata-options.validator.ts index f9f4a48756..6fcaf2bc2e 100644 --- a/packages/twenty-server/src/engine/metadata-modules/field-metadata/validators/is-field-metadata-options.validator.ts +++ b/packages/twenty-server/src/engine/metadata-modules/field-metadata/validators/is-field-metadata-options.validator.ts @@ -2,11 +2,12 @@ import { Injectable } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { type ValidationArguments, ValidatorConstraint } from 'class-validator'; -import { type FieldMetadataType } from 'twenty-shared/types'; +import { + type FieldMetadataType, + type FieldMetadataOptions, +} from 'twenty-shared/types'; import { Repository } from 'typeorm'; -import { type FieldMetadataOptions } from 'src/engine/metadata-modules/field-metadata/interfaces/field-metadata-options.interface'; - import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity'; import { validateOptionsForType } from 'src/engine/metadata-modules/field-metadata/utils/validate-options-for-type.util'; 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 dec84533a8..d5b36b8b97 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 @@ -1,11 +1,13 @@ -import { FieldMetadataType } from 'twenty-shared/types'; +import { + FieldMetadataType, + DateDisplayFormat, + RelationOnDeleteAction, +} from 'twenty-shared/types'; -import { DateDisplayFormat } from 'src/engine/metadata-modules/field-metadata/interfaces/field-metadata-settings.interface'; 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 { 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'; export const ATTACHMENT_FLAT_FIELDS_MOCK = { name: getFlatFieldMetadataMock({ 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 d96e91f4ab..2f08f3e322 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 @@ -1,11 +1,13 @@ -import { FieldMetadataType } from 'twenty-shared/types'; +import { + FieldMetadataType, + DateDisplayFormat, + RelationOnDeleteAction, +} from 'twenty-shared/types'; -import { DateDisplayFormat } from 'src/engine/metadata-modules/field-metadata/interfaces/field-metadata-settings.interface'; 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 { 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'; export const COMPANY_FLAT_FIELDS_MOCK = { name: getFlatFieldMetadataMock({ 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 d6e8e9e2da..e174abd831 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 @@ -1,11 +1,13 @@ -import { FieldMetadataType } from 'twenty-shared/types'; +import { + FieldMetadataType, + DateDisplayFormat, + RelationOnDeleteAction, +} from 'twenty-shared/types'; -import { DateDisplayFormat } from 'src/engine/metadata-modules/field-metadata/interfaces/field-metadata-settings.interface'; 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 { 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'; export const FAVORITE_FLAT_FIELDS_MOCK = { position: getFlatFieldMetadataMock({ 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 a2a71492f4..df2d60d456 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 @@ -1,6 +1,5 @@ -import { FieldMetadataType } from 'twenty-shared/types'; +import { FieldMetadataType, DateDisplayFormat } from 'twenty-shared/types'; -import { DateDisplayFormat } from 'src/engine/metadata-modules/field-metadata/interfaces/field-metadata-settings.interface'; 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'; 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 998134be0e..536e7214e2 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 @@ -1,6 +1,5 @@ -import { FieldMetadataType } from 'twenty-shared/types'; +import { FieldMetadataType, DateDisplayFormat } from 'twenty-shared/types'; -import { DateDisplayFormat } from 'src/engine/metadata-modules/field-metadata/interfaces/field-metadata-settings.interface'; 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'; 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 d955834ae9..f5f84fa87b 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 @@ -1,11 +1,13 @@ -import { FieldMetadataType } from 'twenty-shared/types'; +import { + FieldMetadataType, + DateDisplayFormat, + RelationOnDeleteAction, +} from 'twenty-shared/types'; -import { DateDisplayFormat } from 'src/engine/metadata-modules/field-metadata/interfaces/field-metadata-settings.interface'; 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 { 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'; export const NOTETARGET_FLAT_FIELDS_MOCK = { id: getFlatFieldMetadataMock({ 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 33e3ea2939..10717aa948 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 @@ -1,11 +1,13 @@ -import { FieldMetadataType } from 'twenty-shared/types'; +import { + FieldMetadataType, + DateDisplayFormat, + RelationOnDeleteAction, +} from 'twenty-shared/types'; -import { DateDisplayFormat } from 'src/engine/metadata-modules/field-metadata/interfaces/field-metadata-settings.interface'; 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 { 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'; export const OPPORTUNITY_FLAT_FIELDS_MOCK = { name: getFlatFieldMetadataMock({ 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 e567895ac0..48e00b468d 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 @@ -1,11 +1,13 @@ -import { FieldMetadataType } from 'twenty-shared/types'; +import { + FieldMetadataType, + DateDisplayFormat, + RelationOnDeleteAction, +} from 'twenty-shared/types'; -import { DateDisplayFormat } from 'src/engine/metadata-modules/field-metadata/interfaces/field-metadata-settings.interface'; 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 { 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'; export const PERSON_FLAT_FIELDS_MOCK = { name: getFlatFieldMetadataMock({ 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 abc8fb036c..1f6127c5e7 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 @@ -1,11 +1,13 @@ -import { FieldMetadataType } from 'twenty-shared/types'; +import { + FieldMetadataType, + DateDisplayFormat, + RelationOnDeleteAction, +} from 'twenty-shared/types'; -import { DateDisplayFormat } from 'src/engine/metadata-modules/field-metadata/interfaces/field-metadata-settings.interface'; 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 { 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'; export const TASK_FLAT_FIELDS_MOCK = { position: getFlatFieldMetadataMock({ 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 a71f46cc84..5084c191e2 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 @@ -1,11 +1,13 @@ -import { FieldMetadataType } from 'twenty-shared/types'; +import { + FieldMetadataType, + DateDisplayFormat, + RelationOnDeleteAction, +} from 'twenty-shared/types'; -import { DateDisplayFormat } from 'src/engine/metadata-modules/field-metadata/interfaces/field-metadata-settings.interface'; 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 { 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'; export const TASKTARGET_FLAT_FIELDS_MOCK = { id: getFlatFieldMetadataMock({ 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 1d1ba25f63..e6486f55c1 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 @@ -1,11 +1,13 @@ -import { FieldMetadataType } from 'twenty-shared/types'; +import { + FieldMetadataType, + DateDisplayFormat, + RelationOnDeleteAction, +} from 'twenty-shared/types'; -import { DateDisplayFormat } from 'src/engine/metadata-modules/field-metadata/interfaces/field-metadata-settings.interface'; 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 { 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'; export const TIMELINEACTIVITY_FLAT_FIELDS_MOCK = { happensAt: getFlatFieldMetadataMock({ diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/from-create-field-input-to-flat-field-metadatas-to-create.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/from-create-field-input-to-flat-field-metadatas-to-create.util.ts index d40ab260c4..7473e5f9fe 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/from-create-field-input-to-flat-field-metadatas-to-create.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/from-create-field-input-to-flat-field-metadatas-to-create.util.ts @@ -1,5 +1,8 @@ import { msg } from '@lingui/core/macro'; -import { FieldMetadataType } from 'twenty-shared/types'; +import { + FieldMetadataType, + type FieldMetadataOptions, +} from 'twenty-shared/types'; import { assertUnreachable, isDefined, @@ -7,8 +10,6 @@ import { } from 'twenty-shared/utils'; import { v4 } from 'uuid'; -import { type FieldMetadataOptions } from 'src/engine/metadata-modules/field-metadata/interfaces/field-metadata-options.interface'; - import { type CreateFieldInput } from 'src/engine/metadata-modules/field-metadata/dtos/create-field.input'; import { FieldMetadataExceptionCode } from 'src/engine/metadata-modules/field-metadata/field-metadata.exception'; import { generateRatingOptions } from 'src/engine/metadata-modules/field-metadata/utils/generate-rating-optionts.util'; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/generate-morph-or-relation-flat-field-metadata-pair.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/generate-morph-or-relation-flat-field-metadata-pair.util.ts index 552cbce825..d361c18c94 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/generate-morph-or-relation-flat-field-metadata-pair.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/generate-morph-or-relation-flat-field-metadata-pair.util.ts @@ -1,4 +1,8 @@ -import { FieldMetadataType, RelationType } from 'twenty-shared/types'; +import { + FieldMetadataType, + RelationType, + RelationOnDeleteAction, +} from 'twenty-shared/types'; import { v4 } from 'uuid'; import { type CreateFieldInput } from 'src/engine/metadata-modules/field-metadata/dtos/create-field.input'; @@ -9,7 +13,6 @@ import { generateIndexForFlatFieldMetadata } from 'src/engine/metadata-modules/f import { getDefaultFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/get-default-flat-field-metadata-from-create-field-input.util'; import { type FlatIndexMetadata } from 'src/engine/metadata-modules/flat-index-metadata/types/flat-index-metadata.type'; import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type'; -import { RelationOnDeleteAction } from 'src/engine/metadata-modules/relation-metadata/relation-on-delete-action.type'; import { computeMetadataNameFromLabel } from 'src/engine/metadata-modules/utils/validate-name-and-label-are-sync-or-throw.util'; type ComputeFieldMetadataRelationSettingsForRelationTypeArgs = { diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/get-default-flat-field-metadata-from-create-field-input.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/get-default-flat-field-metadata-from-create-field-input.util.ts index 50130dc0bb..8d86e548f8 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/get-default-flat-field-metadata-from-create-field-input.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/get-default-flat-field-metadata-from-create-field-input.util.ts @@ -43,19 +43,20 @@ export const getDefaultFlatFieldMetadata = ({ objectMetadataId: createFieldInput.objectMetadataId, relationTargetFieldMetadataId: null, relationTargetObjectMetadataId: null, - standardId: null, + standardId: createFieldInput.standardId ?? null, standardOverrides: null, type: createFieldInput.type, - universalIdentifier: fieldMetadataId, + universalIdentifier: + createFieldInput.universalIdentifier ?? fieldMetadataId, workspaceId, - options: null, + options: createFieldInput.options ?? null, defaultValue: defaultValue ?? generateDefaultValue(createFieldInput.type), settings: settings ?? null, createdAt, updatedAt: createdAt, isUIReadOnly: createFieldInput.isUIReadOnly ?? false, morphId: null, - applicationId: null, + applicationId: createFieldInput.applicationId ?? null, viewFilterIds: [], viewGroupIds: [], kanbanAggregateOperationViewIds: [], diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/validators/utils/validate-enum-flat-field-metadata.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/validators/utils/validate-enum-flat-field-metadata.util.ts index 796f59e350..d96826fbca 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/validators/utils/validate-enum-flat-field-metadata.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/validators/utils/validate-enum-flat-field-metadata.util.ts @@ -5,12 +5,11 @@ import { FieldMetadataType, type EnumFieldMetadataType, type NonNullableRequired, + type FieldMetadataOptions, } from 'twenty-shared/types'; import { assertUnreachable, isDefined } from 'twenty-shared/utils'; import { z } from 'zod'; -import { type FieldMetadataOptions } from 'src/engine/metadata-modules/field-metadata/interfaces/field-metadata-options.interface'; - import { type FieldMetadataComplexOption, type FieldMetadataDefaultOption, diff --git a/packages/twenty-server/src/engine/metadata-modules/object-metadata/dtos/create-object.input.ts b/packages/twenty-server/src/engine/metadata-modules/object-metadata/dtos/create-object.input.ts index af9b842578..a6cde80f96 100644 --- a/packages/twenty-server/src/engine/metadata-modules/object-metadata/dtos/create-object.input.ts +++ b/packages/twenty-server/src/engine/metadata-modules/object-metadata/dtos/create-object.input.ts @@ -3,9 +3,10 @@ import { Field, HideField, InputType } from '@nestjs/graphql'; import { BeforeCreateOne } from '@ptc-org/nestjs-query-graphql'; import { IsBoolean, IsNotEmpty, IsOptional, IsString } from 'class-validator'; import GraphQLJSON from 'graphql-type-json'; -import { type FieldMetadataType } from 'twenty-shared/types'; - -import { FieldMetadataSettings } from 'src/engine/metadata-modules/field-metadata/interfaces/field-metadata-settings.interface'; +import { + type FieldMetadataType, + type FieldMetadataSettings, +} from 'twenty-shared/types'; import { IsValidMetadataName } from 'src/engine/decorators/metadata/is-valid-metadata-name.decorator'; import { BeforeCreateOneObject } from 'src/engine/metadata-modules/object-metadata/hooks/before-create-one-object.hook'; diff --git a/packages/twenty-server/src/engine/metadata-modules/object-metadata/services/object-metadata-field-relation.service.ts b/packages/twenty-server/src/engine/metadata-modules/object-metadata/services/object-metadata-field-relation.service.ts index 9f5bfaa4d2..04cc8a2acc 100644 --- a/packages/twenty-server/src/engine/metadata-modules/object-metadata/services/object-metadata-field-relation.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/object-metadata/services/object-metadata-field-relation.service.ts @@ -2,7 +2,7 @@ import { Injectable } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { msg } from '@lingui/core/macro'; -import { FieldMetadataType } from 'twenty-shared/types'; +import { FieldMetadataType, RelationOnDeleteAction } from 'twenty-shared/types'; import { capitalize, isDefined } from 'twenty-shared/utils'; import { type QueryRunner, Repository } from 'typeorm'; import { v4 as uuidV4 } from 'uuid'; @@ -18,7 +18,6 @@ import { } from 'src/engine/metadata-modules/object-metadata/object-metadata.exception'; import { buildDescriptionForRelationFieldMetadataOnFromField } from 'src/engine/metadata-modules/object-metadata/utils/build-description-for-relation-field-on-from-field.util'; import { buildDescriptionForRelationFieldMetadataOnToField } from 'src/engine/metadata-modules/object-metadata/utils/build-description-for-relation-field-on-to-field.util'; -import { RelationOnDeleteAction } from 'src/engine/metadata-modules/relation-metadata/relation-on-delete-action.type'; import { type FieldMetadataMap } from 'src/engine/metadata-modules/types/field-metadata-map'; import { type ObjectMetadataItemWithFieldMaps } from 'src/engine/metadata-modules/types/object-metadata-item-with-field-maps'; import { type ObjectMetadataMaps } from 'src/engine/metadata-modules/types/object-metadata-maps'; diff --git a/packages/twenty-server/src/engine/metadata-modules/object-metadata/utils/build-default-relation-flat-field-metadatas-for-custom-object.util.ts b/packages/twenty-server/src/engine/metadata-modules/object-metadata/utils/build-default-relation-flat-field-metadatas-for-custom-object.util.ts index 47af3acf7c..f2be34b092 100644 --- a/packages/twenty-server/src/engine/metadata-modules/object-metadata/utils/build-default-relation-flat-field-metadatas-for-custom-object.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/object-metadata/utils/build-default-relation-flat-field-metadatas-for-custom-object.util.ts @@ -1,4 +1,4 @@ -import { FieldMetadataType } from 'twenty-shared/types'; +import { FieldMetadataType, RelationOnDeleteAction } from 'twenty-shared/types'; import { capitalize, isDefined } from 'twenty-shared/utils'; import { v4 } from 'uuid'; @@ -15,7 +15,6 @@ import { } from 'src/engine/metadata-modules/object-metadata/object-metadata.exception'; import { buildDescriptionForRelationFieldMetadataOnFromField } from 'src/engine/metadata-modules/object-metadata/utils/build-description-for-relation-field-on-from-field.util'; import { buildDescriptionForRelationFieldMetadataOnToField } from 'src/engine/metadata-modules/object-metadata/utils/build-description-for-relation-field-on-to-field.util'; -import { RelationOnDeleteAction } from 'src/engine/metadata-modules/relation-metadata/relation-on-delete-action.type'; import { CUSTOM_OBJECT_STANDARD_FIELD_IDS, STANDARD_OBJECT_FIELD_IDS, diff --git a/packages/twenty-server/src/engine/metadata-modules/object-metadata/utils/build-migrations-for-custom-object-relations.util.ts b/packages/twenty-server/src/engine/metadata-modules/object-metadata/utils/build-migrations-for-custom-object-relations.util.ts index 8e969ce875..0ab78ae85f 100644 --- a/packages/twenty-server/src/engine/metadata-modules/object-metadata/utils/build-migrations-for-custom-object-relations.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/object-metadata/utils/build-migrations-for-custom-object-relations.util.ts @@ -1,5 +1,6 @@ +import { RelationOnDeleteAction } from 'twenty-shared/types'; + import { computeColumnName } from 'src/engine/metadata-modules/field-metadata/utils/compute-column-name.util'; -import { RelationOnDeleteAction } from 'src/engine/metadata-modules/relation-metadata/relation-on-delete-action.type'; import { type ObjectMetadataItemWithFieldMaps } from 'src/engine/metadata-modules/types/object-metadata-item-with-field-maps'; import { WorkspaceMigrationColumnActionType, diff --git a/packages/twenty-server/src/engine/metadata-modules/relation-metadata/relation-on-delete-action.type.ts b/packages/twenty-server/src/engine/metadata-modules/relation-metadata/relation-on-delete-action.type.ts deleted file mode 100644 index 6f42eb3996..0000000000 --- a/packages/twenty-server/src/engine/metadata-modules/relation-metadata/relation-on-delete-action.type.ts +++ /dev/null @@ -1,6 +0,0 @@ -export enum RelationOnDeleteAction { - CASCADE = 'CASCADE', - RESTRICT = 'RESTRICT', - SET_NULL = 'SET_NULL', - NO_ACTION = 'NO_ACTION', -} diff --git a/packages/twenty-server/src/engine/metadata-modules/remote-server/remote-table/remote-table-relations/remote-table-relations.service.ts b/packages/twenty-server/src/engine/metadata-modules/remote-server/remote-table/remote-table-relations/remote-table-relations.service.ts index 458d1fba56..56739f226e 100644 --- a/packages/twenty-server/src/engine/metadata-modules/remote-server/remote-table/remote-table-relations/remote-table-relations.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/remote-server/remote-table/remote-table-relations/remote-table-relations.service.ts @@ -1,12 +1,13 @@ import { Injectable } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; -import { type FieldMetadataType } from 'twenty-shared/types'; +import { + type FieldMetadataType, + type FieldMetadataSettings, +} from 'twenty-shared/types'; import { In, Repository } from 'typeorm'; import { isDefined } from 'twenty-shared/utils'; -import { type FieldMetadataSettings } from 'src/engine/metadata-modules/field-metadata/interfaces/field-metadata-settings.interface'; - import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity'; import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; import { buildMigrationsToCreateRemoteTableRelations } from 'src/engine/metadata-modules/remote-server/remote-table/remote-table-relations/utils/build-migrations-to-create-remote-table-relations.util'; diff --git a/packages/twenty-server/src/engine/metadata-modules/remote-server/remote-table/utils/udt-name-mapper.util.ts b/packages/twenty-server/src/engine/metadata-modules/remote-server/remote-table/utils/udt-name-mapper.util.ts index 51c2b70fe1..07086efeab 100644 --- a/packages/twenty-server/src/engine/metadata-modules/remote-server/remote-table/utils/udt-name-mapper.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/remote-server/remote-table/utils/udt-name-mapper.util.ts @@ -1,9 +1,8 @@ -import { FieldMetadataType } from 'twenty-shared/types'; - import { + FieldMetadataType, type FieldMetadataSettings, NumberDataType, -} from 'src/engine/metadata-modules/field-metadata/interfaces/field-metadata-settings.interface'; +} from 'twenty-shared/types'; export const mapUdtNameToFieldType = (udtName: string): FieldMetadataType => { switch (udtName) { diff --git a/packages/twenty-server/src/engine/metadata-modules/workspace-migration/workspace-migration.entity.ts b/packages/twenty-server/src/engine/metadata-modules/workspace-migration/workspace-migration.entity.ts index 9d629922c4..fbc9f7c7d4 100644 --- a/packages/twenty-server/src/engine/metadata-modules/workspace-migration/workspace-migration.entity.ts +++ b/packages/twenty-server/src/engine/metadata-modules/workspace-migration/workspace-migration.entity.ts @@ -4,9 +4,9 @@ import { Entity, PrimaryGeneratedColumn, } from 'typeorm'; +import { type RelationOnDeleteAction } from 'twenty-shared/types'; import { type IndexType } from 'src/engine/metadata-modules/index-metadata/types/indexType.types'; -import { type RelationOnDeleteAction } from 'src/engine/metadata-modules/relation-metadata/relation-on-delete-action.type'; export enum WorkspaceMigrationColumnActionType { CREATE = 'CREATE', diff --git a/packages/twenty-server/src/engine/twenty-orm/base.workspace-entity.ts b/packages/twenty-server/src/engine/twenty-orm/base.workspace-entity.ts index 4c95f1b2ed..113855e659 100644 --- a/packages/twenty-server/src/engine/twenty-orm/base.workspace-entity.ts +++ b/packages/twenty-server/src/engine/twenty-orm/base.workspace-entity.ts @@ -1,7 +1,5 @@ import { msg } from '@lingui/core/macro'; -import { FieldMetadataType } from 'twenty-shared/types'; - -import { DateDisplayFormat } from 'src/engine/metadata-modules/field-metadata/interfaces/field-metadata-settings.interface'; +import { FieldMetadataType, DateDisplayFormat } from 'twenty-shared/types'; import { WorkspaceField } from 'src/engine/twenty-orm/decorators/workspace-field.decorator'; import { WorkspaceIsFieldUIReadOnly } from 'src/engine/twenty-orm/decorators/workspace-is-field-ui-readonly.decorator'; diff --git a/packages/twenty-server/src/engine/twenty-orm/custom.workspace-entity.ts b/packages/twenty-server/src/engine/twenty-orm/custom.workspace-entity.ts index a78ca25ed4..440308275a 100644 --- a/packages/twenty-server/src/engine/twenty-orm/custom.workspace-entity.ts +++ b/packages/twenty-server/src/engine/twenty-orm/custom.workspace-entity.ts @@ -1,7 +1,6 @@ import { msg } from '@lingui/core/macro'; -import { FieldMetadataType } from 'twenty-shared/types'; +import { FieldMetadataType, RelationOnDeleteAction } from 'twenty-shared/types'; -import { RelationOnDeleteAction } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-on-delete-action.interface'; import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface'; import { SEARCH_VECTOR_FIELD } from 'src/engine/metadata-modules/constants/search-vector-field.constants'; diff --git a/packages/twenty-server/src/engine/twenty-orm/decorators/workspace-dynamic-relation.decorator.ts b/packages/twenty-server/src/engine/twenty-orm/decorators/workspace-dynamic-relation.decorator.ts index a70bbb56ff..e2cd930a21 100644 --- a/packages/twenty-server/src/engine/twenty-orm/decorators/workspace-dynamic-relation.decorator.ts +++ b/packages/twenty-server/src/engine/twenty-orm/decorators/workspace-dynamic-relation.decorator.ts @@ -1,6 +1,6 @@ import { type ObjectType } from 'typeorm'; +import { type RelationOnDeleteAction } from 'twenty-shared/types'; -import { type RelationOnDeleteAction } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-on-delete-action.interface'; import { type RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface'; import { type WorkspaceDynamicRelationMetadataArgsFactory } from 'src/engine/twenty-orm/interfaces/workspace-dynamic-relation-metadata-args.interface'; diff --git a/packages/twenty-server/src/engine/twenty-orm/decorators/workspace-field.decorator.ts b/packages/twenty-server/src/engine/twenty-orm/decorators/workspace-field.decorator.ts index c30e38c361..fa39d948e0 100644 --- a/packages/twenty-server/src/engine/twenty-orm/decorators/workspace-field.decorator.ts +++ b/packages/twenty-server/src/engine/twenty-orm/decorators/workspace-field.decorator.ts @@ -1,9 +1,11 @@ import { type MessageDescriptor } from '@lingui/core'; -import { type FieldMetadataType } from 'twenty-shared/types'; +import { + type FieldMetadataType, + type FieldMetadataSettings, + type FieldMetadataOptions, +} from 'twenty-shared/types'; import { type FieldMetadataDefaultValue } from 'src/engine/metadata-modules/field-metadata/interfaces/field-metadata-default-value.interface'; -import { type FieldMetadataOptions } from 'src/engine/metadata-modules/field-metadata/interfaces/field-metadata-options.interface'; -import { type FieldMetadataSettings } from 'src/engine/metadata-modules/field-metadata/interfaces/field-metadata-settings.interface'; import { generateDefaultValue } from 'src/engine/metadata-modules/field-metadata/utils/generate-default-value'; import { computeMetadataNameFromLabel } from 'src/engine/metadata-modules/utils/validate-name-and-label-are-sync-or-throw.util'; diff --git a/packages/twenty-server/src/engine/twenty-orm/decorators/workspace-relation.decorator.ts b/packages/twenty-server/src/engine/twenty-orm/decorators/workspace-relation.decorator.ts index 6ceec303ba..977dc96a57 100644 --- a/packages/twenty-server/src/engine/twenty-orm/decorators/workspace-relation.decorator.ts +++ b/packages/twenty-server/src/engine/twenty-orm/decorators/workspace-relation.decorator.ts @@ -2,8 +2,8 @@ import { type MessageDescriptor } from '@lingui/core'; import { isDefined, isUUID } from 'class-validator'; import { CustomError } from 'twenty-shared/utils'; import { type ObjectType } from 'typeorm'; +import { type RelationOnDeleteAction } from 'twenty-shared/types'; -import { type RelationOnDeleteAction } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-on-delete-action.interface'; import { type RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface'; import { type ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; diff --git a/packages/twenty-server/src/engine/twenty-orm/interfaces/workspace-dynamic-relation-metadata-args.interface.ts b/packages/twenty-server/src/engine/twenty-orm/interfaces/workspace-dynamic-relation-metadata-args.interface.ts index c87b979122..653f64ec1d 100644 --- a/packages/twenty-server/src/engine/twenty-orm/interfaces/workspace-dynamic-relation-metadata-args.interface.ts +++ b/packages/twenty-server/src/engine/twenty-orm/interfaces/workspace-dynamic-relation-metadata-args.interface.ts @@ -1,6 +1,6 @@ import { type ObjectType } from 'typeorm'; +import { type RelationOnDeleteAction } from 'twenty-shared/types'; -import { type RelationOnDeleteAction } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-on-delete-action.interface'; import { type RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface'; import { type Gate } from 'src/engine/twenty-orm/interfaces/gate.interface'; diff --git a/packages/twenty-server/src/engine/twenty-orm/interfaces/workspace-field-metadata-args.interface.ts b/packages/twenty-server/src/engine/twenty-orm/interfaces/workspace-field-metadata-args.interface.ts index b157a02c88..2b332b137f 100644 --- a/packages/twenty-server/src/engine/twenty-orm/interfaces/workspace-field-metadata-args.interface.ts +++ b/packages/twenty-server/src/engine/twenty-orm/interfaces/workspace-field-metadata-args.interface.ts @@ -1,8 +1,10 @@ -import { type FieldMetadataType } from 'twenty-shared/types'; +import { + type FieldMetadataType, + type FieldMetadataSettings, + type FieldMetadataOptions, +} from 'twenty-shared/types'; import { type FieldMetadataDefaultValue } from 'src/engine/metadata-modules/field-metadata/interfaces/field-metadata-default-value.interface'; -import { type FieldMetadataOptions } from 'src/engine/metadata-modules/field-metadata/interfaces/field-metadata-options.interface'; -import { type FieldMetadataSettings } from 'src/engine/metadata-modules/field-metadata/interfaces/field-metadata-settings.interface'; import { type Gate } from 'src/engine/twenty-orm/interfaces/gate.interface'; import { type ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; diff --git a/packages/twenty-server/src/engine/twenty-orm/interfaces/workspace-relation-metadata-args.interface.ts b/packages/twenty-server/src/engine/twenty-orm/interfaces/workspace-relation-metadata-args.interface.ts index 2debd271da..95803cd8b3 100644 --- a/packages/twenty-server/src/engine/twenty-orm/interfaces/workspace-relation-metadata-args.interface.ts +++ b/packages/twenty-server/src/engine/twenty-orm/interfaces/workspace-relation-metadata-args.interface.ts @@ -1,6 +1,6 @@ import { type ObjectType } from 'typeorm'; +import { type RelationOnDeleteAction } from 'twenty-shared/types'; -import { type RelationOnDeleteAction } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-on-delete-action.interface'; import { type RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface'; import { type Gate } from 'src/engine/twenty-orm/interfaces/gate.interface'; diff --git a/packages/twenty-server/src/engine/twenty-orm/utils/format-column-name-for-relation-field.util.ts b/packages/twenty-server/src/engine/twenty-orm/utils/format-column-name-for-relation-field.util.ts index dc650082e2..5440c5167c 100644 --- a/packages/twenty-server/src/engine/twenty-orm/utils/format-column-name-for-relation-field.util.ts +++ b/packages/twenty-server/src/engine/twenty-orm/utils/format-column-name-for-relation-field.util.ts @@ -1,8 +1,9 @@ -import { RelationType } from 'twenty-shared/types'; +import { + type FieldMetadataRelationSettings, + RelationType, +} from 'twenty-shared/types'; import { isDefined } from 'twenty-shared/utils'; -import { type FieldMetadataRelationSettings } from 'src/engine/metadata-modules/field-metadata/interfaces/field-metadata-settings.interface'; - export const formatColumnNameForRelationField = ( fieldName: string, fieldMetadataSettings: FieldMetadataRelationSettings, diff --git a/packages/twenty-server/src/engine/twenty-orm/utils/process-field-metadata-for-column-name-mapping.util.ts b/packages/twenty-server/src/engine/twenty-orm/utils/process-field-metadata-for-column-name-mapping.util.ts index d3daa029ce..71cab1772c 100644 --- a/packages/twenty-server/src/engine/twenty-orm/utils/process-field-metadata-for-column-name-mapping.util.ts +++ b/packages/twenty-server/src/engine/twenty-orm/utils/process-field-metadata-for-column-name-mapping.util.ts @@ -1,5 +1,6 @@ +import { type FieldMetadataRelationSettings } from 'twenty-shared/types'; + import { type CompositeType } from 'src/engine/metadata-modules/field-metadata/interfaces/composite-type.interface'; -import { type FieldMetadataRelationSettings } from 'src/engine/metadata-modules/field-metadata/interfaces/field-metadata-settings.interface'; import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface'; import { extractGraphQLRelationFieldNames } from 'src/engine/api/graphql/workspace-schema-builder/utils/extract-graphql-relation-field-names.util'; diff --git a/packages/twenty-server/src/engine/utils/convert-object-metadata-to-schema-properties.util.ts b/packages/twenty-server/src/engine/utils/convert-object-metadata-to-schema-properties.util.ts index 1d5af38382..d733606cc8 100644 --- a/packages/twenty-server/src/engine/utils/convert-object-metadata-to-schema-properties.util.ts +++ b/packages/twenty-server/src/engine/utils/convert-object-metadata-to-schema-properties.util.ts @@ -1,10 +1,10 @@ -import { FieldMetadataType } from 'twenty-shared/types'; -import { isDefined } from 'twenty-shared/utils'; - import { + FieldMetadataType, type FieldMetadataSettings, NumberDataType, -} from 'src/engine/metadata-modules/field-metadata/interfaces/field-metadata-settings.interface'; +} from 'twenty-shared/types'; +import { isDefined } from 'twenty-shared/utils'; + import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface'; import { type FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity'; diff --git a/packages/twenty-server/src/engine/workspace-manager/dev-seeder/metadata/custom-fields/constants/survey-results-field-seeds.constant.ts b/packages/twenty-server/src/engine/workspace-manager/dev-seeder/metadata/custom-fields/constants/survey-results-field-seeds.constant.ts index dddd736d3c..d563d87b2f 100644 --- a/packages/twenty-server/src/engine/workspace-manager/dev-seeder/metadata/custom-fields/constants/survey-results-field-seeds.constant.ts +++ b/packages/twenty-server/src/engine/workspace-manager/dev-seeder/metadata/custom-fields/constants/survey-results-field-seeds.constant.ts @@ -1,6 +1,4 @@ -import { FieldMetadataType } from 'twenty-shared/types'; - -import { NumberDataType } from 'src/engine/metadata-modules/field-metadata/interfaces/field-metadata-settings.interface'; +import { FieldMetadataType, NumberDataType } from 'twenty-shared/types'; import { type FieldMetadataDTO } from 'src/engine/metadata-modules/field-metadata/dtos/field-metadata.dto'; import { type FieldMetadataSeed } from 'src/engine/workspace-manager/dev-seeder/metadata/types/field-metadata-seed.type'; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-runner/utils/convert-on-delete-action-to-on-delete.util.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-runner/utils/convert-on-delete-action-to-on-delete.util.ts index c048d4df4a..99b882e07c 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-runner/utils/convert-on-delete-action-to-on-delete.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-runner/utils/convert-on-delete-action-to-on-delete.util.ts @@ -1,4 +1,4 @@ -import { type RelationOnDeleteAction } from 'src/engine/metadata-modules/relation-metadata/relation-on-delete-action.type'; +import { type RelationOnDeleteAction } from 'twenty-shared/types'; export const convertOnDeleteActionToOnDelete = ( onDeleteAction: RelationOnDeleteAction | undefined, diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/comparators/workspace-field-relation.comparator.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/comparators/workspace-field-relation.comparator.ts index ce4d545800..f33078f729 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/comparators/workspace-field-relation.comparator.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/comparators/workspace-field-relation.comparator.ts @@ -1,9 +1,11 @@ import { Injectable } from '@nestjs/common'; import diff, { type DifferenceChange, type DifferenceRemove } from 'microdiff'; -import { type FieldMetadataType } from 'twenty-shared/types'; +import { + type FieldMetadataType, + type FieldMetadataRelationSettings, +} from 'twenty-shared/types'; -import { type FieldMetadataRelationSettings } from 'src/engine/metadata-modules/field-metadata/interfaces/field-metadata-settings.interface'; import { ComparatorAction, type FieldRelationComparatorResult, diff --git a/packages/twenty-server/src/modules/attachment/standard-objects/attachment.workspace-entity.ts b/packages/twenty-server/src/modules/attachment/standard-objects/attachment.workspace-entity.ts index b7264ed1bf..a81c0e41a6 100644 --- a/packages/twenty-server/src/modules/attachment/standard-objects/attachment.workspace-entity.ts +++ b/packages/twenty-server/src/modules/attachment/standard-objects/attachment.workspace-entity.ts @@ -1,7 +1,6 @@ import { msg } from '@lingui/core/macro'; -import { FieldMetadataType } from 'twenty-shared/types'; +import { FieldMetadataType, RelationOnDeleteAction } from 'twenty-shared/types'; -import { RelationOnDeleteAction } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-on-delete-action.interface'; import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface'; import { Relation } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/relation.interface'; diff --git a/packages/twenty-server/src/modules/blocklist/standard-objects/blocklist.workspace-entity.ts b/packages/twenty-server/src/modules/blocklist/standard-objects/blocklist.workspace-entity.ts index 7c12b368ca..f704a4221f 100644 --- a/packages/twenty-server/src/modules/blocklist/standard-objects/blocklist.workspace-entity.ts +++ b/packages/twenty-server/src/modules/blocklist/standard-objects/blocklist.workspace-entity.ts @@ -1,7 +1,6 @@ import { msg } from '@lingui/core/macro'; -import { FieldMetadataType } from 'twenty-shared/types'; +import { FieldMetadataType, RelationOnDeleteAction } from 'twenty-shared/types'; -import { RelationOnDeleteAction } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-on-delete-action.interface'; import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface'; import { Relation } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/relation.interface'; diff --git a/packages/twenty-server/src/modules/calendar/common/standard-objects/calendar-channel-event-association.workspace-entity.ts b/packages/twenty-server/src/modules/calendar/common/standard-objects/calendar-channel-event-association.workspace-entity.ts index d7295eafce..995962004c 100644 --- a/packages/twenty-server/src/modules/calendar/common/standard-objects/calendar-channel-event-association.workspace-entity.ts +++ b/packages/twenty-server/src/modules/calendar/common/standard-objects/calendar-channel-event-association.workspace-entity.ts @@ -1,7 +1,6 @@ import { msg } from '@lingui/core/macro'; -import { FieldMetadataType } from 'twenty-shared/types'; +import { FieldMetadataType, RelationOnDeleteAction } from 'twenty-shared/types'; -import { RelationOnDeleteAction } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-on-delete-action.interface'; import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface'; import { Relation } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/relation.interface'; diff --git a/packages/twenty-server/src/modules/calendar/common/standard-objects/calendar-channel.workspace-entity.ts b/packages/twenty-server/src/modules/calendar/common/standard-objects/calendar-channel.workspace-entity.ts index 00f3d429b2..b6dd8bbcc5 100644 --- a/packages/twenty-server/src/modules/calendar/common/standard-objects/calendar-channel.workspace-entity.ts +++ b/packages/twenty-server/src/modules/calendar/common/standard-objects/calendar-channel.workspace-entity.ts @@ -1,9 +1,8 @@ import { registerEnumType } from '@nestjs/graphql'; import { msg } from '@lingui/core/macro'; -import { FieldMetadataType } from 'twenty-shared/types'; +import { FieldMetadataType, RelationOnDeleteAction } from 'twenty-shared/types'; -import { RelationOnDeleteAction } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-on-delete-action.interface'; import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface'; import { Relation } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/relation.interface'; diff --git a/packages/twenty-server/src/modules/calendar/common/standard-objects/calendar-event-participant.workspace-entity.ts b/packages/twenty-server/src/modules/calendar/common/standard-objects/calendar-event-participant.workspace-entity.ts index 48f7c74223..c53080e40c 100644 --- a/packages/twenty-server/src/modules/calendar/common/standard-objects/calendar-event-participant.workspace-entity.ts +++ b/packages/twenty-server/src/modules/calendar/common/standard-objects/calendar-event-participant.workspace-entity.ts @@ -1,9 +1,8 @@ import { msg } from '@lingui/core/macro'; -import { FieldMetadataType } from 'twenty-shared/types'; +import { FieldMetadataType, RelationOnDeleteAction } from 'twenty-shared/types'; import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface'; import { Relation } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/relation.interface'; -import { RelationOnDeleteAction } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-on-delete-action.interface'; import { BaseWorkspaceEntity } from 'src/engine/twenty-orm/base.workspace-entity'; import { WorkspaceEntity } from 'src/engine/twenty-orm/decorators/workspace-entity.decorator'; diff --git a/packages/twenty-server/src/modules/calendar/common/standard-objects/calendar-event.workspace-entity.ts b/packages/twenty-server/src/modules/calendar/common/standard-objects/calendar-event.workspace-entity.ts index 294a8549ae..0de3d8ceb6 100644 --- a/packages/twenty-server/src/modules/calendar/common/standard-objects/calendar-event.workspace-entity.ts +++ b/packages/twenty-server/src/modules/calendar/common/standard-objects/calendar-event.workspace-entity.ts @@ -1,7 +1,6 @@ import { msg } from '@lingui/core/macro'; -import { FieldMetadataType } from 'twenty-shared/types'; +import { FieldMetadataType, RelationOnDeleteAction } from 'twenty-shared/types'; -import { RelationOnDeleteAction } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-on-delete-action.interface'; import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface'; import { Relation } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/relation.interface'; diff --git a/packages/twenty-server/src/modules/company/standard-objects/company.workspace-entity.ts b/packages/twenty-server/src/modules/company/standard-objects/company.workspace-entity.ts index 9a4589b5ec..c8d8fcb257 100644 --- a/packages/twenty-server/src/modules/company/standard-objects/company.workspace-entity.ts +++ b/packages/twenty-server/src/modules/company/standard-objects/company.workspace-entity.ts @@ -1,7 +1,6 @@ import { msg } from '@lingui/core/macro'; -import { FieldMetadataType } from 'twenty-shared/types'; +import { FieldMetadataType, RelationOnDeleteAction } from 'twenty-shared/types'; -import { RelationOnDeleteAction } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-on-delete-action.interface'; import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface'; import { Relation } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/relation.interface'; diff --git a/packages/twenty-server/src/modules/connected-account/standard-objects/connected-account.workspace-entity.ts b/packages/twenty-server/src/modules/connected-account/standard-objects/connected-account.workspace-entity.ts index 44375eb607..6f04dbb7fe 100644 --- a/packages/twenty-server/src/modules/connected-account/standard-objects/connected-account.workspace-entity.ts +++ b/packages/twenty-server/src/modules/connected-account/standard-objects/connected-account.workspace-entity.ts @@ -2,9 +2,9 @@ import { msg } from '@lingui/core/macro'; import { ConnectedAccountProvider, FieldMetadataType, + RelationOnDeleteAction, } from 'twenty-shared/types'; -import { RelationOnDeleteAction } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-on-delete-action.interface'; import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface'; import { Relation } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/relation.interface'; diff --git a/packages/twenty-server/src/modules/dashboard/standard-objects/dashboard.workspace-entity.ts b/packages/twenty-server/src/modules/dashboard/standard-objects/dashboard.workspace-entity.ts index bb1b2e9ce6..9526a23bb5 100644 --- a/packages/twenty-server/src/modules/dashboard/standard-objects/dashboard.workspace-entity.ts +++ b/packages/twenty-server/src/modules/dashboard/standard-objects/dashboard.workspace-entity.ts @@ -1,7 +1,6 @@ import { msg } from '@lingui/core/macro'; -import { FieldMetadataType } from 'twenty-shared/types'; +import { FieldMetadataType, RelationOnDeleteAction } from 'twenty-shared/types'; -import { RelationOnDeleteAction } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-on-delete-action.interface'; import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface'; import { Relation } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/relation.interface'; diff --git a/packages/twenty-server/src/modules/favorite-folder/standard-objects/favorite-folder.workspace-entity.ts b/packages/twenty-server/src/modules/favorite-folder/standard-objects/favorite-folder.workspace-entity.ts index fcc50c9d28..85ee25a6ec 100644 --- a/packages/twenty-server/src/modules/favorite-folder/standard-objects/favorite-folder.workspace-entity.ts +++ b/packages/twenty-server/src/modules/favorite-folder/standard-objects/favorite-folder.workspace-entity.ts @@ -1,7 +1,6 @@ import { msg } from '@lingui/core/macro'; -import { FieldMetadataType } from 'twenty-shared/types'; +import { FieldMetadataType, RelationOnDeleteAction } from 'twenty-shared/types'; -import { RelationOnDeleteAction } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-on-delete-action.interface'; import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface'; import { Relation } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/relation.interface'; diff --git a/packages/twenty-server/src/modules/favorite/standard-objects/favorite.workspace-entity.ts b/packages/twenty-server/src/modules/favorite/standard-objects/favorite.workspace-entity.ts index 17b3ec393b..a4451c6a84 100644 --- a/packages/twenty-server/src/modules/favorite/standard-objects/favorite.workspace-entity.ts +++ b/packages/twenty-server/src/modules/favorite/standard-objects/favorite.workspace-entity.ts @@ -1,10 +1,9 @@ import { msg } from '@lingui/core/macro'; -import { FieldMetadataType } from 'twenty-shared/types'; +import { FieldMetadataType, RelationOnDeleteAction } from 'twenty-shared/types'; import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface'; import { Relation } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/relation.interface'; -import { RelationOnDeleteAction } from 'src/engine/metadata-modules/relation-metadata/relation-on-delete-action.type'; import { BaseWorkspaceEntity } from 'src/engine/twenty-orm/base.workspace-entity'; import { CustomWorkspaceEntity } from 'src/engine/twenty-orm/custom.workspace-entity'; import { WorkspaceDynamicRelation } from 'src/engine/twenty-orm/decorators/workspace-dynamic-relation.decorator'; diff --git a/packages/twenty-server/src/modules/messaging/common/standard-objects/message-channel-message-association.workspace-entity.ts b/packages/twenty-server/src/modules/messaging/common/standard-objects/message-channel-message-association.workspace-entity.ts index e4220cdb21..cca49a0403 100644 --- a/packages/twenty-server/src/modules/messaging/common/standard-objects/message-channel-message-association.workspace-entity.ts +++ b/packages/twenty-server/src/modules/messaging/common/standard-objects/message-channel-message-association.workspace-entity.ts @@ -1,9 +1,8 @@ import { msg } from '@lingui/core/macro'; -import { FieldMetadataType } from 'twenty-shared/types'; +import { FieldMetadataType, RelationOnDeleteAction } from 'twenty-shared/types'; import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface'; import { type Relation } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/relation.interface'; -import { RelationOnDeleteAction } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-on-delete-action.interface'; import { BaseWorkspaceEntity } from 'src/engine/twenty-orm/base.workspace-entity'; import { WorkspaceEntity } from 'src/engine/twenty-orm/decorators/workspace-entity.decorator'; diff --git a/packages/twenty-server/src/modules/messaging/common/standard-objects/message-channel.workspace-entity.ts b/packages/twenty-server/src/modules/messaging/common/standard-objects/message-channel.workspace-entity.ts index 648148600c..5d3fac1370 100644 --- a/packages/twenty-server/src/modules/messaging/common/standard-objects/message-channel.workspace-entity.ts +++ b/packages/twenty-server/src/modules/messaging/common/standard-objects/message-channel.workspace-entity.ts @@ -1,9 +1,8 @@ import { registerEnumType } from '@nestjs/graphql'; import { msg } from '@lingui/core/macro'; -import { FieldMetadataType } from 'twenty-shared/types'; +import { FieldMetadataType, RelationOnDeleteAction } from 'twenty-shared/types'; -import { RelationOnDeleteAction } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-on-delete-action.interface'; import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface'; import { Relation } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/relation.interface'; diff --git a/packages/twenty-server/src/modules/messaging/common/standard-objects/message-folder.workspace-entity.ts b/packages/twenty-server/src/modules/messaging/common/standard-objects/message-folder.workspace-entity.ts index 6fa4c6c88f..a25ec5a536 100644 --- a/packages/twenty-server/src/modules/messaging/common/standard-objects/message-folder.workspace-entity.ts +++ b/packages/twenty-server/src/modules/messaging/common/standard-objects/message-folder.workspace-entity.ts @@ -1,10 +1,9 @@ import { registerEnumType } from '@nestjs/graphql'; import { msg } from '@lingui/core/macro'; -import { FieldMetadataType } from 'twenty-shared/types'; +import { FieldMetadataType, RelationOnDeleteAction } from 'twenty-shared/types'; import { Relation } from 'typeorm'; -import { RelationOnDeleteAction } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-on-delete-action.interface'; import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface'; import { BaseWorkspaceEntity } from 'src/engine/twenty-orm/base.workspace-entity'; diff --git a/packages/twenty-server/src/modules/messaging/common/standard-objects/message-participant.workspace-entity.ts b/packages/twenty-server/src/modules/messaging/common/standard-objects/message-participant.workspace-entity.ts index c07cdefdcf..21a6ad074a 100644 --- a/packages/twenty-server/src/modules/messaging/common/standard-objects/message-participant.workspace-entity.ts +++ b/packages/twenty-server/src/modules/messaging/common/standard-objects/message-participant.workspace-entity.ts @@ -1,9 +1,8 @@ import { msg } from '@lingui/core/macro'; -import { FieldMetadataType } from 'twenty-shared/types'; +import { FieldMetadataType, RelationOnDeleteAction } from 'twenty-shared/types'; import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface'; import { Relation } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/relation.interface'; -import { RelationOnDeleteAction } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-on-delete-action.interface'; import { BaseWorkspaceEntity } from 'src/engine/twenty-orm/base.workspace-entity'; import { WorkspaceEntity } from 'src/engine/twenty-orm/decorators/workspace-entity.decorator'; diff --git a/packages/twenty-server/src/modules/messaging/common/standard-objects/message-thread.workspace-entity.ts b/packages/twenty-server/src/modules/messaging/common/standard-objects/message-thread.workspace-entity.ts index f4f596ebe7..798a9d53cd 100644 --- a/packages/twenty-server/src/modules/messaging/common/standard-objects/message-thread.workspace-entity.ts +++ b/packages/twenty-server/src/modules/messaging/common/standard-objects/message-thread.workspace-entity.ts @@ -1,6 +1,6 @@ import { msg } from '@lingui/core/macro'; +import { RelationOnDeleteAction } from 'twenty-shared/types'; -import { RelationOnDeleteAction } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-on-delete-action.interface'; import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface'; import { Relation } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/relation.interface'; diff --git a/packages/twenty-server/src/modules/messaging/common/standard-objects/message.workspace-entity.ts b/packages/twenty-server/src/modules/messaging/common/standard-objects/message.workspace-entity.ts index dafb9a7bc8..e7bf2dc0df 100644 --- a/packages/twenty-server/src/modules/messaging/common/standard-objects/message.workspace-entity.ts +++ b/packages/twenty-server/src/modules/messaging/common/standard-objects/message.workspace-entity.ts @@ -1,7 +1,6 @@ import { msg } from '@lingui/core/macro'; -import { FieldMetadataType } from 'twenty-shared/types'; +import { FieldMetadataType, RelationOnDeleteAction } from 'twenty-shared/types'; -import { RelationOnDeleteAction } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-on-delete-action.interface'; import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface'; import { Relation } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/relation.interface'; diff --git a/packages/twenty-server/src/modules/note/standard-objects/note-target.workspace-entity.ts b/packages/twenty-server/src/modules/note/standard-objects/note-target.workspace-entity.ts index 13d93cdd79..94aecf8244 100644 --- a/packages/twenty-server/src/modules/note/standard-objects/note-target.workspace-entity.ts +++ b/packages/twenty-server/src/modules/note/standard-objects/note-target.workspace-entity.ts @@ -1,8 +1,8 @@ import { msg } from '@lingui/core/macro'; +import { RelationOnDeleteAction } from 'twenty-shared/types'; import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface'; import { Relation } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/relation.interface'; -import { RelationOnDeleteAction } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-on-delete-action.interface'; import { BaseWorkspaceEntity } from 'src/engine/twenty-orm/base.workspace-entity'; import { CustomWorkspaceEntity } from 'src/engine/twenty-orm/custom.workspace-entity'; diff --git a/packages/twenty-server/src/modules/note/standard-objects/note.workspace-entity.ts b/packages/twenty-server/src/modules/note/standard-objects/note.workspace-entity.ts index d177fa88b5..fde330ae1b 100644 --- a/packages/twenty-server/src/modules/note/standard-objects/note.workspace-entity.ts +++ b/packages/twenty-server/src/modules/note/standard-objects/note.workspace-entity.ts @@ -1,7 +1,6 @@ import { msg } from '@lingui/core/macro'; -import { FieldMetadataType } from 'twenty-shared/types'; +import { FieldMetadataType, RelationOnDeleteAction } from 'twenty-shared/types'; -import { RelationOnDeleteAction } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-on-delete-action.interface'; import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface'; import { Relation } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/relation.interface'; diff --git a/packages/twenty-server/src/modules/opportunity/standard-objects/opportunity.workspace-entity.ts b/packages/twenty-server/src/modules/opportunity/standard-objects/opportunity.workspace-entity.ts index c76b17698f..e938b50051 100644 --- a/packages/twenty-server/src/modules/opportunity/standard-objects/opportunity.workspace-entity.ts +++ b/packages/twenty-server/src/modules/opportunity/standard-objects/opportunity.workspace-entity.ts @@ -1,7 +1,6 @@ import { msg } from '@lingui/core/macro'; -import { FieldMetadataType } from 'twenty-shared/types'; +import { FieldMetadataType, RelationOnDeleteAction } from 'twenty-shared/types'; -import { RelationOnDeleteAction } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-on-delete-action.interface'; import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface'; import { Relation } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/relation.interface'; diff --git a/packages/twenty-server/src/modules/person/standard-objects/person.workspace-entity.ts b/packages/twenty-server/src/modules/person/standard-objects/person.workspace-entity.ts index f7f33e5be0..1c1d2b74f7 100644 --- a/packages/twenty-server/src/modules/person/standard-objects/person.workspace-entity.ts +++ b/packages/twenty-server/src/modules/person/standard-objects/person.workspace-entity.ts @@ -1,7 +1,6 @@ import { msg } from '@lingui/core/macro'; -import { FieldMetadataType } from 'twenty-shared/types'; +import { FieldMetadataType, RelationOnDeleteAction } from 'twenty-shared/types'; -import { RelationOnDeleteAction } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-on-delete-action.interface'; import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface'; import { Relation } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/relation.interface'; diff --git a/packages/twenty-server/src/modules/task/standard-objects/task-target.workspace-entity.ts b/packages/twenty-server/src/modules/task/standard-objects/task-target.workspace-entity.ts index 0a247a20fe..2d5e24e30f 100644 --- a/packages/twenty-server/src/modules/task/standard-objects/task-target.workspace-entity.ts +++ b/packages/twenty-server/src/modules/task/standard-objects/task-target.workspace-entity.ts @@ -1,8 +1,8 @@ import { msg } from '@lingui/core/macro'; +import { RelationOnDeleteAction } from 'twenty-shared/types'; import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface'; import { Relation } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/relation.interface'; -import { RelationOnDeleteAction } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-on-delete-action.interface'; import { BaseWorkspaceEntity } from 'src/engine/twenty-orm/base.workspace-entity'; import { CustomWorkspaceEntity } from 'src/engine/twenty-orm/custom.workspace-entity'; diff --git a/packages/twenty-server/src/modules/task/standard-objects/task.workspace-entity.ts b/packages/twenty-server/src/modules/task/standard-objects/task.workspace-entity.ts index 6ae4f0f84f..5bdd8c78ea 100644 --- a/packages/twenty-server/src/modules/task/standard-objects/task.workspace-entity.ts +++ b/packages/twenty-server/src/modules/task/standard-objects/task.workspace-entity.ts @@ -1,7 +1,6 @@ import { msg } from '@lingui/core/macro'; -import { FieldMetadataType } from 'twenty-shared/types'; +import { FieldMetadataType, RelationOnDeleteAction } from 'twenty-shared/types'; -import { RelationOnDeleteAction } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-on-delete-action.interface'; import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface'; import { Relation } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/relation.interface'; diff --git a/packages/twenty-server/src/modules/timeline/standard-objects/timeline-activity.workspace-entity.ts b/packages/twenty-server/src/modules/timeline/standard-objects/timeline-activity.workspace-entity.ts index 880dc2021e..4aa22ee9dd 100644 --- a/packages/twenty-server/src/modules/timeline/standard-objects/timeline-activity.workspace-entity.ts +++ b/packages/twenty-server/src/modules/timeline/standard-objects/timeline-activity.workspace-entity.ts @@ -1,7 +1,6 @@ import { msg } from '@lingui/core/macro'; -import { FieldMetadataType } from 'twenty-shared/types'; +import { FieldMetadataType, RelationOnDeleteAction } from 'twenty-shared/types'; -import { RelationOnDeleteAction } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-on-delete-action.interface'; import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface'; import { Relation } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/relation.interface'; diff --git a/packages/twenty-server/src/modules/workflow/common/standard-objects/workflow-automated-trigger.workspace-entity.ts b/packages/twenty-server/src/modules/workflow/common/standard-objects/workflow-automated-trigger.workspace-entity.ts index 9b2f2b2b21..bd1aed98de 100644 --- a/packages/twenty-server/src/modules/workflow/common/standard-objects/workflow-automated-trigger.workspace-entity.ts +++ b/packages/twenty-server/src/modules/workflow/common/standard-objects/workflow-automated-trigger.workspace-entity.ts @@ -1,10 +1,9 @@ import { msg } from '@lingui/core/macro'; -import { FieldMetadataType } from 'twenty-shared/types'; +import { FieldMetadataType, RelationOnDeleteAction } from 'twenty-shared/types'; import { Relation } from 'typeorm'; import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface'; -import { RelationOnDeleteAction } from 'src/engine/metadata-modules/relation-metadata/relation-on-delete-action.type'; import { BaseWorkspaceEntity } from 'src/engine/twenty-orm/base.workspace-entity'; import { WorkspaceEntity } from 'src/engine/twenty-orm/decorators/workspace-entity.decorator'; import { WorkspaceField } from 'src/engine/twenty-orm/decorators/workspace-field.decorator'; diff --git a/packages/twenty-server/src/modules/workflow/common/standard-objects/workflow-run.workspace-entity.ts b/packages/twenty-server/src/modules/workflow/common/standard-objects/workflow-run.workspace-entity.ts index 3df4e8790b..e0e9e81479 100644 --- a/packages/twenty-server/src/modules/workflow/common/standard-objects/workflow-run.workspace-entity.ts +++ b/packages/twenty-server/src/modules/workflow/common/standard-objects/workflow-run.workspace-entity.ts @@ -1,10 +1,9 @@ import { registerEnumType } from '@nestjs/graphql'; import { msg } from '@lingui/core/macro'; -import { FieldMetadataType } from 'twenty-shared/types'; +import { FieldMetadataType, RelationOnDeleteAction } from 'twenty-shared/types'; import { type WorkflowRunStepInfos } from 'twenty-shared/workflow'; -import { RelationOnDeleteAction } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-on-delete-action.interface'; import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface'; import { Relation } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/relation.interface'; diff --git a/packages/twenty-server/src/modules/workflow/common/standard-objects/workflow-version.workspace-entity.ts b/packages/twenty-server/src/modules/workflow/common/standard-objects/workflow-version.workspace-entity.ts index 62d8698a27..bf1436c8bd 100644 --- a/packages/twenty-server/src/modules/workflow/common/standard-objects/workflow-version.workspace-entity.ts +++ b/packages/twenty-server/src/modules/workflow/common/standard-objects/workflow-version.workspace-entity.ts @@ -1,7 +1,6 @@ import { msg } from '@lingui/core/macro'; -import { FieldMetadataType } from 'twenty-shared/types'; +import { FieldMetadataType, RelationOnDeleteAction } from 'twenty-shared/types'; -import { RelationOnDeleteAction } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-on-delete-action.interface'; import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface'; import { Relation } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/relation.interface'; diff --git a/packages/twenty-server/src/modules/workflow/common/standard-objects/workflow.workspace-entity.ts b/packages/twenty-server/src/modules/workflow/common/standard-objects/workflow.workspace-entity.ts index a430353814..7aa5d912dd 100644 --- a/packages/twenty-server/src/modules/workflow/common/standard-objects/workflow.workspace-entity.ts +++ b/packages/twenty-server/src/modules/workflow/common/standard-objects/workflow.workspace-entity.ts @@ -1,7 +1,6 @@ import { msg } from '@lingui/core/macro'; -import { FieldMetadataType } from 'twenty-shared/types'; +import { FieldMetadataType, RelationOnDeleteAction } from 'twenty-shared/types'; -import { RelationOnDeleteAction } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-on-delete-action.interface'; import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface'; import { Relation } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/relation.interface'; diff --git a/packages/twenty-server/src/modules/workspace-member/standard-objects/workspace-member.workspace-entity.ts b/packages/twenty-server/src/modules/workspace-member/standard-objects/workspace-member.workspace-entity.ts index d17ad870f8..cbe62e7119 100644 --- a/packages/twenty-server/src/modules/workspace-member/standard-objects/workspace-member.workspace-entity.ts +++ b/packages/twenty-server/src/modules/workspace-member/standard-objects/workspace-member.workspace-entity.ts @@ -2,10 +2,12 @@ import { registerEnumType } from '@nestjs/graphql'; import { msg } from '@lingui/core/macro'; import { type APP_LOCALES, SOURCE_LOCALE } from 'twenty-shared/translations'; -import { FieldMetadataType } from 'twenty-shared/types'; +import { + FieldMetadataType, + NumberDataType, + RelationOnDeleteAction, +} from 'twenty-shared/types'; -import { NumberDataType } from 'src/engine/metadata-modules/field-metadata/interfaces/field-metadata-settings.interface'; -import { RelationOnDeleteAction } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-on-delete-action.interface'; import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface'; import { Relation } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/relation.interface'; diff --git a/packages/twenty-shared/src/types/FieldMetadataDefaultValue.ts b/packages/twenty-shared/src/types/FieldMetadataDefaultValue.ts new file mode 100644 index 0000000000..bf681e708c --- /dev/null +++ b/packages/twenty-shared/src/types/FieldMetadataDefaultValue.ts @@ -0,0 +1,311 @@ +import { type FieldMetadataType } from '@/types/FieldMetadataType'; +import { type IsExactly } from '@/types/IsExactly'; + +import { + IsArray, + IsBoolean, + IsDate, + IsNotEmpty, + IsNumber, + IsNumberString, + IsObject, + IsOptional, + IsString, + IsUUID, + Matches, + ValidateIf, + type ValidationArguments, + type ValidationOptions, + registerDecorator, +} from 'class-validator'; + +const IsQuotedString = (validationOptions?: ValidationOptions) => { + return (object: object, propertyName: string) => { + registerDecorator({ + name: 'isQuotedString', + target: object.constructor, + propertyName: propertyName, + options: validationOptions, + validator: { + validate: (value: any) => { + return typeof value === 'string' && /^'{1}.*'{1}$/.test(value); + }, + defaultMessage: (args: ValidationArguments) => { + return `${args.property} must be a quoted string`; + }, + }, + }); + }; +}; + +export const fieldMetadataDefaultValueFunctionName = { + UUID: 'uuid', + NOW: 'now', +} as const; + +export type FieldMetadataDefaultValueFunctionNames = + (typeof fieldMetadataDefaultValueFunctionName)[keyof typeof fieldMetadataDefaultValueFunctionName]; + +export class FieldMetadataDefaultValueString { + @ValidateIf((_object, value) => value !== null) + @IsQuotedString() + value!: string | null; +} + +export class FieldMetadataDefaultValueRawJson { + @ValidateIf((_object, value) => value !== null) + @IsObject() // TODO: Should this also allow arrays? + value!: object | null; +} + +export class FieldMetadataDefaultValueRichTextV2 { + @ValidateIf((_object, value) => value !== null) + @IsQuotedString() + blocknote!: string | null; + + @ValidateIf((_object, value) => value !== null) + @IsQuotedString() + markdown!: string | null; +} + +export class FieldMetadataDefaultValueRichText { + @ValidateIf((_object, value) => value !== null) + @IsString() + value!: string | null; +} + +export class FieldMetadataDefaultValueNumber { + @ValidateIf((_object, value) => value !== null) + @IsNumber() + value!: number | null; +} + +export class FieldMetadataDefaultValueBoolean { + @ValidateIf((_object, value) => value !== null) + @IsBoolean() + value!: boolean | null; +} + +export class FieldMetadataDefaultValueStringArray { + @ValidateIf((_object, value) => value !== null) + @IsArray() + @IsQuotedString({ each: true }) + value!: string[] | null; +} + +export class FieldMetadataDefaultValueDateTime { + @ValidateIf((_object, value) => value !== null) + @IsDate() + value!: Date | null; +} + +export class FieldMetadataDefaultValueDate { + @ValidateIf((_object, value) => value !== null) + @IsDate() + value!: Date | null; +} + +export class FieldMetadataDefaultValueCurrency { + @ValidateIf((_object, value) => value !== null) + @IsNumberString() + amountMicros!: string | null; + + @ValidateIf((_object, value) => value !== null) + @IsQuotedString() + currencyCode!: string | null; +} + +export class FieldMetadataDefaultValueFullName { + @ValidateIf((_object, value) => value !== null) + @IsQuotedString() + firstName!: string | null; + + @ValidateIf((_object, value) => value !== null) + @IsQuotedString() + lastName!: string | null; +} + +export class FieldMetadataDefaultValueUuidFunction { + @Matches(fieldMetadataDefaultValueFunctionName.UUID) + @IsNotEmpty() + value!: typeof fieldMetadataDefaultValueFunctionName.UUID; +} + +export class FieldMetadataDefaultValueNowFunction { + @Matches(fieldMetadataDefaultValueFunctionName.NOW) + @IsNotEmpty() + value!: typeof fieldMetadataDefaultValueFunctionName.NOW; +} + +export class FieldMetadataDefaultValueAddress { + @ValidateIf((_object, value) => value !== null) + @IsString() + addressStreet1!: string | null; + + @ValidateIf((_object, value) => value !== null) + @IsString() + addressStreet2!: string | null; + + @ValidateIf((_object, value) => value !== null) + @IsString() + addressCity!: string | null; + + @ValidateIf((_object, value) => value !== null) + @IsString() + addressPostcode!: string | null; + + @ValidateIf((_object, value) => value !== null) + @IsString() + addressState!: string | null; + + @ValidateIf((_object, value) => value !== null) + @IsString() + addressCountry!: string | null; + + @ValidateIf((_object, value) => value !== null) + @IsNumber() + addressLat!: number | null; + + @ValidateIf((_object, value) => value !== null) + @IsNumber() + addressLng!: number | null; +} + +class LinkMetadata { + @IsString() + label!: string; + + @IsString() + url!: string; +} + +export class FieldMetadataDefaultValueLinks { + @ValidateIf((_object, value) => value !== null) + @IsQuotedString() + primaryLinkLabel!: string | null; + + @ValidateIf((_object, value) => value !== null) + @IsQuotedString() + primaryLinkUrl!: string | null; + + @ValidateIf((_object, value) => value !== null) + @IsArray() + secondaryLinks!: LinkMetadata[] | null; +} + +export class FieldMetadataDefaultActor { + @ValidateIf((_object, value) => value !== null) + @IsString() + source!: string; + + @ValidateIf((_object, value) => value !== null) + @IsOptional() + @IsUUID() + workspaceMemberId?: string | null; + + @ValidateIf((_object, value) => value !== null) + @IsString() + name!: string; +} + +export class FieldMetadataDefaultValueEmails { + @ValidateIf((_object, value) => value !== null) + @IsQuotedString() + primaryEmail!: string | null; + + @ValidateIf((_object, value) => value !== null) + @IsObject() + additionalEmails!: object | null; +} + +export class FieldMetadataDefaultValuePhones { + @ValidateIf((_object, value) => value !== null) + @IsQuotedString() + primaryPhoneNumber!: string | null; + + @ValidateIf((_object, value) => value !== null) + @IsQuotedString() + primaryPhoneCountryCode!: string | null; + + @ValidateIf((_object, value) => value !== null) + @IsQuotedString() + primaryPhoneCallingCode!: string | null; + + @ValidateIf((_object, value) => value !== null) + @IsObject() + additionalPhones!: object | null; +} + +export class FieldMetadataDefaultArray { + @ValidateIf((_object, value) => value !== null) + @IsArray() + value!: string[] | null; +} + +type ExtractValueType = T extends { value: infer V } ? V : T; + +type UnionOfValues = T[keyof T]; + +type FieldMetadataDefaultValueMapping = { + [FieldMetadataType.UUID]: + | FieldMetadataDefaultValueString + | FieldMetadataDefaultValueUuidFunction; + [FieldMetadataType.TEXT]: FieldMetadataDefaultValueString; + [FieldMetadataType.PHONES]: FieldMetadataDefaultValuePhones; + [FieldMetadataType.EMAILS]: FieldMetadataDefaultValueEmails; + [FieldMetadataType.DATE_TIME]: + | FieldMetadataDefaultValueDateTime + | FieldMetadataDefaultValueNowFunction; + [FieldMetadataType.DATE]: + | FieldMetadataDefaultValueDateTime + | FieldMetadataDefaultValueNowFunction; + [FieldMetadataType.BOOLEAN]: FieldMetadataDefaultValueBoolean; + [FieldMetadataType.NUMBER]: FieldMetadataDefaultValueNumber; + [FieldMetadataType.POSITION]: FieldMetadataDefaultValueNumber; + [FieldMetadataType.NUMERIC]: FieldMetadataDefaultValueString; + [FieldMetadataType.LINKS]: FieldMetadataDefaultValueLinks; + [FieldMetadataType.CURRENCY]: FieldMetadataDefaultValueCurrency; + [FieldMetadataType.FULL_NAME]: FieldMetadataDefaultValueFullName; + [FieldMetadataType.ADDRESS]: FieldMetadataDefaultValueAddress; + [FieldMetadataType.RATING]: FieldMetadataDefaultValueString; + [FieldMetadataType.SELECT]: FieldMetadataDefaultValueString; + [FieldMetadataType.MULTI_SELECT]: FieldMetadataDefaultValueStringArray; + [FieldMetadataType.RAW_JSON]: FieldMetadataDefaultValueRawJson; + [FieldMetadataType.RICH_TEXT]: FieldMetadataDefaultValueRichText; + [FieldMetadataType.ACTOR]: FieldMetadataDefaultActor; + [FieldMetadataType.ARRAY]: FieldMetadataDefaultArray; +}; + +export type FieldMetadataClassValidation = + UnionOfValues; + +export type FieldMetadataFunctionDefaultValue = ExtractValueType< + FieldMetadataDefaultValueUuidFunction | FieldMetadataDefaultValueNowFunction +>; + +export type FieldMetadataDefaultValueForType< + T extends keyof FieldMetadataDefaultValueMapping, +> = ExtractValueType | null; + +export type FieldMetadataDefaultValueForAnyType = ExtractValueType< + UnionOfValues +> | null; + +export type FieldMetadataDefaultValue< + T extends FieldMetadataType = FieldMetadataType, +> = + IsExactly extends true + ? FieldMetadataDefaultValueForAnyType | null // Could be improved to be | unknown + : T extends keyof FieldMetadataDefaultValueMapping + ? FieldMetadataDefaultValueForType + : never | null; + +type FieldMetadataDefaultValueExtractedTypes = { + [K in keyof FieldMetadataDefaultValueMapping]: ExtractValueType< + FieldMetadataDefaultValueMapping[K] + >; +}; + +export type FieldMetadataDefaultSerializableValue = + | FieldMetadataDefaultValueExtractedTypes[keyof FieldMetadataDefaultValueExtractedTypes] + | null; diff --git a/packages/twenty-server/src/engine/metadata-modules/field-metadata/interfaces/field-metadata-options.interface.ts b/packages/twenty-shared/src/types/FieldMetadataOptions.ts similarity index 55% rename from packages/twenty-server/src/engine/metadata-modules/field-metadata/interfaces/field-metadata-options.interface.ts rename to packages/twenty-shared/src/types/FieldMetadataOptions.ts index a220a7f715..977fe33f11 100644 --- a/packages/twenty-server/src/engine/metadata-modules/field-metadata/interfaces/field-metadata-options.interface.ts +++ b/packages/twenty-shared/src/types/FieldMetadataOptions.ts @@ -1,9 +1,28 @@ -import { type FieldMetadataType, type IsExactly } from 'twenty-shared/types'; +import { type FieldMetadataType } from '@/types/FieldMetadataType'; +import { type IsExactly } from '@/types/IsExactly'; -import { - type FieldMetadataComplexOption, - type FieldMetadataDefaultOption, -} from 'src/engine/metadata-modules/field-metadata/dtos/options.input'; +export type TagColor = + | 'green' + | 'turquoise' + | 'sky' + | 'blue' + | 'purple' + | 'pink' + | 'red' + | 'orange' + | 'yellow' + | 'gray'; + +export class FieldMetadataDefaultOption { + id?: string; + position!: number; + label!: string; + value!: string; +} + +export class FieldMetadataComplexOption extends FieldMetadataDefaultOption { + color!: TagColor; +} type FieldMetadataOptionsMapping = { [FieldMetadataType.RATING]: FieldMetadataDefaultOption[]; diff --git a/packages/twenty-server/src/engine/metadata-modules/field-metadata/interfaces/field-metadata-settings.interface.ts b/packages/twenty-shared/src/types/FieldMetadataSettings.ts similarity index 84% rename from packages/twenty-server/src/engine/metadata-modules/field-metadata/interfaces/field-metadata-settings.interface.ts rename to packages/twenty-shared/src/types/FieldMetadataSettings.ts index 8ca25b6ffb..f82cbd4351 100644 --- a/packages/twenty-server/src/engine/metadata-modules/field-metadata/interfaces/field-metadata-settings.interface.ts +++ b/packages/twenty-shared/src/types/FieldMetadataSettings.ts @@ -1,12 +1,9 @@ -import { - type AllowedAddressSubField, - type FieldMetadataMultiItemSettings, - type FieldMetadataType, - type IsExactly, -} from 'twenty-shared/types'; - -import { type RelationOnDeleteAction } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-on-delete-action.interface'; -import { type RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface'; +import { type AllowedAddressSubField } from '@/types/AddressFieldsType'; +import { type FieldMetadataMultiItemSettings } from '@/types/FieldMetadataMultiItemSettings'; +import { type RelationType } from '@/types/RelationType'; +import { type FieldMetadataType } from '@/types/FieldMetadataType'; +import { type IsExactly } from '@/types/IsExactly'; +import { type RelationOnDeleteAction } from '@/types/RelationOnDeleteAction.type'; export enum NumberDataType { FLOAT = 'float', diff --git a/packages/twenty-server/src/engine/metadata-modules/field-metadata/interfaces/relation-on-delete-action.interface.ts b/packages/twenty-shared/src/types/RelationOnDeleteAction.type.ts similarity index 100% rename from packages/twenty-server/src/engine/metadata-modules/field-metadata/interfaces/relation-on-delete-action.interface.ts rename to packages/twenty-shared/src/types/RelationOnDeleteAction.type.ts diff --git a/packages/twenty-shared/src/types/index.ts b/packages/twenty-shared/src/types/index.ts index db0a2f657b..0a1a1bc54f 100644 --- a/packages/twenty-shared/src/types/index.ts +++ b/packages/twenty-shared/src/types/index.ts @@ -18,7 +18,56 @@ export { ConnectedAccountProvider } from './ConnectedAccountProvider'; export type { EnumFieldMetadataType } from './EnumFieldMetadataType'; export type { ExcludeFunctions } from './ExcludeFunctions'; export type { ExtractPropertiesThatEndsWithId } from './ExtractPropertiesThatEndsWithId'; +export type { + FieldMetadataDefaultValueFunctionNames, + FieldMetadataClassValidation, + FieldMetadataFunctionDefaultValue, + FieldMetadataDefaultValueForType, + FieldMetadataDefaultValueForAnyType, + FieldMetadataDefaultValue, + FieldMetadataDefaultSerializableValue, +} from './FieldMetadataDefaultValue'; +export { + fieldMetadataDefaultValueFunctionName, + FieldMetadataDefaultValueString, + FieldMetadataDefaultValueRawJson, + FieldMetadataDefaultValueRichTextV2, + FieldMetadataDefaultValueRichText, + FieldMetadataDefaultValueNumber, + FieldMetadataDefaultValueBoolean, + FieldMetadataDefaultValueStringArray, + FieldMetadataDefaultValueDateTime, + FieldMetadataDefaultValueDate, + FieldMetadataDefaultValueCurrency, + FieldMetadataDefaultValueFullName, + FieldMetadataDefaultValueUuidFunction, + FieldMetadataDefaultValueNowFunction, + FieldMetadataDefaultValueAddress, + FieldMetadataDefaultValueLinks, + FieldMetadataDefaultActor, + FieldMetadataDefaultValueEmails, + FieldMetadataDefaultValuePhones, + FieldMetadataDefaultArray, +} from './FieldMetadataDefaultValue'; export type { FieldMetadataMultiItemSettings } from './FieldMetadataMultiItemSettings'; +export type { TagColor, FieldMetadataOptions } from './FieldMetadataOptions'; +export { + FieldMetadataDefaultOption, + FieldMetadataComplexOption, +} from './FieldMetadataOptions'; +export type { + FieldNumberVariant, + FieldMetadataNumberSettings, + FieldMetadataTextSettings, + FieldMetadataDateSettings, + FieldMetadataDateTimeSettings, + FieldMetadataRelationSettings, + FieldMetadataAddressSettings, + FieldMetadataTsVectorSettings, + AllFieldMetadataSettings, + FieldMetadataSettings, +} from './FieldMetadataSettings'; +export { NumberDataType, DateDisplayFormat } from './FieldMetadataSettings'; export { FieldMetadataType } from './FieldMetadataType'; export type { FieldRatingValue } from './FieldRatingValue'; export type { @@ -85,6 +134,7 @@ export type { } from './RecordGqlOperationFilter'; export type { RelationAndMorphRelationFieldMetadataType } from './RelationAndMorphRelationFieldMetadataType'; export type { RelationCreationPayload } from './RelationCreationPayload'; +export { RelationOnDeleteAction } from './RelationOnDeleteAction.type'; export { RelationType } from './RelationType'; export type { RestrictedFieldPermissions } from './RestrictedFieldPermissions'; export type { RestrictedFieldsPermissions } from './RestrictedFieldsPermissions';