From e3ffdb0c2b63e1dc5d05843802a0617e88eff00b Mon Sep 17 00:00:00 2001 From: Paul Rastoin <45004772+prastoin@users.noreply.github.com> Date: Tue, 30 Dec 2025 14:47:02 +0100 Subject: [PATCH] `[BREAKING_CHANGE_NESTED_WORKSPACE]`Refactor `FlatEntity` typing in aim of introducing `UniversalFlatEntity` (#16701) # Introduction Added a `WorkspaceRelated` and `AllNonWorkspaceRelatedEntity` to simplify the `FlatEntityFrom` that now do not expect a string literal to omit and itself builds the related many to one entities foreign key aggregators We now have the type grain over relation to syncable or just workspace related entities Added a migrations that sets the fk on missing entities ## Next In upcoming PR we will be able to introduce such below type ```ts import { type CastRecordTypeOrmDatePropertiesToString } from 'src/engine/metadata-modules/flat-entity/types/cast-record-typeorm-date-properties-to-string.type'; import { type ExtractEntityManyToOneEntityRelationProperties } from 'src/engine/metadata-modules/flat-entity/types/extract-entity-many-to-one-entity-relation-properties.type'; import { type ExtractEntityOneToManyEntityRelationProperties } from 'src/engine/metadata-modules/flat-entity/types/extract-entity-one-to-many-entity-relation-properties.type'; import { type ExtractEntityRelatedEntityProperties } from 'src/engine/metadata-modules/flat-entity/types/extract-entity-related-entity-properties.type'; import { type RemoveSuffix } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/remove-suffix.type'; import { type SyncableEntity } from 'src/engine/workspace-manager/workspace-sync/types/syncable-entity.interface'; export type UniversalFlatEntityFrom = Omit< TEntity, | `${ExtractEntityManyToOneEntityRelationProperties & string}Id` | ExtractEntityRelatedEntityProperties | 'application' | 'workspaceId' | 'applicationId' | keyof CastRecordTypeOrmDatePropertiesToString > & CastRecordTypeOrmDatePropertiesToString & { [P in ExtractEntityManyToOneEntityRelationProperties & string as `${RemoveSuffix}UniversalIdentifier`]: string; } & { [P in ExtractEntityOneToManyEntityRelationProperties< TEntity, SyncableEntity > & string as `${RemoveSuffix}UniversalIdentifiers`]: string[]; }; ``` --- .github/actions/restore-cache/action.yaml | 4 +- .../src/generated-metadata/graphql.ts | 7 - .../twenty-front/src/generated/graphql.ts | 7 - .../1767002571103-addWorkspaceForeignKeys.ts | 109 ++++++++++++++ .../core-modules/api-key/api-key.entity.ts | 18 +-- .../application/application.entity.ts | 17 +-- .../approved-access-domain.entity.ts | 21 +-- .../entities/billing-customer.entity.ts | 10 +- .../entities/billing-entitlement.entity.ts | 8 +- .../entities/billing-subscription.entity.ts | 6 +- .../emailing-domain/emailing-domain.entity.ts | 17 +-- .../feature-flag/feature-flag.entity.ts | 15 +- .../core-modules/file/entities/file.entity.ts | 16 +-- .../postgres-credentials.entity.ts | 22 +-- .../public-domain/public-domain.entity.ts | 17 +-- .../workspace-sso-identity-provider.entity.ts | 20 +-- .../user-workspace/user-workspace.entity.ts | 17 +-- .../core-modules/webhook/webhook.entity.ts | 18 +-- .../workspace/workspace.entity.ts | 2 +- .../ai/ai-agent/entities/agent.entity.ts | 16 +-- .../entities/cron-trigger.entity.ts | 8 +- ...ace-flat-cron-trigger-map-cache.service.ts | 15 +- .../types/flat-cron-trigger.type.ts | 14 +- .../data-source/data-source.entity.ts | 6 +- .../entities/database-event-trigger.entity.ts | 8 +- ...atabase-event-trigger-map-cache.service.ts | 15 +- .../types/flat-database-event-trigger.type.ts | 15 +- .../field-metadata/field-metadata.entity.ts | 7 +- .../flat-agent/types/flat-agent.type.ts | 13 +- ...-metadata-relations-properties.constant.ts | 133 ++++++++++++++++++ ...-to-one-entity-relation-properties.type.ts | 17 +++ ...to-many-entity-relation-properties.type.ts | 17 +++ ...t-entity-related-entity-properties.type.ts | 11 ++ .../flat-entity/types/flat-entity.type.ts | 24 ++-- ...m-metadata-entity-to-metadata-name.type.ts | 12 ++ .../types/flat-field-metadata.type.ts | 30 +--- ...data-entity-to-flat-field-metadata.util.ts | 10 +- ...ata-entity-relation-properties.constant.ts | 6 - .../types/flat-index-metadata.type.ts | 24 +--- ...data-entity-to-flat-index-metadata.util.ts | 6 +- .../types/flat-object-metadata.type.ts | 23 +-- ...ata-entity-to-flat-object-metadata.util.ts | 10 +- .../types/flat-page-layout-tab.type.ts | 17 +-- ...get-entity-relation-properties.constant.ts | 8 -- .../types/flat-page-layout-widget.type.ts | 19 +-- ...-entity-to-flat-page-layout-widget.util.ts | 6 +- .../types/flat-page-layout.type.ts | 17 +-- .../types/flat-role-target.type.ts | 10 +- .../flat-role/types/flat-role.type.ts | 23 +-- ...eld-entity-relation-properties.constant.ts | 7 - .../types/flat-view-field.type.ts | 15 +- ...ew-field-entity-to-flat-view-field.util.ts | 6 +- ...ter-entity-relation-properties.constant.ts | 8 -- .../types/flat-view-filter.type.ts | 15 +- ...-filter-entity-to-flat-view-filter.util.ts | 6 +- ...oup-entity-relation-properties.constant.ts | 6 - .../types/flat-view-group.type.ts | 15 +- ...ew-group-entity-to-flat-view-group.util.ts | 6 +- ...iew-entity-relation-properties.constant.ts | 13 -- .../flat-view/types/flat-view.type.ts | 36 +---- .../from-view-entity-to-flat-view.util.ts | 6 +- .../index-metadata/index-metadata.entity.ts | 3 +- .../object-metadata/object-metadata.entity.ts | 3 +- .../field-permission.entity.ts | 11 +- .../object-permission.entity.ts | 6 +- .../entities/page-layout-tab.entity.ts | 13 +- .../entities/page-layout-widget.entity.ts | 13 +- .../entities/page-layout.entity.ts | 13 +- .../permission-flag/permission-flag.entity.ts | 8 +- .../remote-server/remote-server.entity.ts | 8 +- .../remote-table/remote-table.entity.ts | 12 +- .../role-target/role-target.entity.ts | 3 +- .../metadata-modules/role/role.entity.ts | 3 +- .../route-trigger/route-trigger.entity.ts | 13 +- ...ce-flat-route-trigger-map-cache.service.ts | 16 ++- .../types/flat-route-trigger.type.ts | 14 +- .../search-field-metadata.entity.ts | 11 +- .../serverless-function-layer.entity.ts | 8 +- .../serverless-function.entity.ts | 10 +- .../types/flat-serverless-function.type.ts | 29 +--- .../types/cached-field-metadata-entity.ts | 8 -- .../view-field/entities/view-field.entity.ts | 11 +- .../entities/view-filter-group.entity.ts | 11 +- .../entities/view-filter.entity.ts | 11 +- .../view-group/entities/view-group.entity.ts | 11 +- .../view-sort/entities/view-sort.entity.ts | 11 +- .../view/entities/view.entity.ts | 13 +- .../composite-column-action.factory.ts | 2 +- .../workspace-migration.entity.ts | 8 +- .../is-cached-field-metadata-of-type.util.ts | 14 -- ...record-typeorm-relation-properties.type.ts | 12 -- ...metadata-entities-relation-targets.type.ts | 20 --- .../types/remove-suffix.type.ts | 4 + .../partial-index-metadata.interface.ts | 1 + .../all-non-workspace-related-entity.type.ts | 41 ++++++ .../syncable-entity.interface.ts | 3 +- .../types/workspace-related-entity.ts | 12 ++ ...orkflow-database-event-trigger.listener.ts | 8 +- .../get-field-metadata-entity.mock.ts | 2 + .../get-object-metadata-entity.mock.ts | 2 + .../graphql/utils/get-current-user.util.ts | 1 - 101 files changed, 559 insertions(+), 874 deletions(-) create mode 100644 packages/twenty-server/src/database/typeorm/core/migrations/common/1767002571103-addWorkspaceForeignKeys.ts create mode 100644 packages/twenty-server/src/engine/metadata-modules/flat-entity/constant/all-metadata-relations-properties.constant.ts create mode 100644 packages/twenty-server/src/engine/metadata-modules/flat-entity/types/extract-entity-many-to-one-entity-relation-properties.type.ts create mode 100644 packages/twenty-server/src/engine/metadata-modules/flat-entity/types/extract-entity-one-to-many-entity-relation-properties.type.ts create mode 100644 packages/twenty-server/src/engine/metadata-modules/flat-entity/types/extract-entity-related-entity-properties.type.ts create mode 100644 packages/twenty-server/src/engine/metadata-modules/flat-entity/types/from-metadata-entity-to-metadata-name.type.ts delete mode 100644 packages/twenty-server/src/engine/metadata-modules/flat-index-metadata/constants/index-metadata-entity-relation-properties.constant.ts delete mode 100644 packages/twenty-server/src/engine/metadata-modules/flat-page-layout-widget/constants/page-layout-widget-entity-relation-properties.constant.ts delete mode 100644 packages/twenty-server/src/engine/metadata-modules/flat-view-field/constants/view-field-entity-relation-properties.constant.ts delete mode 100644 packages/twenty-server/src/engine/metadata-modules/flat-view-filter/constants/view-filter-entity-relation-properties.constant.ts delete mode 100644 packages/twenty-server/src/engine/metadata-modules/flat-view-group/constants/view-group-entity-relation-properties.constant.ts delete mode 100644 packages/twenty-server/src/engine/metadata-modules/flat-view/constants/view-entity-relation-properties.constant.ts delete mode 100644 packages/twenty-server/src/engine/metadata-modules/types/cached-field-metadata-entity.ts delete mode 100644 packages/twenty-server/src/engine/utils/is-cached-field-metadata-of-type.util.ts delete mode 100644 packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/types/extract-record-typeorm-relation-properties.type.ts delete mode 100644 packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/types/metadata-entities-relation-targets.type.ts create mode 100644 packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/remove-suffix.type.ts create mode 100644 packages/twenty-server/src/engine/workspace-manager/workspace-sync/types/all-non-workspace-related-entity.type.ts rename packages/twenty-server/src/engine/workspace-manager/workspace-sync/{interfaces => types}/syncable-entity.interface.ts (76%) create mode 100644 packages/twenty-server/src/engine/workspace-manager/workspace-sync/types/workspace-related-entity.ts diff --git a/.github/actions/restore-cache/action.yaml b/.github/actions/restore-cache/action.yaml index b1f534e068a..9c8ee524480 100644 --- a/.github/actions/restore-cache/action.yaml +++ b/.github/actions/restore-cache/action.yaml @@ -20,7 +20,7 @@ runs: id: cache-primary-key-builder shell: bash run: | - echo "CACHE_PRIMARY_KEY_PREFIX=v3-${{ inputs.key }}-${{ github.ref_name }}" >> "${GITHUB_OUTPUT}" + echo "CACHE_PRIMARY_KEY_PREFIX=v4-${{ inputs.key }}-${{ github.ref_name }}" >> "${GITHUB_OUTPUT}" - name: Restore cache uses: actions/cache/restore@v4 id: restore-cache @@ -32,4 +32,4 @@ runs: .nx node_modules/.cache packages/*/node_modules/.cache - ${{ inputs.additional-paths }} \ No newline at end of file + ${{ inputs.additional-paths }} diff --git a/packages/twenty-front/src/generated-metadata/graphql.ts b/packages/twenty-front/src/generated-metadata/graphql.ts index 88600298490..b1f717055c2 100644 --- a/packages/twenty-front/src/generated-metadata/graphql.ts +++ b/packages/twenty-front/src/generated-metadata/graphql.ts @@ -202,8 +202,6 @@ export type ApiKey = { revokedAt?: Maybe; role: Role; updatedAt: Scalars['DateTime']; - workspace: Workspace; - workspaceId: Scalars['UUID']; }; export type ApiKeyForRole = { @@ -1303,7 +1301,6 @@ export type FeatureFlag = { id: Scalars['UUID']; key: FeatureFlagKey; value: Scalars['Boolean']; - workspaceId: Scalars['UUID']; }; export type FeatureFlagDto = { @@ -4678,8 +4675,6 @@ export type UserWorkspace = { updatedAt: Scalars['DateTime']; user: User; userId: Scalars['UUID']; - workspace?: Maybe; - workspaceId: Scalars['UUID']; }; export type ValidateApprovedAccessDomainInput = { @@ -4785,8 +4780,6 @@ export type Webhook = { secret: Scalars['String']; targetUrl: Scalars['String']; updatedAt: Scalars['DateTime']; - workspace: Workspace; - workspaceId: Scalars['UUID']; }; export type WidgetConfiguration = AggregateChartConfiguration | BarChartConfiguration | GaugeChartConfiguration | IframeConfiguration | LineChartConfiguration | PieChartConfiguration | StandaloneRichTextConfiguration; diff --git a/packages/twenty-front/src/generated/graphql.ts b/packages/twenty-front/src/generated/graphql.ts index 3cd326850de..e842270dd1e 100644 --- a/packages/twenty-front/src/generated/graphql.ts +++ b/packages/twenty-front/src/generated/graphql.ts @@ -202,8 +202,6 @@ export type ApiKey = { revokedAt?: Maybe; role: Role; updatedAt: Scalars['DateTime']; - workspace: Workspace; - workspaceId: Scalars['UUID']; }; export type ApiKeyForRole = { @@ -1286,7 +1284,6 @@ export type FeatureFlag = { id: Scalars['UUID']; key: FeatureFlagKey; value: Scalars['Boolean']; - workspaceId: Scalars['UUID']; }; export type FeatureFlagDto = { @@ -4497,8 +4494,6 @@ export type UserWorkspace = { updatedAt: Scalars['DateTime']; user: User; userId: Scalars['UUID']; - workspace?: Maybe; - workspaceId: Scalars['UUID']; }; export type ValidateApprovedAccessDomainInput = { @@ -4604,8 +4599,6 @@ export type Webhook = { secret: Scalars['String']; targetUrl: Scalars['String']; updatedAt: Scalars['DateTime']; - workspace: Workspace; - workspaceId: Scalars['UUID']; }; export type WidgetConfiguration = AggregateChartConfiguration | BarChartConfiguration | GaugeChartConfiguration | IframeConfiguration | LineChartConfiguration | PieChartConfiguration | StandaloneRichTextConfiguration; diff --git a/packages/twenty-server/src/database/typeorm/core/migrations/common/1767002571103-addWorkspaceForeignKeys.ts b/packages/twenty-server/src/database/typeorm/core/migrations/common/1767002571103-addWorkspaceForeignKeys.ts new file mode 100644 index 00000000000..c5a61d8737d --- /dev/null +++ b/packages/twenty-server/src/database/typeorm/core/migrations/common/1767002571103-addWorkspaceForeignKeys.ts @@ -0,0 +1,109 @@ +import { type MigrationInterface, type QueryRunner } from 'typeorm'; + +export class AddWorkspaceForeignKeys1767002571103 + implements MigrationInterface +{ + name = 'AddWorkspaceForeignKeys1767002571103'; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "core"."indexMetadata" ADD CONSTRAINT "FK_5c988136a6d6f25a100c1064789" FOREIGN KEY ("workspaceId") REFERENCES "core"."workspace"("id") ON DELETE CASCADE ON UPDATE NO ACTION`, + ); + await queryRunner.query( + `ALTER TABLE "core"."roleTarget" ADD CONSTRAINT "FK_a86894bed7b7e1cc8b3f1d6186f" FOREIGN KEY ("workspaceId") REFERENCES "core"."workspace"("id") ON DELETE CASCADE ON UPDATE NO ACTION`, + ); + await queryRunner.query( + `ALTER TABLE "core"."role" ADD CONSTRAINT "FK_d2532f520d84f8c22ee45681c5a" FOREIGN KEY ("workspaceId") REFERENCES "core"."workspace"("id") ON DELETE CASCADE ON UPDATE NO ACTION`, + ); + await queryRunner.query( + `ALTER TABLE "core"."fieldMetadata" ADD CONSTRAINT "FK_9ce5ba7878f498bcf79e447a9a6" FOREIGN KEY ("workspaceId") REFERENCES "core"."workspace"("id") ON DELETE CASCADE ON UPDATE NO ACTION`, + ); + await queryRunner.query( + `ALTER TABLE "core"."objectMetadata" ADD CONSTRAINT "FK_d82a05a204136c01388ea80bc7a" FOREIGN KEY ("workspaceId") REFERENCES "core"."workspace"("id") ON DELETE CASCADE ON UPDATE NO ACTION`, + ); + await queryRunner.query( + `ALTER TABLE "core"."cronTrigger" ADD CONSTRAINT "FK_058c319eeb9799a4637908ce362" FOREIGN KEY ("workspaceId") REFERENCES "core"."workspace"("id") ON DELETE CASCADE ON UPDATE NO ACTION`, + ); + await queryRunner.query( + `ALTER TABLE "core"."databaseEventTrigger" ADD CONSTRAINT "FK_cf158c3199dcf2d52b0da05c33b" FOREIGN KEY ("workspaceId") REFERENCES "core"."workspace"("id") ON DELETE CASCADE ON UPDATE NO ACTION`, + ); + await queryRunner.query( + `ALTER TABLE "core"."routeTrigger" ADD CONSTRAINT "FK_5e004929fcf5e67398544b43885" FOREIGN KEY ("workspaceId") REFERENCES "core"."workspace"("id") ON DELETE CASCADE ON UPDATE NO ACTION`, + ); + await queryRunner.query( + `ALTER TABLE "core"."serverlessFunction" ADD CONSTRAINT "FK_ef5dde6a681970b9c1e10563498" FOREIGN KEY ("workspaceId") REFERENCES "core"."workspace"("id") ON DELETE CASCADE ON UPDATE NO ACTION`, + ); + await queryRunner.query( + `ALTER TABLE "core"."dataSource" ADD CONSTRAINT "FK_e1914827ee8b22fba4254578311" FOREIGN KEY ("workspaceId") REFERENCES "core"."workspace"("id") ON DELETE CASCADE ON UPDATE NO ACTION`, + ); + await queryRunner.query( + `ALTER TABLE "core"."objectPermission" ADD CONSTRAINT "FK_edcd87df18d3284141757bf6e16" FOREIGN KEY ("workspaceId") REFERENCES "core"."workspace"("id") ON DELETE CASCADE ON UPDATE NO ACTION`, + ); + await queryRunner.query( + `ALTER TABLE "core"."permissionFlag" ADD CONSTRAINT "FK_835bc9f7ef959debfc5cd268049" FOREIGN KEY ("workspaceId") REFERENCES "core"."workspace"("id") ON DELETE CASCADE ON UPDATE NO ACTION`, + ); + await queryRunner.query( + `ALTER TABLE "core"."serverlessFunctionLayer" ADD CONSTRAINT "FK_ca0699c3c906e903d7381c6a771" FOREIGN KEY ("workspaceId") REFERENCES "core"."workspace"("id") ON DELETE CASCADE ON UPDATE NO ACTION`, + ); + await queryRunner.query( + `ALTER TABLE "core"."workspaceMigration" ADD CONSTRAINT "FK_bebfcf8dcb299fd39ad04ed4c7f" FOREIGN KEY ("workspaceId") REFERENCES "core"."workspace"("id") ON DELETE CASCADE ON UPDATE NO ACTION`, + ); + await queryRunner.query( + `ALTER TABLE "core"."remoteTable" ADD CONSTRAINT "FK_30b429b14ddc6aab7495fa884f3" FOREIGN KEY ("workspaceId") REFERENCES "core"."workspace"("id") ON DELETE CASCADE ON UPDATE NO ACTION`, + ); + await queryRunner.query( + `ALTER TABLE "core"."remoteServer" ADD CONSTRAINT "FK_d1293835c5a0bb89fc0ed45713f" FOREIGN KEY ("workspaceId") REFERENCES "core"."workspace"("id") ON DELETE CASCADE ON UPDATE NO ACTION`, + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "core"."remoteServer" DROP CONSTRAINT "FK_d1293835c5a0bb89fc0ed45713f"`, + ); + await queryRunner.query( + `ALTER TABLE "core"."remoteTable" DROP CONSTRAINT "FK_30b429b14ddc6aab7495fa884f3"`, + ); + await queryRunner.query( + `ALTER TABLE "core"."workspaceMigration" DROP CONSTRAINT "FK_bebfcf8dcb299fd39ad04ed4c7f"`, + ); + await queryRunner.query( + `ALTER TABLE "core"."serverlessFunctionLayer" DROP CONSTRAINT "FK_ca0699c3c906e903d7381c6a771"`, + ); + await queryRunner.query( + `ALTER TABLE "core"."permissionFlag" DROP CONSTRAINT "FK_835bc9f7ef959debfc5cd268049"`, + ); + await queryRunner.query( + `ALTER TABLE "core"."objectPermission" DROP CONSTRAINT "FK_edcd87df18d3284141757bf6e16"`, + ); + await queryRunner.query( + `ALTER TABLE "core"."dataSource" DROP CONSTRAINT "FK_e1914827ee8b22fba4254578311"`, + ); + await queryRunner.query( + `ALTER TABLE "core"."serverlessFunction" DROP CONSTRAINT "FK_ef5dde6a681970b9c1e10563498"`, + ); + await queryRunner.query( + `ALTER TABLE "core"."routeTrigger" DROP CONSTRAINT "FK_5e004929fcf5e67398544b43885"`, + ); + await queryRunner.query( + `ALTER TABLE "core"."databaseEventTrigger" DROP CONSTRAINT "FK_cf158c3199dcf2d52b0da05c33b"`, + ); + await queryRunner.query( + `ALTER TABLE "core"."cronTrigger" DROP CONSTRAINT "FK_058c319eeb9799a4637908ce362"`, + ); + await queryRunner.query( + `ALTER TABLE "core"."objectMetadata" DROP CONSTRAINT "FK_d82a05a204136c01388ea80bc7a"`, + ); + await queryRunner.query( + `ALTER TABLE "core"."fieldMetadata" DROP CONSTRAINT "FK_9ce5ba7878f498bcf79e447a9a6"`, + ); + await queryRunner.query( + `ALTER TABLE "core"."role" DROP CONSTRAINT "FK_d2532f520d84f8c22ee45681c5a"`, + ); + await queryRunner.query( + `ALTER TABLE "core"."roleTarget" DROP CONSTRAINT "FK_a86894bed7b7e1cc8b3f1d6186f"`, + ); + await queryRunner.query( + `ALTER TABLE "core"."indexMetadata" DROP CONSTRAINT "FK_5c988136a6d6f25a100c1064789"`, + ); + } +} diff --git a/packages/twenty-server/src/engine/core-modules/api-key/api-key.entity.ts b/packages/twenty-server/src/engine/core-modules/api-key/api-key.entity.ts index c03e52d8692..d8746beb7cc 100644 --- a/packages/twenty-server/src/engine/core-modules/api-key/api-key.entity.ts +++ b/packages/twenty-server/src/engine/core-modules/api-key/api-key.entity.ts @@ -6,20 +6,17 @@ import { CreateDateColumn, Entity, Index, - JoinColumn, - ManyToOne, PrimaryGeneratedColumn, - Relation, UpdateDateColumn, } from 'typeorm'; import { UUIDScalarType } from 'src/engine/api/graphql/workspace-schema-builder/graphql-types/scalars'; -import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; +import { WorkspaceRelatedEntity } from 'src/engine/workspace-manager/workspace-sync/types/workspace-related-entity'; @Index('IDX_API_KEY_WORKSPACE_ID', ['workspaceId']) @Entity({ name: 'apiKey', schema: 'core' }) @ObjectType('ApiKey') -export class ApiKeyEntity { +export class ApiKeyEntity extends WorkspaceRelatedEntity { @IDField(() => UUIDScalarType) @PrimaryGeneratedColumn('uuid') id: string; @@ -36,10 +33,6 @@ export class ApiKeyEntity { @Column({ type: 'timestamptz', nullable: true }) revokedAt?: Date | null; - @Field(() => UUIDScalarType) - @Column({ nullable: false, type: 'uuid' }) - workspaceId: string; - @Field(() => Date) @CreateDateColumn({ type: 'timestamptz' }) createdAt: Date; @@ -47,11 +40,4 @@ export class ApiKeyEntity { @Field(() => Date) @UpdateDateColumn({ type: 'timestamptz' }) updatedAt: Date; - - @Field(() => WorkspaceEntity) - @ManyToOne(() => WorkspaceEntity, (workspace) => workspace.apiKeys, { - onDelete: 'CASCADE', - }) - @JoinColumn({ name: 'workspaceId' }) - workspace: Relation; } diff --git a/packages/twenty-server/src/engine/core-modules/application/application.entity.ts b/packages/twenty-server/src/engine/core-modules/application/application.entity.ts index 6026068fe26..dece8475909 100644 --- a/packages/twenty-server/src/engine/core-modules/application/application.entity.ts +++ b/packages/twenty-server/src/engine/core-modules/application/application.entity.ts @@ -6,20 +6,18 @@ import { DeleteDateColumn, Entity, Index, - JoinColumn, - ManyToOne, OneToMany, PrimaryGeneratedColumn, Relation, UpdateDateColumn, } from 'typeorm'; -import { RoleDTO } from 'src/engine/metadata-modules/role/dtos/role.dto'; import { ApplicationVariableEntity } from 'src/engine/core-modules/applicationVariable/application-variable.entity'; -import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; import { AgentEntity } from 'src/engine/metadata-modules/ai/ai-agent/entities/agent.entity'; import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; +import { RoleDTO } from 'src/engine/metadata-modules/role/dtos/role.dto'; import { ServerlessFunctionEntity } from 'src/engine/metadata-modules/serverless-function/serverless-function.entity'; +import { WorkspaceRelatedEntity } from 'src/engine/workspace-manager/workspace-sync/types/workspace-related-entity'; @Entity({ name: 'application', schema: 'core' }) @ObjectType('Application') @@ -32,7 +30,7 @@ import { ServerlessFunctionEntity } from 'src/engine/metadata-modules/serverless where: '"deletedAt" IS NULL AND "universalIdentifier" IS NOT NULL', }, ) -export class ApplicationEntity { +export class ApplicationEntity extends WorkspaceRelatedEntity { @PrimaryGeneratedColumn('uuid') id: string; @@ -55,9 +53,6 @@ export class ApplicationEntity { @Column({ nullable: false, type: 'text' }) sourcePath: string; - @Column({ nullable: false, type: 'uuid' }) - workspaceId: string; - @Column({ nullable: true, type: 'uuid' }) serverlessFunctionLayerId: string | null; @@ -70,12 +65,6 @@ export class ApplicationEntity { @Column({ nullable: false, type: 'boolean', default: true }) canBeUninstalled: boolean; - @ManyToOne(() => WorkspaceEntity, { - onDelete: 'CASCADE', - }) - @JoinColumn({ name: 'workspaceId' }) - workspace: Relation; - @OneToMany(() => AgentEntity, (agent) => agent.application, { onDelete: 'CASCADE', }) diff --git a/packages/twenty-server/src/engine/core-modules/approved-access-domain/approved-access-domain.entity.ts b/packages/twenty-server/src/engine/core-modules/approved-access-domain/approved-access-domain.entity.ts index cb0d9dcafbd..237944f4905 100644 --- a/packages/twenty-server/src/engine/core-modules/approved-access-domain/approved-access-domain.entity.ts +++ b/packages/twenty-server/src/engine/core-modules/approved-access-domain/approved-access-domain.entity.ts @@ -4,16 +4,12 @@ import { Column, CreateDateColumn, Entity, - JoinColumn, - ManyToOne, PrimaryGeneratedColumn, Unique, UpdateDateColumn, } from 'typeorm'; -import { Relation } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/relation.interface'; - -import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; +import { WorkspaceRelatedEntity } from 'src/engine/workspace-manager/workspace-sync/types/workspace-related-entity'; @Entity({ name: 'approvedAccessDomain', schema: 'core' }) @ObjectType('ApprovedAccessDomain') @@ -21,7 +17,7 @@ import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.ent 'domain', 'workspaceId', ]) -export class ApprovedAccessDomainEntity { +export class ApprovedAccessDomainEntity extends WorkspaceRelatedEntity { @PrimaryGeneratedColumn('uuid') id: string; @@ -36,17 +32,4 @@ export class ApprovedAccessDomainEntity { @Column({ type: 'boolean', default: false, nullable: false }) isValidated: boolean; - - @Column({ nullable: false, type: 'uuid' }) - workspaceId: string; - - @ManyToOne( - () => WorkspaceEntity, - (workspace) => workspace.approvedAccessDomains, - { - onDelete: 'CASCADE', - }, - ) - @JoinColumn({ name: 'workspaceId' }) - workspace: Relation; } diff --git a/packages/twenty-server/src/engine/core-modules/billing/entities/billing-customer.entity.ts b/packages/twenty-server/src/engine/core-modules/billing/entities/billing-customer.entity.ts index 88020f76efd..93c0a225137 100644 --- a/packages/twenty-server/src/engine/core-modules/billing/entities/billing-customer.entity.ts +++ b/packages/twenty-server/src/engine/core-modules/billing/entities/billing-customer.entity.ts @@ -7,6 +7,7 @@ import { Column, CreateDateColumn, Entity, + Index, OneToMany, PrimaryGeneratedColumn, Relation, @@ -16,10 +17,14 @@ import { import { UUIDScalarType } from 'src/engine/api/graphql/workspace-schema-builder/graphql-types/scalars'; import { BillingEntitlementEntity } from 'src/engine/core-modules/billing/entities/billing-entitlement.entity'; import { BillingSubscriptionEntity } from 'src/engine/core-modules/billing/entities/billing-subscription.entity'; +import { WorkspaceRelatedEntity } from 'src/engine/workspace-manager/workspace-sync/types/workspace-related-entity'; @Entity({ name: 'billingCustomer', schema: 'core' }) @ObjectType('BillingCustomer') -export class BillingCustomerEntity { +@Index('IDX_BILLING_CUSTOMER_WORKSPACE_ID_UNIQUE', ['workspaceId'], { + unique: true, +}) +export class BillingCustomerEntity extends WorkspaceRelatedEntity { @IDField(() => UUIDScalarType) @PrimaryGeneratedColumn('uuid') id: string; @@ -33,9 +38,6 @@ export class BillingCustomerEntity { @UpdateDateColumn({ type: 'timestamptz' }) updatedAt: Date; - @Column({ nullable: false, type: 'uuid', unique: true }) - workspaceId: string; - @Column({ nullable: false, unique: true }) stripeCustomerId: string; diff --git a/packages/twenty-server/src/engine/core-modules/billing/entities/billing-entitlement.entity.ts b/packages/twenty-server/src/engine/core-modules/billing/entities/billing-entitlement.entity.ts index d31a561660c..7339292baaf 100644 --- a/packages/twenty-server/src/engine/core-modules/billing/entities/billing-entitlement.entity.ts +++ b/packages/twenty-server/src/engine/core-modules/billing/entities/billing-entitlement.entity.ts @@ -18,13 +18,15 @@ import { import { UUIDScalarType } from 'src/engine/api/graphql/workspace-schema-builder/graphql-types/scalars'; import { BillingCustomerEntity } from 'src/engine/core-modules/billing/entities/billing-customer.entity'; import { BillingEntitlementKey } from 'src/engine/core-modules/billing/enums/billing-entitlement-key.enum'; +import { WorkspaceRelatedEntity } from 'src/engine/workspace-manager/workspace-sync/types/workspace-related-entity'; + @Entity({ name: 'billingEntitlement', schema: 'core' }) @ObjectType('BillingEntitlement') @Unique('IDX_BILLING_ENTITLEMENT_KEY_WORKSPACE_ID_UNIQUE', [ 'key', 'workspaceId', ]) -export class BillingEntitlementEntity { +export class BillingEntitlementEntity extends WorkspaceRelatedEntity { @IDField(() => UUIDScalarType) @PrimaryGeneratedColumn('uuid') id: string; @@ -33,10 +35,6 @@ export class BillingEntitlementEntity { @Column({ nullable: false, type: 'text' }) key: BillingEntitlementKey; - @Field(() => UUIDScalarType) - @Column({ nullable: false, type: 'uuid' }) - workspaceId: string; - @Column({ nullable: false }) stripeCustomerId: string; diff --git a/packages/twenty-server/src/engine/core-modules/billing/entities/billing-subscription.entity.ts b/packages/twenty-server/src/engine/core-modules/billing/entities/billing-subscription.entity.ts index 21ab27b8c86..830c54881ca 100644 --- a/packages/twenty-server/src/engine/core-modules/billing/entities/billing-subscription.entity.ts +++ b/packages/twenty-server/src/engine/core-modules/billing/entities/billing-subscription.entity.ts @@ -44,6 +44,7 @@ import { BillingSubscriptionItemEntity } from 'src/engine/core-modules/billing/e import { BillingSubscriptionCollectionMethod } from 'src/engine/core-modules/billing/enums/billing-subscription-collection-method.enum'; import { SubscriptionInterval } from 'src/engine/core-modules/billing/enums/billing-subscription-interval.enum'; import { SubscriptionStatus } from 'src/engine/core-modules/billing/enums/billing-subscription-status.enum'; +import { WorkspaceRelatedEntity } from 'src/engine/workspace-manager/workspace-sync/types/workspace-related-entity'; registerEnumType(SubscriptionStatus, { name: 'SubscriptionStatus' }); registerEnumType(SubscriptionInterval, { name: 'SubscriptionInterval' }); @@ -54,7 +55,7 @@ registerEnumType(SubscriptionInterval, { name: 'SubscriptionInterval' }); where: `status IN ('trialing', 'active', 'past_due')`, }) @ObjectType('BillingSubscription') -export class BillingSubscriptionEntity { +export class BillingSubscriptionEntity extends WorkspaceRelatedEntity { @IDField(() => UUIDScalarType) @PrimaryGeneratedColumn('uuid') id: string; @@ -68,9 +69,6 @@ export class BillingSubscriptionEntity { @UpdateDateColumn({ type: 'timestamptz' }) updatedAt: Date; - @Column({ nullable: false, type: 'uuid' }) - workspaceId: string; - @Column({ nullable: false }) stripeCustomerId: string; diff --git a/packages/twenty-server/src/engine/core-modules/emailing-domain/emailing-domain.entity.ts b/packages/twenty-server/src/engine/core-modules/emailing-domain/emailing-domain.entity.ts index 429e887d86a..872c6ff4dca 100644 --- a/packages/twenty-server/src/engine/core-modules/emailing-domain/emailing-domain.entity.ts +++ b/packages/twenty-server/src/engine/core-modules/emailing-domain/emailing-domain.entity.ts @@ -4,21 +4,17 @@ import { Column, CreateDateColumn, Entity, - JoinColumn, - ManyToOne, PrimaryGeneratedColumn, Unique, UpdateDateColumn, } from 'typeorm'; -import { Relation } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/relation.interface'; - import { EmailingDomainDriver, EmailingDomainStatus, } from 'src/engine/core-modules/emailing-domain/drivers/types/emailing-domain'; import { VerificationRecord } from 'src/engine/core-modules/emailing-domain/drivers/types/verifications-record'; -import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; +import { WorkspaceRelatedEntity } from 'src/engine/workspace-manager/workspace-sync/types/workspace-related-entity'; @Entity({ name: 'emailingDomain', schema: 'core' }) @ObjectType('EmailingDomain') @@ -26,7 +22,7 @@ import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.ent 'domain', 'workspaceId', ]) -export class EmailingDomainEntity { +export class EmailingDomainEntity extends WorkspaceRelatedEntity { @PrimaryGeneratedColumn('uuid') id: string; @@ -59,13 +55,4 @@ export class EmailingDomainEntity { @Column({ type: 'timestamptz', nullable: true }) verifiedAt: Date | null; - - @Column({ nullable: false, type: 'uuid' }) - workspaceId: string; - - @ManyToOne(() => WorkspaceEntity, (workspace) => workspace.emailingDomains, { - onDelete: 'CASCADE', - }) - @JoinColumn({ name: 'workspaceId' }) - workspace: Relation; } diff --git a/packages/twenty-server/src/engine/core-modules/feature-flag/feature-flag.entity.ts b/packages/twenty-server/src/engine/core-modules/feature-flag/feature-flag.entity.ts index ae8b1899ad0..d10cdf6522e 100644 --- a/packages/twenty-server/src/engine/core-modules/feature-flag/feature-flag.entity.ts +++ b/packages/twenty-server/src/engine/core-modules/feature-flag/feature-flag.entity.ts @@ -5,21 +5,19 @@ import { Column, CreateDateColumn, Entity, - ManyToOne, PrimaryGeneratedColumn, - Relation, Unique, UpdateDateColumn, } from 'typeorm'; import { UUIDScalarType } from 'src/engine/api/graphql/workspace-schema-builder/graphql-types/scalars'; import { FeatureFlagKey } from 'src/engine/core-modules/feature-flag/enums/feature-flag-key.enum'; -import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; +import { WorkspaceRelatedEntity } from 'src/engine/workspace-manager/workspace-sync/types/workspace-related-entity'; @Entity({ name: 'featureFlag', schema: 'core' }) @ObjectType('FeatureFlag') @Unique('IDX_FEATURE_FLAG_KEY_WORKSPACE_ID_UNIQUE', ['key', 'workspaceId']) -export class FeatureFlagEntity { +export class FeatureFlagEntity extends WorkspaceRelatedEntity { @IDField(() => UUIDScalarType) @PrimaryGeneratedColumn('uuid') id: string; @@ -28,15 +26,6 @@ export class FeatureFlagEntity { @Column({ nullable: false, type: 'text' }) key: FeatureFlagKey; - @Field(() => UUIDScalarType) - @Column({ nullable: false, type: 'uuid' }) - workspaceId: string; - - @ManyToOne(() => WorkspaceEntity, (workspace) => workspace.featureFlags, { - onDelete: 'CASCADE', - }) - workspace: Relation; - @Field() @Column({ nullable: false }) value: boolean; diff --git a/packages/twenty-server/src/engine/core-modules/file/entities/file.entity.ts b/packages/twenty-server/src/engine/core-modules/file/entities/file.entity.ts index cd59c394363..0f39f603931 100644 --- a/packages/twenty-server/src/engine/core-modules/file/entities/file.entity.ts +++ b/packages/twenty-server/src/engine/core-modules/file/entities/file.entity.ts @@ -5,18 +5,15 @@ import { CreateDateColumn, Entity, Index, - JoinColumn, - ManyToOne, PrimaryGeneratedColumn, - Relation, } from 'typeorm'; -import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; +import { WorkspaceRelatedEntity } from 'src/engine/workspace-manager/workspace-sync/types/workspace-related-entity'; @Entity('file') @ObjectType('File') @Index('IDX_FILE_WORKSPACE_ID', ['workspaceId']) -export class FileEntity { +export class FileEntity extends WorkspaceRelatedEntity { @PrimaryGeneratedColumn('uuid') id: string; @@ -32,15 +29,6 @@ export class FileEntity { @Column({ nullable: false }) type: string; - @Column({ nullable: false, type: 'uuid' }) - workspaceId: string; - - @ManyToOne(() => WorkspaceEntity, { - onDelete: 'CASCADE', - }) - @JoinColumn({ name: 'workspaceId' }) - workspace: Relation; - @CreateDateColumn({ type: 'timestamptz' }) createdAt: Date; } diff --git a/packages/twenty-server/src/engine/core-modules/postgres-credentials/postgres-credentials.entity.ts b/packages/twenty-server/src/engine/core-modules/postgres-credentials/postgres-credentials.entity.ts index 6daeaab2d7c..f3eafafa438 100644 --- a/packages/twenty-server/src/engine/core-modules/postgres-credentials/postgres-credentials.entity.ts +++ b/packages/twenty-server/src/engine/core-modules/postgres-credentials/postgres-credentials.entity.ts @@ -1,20 +1,18 @@ import { ObjectType } from '@nestjs/graphql'; import { - Entity, Column, - PrimaryGeneratedColumn, CreateDateColumn, + Entity, + PrimaryGeneratedColumn, UpdateDateColumn, - ManyToOne, - Relation, } from 'typeorm'; -import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; +import { WorkspaceRelatedEntity } from 'src/engine/workspace-manager/workspace-sync/types/workspace-related-entity'; @Entity({ name: 'postgresCredentials', schema: 'core' }) @ObjectType('PostgresCredentials') -export class PostgresCredentialsEntity { +export class PostgresCredentialsEntity extends WorkspaceRelatedEntity { @PrimaryGeneratedColumn('uuid') id: string; @@ -32,16 +30,4 @@ export class PostgresCredentialsEntity { @Column({ nullable: true, type: 'timestamptz' }) deletedAt: Date; - - @ManyToOne( - () => WorkspaceEntity, - (workspace) => workspace.allPostgresCredentials, - { - onDelete: 'CASCADE', - }, - ) - workspace: Relation; - - @Column({ nullable: false, type: 'uuid' }) - workspaceId: string; } diff --git a/packages/twenty-server/src/engine/core-modules/public-domain/public-domain.entity.ts b/packages/twenty-server/src/engine/core-modules/public-domain/public-domain.entity.ts index 0c7994cb31e..7eaa01f9783 100644 --- a/packages/twenty-server/src/engine/core-modules/public-domain/public-domain.entity.ts +++ b/packages/twenty-server/src/engine/core-modules/public-domain/public-domain.entity.ts @@ -4,19 +4,15 @@ import { Column, CreateDateColumn, Entity, - JoinColumn, - ManyToOne, PrimaryGeneratedColumn, UpdateDateColumn, } from 'typeorm'; -import { Relation } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/relation.interface'; - -import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; +import { WorkspaceRelatedEntity } from 'src/engine/workspace-manager/workspace-sync/types/workspace-related-entity'; @Entity({ name: 'publicDomain', schema: 'core' }) @ObjectType('PublicDomain') -export class PublicDomainEntity { +export class PublicDomainEntity extends WorkspaceRelatedEntity { @PrimaryGeneratedColumn('uuid') id: string; @@ -31,13 +27,4 @@ export class PublicDomainEntity { @Column({ type: 'boolean', default: false, nullable: false }) isValidated: boolean; - - @Column({ nullable: false, type: 'uuid' }) - workspaceId: string; - - @ManyToOne(() => WorkspaceEntity, (workspace) => workspace.publicDomains, { - onDelete: 'CASCADE', - }) - @JoinColumn({ name: 'workspaceId' }) - workspace: Relation; } diff --git a/packages/twenty-server/src/engine/core-modules/sso/workspace-sso-identity-provider.entity.ts b/packages/twenty-server/src/engine/core-modules/sso/workspace-sso-identity-provider.entity.ts index a1c707412d0..33bcab2a7d0 100644 --- a/packages/twenty-server/src/engine/core-modules/sso/workspace-sso-identity-provider.entity.ts +++ b/packages/twenty-server/src/engine/core-modules/sso/workspace-sso-identity-provider.entity.ts @@ -7,15 +7,12 @@ import { Column, CreateDateColumn, Entity, - JoinColumn, - ManyToOne, PrimaryGeneratedColumn, - Relation, UpdateDateColumn, } from 'typeorm'; import { UUIDScalarType } from 'src/engine/api/graphql/workspace-schema-builder/graphql-types/scalars'; -import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; +import { WorkspaceRelatedEntity } from 'src/engine/workspace-manager/workspace-sync/types/workspace-related-entity'; export enum IdentityProviderType { OIDC = 'OIDC', @@ -46,7 +43,7 @@ registerEnumType(SSOIdentityProviderStatus, { @Entity({ name: 'workspaceSSOIdentityProvider', schema: 'core' }) @ObjectType('WorkspaceSSOIdentityProvider') -export class WorkspaceSSOIdentityProviderEntity { +export class WorkspaceSSOIdentityProviderEntity extends WorkspaceRelatedEntity { // COMMON @IDField(() => UUIDScalarType) @PrimaryGeneratedColumn('uuid') @@ -62,19 +59,6 @@ export class WorkspaceSSOIdentityProviderEntity { }) status: SSOIdentityProviderStatus; - @ManyToOne( - () => WorkspaceEntity, - (workspace) => workspace.workspaceSSOIdentityProviders, - { - onDelete: 'CASCADE', - }, - ) - @JoinColumn({ name: 'workspaceId' }) - workspace: Relation; - - @Column({ nullable: false, type: 'uuid' }) - workspaceId: string; - @CreateDateColumn({ type: 'timestamptz' }) createdAt: Date; diff --git a/packages/twenty-server/src/engine/core-modules/user-workspace/user-workspace.entity.ts b/packages/twenty-server/src/engine/core-modules/user-workspace/user-workspace.entity.ts index 1d15a47b59c..65b1af2cdbd 100644 --- a/packages/twenty-server/src/engine/core-modules/user-workspace/user-workspace.entity.ts +++ b/packages/twenty-server/src/engine/core-modules/user-workspace/user-workspace.entity.ts @@ -2,8 +2,8 @@ import { Field, ObjectType, registerEnumType } from '@nestjs/graphql'; import { IDField } from '@ptc-org/nestjs-query-graphql'; import { - PermissionsOnAllObjectRecords, PermissionFlagType, + PermissionsOnAllObjectRecords, } from 'twenty-shared/constants'; import { type APP_LOCALES, SOURCE_LOCALE } from 'twenty-shared/translations'; import { @@ -24,8 +24,8 @@ import { UUIDScalarType } from 'src/engine/api/graphql/workspace-schema-builder/ import { TwoFactorAuthenticationMethodSummaryDto } from 'src/engine/core-modules/two-factor-authentication/dto/two-factor-authentication-method.dto'; import { TwoFactorAuthenticationMethodEntity } from 'src/engine/core-modules/two-factor-authentication/entities/two-factor-authentication-method.entity'; import { UserEntity } from 'src/engine/core-modules/user/user.entity'; -import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; import { ObjectPermissionDTO } from 'src/engine/metadata-modules/object-permission/dtos/object-permission.dto'; +import { WorkspaceRelatedEntity } from 'src/engine/workspace-manager/workspace-sync/types/workspace-related-entity'; registerEnumType(PermissionFlagType, { name: 'PermissionFlagType', @@ -47,7 +47,7 @@ registerEnumType(PermissionsOnAllObjectRecords, { ) @Index('IDX_USER_WORKSPACE_USER_ID', ['userId']) @Index('IDX_USER_WORKSPACE_WORKSPACE_ID', ['workspaceId']) -export class UserWorkspaceEntity { +export class UserWorkspaceEntity extends WorkspaceRelatedEntity { @IDField(() => UUIDScalarType) @PrimaryGeneratedColumn('uuid') id: string; @@ -63,17 +63,6 @@ export class UserWorkspaceEntity { @Column() userId: string; - @Field(() => WorkspaceEntity, { nullable: true }) - @ManyToOne(() => WorkspaceEntity, (workspace) => workspace.workspaceUsers, { - onDelete: 'CASCADE', - }) - @JoinColumn({ name: 'workspaceId' }) - workspace: Relation; - - @Field(() => UUIDScalarType, { nullable: false }) - @Column({ nullable: false, type: 'uuid' }) - workspaceId: string; - @Column({ nullable: true }) defaultAvatarUrl: string; diff --git a/packages/twenty-server/src/engine/core-modules/webhook/webhook.entity.ts b/packages/twenty-server/src/engine/core-modules/webhook/webhook.entity.ts index 840056e5ec0..c0fe91837e6 100644 --- a/packages/twenty-server/src/engine/core-modules/webhook/webhook.entity.ts +++ b/packages/twenty-server/src/engine/core-modules/webhook/webhook.entity.ts @@ -7,20 +7,17 @@ import { DeleteDateColumn, Entity, Index, - JoinColumn, - ManyToOne, PrimaryGeneratedColumn, - Relation, UpdateDateColumn, } from 'typeorm'; import { UUIDScalarType } from 'src/engine/api/graphql/workspace-schema-builder/graphql-types/scalars'; -import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; +import { WorkspaceRelatedEntity } from 'src/engine/workspace-manager/workspace-sync/types/workspace-related-entity'; @Index('IDX_WEBHOOK_WORKSPACE_ID', ['workspaceId']) @Entity({ name: 'webhook', schema: 'core' }) @ObjectType('Webhook') -export class WebhookEntity { +export class WebhookEntity extends WorkspaceRelatedEntity { @IDField(() => UUIDScalarType) @PrimaryGeneratedColumn('uuid') id: string; @@ -41,10 +38,6 @@ export class WebhookEntity { @Column() secret: string; - @Field(() => UUIDScalarType) - @Column({ nullable: false, type: 'uuid' }) - workspaceId: string; - @Field() @CreateDateColumn({ type: 'timestamptz' }) createdAt: Date; @@ -56,11 +49,4 @@ export class WebhookEntity { @Field({ nullable: true }) @DeleteDateColumn({ type: 'timestamptz' }) deletedAt?: Date; - - @Field(() => WorkspaceEntity) - @ManyToOne(() => WorkspaceEntity, (workspace) => workspace.webhooks, { - onDelete: 'CASCADE', - }) - @JoinColumn({ name: 'workspaceId' }) - workspace: Relation; } diff --git a/packages/twenty-server/src/engine/core-modules/workspace/workspace.entity.ts b/packages/twenty-server/src/engine/core-modules/workspace/workspace.entity.ts index 97c59c1c277..8b4bc2f10ef 100644 --- a/packages/twenty-server/src/engine/core-modules/workspace/workspace.entity.ts +++ b/packages/twenty-server/src/engine/core-modules/workspace/workspace.entity.ts @@ -121,7 +121,7 @@ export class WorkspaceEntity { @OneToMany( () => UserWorkspaceEntity, - (userWorkspace: UserWorkspaceEntity) => userWorkspace.workspace, + (userWorkspace) => userWorkspace.workspace, { onDelete: 'CASCADE', }, diff --git a/packages/twenty-server/src/engine/metadata-modules/ai/ai-agent/entities/agent.entity.ts b/packages/twenty-server/src/engine/metadata-modules/ai/ai-agent/entities/agent.entity.ts index 1e784dbad8a..0f8744a2b95 100644 --- a/packages/twenty-server/src/engine/metadata-modules/ai/ai-agent/entities/agent.entity.ts +++ b/packages/twenty-server/src/engine/metadata-modules/ai/ai-agent/entities/agent.entity.ts @@ -4,16 +4,11 @@ import { DeleteDateColumn, Entity, Index, - JoinColumn, - ManyToOne, PrimaryGeneratedColumn, UpdateDateColumn, } from 'typeorm'; -import { Relation } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/relation.interface'; -import { SyncableEntity } from 'src/engine/workspace-manager/workspace-sync/interfaces/syncable-entity.interface'; - -import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; +import { SyncableEntity } from 'src/engine/workspace-manager/workspace-sync/types/syncable-entity.interface'; import { AgentResponseFormat } from 'src/engine/metadata-modules/ai/ai-agent/types/agent-response-format.type'; import { ModelConfiguration } from 'src/engine/metadata-modules/ai/ai-agent/types/modelConfiguration'; import { @@ -59,18 +54,9 @@ export class AgentEntity @Column({ nullable: true, type: 'jsonb', default: { type: 'text' } }) responseFormat: AgentResponseFormat; - @Column({ nullable: false, type: 'uuid' }) - workspaceId: string; - @Column({ default: false }) isCustom: boolean; - @ManyToOne(() => WorkspaceEntity, (workspace) => workspace.agents, { - onDelete: 'CASCADE', - }) - @JoinColumn({ name: 'workspaceId' }) - workspace: Relation; - @CreateDateColumn({ type: 'timestamptz' }) createdAt: Date; diff --git a/packages/twenty-server/src/engine/metadata-modules/cron-trigger/entities/cron-trigger.entity.ts b/packages/twenty-server/src/engine/metadata-modules/cron-trigger/entities/cron-trigger.entity.ts index 574e23e759b..471d5dd430d 100644 --- a/packages/twenty-server/src/engine/metadata-modules/cron-trigger/entities/cron-trigger.entity.ts +++ b/packages/twenty-server/src/engine/metadata-modules/cron-trigger/entities/cron-trigger.entity.ts @@ -10,19 +10,13 @@ import { UpdateDateColumn, } from 'typeorm'; -import { SyncableEntity } from 'src/engine/workspace-manager/workspace-sync/interfaces/syncable-entity.interface'; - -import { CronTriggerEntityRelationProperties } from 'src/engine/metadata-modules/cron-trigger/types/flat-cron-trigger.type'; +import { SyncableEntity } from 'src/engine/workspace-manager/workspace-sync/types/syncable-entity.interface'; import { ServerlessFunctionEntity } from 'src/engine/metadata-modules/serverless-function/serverless-function.entity'; export type CronTriggerSettings = { pattern: string; }; -export const CRON_TRIGGER_ENTITY_RELATION_PROPERTIES = [ - 'serverlessFunction', -] as const satisfies readonly CronTriggerEntityRelationProperties[]; - @Entity({ name: 'cronTrigger', schema: 'core' }) @Index('IDX_CRON_TRIGGER_WORKSPACE_ID', ['workspaceId']) export class CronTriggerEntity diff --git a/packages/twenty-server/src/engine/metadata-modules/cron-trigger/services/workspace-flat-cron-trigger-map-cache.service.ts b/packages/twenty-server/src/engine/metadata-modules/cron-trigger/services/workspace-flat-cron-trigger-map-cache.service.ts index 605bba7213f..fcfd1673ce6 100644 --- a/packages/twenty-server/src/engine/metadata-modules/cron-trigger/services/workspace-flat-cron-trigger-map-cache.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/cron-trigger/services/workspace-flat-cron-trigger-map-cache.service.ts @@ -6,11 +6,9 @@ import { Repository } from 'typeorm'; import { WorkspaceCacheProvider } from 'src/engine/workspace-cache/interfaces/workspace-cache-provider.service'; -import { - CRON_TRIGGER_ENTITY_RELATION_PROPERTIES, - CronTriggerEntity, -} from 'src/engine/metadata-modules/cron-trigger/entities/cron-trigger.entity'; +import { CronTriggerEntity } from 'src/engine/metadata-modules/cron-trigger/entities/cron-trigger.entity'; import { FlatCronTrigger } from 'src/engine/metadata-modules/cron-trigger/types/flat-cron-trigger.type'; +import { ALL_METADATA_RELATION_PROPERTIES } from 'src/engine/metadata-modules/flat-entity/constant/all-metadata-relations-properties.constant'; import { createEmptyFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/constant/create-empty-flat-entity-maps.constant'; import { FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type'; import { WorkspaceCache } from 'src/engine/workspace-cache/decorators/workspace-cache.decorator'; @@ -41,9 +39,12 @@ export class WorkspaceFlatCronTriggerMapCacheService extends WorkspaceCacheProvi for (const cronTriggerEntity of cronTriggers) { const flatCronTrigger = { - ...removePropertiesFromRecord(cronTriggerEntity, [ - ...CRON_TRIGGER_ENTITY_RELATION_PROPERTIES, - ]), + ...removePropertiesFromRecord( + cronTriggerEntity, + Object.keys( + ALL_METADATA_RELATION_PROPERTIES.cronTrigger, + ) as (keyof typeof ALL_METADATA_RELATION_PROPERTIES.cronTrigger)[], + ), universalIdentifier: cronTriggerEntity.universalIdentifier ?? cronTriggerEntity.id, createdAt: cronTriggerEntity.createdAt.toISOString(), diff --git a/packages/twenty-server/src/engine/metadata-modules/cron-trigger/types/flat-cron-trigger.type.ts b/packages/twenty-server/src/engine/metadata-modules/cron-trigger/types/flat-cron-trigger.type.ts index f2d13b31a61..76a29c6c6fe 100644 --- a/packages/twenty-server/src/engine/metadata-modules/cron-trigger/types/flat-cron-trigger.type.ts +++ b/packages/twenty-server/src/engine/metadata-modules/cron-trigger/types/flat-cron-trigger.type.ts @@ -1,16 +1,4 @@ -import { type WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; import { type CronTriggerEntity } from 'src/engine/metadata-modules/cron-trigger/entities/cron-trigger.entity'; import { type FlatEntityFrom } from 'src/engine/metadata-modules/flat-entity/types/flat-entity.type'; -import { type ServerlessFunctionEntity } from 'src/engine/metadata-modules/serverless-function/serverless-function.entity'; -import { type ExtractRecordTypeOrmRelationProperties } from 'src/engine/workspace-manager/workspace-migration-v2/types/extract-record-typeorm-relation-properties.type'; -export type CronTriggerEntityRelationProperties = - ExtractRecordTypeOrmRelationProperties< - CronTriggerEntity, - ServerlessFunctionEntity | WorkspaceEntity - >; - -export type FlatCronTrigger = FlatEntityFrom< - CronTriggerEntity, - CronTriggerEntityRelationProperties ->; +export type FlatCronTrigger = FlatEntityFrom; diff --git a/packages/twenty-server/src/engine/metadata-modules/data-source/data-source.entity.ts b/packages/twenty-server/src/engine/metadata-modules/data-source/data-source.entity.ts index 99db375ffe6..c737f97b5cb 100644 --- a/packages/twenty-server/src/engine/metadata-modules/data-source/data-source.entity.ts +++ b/packages/twenty-server/src/engine/metadata-modules/data-source/data-source.entity.ts @@ -10,12 +10,13 @@ import { } from 'typeorm'; import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; +import { WorkspaceRelatedEntity } from 'src/engine/workspace-manager/workspace-sync/types/workspace-related-entity'; export type DataSourceType = DataSourceOptions['type']; @Entity('dataSource') @Index('IDX_DATA_SOURCE_WORKSPACE_ID_CREATED_AT', ['workspaceId', 'createdAt']) -export class DataSourceEntity { +export class DataSourceEntity extends WorkspaceRelatedEntity { @PrimaryGeneratedColumn('uuid') id: string; @@ -39,9 +40,6 @@ export class DataSourceEntity { }) objects: ObjectMetadataEntity[]; - @Column({ nullable: false, type: 'uuid' }) - workspaceId: string; - @CreateDateColumn({ type: 'timestamptz' }) createdAt: Date; diff --git a/packages/twenty-server/src/engine/metadata-modules/database-event-trigger/entities/database-event-trigger.entity.ts b/packages/twenty-server/src/engine/metadata-modules/database-event-trigger/entities/database-event-trigger.entity.ts index dca983eb66f..79ea16f4c05 100644 --- a/packages/twenty-server/src/engine/metadata-modules/database-event-trigger/entities/database-event-trigger.entity.ts +++ b/packages/twenty-server/src/engine/metadata-modules/database-event-trigger/entities/database-event-trigger.entity.ts @@ -10,19 +10,13 @@ import { UpdateDateColumn, } from 'typeorm'; -import { SyncableEntity } from 'src/engine/workspace-manager/workspace-sync/interfaces/syncable-entity.interface'; - -import { DatabaseEventTriggerEntityRelationProperties } from 'src/engine/metadata-modules/database-event-trigger/types/flat-database-event-trigger.type'; +import { SyncableEntity } from 'src/engine/workspace-manager/workspace-sync/types/syncable-entity.interface'; import { ServerlessFunctionEntity } from 'src/engine/metadata-modules/serverless-function/serverless-function.entity'; export type DatabaseEventTriggerSettings = { eventName: string; }; -export const DATABASE_EVENT_TRIGGER_ENTITY_RELATION_PROPERTIES = [ - 'serverlessFunction', -] as const satisfies readonly DatabaseEventTriggerEntityRelationProperties[]; - @Entity('databaseEventTrigger') @Index('IDX_DATABASE_EVENT_TRIGGER_WORKSPACE_ID', ['workspaceId']) export class DatabaseEventTriggerEntity diff --git a/packages/twenty-server/src/engine/metadata-modules/database-event-trigger/services/workspace-flat-database-event-trigger-map-cache.service.ts b/packages/twenty-server/src/engine/metadata-modules/database-event-trigger/services/workspace-flat-database-event-trigger-map-cache.service.ts index a5705a74f08..70aee3227f3 100644 --- a/packages/twenty-server/src/engine/metadata-modules/database-event-trigger/services/workspace-flat-database-event-trigger-map-cache.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/database-event-trigger/services/workspace-flat-database-event-trigger-map-cache.service.ts @@ -6,11 +6,9 @@ import { Repository } from 'typeorm'; import { WorkspaceCacheProvider } from 'src/engine/workspace-cache/interfaces/workspace-cache-provider.service'; -import { - DATABASE_EVENT_TRIGGER_ENTITY_RELATION_PROPERTIES, - DatabaseEventTriggerEntity, -} from 'src/engine/metadata-modules/database-event-trigger/entities/database-event-trigger.entity'; +import { DatabaseEventTriggerEntity } from 'src/engine/metadata-modules/database-event-trigger/entities/database-event-trigger.entity'; import { FlatDatabaseEventTrigger } from 'src/engine/metadata-modules/database-event-trigger/types/flat-database-event-trigger.type'; +import { ALL_METADATA_RELATION_PROPERTIES } from 'src/engine/metadata-modules/flat-entity/constant/all-metadata-relations-properties.constant'; import { createEmptyFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/constant/create-empty-flat-entity-maps.constant'; import { FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type'; import { WorkspaceCache } from 'src/engine/workspace-cache/decorators/workspace-cache.decorator'; @@ -42,9 +40,12 @@ export class WorkspaceFlatDatabaseEventTriggerMapCacheService extends WorkspaceC for (const databaseEventTriggerEntity of databaseEventTriggers) { const flatDatabaseEventTrigger = { - ...removePropertiesFromRecord(databaseEventTriggerEntity, [ - ...DATABASE_EVENT_TRIGGER_ENTITY_RELATION_PROPERTIES, - ]), + ...removePropertiesFromRecord( + databaseEventTriggerEntity, + Object.keys( + ALL_METADATA_RELATION_PROPERTIES.databaseEventTrigger, + ) as (keyof typeof ALL_METADATA_RELATION_PROPERTIES.databaseEventTrigger)[], + ), universalIdentifier: databaseEventTriggerEntity.universalIdentifier ?? databaseEventTriggerEntity.id, diff --git a/packages/twenty-server/src/engine/metadata-modules/database-event-trigger/types/flat-database-event-trigger.type.ts b/packages/twenty-server/src/engine/metadata-modules/database-event-trigger/types/flat-database-event-trigger.type.ts index 0f5f35bb20f..f6df53f8237 100644 --- a/packages/twenty-server/src/engine/metadata-modules/database-event-trigger/types/flat-database-event-trigger.type.ts +++ b/packages/twenty-server/src/engine/metadata-modules/database-event-trigger/types/flat-database-event-trigger.type.ts @@ -1,16 +1,5 @@ -import { type WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; import { type DatabaseEventTriggerEntity } from 'src/engine/metadata-modules/database-event-trigger/entities/database-event-trigger.entity'; import { type FlatEntityFrom } from 'src/engine/metadata-modules/flat-entity/types/flat-entity.type'; -import { type ServerlessFunctionEntity } from 'src/engine/metadata-modules/serverless-function/serverless-function.entity'; -import { type ExtractRecordTypeOrmRelationProperties } from 'src/engine/workspace-manager/workspace-migration-v2/types/extract-record-typeorm-relation-properties.type'; -export type DatabaseEventTriggerEntityRelationProperties = - ExtractRecordTypeOrmRelationProperties< - DatabaseEventTriggerEntity, - ServerlessFunctionEntity | WorkspaceEntity - >; - -export type FlatDatabaseEventTrigger = FlatEntityFrom< - DatabaseEventTriggerEntity, - DatabaseEventTriggerEntityRelationProperties ->; +export type FlatDatabaseEventTrigger = + FlatEntityFrom; 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 39b101b3abe..e64b99fa768 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 @@ -20,7 +20,6 @@ import { } from 'typeorm'; import { FieldMetadataDefaultValue } from 'src/engine/metadata-modules/field-metadata/interfaces/field-metadata-default-value.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'; import { AssignIfIsGivenFieldMetadataType } from 'src/engine/metadata-modules/field-metadata/types/assign-if-is-given-field-metadata-type.type'; @@ -31,6 +30,7 @@ import { FieldPermissionEntity } from 'src/engine/metadata-modules/object-permis import { ViewFieldEntity } from 'src/engine/metadata-modules/view-field/entities/view-field.entity'; import { ViewFilterEntity } from 'src/engine/metadata-modules/view-filter/entities/view-filter.entity'; import { ViewEntity } from 'src/engine/metadata-modules/view/entities/view.entity'; +import { SyncableEntity } from 'src/engine/workspace-manager/workspace-sync/types/syncable-entity.interface'; @Entity('fieldMetadata') @Check( @@ -52,6 +52,7 @@ import { ViewEntity } from 'src/engine/metadata-modules/view/entities/view.entit 'objectMetadataId', 'workspaceId', ]) +@Index('IDX_FIELD_METADATA_WORKSPACE_ID', ['workspaceId']) export class FieldMetadataEntity< TFieldMetadataType extends FieldMetadataType = FieldMetadataType, > @@ -125,10 +126,6 @@ export class FieldMetadataEntity< @Column({ nullable: true, default: false, type: 'boolean' }) isUnique: boolean | null; - @Column({ nullable: false, type: 'uuid' }) - @Index('IDX_FIELD_METADATA_WORKSPACE_ID', ['workspaceId']) - workspaceId: string; - @Column({ default: false }) isLabelSyncedWithName: boolean; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-agent/types/flat-agent.type.ts b/packages/twenty-server/src/engine/metadata-modules/flat-agent/types/flat-agent.type.ts index ae1b8eca3d7..4152c1ad12a 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-agent/types/flat-agent.type.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-agent/types/flat-agent.type.ts @@ -1,17 +1,6 @@ import { type AgentEntity } from 'src/engine/metadata-modules/ai/ai-agent/entities/agent.entity'; import { type FlatEntityFrom } from 'src/engine/metadata-modules/flat-entity/types/flat-entity.type'; -export const agentEntityRelationProperties = [ - 'workspace', - 'application', -] as const; - -export type AgentEntityRelationProperties = - (typeof agentEntityRelationProperties)[number]; - -export type FlatAgent = FlatEntityFrom< - AgentEntity, - AgentEntityRelationProperties ->; +export type FlatAgent = FlatEntityFrom; export type FlatAgentWithRoleId = FlatAgent & { roleId: string | null }; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-entity/constant/all-metadata-relations-properties.constant.ts b/packages/twenty-server/src/engine/metadata-modules/flat-entity/constant/all-metadata-relations-properties.constant.ts new file mode 100644 index 00000000000..7094e457de5 --- /dev/null +++ b/packages/twenty-server/src/engine/metadata-modules/flat-entity/constant/all-metadata-relations-properties.constant.ts @@ -0,0 +1,133 @@ +import { type AllMetadataName } from 'twenty-shared/metadata'; + +import { type ExtractEntityRelatedEntityProperties } from 'src/engine/metadata-modules/flat-entity/types/extract-entity-related-entity-properties.type'; +import { type MetadataEntity } from 'src/engine/metadata-modules/flat-entity/types/metadata-entity.type'; + +export const ALL_METADATA_RELATION_PROPERTIES = { + agent: { + workspace: true, + application: true, + }, + fieldMetadata: { + relationTargetFieldMetadata: true, + relationTargetObjectMetadata: true, + fieldPermissions: true, + indexFieldMetadatas: true, + object: true, + viewFields: true, + viewFilters: true, + kanbanAggregateOperationViews: true, + calendarViews: true, + mainGroupByFieldMetadataViews: true, + workspace: true, + application: true, + }, + objectMetadata: { + fields: true, + indexMetadatas: true, + targetRelationFields: true, + dataSource: true, + objectPermissions: true, + fieldPermissions: true, + views: true, + workspace: true, + application: true, + }, + view: { + objectMetadata: true, + viewFields: true, + viewFilters: true, + viewFilterGroups: true, + viewGroups: true, + viewSorts: true, + workspace: true, + createdBy: true, + application: true, + calendarFieldMetadata: true, + kanbanAggregateOperationFieldMetadata: true, + mainGroupByFieldMetadata: true, + }, + viewField: { + fieldMetadata: true, + view: true, + workspace: true, + application: true, + }, + viewFilter: { + fieldMetadata: true, + view: true, + viewFilterGroup: true, + workspace: true, + application: true, + }, + viewGroup: { + view: true, + workspace: true, + application: true, + }, + index: { + objectMetadata: true, + indexFieldMetadatas: true, + workspace: true, + application: true, + }, + serverlessFunction: { + cronTriggers: true, + databaseEventTriggers: true, + routeTriggers: true, + serverlessFunctionLayer: true, + workspace: true, + application: true, + }, + cronTrigger: { + serverlessFunction: true, + workspace: true, + application: true, + }, + databaseEventTrigger: { + serverlessFunction: true, + workspace: true, + application: true, + }, + routeTrigger: { + serverlessFunction: true, + workspace: true, + application: true, + }, + role: { + roleTargets: true, + objectPermissions: true, + permissionFlags: true, + fieldPermissions: true, + workspace: true, + application: true, + }, + roleTarget: { + role: true, + apiKey: true, + workspace: true, + application: true, + }, + pageLayout: { + workspace: true, + objectMetadata: true, + tabs: true, + application: true, + }, + pageLayoutTab: { + workspace: true, + pageLayout: true, + widgets: true, + application: true, + }, + pageLayoutWidget: { + workspace: true, + pageLayoutTab: true, + objectMetadata: true, + application: true, + }, +} as const satisfies { + [TName in AllMetadataName]: { + [P in ExtractEntityRelatedEntityProperties>]: true; + }; +}; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/extract-entity-many-to-one-entity-relation-properties.type.ts b/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/extract-entity-many-to-one-entity-relation-properties.type.ts new file mode 100644 index 00000000000..2b321eb309a --- /dev/null +++ b/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/extract-entity-many-to-one-entity-relation-properties.type.ts @@ -0,0 +1,17 @@ +import { type Relation } from 'typeorm'; + +import { type AllNonWorkspaceRelatedEntity } from 'src/engine/workspace-manager/workspace-sync/types/all-non-workspace-related-entity.type'; +import { type WorkspaceRelatedEntity } from 'src/engine/workspace-manager/workspace-sync/types/workspace-related-entity'; + +export type ExtractEntityManyToOneEntityRelationProperties< + T, + TTarget = WorkspaceRelatedEntity | AllNonWorkspaceRelatedEntity, +> = NonNullable< + { + [P in keyof T]: [NonNullable] extends [never] + ? never + : NonNullable extends Relation + ? P + : never; + }[keyof T] +>; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/extract-entity-one-to-many-entity-relation-properties.type.ts b/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/extract-entity-one-to-many-entity-relation-properties.type.ts new file mode 100644 index 00000000000..30b60050dbb --- /dev/null +++ b/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/extract-entity-one-to-many-entity-relation-properties.type.ts @@ -0,0 +1,17 @@ +import { type Relation } from 'typeorm'; + +import { type AllNonWorkspaceRelatedEntity } from 'src/engine/workspace-manager/workspace-sync/types/all-non-workspace-related-entity.type'; +import { type WorkspaceRelatedEntity } from 'src/engine/workspace-manager/workspace-sync/types/workspace-related-entity'; + +export type ExtractEntityOneToManyEntityRelationProperties< + T, + TTarget = WorkspaceRelatedEntity | AllNonWorkspaceRelatedEntity, +> = NonNullable< + { + [P in keyof T]: NonNullable extends Array + ? U extends Relation + ? P + : never + : never; + }[keyof T] +>; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/extract-entity-related-entity-properties.type.ts b/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/extract-entity-related-entity-properties.type.ts new file mode 100644 index 00000000000..dd8e610dd6d --- /dev/null +++ b/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/extract-entity-related-entity-properties.type.ts @@ -0,0 +1,11 @@ +import { type ExtractEntityManyToOneEntityRelationProperties } from 'src/engine/metadata-modules/flat-entity/types/extract-entity-many-to-one-entity-relation-properties.type'; +import { type ExtractEntityOneToManyEntityRelationProperties } from 'src/engine/metadata-modules/flat-entity/types/extract-entity-one-to-many-entity-relation-properties.type'; +import { type AllNonWorkspaceRelatedEntity } from 'src/engine/workspace-manager/workspace-sync/types/all-non-workspace-related-entity.type'; +import { type WorkspaceRelatedEntity } from 'src/engine/workspace-manager/workspace-sync/types/workspace-related-entity'; + +export type ExtractEntityRelatedEntityProperties< + T, + TTarget = WorkspaceRelatedEntity | AllNonWorkspaceRelatedEntity, +> = + | ExtractEntityManyToOneEntityRelationProperties + | ExtractEntityOneToManyEntityRelationProperties; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/flat-entity.type.ts b/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/flat-entity.type.ts index c705d4f1445..c845333c49c 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/flat-entity.type.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/flat-entity.type.ts @@ -1,22 +1,28 @@ -import { type SyncableEntity } from 'src/engine/workspace-manager/workspace-sync/interfaces/syncable-entity.interface'; - import { type CastRecordTypeOrmDatePropertiesToString } from 'src/engine/metadata-modules/flat-entity/types/cast-record-typeorm-date-properties-to-string.type'; +import { type ExtractEntityOneToManyEntityRelationProperties } from 'src/engine/metadata-modules/flat-entity/types/extract-entity-one-to-many-entity-relation-properties.type'; +import { type ExtractEntityRelatedEntityProperties } from 'src/engine/metadata-modules/flat-entity/types/extract-entity-related-entity-properties.type'; +import { type RemoveSuffix } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/remove-suffix.type'; +import { type SyncableEntity } from 'src/engine/workspace-manager/workspace-sync/types/syncable-entity.interface'; import { type NonNullableProperties } from 'src/types/non-nullable-properties.type'; export type SyncableFlatEntity = NonNullableProperties< - Omit + Omit > & { id: string; applicationId: string | null; }; -export type FlatEntityFrom< +export type FlatEntityFrom = Omit< TEntity, - TEntityRelationProperties extends keyof TEntity, -> = Omit< - TEntity, - | TEntityRelationProperties + | ExtractEntityRelatedEntityProperties | 'application' + | 'workspace' | keyof CastRecordTypeOrmDatePropertiesToString > & - CastRecordTypeOrmDatePropertiesToString; + CastRecordTypeOrmDatePropertiesToString & { + [P in ExtractEntityOneToManyEntityRelationProperties< + TEntity, + SyncableEntity + > & + string as `${RemoveSuffix}Ids`]: string[]; + }; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/from-metadata-entity-to-metadata-name.type.ts b/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/from-metadata-entity-to-metadata-name.type.ts new file mode 100644 index 00000000000..3e287eed4bc --- /dev/null +++ b/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/from-metadata-entity-to-metadata-name.type.ts @@ -0,0 +1,12 @@ +import { type AllMetadataName } from 'twenty-shared/metadata'; + +import { type AllFlatEntityTypesByMetadataName } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-types-by-metadata-name'; +import { type SyncableEntity } from 'src/engine/workspace-manager/workspace-sync/types/syncable-entity.interface'; + +export type FromMetadataEntityToMetadataName = { + [P in AllMetadataName]: AllFlatEntityTypesByMetadataName[P] extends { + entity: T; + } + ? P + : never; +}[AllMetadataName]; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type.ts index 4d8e03355a1..acdfd921561 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type.ts @@ -3,32 +3,12 @@ import { type FieldMetadataType } from 'twenty-shared/types'; import { type FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity'; import { type FlatEntityFrom } from 'src/engine/metadata-modules/flat-entity/types/flat-entity.type'; -export const FIELD_METADATA_RELATION_PROPERTIES = [ - 'relationTargetFieldMetadata', - 'relationTargetObjectMetadata', - 'fieldPermissions', - 'indexFieldMetadatas', - 'object', - 'viewFields', - 'application', - 'viewFilters', - 'kanbanAggregateOperationViews', - 'calendarViews', - 'mainGroupByFieldMetadataViews', -] as const satisfies (keyof FieldMetadataEntity)[]; - -export type FieldMetadataEntityRelationProperties = - (typeof FIELD_METADATA_RELATION_PROPERTIES)[number]; - export type FlatFieldMetadata = FlatEntityFrom< - FieldMetadataEntity, - FieldMetadataEntityRelationProperties + Omit< + FieldMetadataEntity, + 'relationTargetFieldMetadata' | 'relationTargetObjectMetadata' + > > & { - universalIdentifier: string; - viewFieldIds: string[]; - viewFilterIds: string[]; - kanbanAggregateOperationViewIds: string[]; - calendarViewIds: string[]; - mainGroupByFieldMetadataViewIds: string[]; + universalIdentifier: string; // TODO remove once universalIdentifier is required on entity directly }; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/from-field-metadata-entity-to-flat-field-metadata.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/from-field-metadata-entity-to-flat-field-metadata.util.ts index 4d84376118a..5ea16b872de 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/from-field-metadata-entity-to-flat-field-metadata.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/from-field-metadata-entity-to-flat-field-metadata.util.ts @@ -2,10 +2,8 @@ import { type FieldMetadataType } from 'twenty-shared/types'; import { removePropertiesFromRecord } from 'twenty-shared/utils'; import { type FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity'; -import { - type FlatFieldMetadata, - FIELD_METADATA_RELATION_PROPERTIES, -} from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; +import { ALL_METADATA_RELATION_PROPERTIES } from 'src/engine/metadata-modules/flat-entity/constant/all-metadata-relations-properties.constant'; +import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; export const fromFieldMetadataEntityToFlatFieldMetadata = < T extends FieldMetadataType, @@ -15,7 +13,9 @@ export const fromFieldMetadataEntityToFlatFieldMetadata = < ): FlatFieldMetadata => { const fieldMetadataWithoutRelations = removePropertiesFromRecord( fieldMetadataEntity, - FIELD_METADATA_RELATION_PROPERTIES, + Object.keys( + ALL_METADATA_RELATION_PROPERTIES.fieldMetadata, + ) as (keyof typeof ALL_METADATA_RELATION_PROPERTIES.fieldMetadata)[], ); return { diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-index-metadata/constants/index-metadata-entity-relation-properties.constant.ts b/packages/twenty-server/src/engine/metadata-modules/flat-index-metadata/constants/index-metadata-entity-relation-properties.constant.ts deleted file mode 100644 index ad063704a91..00000000000 --- a/packages/twenty-server/src/engine/metadata-modules/flat-index-metadata/constants/index-metadata-entity-relation-properties.constant.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { type IndexMetadataRelationProperties } from 'src/engine/metadata-modules/flat-index-metadata/types/flat-index-metadata.type'; - -export const INDEX_METADATA_ENTITY_RELATION_PROPERTIES = [ - 'objectMetadata', - 'indexFieldMetadatas', -] as const satisfies readonly IndexMetadataRelationProperties[]; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-index-metadata/types/flat-index-metadata.type.ts b/packages/twenty-server/src/engine/metadata-modules/flat-index-metadata/types/flat-index-metadata.type.ts index 053d3cc8319..9e58bc88543 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-index-metadata/types/flat-index-metadata.type.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-index-metadata/types/flat-index-metadata.type.ts @@ -1,30 +1,10 @@ import { type FlatEntityFrom } from 'src/engine/metadata-modules/flat-entity/types/flat-entity.type'; import { type IndexFieldMetadataEntity } from 'src/engine/metadata-modules/index-metadata/index-field-metadata.entity'; import { type IndexMetadataEntity } from 'src/engine/metadata-modules/index-metadata/index-metadata.entity'; -import { type ExtractRecordTypeOrmRelationProperties } from 'src/engine/workspace-manager/workspace-migration-v2/types/extract-record-typeorm-relation-properties.type'; -import { type MetadataEntitiesRelationTarget } from 'src/engine/workspace-manager/workspace-migration-v2/types/metadata-entities-relation-targets.type'; -export type IndexMetadataRelationProperties = - ExtractRecordTypeOrmRelationProperties< - IndexMetadataEntity, - MetadataEntitiesRelationTarget - >; +export type FlatIndexFieldMetadata = FlatEntityFrom; -export type IndexFieldMetadataEntityRelationProperties = - ExtractRecordTypeOrmRelationProperties< - IndexFieldMetadataEntity, - MetadataEntitiesRelationTarget - >; - -export type FlatIndexFieldMetadata = FlatEntityFrom< - IndexFieldMetadataEntity, - IndexFieldMetadataEntityRelationProperties ->; - -export type FlatIndexMetadata = FlatEntityFrom< - IndexMetadataEntity, - IndexMetadataRelationProperties -> & { +export type FlatIndexMetadata = FlatEntityFrom & { universalIdentifier: string; flatIndexFieldMetadatas: FlatIndexFieldMetadata[]; }; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-index-metadata/utils/from-index-metadata-entity-to-flat-index-metadata.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-index-metadata/utils/from-index-metadata-entity-to-flat-index-metadata.util.ts index c94f598e87c..e19f11b0e15 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-index-metadata/utils/from-index-metadata-entity-to-flat-index-metadata.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-index-metadata/utils/from-index-metadata-entity-to-flat-index-metadata.util.ts @@ -1,6 +1,6 @@ import { removePropertiesFromRecord } from 'twenty-shared/utils'; -import { INDEX_METADATA_ENTITY_RELATION_PROPERTIES } from 'src/engine/metadata-modules/flat-index-metadata/constants/index-metadata-entity-relation-properties.constant'; +import { ALL_METADATA_RELATION_PROPERTIES } from 'src/engine/metadata-modules/flat-entity/constant/all-metadata-relations-properties.constant'; import { type FlatIndexMetadata } from 'src/engine/metadata-modules/flat-index-metadata/types/flat-index-metadata.type'; import { type IndexMetadataEntity } from 'src/engine/metadata-modules/index-metadata/index-metadata.entity'; @@ -9,7 +9,9 @@ export const fromIndexMetadataEntityToFlatIndexMetadata = ( ): FlatIndexMetadata => { const indexMetadataEntityWithoutRelations = removePropertiesFromRecord( indexMetadataEntity, - [...INDEX_METADATA_ENTITY_RELATION_PROPERTIES], + Object.keys( + ALL_METADATA_RELATION_PROPERTIES.index, + ) as (keyof typeof ALL_METADATA_RELATION_PROPERTIES.index)[], ); return { diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type.ts b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type.ts index 680118bbabe..e63c71aebf4 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type.ts @@ -1,29 +1,8 @@ import { type FlatEntityFrom } from 'src/engine/metadata-modules/flat-entity/types/flat-entity.type'; import { type ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; -import { type ExtractRecordTypeOrmRelationProperties } from 'src/engine/workspace-manager/workspace-migration-v2/types/extract-record-typeorm-relation-properties.type'; -import { type MetadataEntitiesRelationTarget } from 'src/engine/workspace-manager/workspace-migration-v2/types/metadata-entities-relation-targets.type'; - -export const objectMetadataEntityRelationProperties = [ - 'fields', - 'indexMetadatas', - 'targetRelationFields', - 'dataSource', - 'application', - 'objectPermissions', - 'fieldPermissions', - 'views', -] as const satisfies ObjectMetadataRelationProperties[]; - -type ObjectMetadataRelationProperties = ExtractRecordTypeOrmRelationProperties< - ObjectMetadataEntity, - MetadataEntitiesRelationTarget ->; export type FlatObjectMetadata = FlatEntityFrom< - ObjectMetadataEntity, - ObjectMetadataRelationProperties | 'dataSourceId' + Omit > & { fieldMetadataIds: string[]; - indexMetadataIds: string[]; - viewIds: string[]; }; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/from-object-metadata-entity-to-flat-object-metadata.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/from-object-metadata-entity-to-flat-object-metadata.util.ts index 397ffe297d9..352149e3cda 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/from-object-metadata-entity-to-flat-object-metadata.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/from-object-metadata-entity-to-flat-object-metadata.util.ts @@ -1,9 +1,7 @@ import { removePropertiesFromRecord } from 'twenty-shared/utils'; -import { - type FlatObjectMetadata, - objectMetadataEntityRelationProperties, -} from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type'; +import { ALL_METADATA_RELATION_PROPERTIES } from 'src/engine/metadata-modules/flat-entity/constant/all-metadata-relations-properties.constant'; +import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type'; import { type ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; export const fromObjectMetadataEntityToFlatObjectMetadata = ( @@ -11,7 +9,9 @@ export const fromObjectMetadataEntityToFlatObjectMetadata = ( ): FlatObjectMetadata => { const objectMetadataEntityWithoutRelations = removePropertiesFromRecord( objectMetadataEntity, - objectMetadataEntityRelationProperties, + Object.keys( + ALL_METADATA_RELATION_PROPERTIES.objectMetadata, + ) as (keyof typeof ALL_METADATA_RELATION_PROPERTIES.objectMetadata)[], ); return { diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-page-layout-tab/types/flat-page-layout-tab.type.ts b/packages/twenty-server/src/engine/metadata-modules/flat-page-layout-tab/types/flat-page-layout-tab.type.ts index 9228562d0ee..dacb31460bd 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-page-layout-tab/types/flat-page-layout-tab.type.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-page-layout-tab/types/flat-page-layout-tab.type.ts @@ -1,19 +1,4 @@ import { type FlatEntityFrom } from 'src/engine/metadata-modules/flat-entity/types/flat-entity.type'; import { type PageLayoutTabEntity } from 'src/engine/metadata-modules/page-layout-tab/entities/page-layout-tab.entity'; -export const pageLayoutTabEntityRelationProperties = [ - 'workspace', - 'pageLayout', - 'widgets', - 'application', -] as const satisfies (keyof PageLayoutTabEntity)[]; - -export type PageLayoutTabEntityRelationProperties = - (typeof pageLayoutTabEntityRelationProperties)[number]; - -export type FlatPageLayoutTab = FlatEntityFrom< - PageLayoutTabEntity, - PageLayoutTabEntityRelationProperties -> & { - widgetIds: string[]; -}; +export type FlatPageLayoutTab = FlatEntityFrom; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-page-layout-widget/constants/page-layout-widget-entity-relation-properties.constant.ts b/packages/twenty-server/src/engine/metadata-modules/flat-page-layout-widget/constants/page-layout-widget-entity-relation-properties.constant.ts deleted file mode 100644 index 8f0be2fa5ac..00000000000 --- a/packages/twenty-server/src/engine/metadata-modules/flat-page-layout-widget/constants/page-layout-widget-entity-relation-properties.constant.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { type PageLayoutWidgetEntityRelationProperties } from 'src/engine/metadata-modules/flat-page-layout-widget/types/flat-page-layout-widget.type'; - -export const PAGE_LAYOUT_WIDGET_ENTITY_RELATION_PROPERTIES = [ - 'workspace', - 'pageLayoutTab', - 'objectMetadata', - 'application', -] as const satisfies PageLayoutWidgetEntityRelationProperties[]; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-page-layout-widget/types/flat-page-layout-widget.type.ts b/packages/twenty-server/src/engine/metadata-modules/flat-page-layout-widget/types/flat-page-layout-widget.type.ts index befe9c3992d..ba58b2cb579 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-page-layout-widget/types/flat-page-layout-widget.type.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-page-layout-widget/types/flat-page-layout-widget.type.ts @@ -1,21 +1,4 @@ -import { type ApplicationEntity } from 'src/engine/core-modules/application/application.entity'; -import { type WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; import { type FlatEntityFrom } from 'src/engine/metadata-modules/flat-entity/types/flat-entity.type'; -import { type ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; -import { type PageLayoutTabEntity } from 'src/engine/metadata-modules/page-layout-tab/entities/page-layout-tab.entity'; import { type PageLayoutWidgetEntity } from 'src/engine/metadata-modules/page-layout-widget/entities/page-layout-widget.entity'; -import { type ExtractRecordTypeOrmRelationProperties } from 'src/engine/workspace-manager/workspace-migration-v2/types/extract-record-typeorm-relation-properties.type'; -export type PageLayoutWidgetEntityRelationProperties = - ExtractRecordTypeOrmRelationProperties< - PageLayoutWidgetEntity, - | PageLayoutTabEntity - | ObjectMetadataEntity - | WorkspaceEntity - | ApplicationEntity - >; - -export type FlatPageLayoutWidget = FlatEntityFrom< - PageLayoutWidgetEntity, - PageLayoutWidgetEntityRelationProperties ->; +export type FlatPageLayoutWidget = FlatEntityFrom; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-page-layout-widget/utils/from-page-layout-widget-entity-to-flat-page-layout-widget.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-page-layout-widget/utils/from-page-layout-widget-entity-to-flat-page-layout-widget.util.ts index 73640c4cc4e..5445d8e4629 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-page-layout-widget/utils/from-page-layout-widget-entity-to-flat-page-layout-widget.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-page-layout-widget/utils/from-page-layout-widget-entity-to-flat-page-layout-widget.util.ts @@ -1,6 +1,6 @@ import { removePropertiesFromRecord } from 'twenty-shared/utils'; -import { PAGE_LAYOUT_WIDGET_ENTITY_RELATION_PROPERTIES } from 'src/engine/metadata-modules/flat-page-layout-widget/constants/page-layout-widget-entity-relation-properties.constant'; +import { ALL_METADATA_RELATION_PROPERTIES } from 'src/engine/metadata-modules/flat-entity/constant/all-metadata-relations-properties.constant'; import { type FlatPageLayoutWidget } from 'src/engine/metadata-modules/flat-page-layout-widget/types/flat-page-layout-widget.type'; import { type PageLayoutWidgetEntity } from 'src/engine/metadata-modules/page-layout-widget/entities/page-layout-widget.entity'; @@ -9,7 +9,9 @@ export const fromPageLayoutWidgetEntityToFlatPageLayoutWidget = ( ): FlatPageLayoutWidget => { const pageLayoutWidgetEntityWithoutRelations = removePropertiesFromRecord( pageLayoutWidgetEntity, - PAGE_LAYOUT_WIDGET_ENTITY_RELATION_PROPERTIES, + Object.keys( + ALL_METADATA_RELATION_PROPERTIES.pageLayoutWidget, + ) as (keyof typeof ALL_METADATA_RELATION_PROPERTIES.pageLayoutWidget)[], ); return { diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-page-layout/types/flat-page-layout.type.ts b/packages/twenty-server/src/engine/metadata-modules/flat-page-layout/types/flat-page-layout.type.ts index 9e8ab0d6ff8..19407d28d7b 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-page-layout/types/flat-page-layout.type.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-page-layout/types/flat-page-layout.type.ts @@ -1,19 +1,4 @@ import { type FlatEntityFrom } from 'src/engine/metadata-modules/flat-entity/types/flat-entity.type'; import { type PageLayoutEntity } from 'src/engine/metadata-modules/page-layout/entities/page-layout.entity'; -export const pageLayoutEntityRelationProperties = [ - 'workspace', - 'objectMetadata', - 'tabs', - 'application', -] as const satisfies (keyof PageLayoutEntity)[]; - -export type PageLayoutEntityRelationProperties = - (typeof pageLayoutEntityRelationProperties)[number]; - -export type FlatPageLayout = FlatEntityFrom< - PageLayoutEntity, - PageLayoutEntityRelationProperties -> & { - tabIds: string[]; -}; +export type FlatPageLayout = FlatEntityFrom; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-role-target/types/flat-role-target.type.ts b/packages/twenty-server/src/engine/metadata-modules/flat-role-target/types/flat-role-target.type.ts index 5725c479274..d824fd108ec 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-role-target/types/flat-role-target.type.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-role-target/types/flat-role-target.type.ts @@ -1,12 +1,4 @@ import { type FlatEntityFrom } from 'src/engine/metadata-modules/flat-entity/types/flat-entity.type'; import { type RoleTargetEntity } from 'src/engine/metadata-modules/role-target/role-target.entity'; -export const roleTargetsEntityRelationProperties = ['role', 'apiKey'] as const; - -export type RoleTargetsEntityRelationProperties = - (typeof roleTargetsEntityRelationProperties)[number]; - -export type FlatRoleTarget = FlatEntityFrom< - RoleTargetEntity, - RoleTargetsEntityRelationProperties ->; +export type FlatRoleTarget = FlatEntityFrom; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-role/types/flat-role.type.ts b/packages/twenty-server/src/engine/metadata-modules/flat-role/types/flat-role.type.ts index 3e77d783252..712d4fda3b3 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-role/types/flat-role.type.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-role/types/flat-role.type.ts @@ -1,27 +1,8 @@ -import { type ApplicationEntity } from 'src/engine/core-modules/application/application.entity'; import { type FlatEntityFrom } from 'src/engine/metadata-modules/flat-entity/types/flat-entity.type'; -import { type FieldPermissionEntity } from 'src/engine/metadata-modules/object-permission/field-permission/field-permission.entity'; -import { type ObjectPermissionEntity } from 'src/engine/metadata-modules/object-permission/object-permission.entity'; -import { type PermissionFlagEntity } from 'src/engine/metadata-modules/permission-flag/permission-flag.entity'; -import { type RoleTargetEntity } from 'src/engine/metadata-modules/role-target/role-target.entity'; import { type RoleEntity } from 'src/engine/metadata-modules/role/role.entity'; -import { type ExtractRecordTypeOrmRelationProperties } from 'src/engine/workspace-manager/workspace-migration-v2/types/extract-record-typeorm-relation-properties.type'; -export type RoleEntityRelationProperties = - ExtractRecordTypeOrmRelationProperties< - RoleEntity, - | RoleTargetEntity - | ObjectPermissionEntity - | PermissionFlagEntity - | FieldPermissionEntity - | ApplicationEntity - >; - -export type FlatRole = FlatEntityFrom< - RoleEntity, - RoleEntityRelationProperties -> & { - roleTargetIds: string[]; +export type FlatRole = FlatEntityFrom & { + // TODO remove once objectPermission permissionFlag fieldPermission have been migrated to v2 objectPermissionIds: string[]; permissionFlagIds: string[]; fieldPermissionIds: string[]; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-view-field/constants/view-field-entity-relation-properties.constant.ts b/packages/twenty-server/src/engine/metadata-modules/flat-view-field/constants/view-field-entity-relation-properties.constant.ts deleted file mode 100644 index 7d064523c20..00000000000 --- a/packages/twenty-server/src/engine/metadata-modules/flat-view-field/constants/view-field-entity-relation-properties.constant.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { type ViewFieldEntityRelationProperties } from 'src/engine/metadata-modules/flat-view-field/types/flat-view-field.type'; - -export const VIEW_FIELD_ENTITY_RELATION_PROPERTIES = [ - 'fieldMetadata', - 'view', - 'workspace', -] as const satisfies ViewFieldEntityRelationProperties[]; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-view-field/types/flat-view-field.type.ts b/packages/twenty-server/src/engine/metadata-modules/flat-view-field/types/flat-view-field.type.ts index 193a11e1e7e..8355d65bd34 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-view-field/types/flat-view-field.type.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-view-field/types/flat-view-field.type.ts @@ -1,17 +1,4 @@ -import { type WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; -import { type FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity'; import { type FlatEntityFrom } from 'src/engine/metadata-modules/flat-entity/types/flat-entity.type'; import { type ViewFieldEntity } from 'src/engine/metadata-modules/view-field/entities/view-field.entity'; -import { type ViewEntity } from 'src/engine/metadata-modules/view/entities/view.entity'; -import { type ExtractRecordTypeOrmRelationProperties } from 'src/engine/workspace-manager/workspace-migration-v2/types/extract-record-typeorm-relation-properties.type'; -export type ViewFieldEntityRelationProperties = - ExtractRecordTypeOrmRelationProperties< - ViewFieldEntity, - FieldMetadataEntity | ViewEntity | WorkspaceEntity - >; - -export type FlatViewField = FlatEntityFrom< - ViewFieldEntity, - ViewFieldEntityRelationProperties ->; +export type FlatViewField = FlatEntityFrom; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-view-field/utils/from-view-field-entity-to-flat-view-field.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-view-field/utils/from-view-field-entity-to-flat-view-field.util.ts index 355f0c18501..499319e9e3c 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-view-field/utils/from-view-field-entity-to-flat-view-field.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-view-field/utils/from-view-field-entity-to-flat-view-field.util.ts @@ -1,6 +1,6 @@ import { removePropertiesFromRecord } from 'twenty-shared/utils'; -import { VIEW_FIELD_ENTITY_RELATION_PROPERTIES } from 'src/engine/metadata-modules/flat-view-field/constants/view-field-entity-relation-properties.constant'; +import { ALL_METADATA_RELATION_PROPERTIES } from 'src/engine/metadata-modules/flat-entity/constant/all-metadata-relations-properties.constant'; import { type FlatViewField } from 'src/engine/metadata-modules/flat-view-field/types/flat-view-field.type'; import { type ViewFieldEntity } from 'src/engine/metadata-modules/view-field/entities/view-field.entity'; @@ -9,7 +9,9 @@ export const fromViewFieldEntityToFlatViewField = ( ): FlatViewField => { const viewFieldEntityWithoutRelations = removePropertiesFromRecord( viewFieldEntity, - VIEW_FIELD_ENTITY_RELATION_PROPERTIES, + Object.keys( + ALL_METADATA_RELATION_PROPERTIES.viewField, + ) as (keyof typeof ALL_METADATA_RELATION_PROPERTIES.viewField)[], ); return { diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-view-filter/constants/view-filter-entity-relation-properties.constant.ts b/packages/twenty-server/src/engine/metadata-modules/flat-view-filter/constants/view-filter-entity-relation-properties.constant.ts deleted file mode 100644 index ddddee89638..00000000000 --- a/packages/twenty-server/src/engine/metadata-modules/flat-view-filter/constants/view-filter-entity-relation-properties.constant.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { type ViewFilterEntityRelationProperties } from 'src/engine/metadata-modules/flat-view-filter/types/flat-view-filter.type'; - -export const VIEW_FILTER_ENTITY_RELATION_PROPERTIES = [ - 'fieldMetadata', - 'view', - 'viewFilterGroup', - 'workspace', -] as const satisfies ViewFilterEntityRelationProperties[]; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-view-filter/types/flat-view-filter.type.ts b/packages/twenty-server/src/engine/metadata-modules/flat-view-filter/types/flat-view-filter.type.ts index cf92da77aac..f96f24f165c 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-view-filter/types/flat-view-filter.type.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-view-filter/types/flat-view-filter.type.ts @@ -1,18 +1,7 @@ -import { type WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; -import { type FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity'; import { type FlatEntityFrom } from 'src/engine/metadata-modules/flat-entity/types/flat-entity.type'; -import { type ViewFilterGroupEntity } from 'src/engine/metadata-modules/view-filter-group/entities/view-filter-group.entity'; import { type ViewFilterEntity } from 'src/engine/metadata-modules/view-filter/entities/view-filter.entity'; -import { type ViewEntity } from 'src/engine/metadata-modules/view/entities/view.entity'; -import { type ExtractRecordTypeOrmRelationProperties } from 'src/engine/workspace-manager/workspace-migration-v2/types/extract-record-typeorm-relation-properties.type'; - -export type ViewFilterEntityRelationProperties = - ExtractRecordTypeOrmRelationProperties< - ViewFilterEntity, - FieldMetadataEntity | ViewEntity | ViewFilterGroupEntity | WorkspaceEntity - >; export type FlatViewFilter = FlatEntityFrom< - ViewFilterEntity, - ViewFilterEntityRelationProperties + // TODO remove once viewFilterGroups have been migrated to v2 + Omit >; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-view-filter/utils/from-view-filter-entity-to-flat-view-filter.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-view-filter/utils/from-view-filter-entity-to-flat-view-filter.util.ts index 07d7a5bfec6..59578cfed42 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-view-filter/utils/from-view-filter-entity-to-flat-view-filter.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-view-filter/utils/from-view-filter-entity-to-flat-view-filter.util.ts @@ -1,6 +1,6 @@ import { removePropertiesFromRecord } from 'twenty-shared/utils'; -import { VIEW_FILTER_ENTITY_RELATION_PROPERTIES } from 'src/engine/metadata-modules/flat-view-filter/constants/view-filter-entity-relation-properties.constant'; +import { ALL_METADATA_RELATION_PROPERTIES } from 'src/engine/metadata-modules/flat-entity/constant/all-metadata-relations-properties.constant'; import { type FlatViewFilter } from 'src/engine/metadata-modules/flat-view-filter/types/flat-view-filter.type'; import { type ViewFilterEntity } from 'src/engine/metadata-modules/view-filter/entities/view-filter.entity'; @@ -9,7 +9,9 @@ export const fromViewFilterEntityToFlatViewFilter = ( ): FlatViewFilter => { const viewFilterEntityWithoutRelations = removePropertiesFromRecord( viewFilterEntity, - VIEW_FILTER_ENTITY_RELATION_PROPERTIES, + Object.keys( + ALL_METADATA_RELATION_PROPERTIES.viewFilter, + ) as (keyof typeof ALL_METADATA_RELATION_PROPERTIES.viewFilter)[], ); return { diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-view-group/constants/view-group-entity-relation-properties.constant.ts b/packages/twenty-server/src/engine/metadata-modules/flat-view-group/constants/view-group-entity-relation-properties.constant.ts deleted file mode 100644 index e96a5215082..00000000000 --- a/packages/twenty-server/src/engine/metadata-modules/flat-view-group/constants/view-group-entity-relation-properties.constant.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { type ViewGroupEntityRelationProperties } from 'src/engine/metadata-modules/flat-view-group/types/flat-view-group.type'; - -export const VIEW_GROUP_ENTITY_RELATION_PROPERTIES = [ - 'view', - 'workspace', -] as const satisfies ViewGroupEntityRelationProperties[]; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-view-group/types/flat-view-group.type.ts b/packages/twenty-server/src/engine/metadata-modules/flat-view-group/types/flat-view-group.type.ts index cf6c39ffa8e..ac55795448e 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-view-group/types/flat-view-group.type.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-view-group/types/flat-view-group.type.ts @@ -1,17 +1,4 @@ -import { type WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; -import { type FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity'; import { type FlatEntityFrom } from 'src/engine/metadata-modules/flat-entity/types/flat-entity.type'; import { type ViewGroupEntity } from 'src/engine/metadata-modules/view-group/entities/view-group.entity'; -import { type ViewEntity } from 'src/engine/metadata-modules/view/entities/view.entity'; -import { type ExtractRecordTypeOrmRelationProperties } from 'src/engine/workspace-manager/workspace-migration-v2/types/extract-record-typeorm-relation-properties.type'; -export type ViewGroupEntityRelationProperties = - ExtractRecordTypeOrmRelationProperties< - ViewGroupEntity, - FieldMetadataEntity | ViewEntity | WorkspaceEntity - >; - -export type FlatViewGroup = FlatEntityFrom< - ViewGroupEntity, - ViewGroupEntityRelationProperties ->; +export type FlatViewGroup = FlatEntityFrom; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-view-group/utils/from-view-group-entity-to-flat-view-group.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-view-group/utils/from-view-group-entity-to-flat-view-group.util.ts index 67d0d3679f7..d403ee79ec1 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-view-group/utils/from-view-group-entity-to-flat-view-group.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-view-group/utils/from-view-group-entity-to-flat-view-group.util.ts @@ -1,6 +1,6 @@ import { removePropertiesFromRecord } from 'twenty-shared/utils'; -import { VIEW_GROUP_ENTITY_RELATION_PROPERTIES } from 'src/engine/metadata-modules/flat-view-group/constants/view-group-entity-relation-properties.constant'; +import { ALL_METADATA_RELATION_PROPERTIES } from 'src/engine/metadata-modules/flat-entity/constant/all-metadata-relations-properties.constant'; import { type FlatViewGroup } from 'src/engine/metadata-modules/flat-view-group/types/flat-view-group.type'; import { type ViewGroupEntity } from 'src/engine/metadata-modules/view-group/entities/view-group.entity'; @@ -9,7 +9,9 @@ export const fromViewGroupEntityToFlatViewGroup = ( ): FlatViewGroup => { const viewGroupEntityWithoutRelations = removePropertiesFromRecord( viewGroupEntity, - VIEW_GROUP_ENTITY_RELATION_PROPERTIES, + Object.keys( + ALL_METADATA_RELATION_PROPERTIES.viewGroup, + ) as (keyof typeof ALL_METADATA_RELATION_PROPERTIES.viewGroup)[], ); return { diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-view/constants/view-entity-relation-properties.constant.ts b/packages/twenty-server/src/engine/metadata-modules/flat-view/constants/view-entity-relation-properties.constant.ts deleted file mode 100644 index 49029054d86..00000000000 --- a/packages/twenty-server/src/engine/metadata-modules/flat-view/constants/view-entity-relation-properties.constant.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { type ViewEntityRelationProperties } from 'src/engine/metadata-modules/flat-view/types/flat-view.type'; - -export const VIEW_ENTITY_RELATION_PROPERTIES = [ - 'objectMetadata', - 'viewFields', - 'viewFilters', - 'viewFilterGroups', - 'viewGroups', - 'viewSorts', - 'workspace', - 'createdBy', - 'application', -] as const satisfies ViewEntityRelationProperties[]; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-view/types/flat-view.type.ts b/packages/twenty-server/src/engine/metadata-modules/flat-view/types/flat-view.type.ts index e22cdbf378d..2895fb9c912 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-view/types/flat-view.type.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-view/types/flat-view.type.ts @@ -1,37 +1,7 @@ -import { type ApplicationEntity } from 'src/engine/core-modules/application/application.entity'; -import { type UserWorkspaceEntity } from 'src/engine/core-modules/user-workspace/user-workspace.entity'; -import { type WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; -import { type FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity'; import { type FlatEntityFrom } from 'src/engine/metadata-modules/flat-entity/types/flat-entity.type'; -import { type ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; -import { type ViewFieldEntity } from 'src/engine/metadata-modules/view-field/entities/view-field.entity'; -import { type ViewFilterGroupEntity } from 'src/engine/metadata-modules/view-filter-group/entities/view-filter-group.entity'; -import { type ViewFilterEntity } from 'src/engine/metadata-modules/view-filter/entities/view-filter.entity'; -import { type ViewGroupEntity } from 'src/engine/metadata-modules/view-group/entities/view-group.entity'; -import { type ViewSortEntity } from 'src/engine/metadata-modules/view-sort/entities/view-sort.entity'; import { type ViewEntity } from 'src/engine/metadata-modules/view/entities/view.entity'; -import { type ExtractRecordTypeOrmRelationProperties } from 'src/engine/workspace-manager/workspace-migration-v2/types/extract-record-typeorm-relation-properties.type'; - -export type ViewEntityRelationProperties = - ExtractRecordTypeOrmRelationProperties< - ViewEntity, - | ObjectMetadataEntity - | ViewFieldEntity - | ViewSortEntity - | ViewFilterEntity - | ViewGroupEntity - | ViewFilterGroupEntity - | WorkspaceEntity - | FieldMetadataEntity - | UserWorkspaceEntity - | ApplicationEntity - >; export type FlatView = FlatEntityFrom< - ViewEntity, - ViewEntityRelationProperties -> & { - viewFieldIds: string[]; - viewFilterIds: string[]; - viewGroupIds: string[]; -}; + // TODO remove once viewSorts and viewFilterGroups have been migrated to v2 + Omit +>; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-view/utils/from-view-entity-to-flat-view.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-view/utils/from-view-entity-to-flat-view.util.ts index 3575a28f5bb..af60b4f73aa 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-view/utils/from-view-entity-to-flat-view.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-view/utils/from-view-entity-to-flat-view.util.ts @@ -1,13 +1,15 @@ import { removePropertiesFromRecord } from 'twenty-shared/utils'; -import { VIEW_ENTITY_RELATION_PROPERTIES } from 'src/engine/metadata-modules/flat-view/constants/view-entity-relation-properties.constant'; +import { ALL_METADATA_RELATION_PROPERTIES } from 'src/engine/metadata-modules/flat-entity/constant/all-metadata-relations-properties.constant'; import { type FlatView } from 'src/engine/metadata-modules/flat-view/types/flat-view.type'; import { type ViewEntity } from 'src/engine/metadata-modules/view/entities/view.entity'; export const fromViewEntityToFlatView = (viewEntity: ViewEntity): FlatView => { const viewEntityWithoutRelations = removePropertiesFromRecord( viewEntity, - VIEW_ENTITY_RELATION_PROPERTIES, + Object.keys( + ALL_METADATA_RELATION_PROPERTIES.view, + ) as (keyof typeof ALL_METADATA_RELATION_PROPERTIES.view)[], ); return { diff --git a/packages/twenty-server/src/engine/metadata-modules/index-metadata/index-metadata.entity.ts b/packages/twenty-server/src/engine/metadata-modules/index-metadata/index-metadata.entity.ts index 1e37cb171ac..57eaf79919a 100644 --- a/packages/twenty-server/src/engine/metadata-modules/index-metadata/index-metadata.entity.ts +++ b/packages/twenty-server/src/engine/metadata-modules/index-metadata/index-metadata.entity.ts @@ -12,8 +12,7 @@ import { UpdateDateColumn, } from 'typeorm'; -import { SyncableEntity } from 'src/engine/workspace-manager/workspace-sync/interfaces/syncable-entity.interface'; - +import { SyncableEntity } from 'src/engine/workspace-manager/workspace-sync/types/syncable-entity.interface'; import { IndexFieldMetadataEntity } from 'src/engine/metadata-modules/index-metadata/index-field-metadata.entity'; import { IndexType } from 'src/engine/metadata-modules/index-metadata/types/indexType.types'; import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; diff --git a/packages/twenty-server/src/engine/metadata-modules/object-metadata/object-metadata.entity.ts b/packages/twenty-server/src/engine/metadata-modules/object-metadata/object-metadata.entity.ts index 297f11879ee..09fd29031c6 100644 --- a/packages/twenty-server/src/engine/metadata-modules/object-metadata/object-metadata.entity.ts +++ b/packages/twenty-server/src/engine/metadata-modules/object-metadata/object-metadata.entity.ts @@ -10,8 +10,7 @@ import { UpdateDateColumn, } from 'typeorm'; -import { SyncableEntity } from 'src/engine/workspace-manager/workspace-sync/interfaces/syncable-entity.interface'; - +import { SyncableEntity } from 'src/engine/workspace-manager/workspace-sync/types/syncable-entity.interface'; import { type WorkspaceEntityDuplicateCriteria } from 'src/engine/api/graphql/workspace-query-builder/types/workspace-entity-duplicate-criteria.type'; import { DataSourceEntity } from 'src/engine/metadata-modules/data-source/data-source.entity'; import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity'; diff --git a/packages/twenty-server/src/engine/metadata-modules/object-permission/field-permission/field-permission.entity.ts b/packages/twenty-server/src/engine/metadata-modules/object-permission/field-permission/field-permission.entity.ts index 10b645e2a1d..9fdd7159cd9 100644 --- a/packages/twenty-server/src/engine/metadata-modules/object-permission/field-permission/field-permission.entity.ts +++ b/packages/twenty-server/src/engine/metadata-modules/object-permission/field-permission/field-permission.entity.ts @@ -12,10 +12,10 @@ import { UpdateDateColumn, } from 'typeorm'; -import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; 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 { RoleEntity } from 'src/engine/metadata-modules/role/role.entity'; +import { WorkspaceRelatedEntity } from 'src/engine/workspace-manager/workspace-sync/types/workspace-related-entity'; @Entity('fieldPermission') @Unique('IDX_FIELD_PERMISSION_FIELD_METADATA_ID_ROLE_ID_UNIQUE', [ @@ -23,7 +23,7 @@ import { RoleEntity } from 'src/engine/metadata-modules/role/role.entity'; 'roleId', ]) @Index('IDX_FIELD_PERMISSION_WORKSPACE_ID_ROLE_ID', ['workspaceId', 'roleId']) -export class FieldPermissionEntity { +export class FieldPermissionEntity extends WorkspaceRelatedEntity { @PrimaryGeneratedColumn('uuid') id: string; @@ -75,13 +75,6 @@ export class FieldPermissionEntity { @Column({ nullable: true, type: 'boolean' }) canUpdateFieldValue?: boolean | null; - @Column({ nullable: false, type: 'uuid' }) - workspaceId: string; - - @ManyToOne(() => WorkspaceEntity, { onDelete: 'CASCADE' }) - @JoinColumn({ name: 'workspaceId' }) - workspace: Relation; - @CreateDateColumn({ type: 'timestamptz' }) createdAt: Date; diff --git a/packages/twenty-server/src/engine/metadata-modules/object-permission/object-permission.entity.ts b/packages/twenty-server/src/engine/metadata-modules/object-permission/object-permission.entity.ts index 5422bcd7ed2..81d4d6e1758 100644 --- a/packages/twenty-server/src/engine/metadata-modules/object-permission/object-permission.entity.ts +++ b/packages/twenty-server/src/engine/metadata-modules/object-permission/object-permission.entity.ts @@ -13,6 +13,7 @@ import { import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; import { RoleEntity } from 'src/engine/metadata-modules/role/role.entity'; +import { WorkspaceRelatedEntity } from 'src/engine/workspace-manager/workspace-sync/types/workspace-related-entity'; @Entity('objectPermission') @Unique('IDX_OBJECT_PERMISSION_OBJECT_METADATA_ID_ROLE_ID_UNIQUE', [ @@ -20,7 +21,7 @@ import { RoleEntity } from 'src/engine/metadata-modules/role/role.entity'; 'roleId', ]) @Index('IDX_OBJECT_PERMISSION_WORKSPACE_ID_ROLE_ID', ['workspaceId', 'roleId']) -export class ObjectPermissionEntity { +export class ObjectPermissionEntity extends WorkspaceRelatedEntity { @PrimaryGeneratedColumn('uuid') id: string; @@ -58,9 +59,6 @@ export class ObjectPermissionEntity { @Column({ nullable: true, type: 'boolean' }) canDestroyObjectRecords?: boolean; - @Column({ nullable: false, type: 'uuid' }) - workspaceId: string; - @CreateDateColumn({ type: 'timestamptz' }) createdAt: Date; diff --git a/packages/twenty-server/src/engine/metadata-modules/page-layout-tab/entities/page-layout-tab.entity.ts b/packages/twenty-server/src/engine/metadata-modules/page-layout-tab/entities/page-layout-tab.entity.ts index a70e945c86d..7fb75e6fe47 100644 --- a/packages/twenty-server/src/engine/metadata-modules/page-layout-tab/entities/page-layout-tab.entity.ts +++ b/packages/twenty-server/src/engine/metadata-modules/page-layout-tab/entities/page-layout-tab.entity.ts @@ -14,9 +14,7 @@ import { UpdateDateColumn, } from 'typeorm'; -import { SyncableEntity } from 'src/engine/workspace-manager/workspace-sync/interfaces/syncable-entity.interface'; - -import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; +import { SyncableEntity } from 'src/engine/workspace-manager/workspace-sync/types/syncable-entity.interface'; import { PageLayoutWidgetEntity } from 'src/engine/metadata-modules/page-layout-widget/entities/page-layout-widget.entity'; import { PageLayoutEntity } from 'src/engine/metadata-modules/page-layout/entities/page-layout.entity'; @@ -37,15 +35,6 @@ export class PageLayoutTabEntity @Column({ nullable: false }) title: string; - @Column({ nullable: false, type: 'uuid' }) - workspaceId: string; - - @ManyToOne(() => WorkspaceEntity, { - onDelete: 'CASCADE', - }) - @JoinColumn({ name: 'workspaceId' }) - workspace: Relation; - @Column({ nullable: false, type: 'float', default: 0 }) position: number; diff --git a/packages/twenty-server/src/engine/metadata-modules/page-layout-widget/entities/page-layout-widget.entity.ts b/packages/twenty-server/src/engine/metadata-modules/page-layout-widget/entities/page-layout-widget.entity.ts index 4a94e6920d3..bf276c78815 100644 --- a/packages/twenty-server/src/engine/metadata-modules/page-layout-widget/entities/page-layout-widget.entity.ts +++ b/packages/twenty-server/src/engine/metadata-modules/page-layout-widget/entities/page-layout-widget.entity.ts @@ -13,9 +13,7 @@ import { UpdateDateColumn, } from 'typeorm'; -import { SyncableEntity } from 'src/engine/workspace-manager/workspace-sync/interfaces/syncable-entity.interface'; - -import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; +import { SyncableEntity } from 'src/engine/workspace-manager/workspace-sync/types/syncable-entity.interface'; import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; import { PageLayoutTabEntity } from 'src/engine/metadata-modules/page-layout-tab/entities/page-layout-tab.entity'; import { WidgetType } from 'src/engine/metadata-modules/page-layout-widget/enums/widget-type.enum'; @@ -39,15 +37,6 @@ export class PageLayoutWidgetEntity @Column({ nullable: false, type: 'uuid' }) pageLayoutTabId: string; - @Column({ nullable: false, type: 'uuid' }) - workspaceId: string; - - @ManyToOne(() => WorkspaceEntity, { - onDelete: 'CASCADE', - }) - @JoinColumn({ name: 'workspaceId' }) - workspace: Relation; - @ManyToOne(() => PageLayoutTabEntity, { onDelete: 'CASCADE', }) diff --git a/packages/twenty-server/src/engine/metadata-modules/page-layout/entities/page-layout.entity.ts b/packages/twenty-server/src/engine/metadata-modules/page-layout/entities/page-layout.entity.ts index 55570f3d378..74b565950e0 100644 --- a/packages/twenty-server/src/engine/metadata-modules/page-layout/entities/page-layout.entity.ts +++ b/packages/twenty-server/src/engine/metadata-modules/page-layout/entities/page-layout.entity.ts @@ -14,9 +14,7 @@ import { UpdateDateColumn, } from 'typeorm'; -import { SyncableEntity } from 'src/engine/workspace-manager/workspace-sync/interfaces/syncable-entity.interface'; - -import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; +import { SyncableEntity } from 'src/engine/workspace-manager/workspace-sync/types/syncable-entity.interface'; import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; import { PageLayoutTabEntity } from 'src/engine/metadata-modules/page-layout-tab/entities/page-layout-tab.entity'; import { PageLayoutType } from 'src/engine/metadata-modules/page-layout/enums/page-layout-type.enum'; @@ -38,15 +36,6 @@ export class PageLayoutEntity @Column({ nullable: false }) name: string; - @Column({ nullable: false, type: 'uuid' }) - workspaceId: string; - - @ManyToOne(() => WorkspaceEntity, { - onDelete: 'CASCADE', - }) - @JoinColumn({ name: 'workspaceId' }) - workspace: Relation; - @Column({ type: 'enum', enum: Object.values(PageLayoutType), diff --git a/packages/twenty-server/src/engine/metadata-modules/permission-flag/permission-flag.entity.ts b/packages/twenty-server/src/engine/metadata-modules/permission-flag/permission-flag.entity.ts index 3f736af7885..1ef799cb9d3 100644 --- a/packages/twenty-server/src/engine/metadata-modules/permission-flag/permission-flag.entity.ts +++ b/packages/twenty-server/src/engine/metadata-modules/permission-flag/permission-flag.entity.ts @@ -1,3 +1,4 @@ +import { PermissionFlagType } from 'twenty-shared/constants'; import { Column, CreateDateColumn, @@ -9,13 +10,13 @@ import { Unique, UpdateDateColumn, } from 'typeorm'; -import { PermissionFlagType } from 'twenty-shared/constants'; import { RoleEntity } from 'src/engine/metadata-modules/role/role.entity'; +import { WorkspaceRelatedEntity } from 'src/engine/workspace-manager/workspace-sync/types/workspace-related-entity'; @Entity('permissionFlag') @Unique('IDX_PERMISSION_FLAG_FLAG_ROLE_ID_UNIQUE', ['flag', 'roleId']) -export class PermissionFlagEntity { +export class PermissionFlagEntity extends WorkspaceRelatedEntity { @PrimaryGeneratedColumn('uuid') id: string; @@ -31,9 +32,6 @@ export class PermissionFlagEntity { @Column({ nullable: false, type: 'varchar' }) flag: PermissionFlagType; - @Column({ nullable: false, type: 'uuid' }) - workspaceId: string; - @CreateDateColumn({ type: 'timestamptz' }) createdAt: Date; diff --git a/packages/twenty-server/src/engine/metadata-modules/remote-server/remote-server.entity.ts b/packages/twenty-server/src/engine/metadata-modules/remote-server/remote-server.entity.ts index dc56c800815..b13482525de 100644 --- a/packages/twenty-server/src/engine/metadata-modules/remote-server/remote-server.entity.ts +++ b/packages/twenty-server/src/engine/metadata-modules/remote-server/remote-server.entity.ts @@ -11,6 +11,7 @@ import { import { RemoteTableEntity } from 'src/engine/metadata-modules/remote-server/remote-table/remote-table.entity'; import { UserMappingOptions } from 'src/engine/metadata-modules/remote-server/types/user-mapping-options'; +import { WorkspaceRelatedEntity } from 'src/engine/workspace-manager/workspace-sync/types/workspace-related-entity'; export enum RemoteServerType { POSTGRES_FDW = 'postgres_fdw', @@ -35,7 +36,9 @@ export type ForeignDataWrapperOptions = : never; @Entity('remoteServer') -export class RemoteServerEntity { +export class RemoteServerEntity< + T extends RemoteServerType, +> extends WorkspaceRelatedEntity { @PrimaryGeneratedColumn('uuid') id: string; @@ -58,9 +61,6 @@ export class RemoteServerEntity { @Column({ type: 'text', nullable: true }) schema: string; - @Column({ nullable: false, type: 'uuid' }) - workspaceId: string; - @OneToMany(() => RemoteTableEntity, (table) => table.server, { cascade: true, }) diff --git a/packages/twenty-server/src/engine/metadata-modules/remote-server/remote-table/remote-table.entity.ts b/packages/twenty-server/src/engine/metadata-modules/remote-server/remote-table/remote-table.entity.ts index 31fd2484587..5133652063d 100644 --- a/packages/twenty-server/src/engine/metadata-modules/remote-server/remote-table/remote-table.entity.ts +++ b/packages/twenty-server/src/engine/metadata-modules/remote-server/remote-table/remote-table.entity.ts @@ -1,21 +1,22 @@ import { - Entity, - PrimaryGeneratedColumn, Column, CreateDateColumn, - UpdateDateColumn, + Entity, JoinColumn, ManyToOne, + PrimaryGeneratedColumn, Relation, + UpdateDateColumn, } from 'typeorm'; import { RemoteServerEntity, type RemoteServerType, } from 'src/engine/metadata-modules/remote-server/remote-server.entity'; +import { WorkspaceRelatedEntity } from 'src/engine/workspace-manager/workspace-sync/types/workspace-related-entity'; @Entity('remoteTable') -export class RemoteTableEntity { +export class RemoteTableEntity extends WorkspaceRelatedEntity { @PrimaryGeneratedColumn('uuid') id: string; @@ -25,9 +26,6 @@ export class RemoteTableEntity { @Column({ nullable: false }) localTableName: string; - @Column({ nullable: false, type: 'uuid' }) - workspaceId: string; - @Column({ nullable: false, type: 'uuid' }) remoteServerId: string; diff --git a/packages/twenty-server/src/engine/metadata-modules/role-target/role-target.entity.ts b/packages/twenty-server/src/engine/metadata-modules/role-target/role-target.entity.ts index abd29783990..1eca4b1bb16 100644 --- a/packages/twenty-server/src/engine/metadata-modules/role-target/role-target.entity.ts +++ b/packages/twenty-server/src/engine/metadata-modules/role-target/role-target.entity.ts @@ -12,8 +12,7 @@ import { UpdateDateColumn, } from 'typeorm'; -import { SyncableEntity } from 'src/engine/workspace-manager/workspace-sync/interfaces/syncable-entity.interface'; - +import { SyncableEntity } from 'src/engine/workspace-manager/workspace-sync/types/syncable-entity.interface'; import { ApiKeyEntity } from 'src/engine/core-modules/api-key/api-key.entity'; import { RoleEntity } from 'src/engine/metadata-modules/role/role.entity'; diff --git a/packages/twenty-server/src/engine/metadata-modules/role/role.entity.ts b/packages/twenty-server/src/engine/metadata-modules/role/role.entity.ts index 6d7302d1583..1f4fc7663a2 100644 --- a/packages/twenty-server/src/engine/metadata-modules/role/role.entity.ts +++ b/packages/twenty-server/src/engine/metadata-modules/role/role.entity.ts @@ -9,8 +9,7 @@ import { UpdateDateColumn, } from 'typeorm'; -import { SyncableEntity } from 'src/engine/workspace-manager/workspace-sync/interfaces/syncable-entity.interface'; - +import { SyncableEntity } from 'src/engine/workspace-manager/workspace-sync/types/syncable-entity.interface'; import { FieldPermissionEntity } from 'src/engine/metadata-modules/object-permission/field-permission/field-permission.entity'; import { ObjectPermissionEntity } from 'src/engine/metadata-modules/object-permission/object-permission.entity'; import { PermissionFlagEntity } from 'src/engine/metadata-modules/permission-flag/permission-flag.entity'; diff --git a/packages/twenty-server/src/engine/metadata-modules/route-trigger/route-trigger.entity.ts b/packages/twenty-server/src/engine/metadata-modules/route-trigger/route-trigger.entity.ts index 6e83207c663..4f8359a7b87 100644 --- a/packages/twenty-server/src/engine/metadata-modules/route-trigger/route-trigger.entity.ts +++ b/packages/twenty-server/src/engine/metadata-modules/route-trigger/route-trigger.entity.ts @@ -1,3 +1,4 @@ +import { HTTPMethod } from 'twenty-shared/types'; import { Column, CreateDateColumn, @@ -9,17 +10,10 @@ import { Unique, UpdateDateColumn, } from 'typeorm'; -import { HTTPMethod } from 'twenty-shared/types'; -import { SyncableEntity } from 'src/engine/workspace-manager/workspace-sync/interfaces/syncable-entity.interface'; - -import { RouteTriggerEntityRelationProperties } from 'src/engine/metadata-modules/route-trigger/types/flat-route-trigger.type'; +import { SyncableEntity } from 'src/engine/workspace-manager/workspace-sync/types/syncable-entity.interface'; import { ServerlessFunctionEntity } from 'src/engine/metadata-modules/serverless-function/serverless-function.entity'; -export const ROUTE_TRIGGER_ENTITY_RELATION_PROPERTIES = [ - 'serverlessFunction', -] as const satisfies readonly RouteTriggerEntityRelationProperties[]; - @Entity({ name: 'routeTrigger', schema: 'core' }) @Unique('IDX_ROUTE_TRIGGER_PATH_HTTP_METHOD_WORKSPACE_ID_UNIQUE', [ 'path', @@ -58,9 +52,6 @@ export class RouteTriggerEntity @Column({ nullable: false, type: 'uuid' }) serverlessFunctionId: string; - @Column({ nullable: false, type: 'uuid' }) - workspaceId: string; - @CreateDateColumn({ type: 'timestamptz' }) createdAt: Date; diff --git a/packages/twenty-server/src/engine/metadata-modules/route-trigger/services/workspace-flat-route-trigger-map-cache.service.ts b/packages/twenty-server/src/engine/metadata-modules/route-trigger/services/workspace-flat-route-trigger-map-cache.service.ts index 7dbcc378a35..26f030cec46 100644 --- a/packages/twenty-server/src/engine/metadata-modules/route-trigger/services/workspace-flat-route-trigger-map-cache.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/route-trigger/services/workspace-flat-route-trigger-map-cache.service.ts @@ -6,12 +6,10 @@ import { Repository } from 'typeorm'; import { WorkspaceCacheProvider } from 'src/engine/workspace-cache/interfaces/workspace-cache-provider.service'; +import { ALL_METADATA_RELATION_PROPERTIES } from 'src/engine/metadata-modules/flat-entity/constant/all-metadata-relations-properties.constant'; import { createEmptyFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/constant/create-empty-flat-entity-maps.constant'; import { FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type'; -import { - ROUTE_TRIGGER_ENTITY_RELATION_PROPERTIES, - RouteTriggerEntity, -} from 'src/engine/metadata-modules/route-trigger/route-trigger.entity'; +import { RouteTriggerEntity } from 'src/engine/metadata-modules/route-trigger/route-trigger.entity'; import { FlatRouteTrigger } from 'src/engine/metadata-modules/route-trigger/types/flat-route-trigger.type'; import { WorkspaceCache } from 'src/engine/workspace-cache/decorators/workspace-cache.decorator'; import { addFlatEntityToFlatEntityMapsThroughMutationOrThrow } from 'src/engine/workspace-manager/workspace-migration-v2/utils/add-flat-entity-to-flat-entity-maps-through-mutation-or-throw.util'; @@ -40,10 +38,14 @@ export class WorkspaceFlatRouteTriggerMapCacheService extends WorkspaceCacheProv const flatRouteTriggerMaps = createEmptyFlatEntityMaps(); for (const routeTriggerEntity of routeTriggers) { + const routeTriggerEntityWithoutRelations = removePropertiesFromRecord( + routeTriggerEntity, + Object.keys( + ALL_METADATA_RELATION_PROPERTIES.routeTrigger, + ) as (keyof typeof ALL_METADATA_RELATION_PROPERTIES.routeTrigger)[], + ); const flatRouteTrigger = { - ...removePropertiesFromRecord(routeTriggerEntity, [ - ...ROUTE_TRIGGER_ENTITY_RELATION_PROPERTIES, - ]), + ...routeTriggerEntityWithoutRelations, createdAt: routeTriggerEntity.createdAt.toISOString(), updatedAt: routeTriggerEntity.updatedAt.toISOString(), universalIdentifier: diff --git a/packages/twenty-server/src/engine/metadata-modules/route-trigger/types/flat-route-trigger.type.ts b/packages/twenty-server/src/engine/metadata-modules/route-trigger/types/flat-route-trigger.type.ts index 855e99b8923..a3a18c01edc 100644 --- a/packages/twenty-server/src/engine/metadata-modules/route-trigger/types/flat-route-trigger.type.ts +++ b/packages/twenty-server/src/engine/metadata-modules/route-trigger/types/flat-route-trigger.type.ts @@ -1,16 +1,4 @@ -import { type WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; import { type FlatEntityFrom } from 'src/engine/metadata-modules/flat-entity/types/flat-entity.type'; import { type RouteTriggerEntity } from 'src/engine/metadata-modules/route-trigger/route-trigger.entity'; -import { type ServerlessFunctionEntity } from 'src/engine/metadata-modules/serverless-function/serverless-function.entity'; -import { type ExtractRecordTypeOrmRelationProperties } from 'src/engine/workspace-manager/workspace-migration-v2/types/extract-record-typeorm-relation-properties.type'; -export type RouteTriggerEntityRelationProperties = - ExtractRecordTypeOrmRelationProperties< - RouteTriggerEntity, - ServerlessFunctionEntity | WorkspaceEntity - >; - -export type FlatRouteTrigger = FlatEntityFrom< - RouteTriggerEntity, - RouteTriggerEntityRelationProperties ->; +export type FlatRouteTrigger = FlatEntityFrom; diff --git a/packages/twenty-server/src/engine/metadata-modules/search-field-metadata/search-field-metadata.entity.ts b/packages/twenty-server/src/engine/metadata-modules/search-field-metadata/search-field-metadata.entity.ts index 6a1386d2eb0..27e8e4b6904 100644 --- a/packages/twenty-server/src/engine/metadata-modules/search-field-metadata/search-field-metadata.entity.ts +++ b/packages/twenty-server/src/engine/metadata-modules/search-field-metadata/search-field-metadata.entity.ts @@ -13,7 +13,7 @@ import { 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 { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; +import { WorkspaceRelatedEntity } from 'src/engine/workspace-manager/workspace-sync/types/workspace-related-entity'; @Entity('searchFieldMetadata') @Unique('IDX_SEARCH_FIELD_METADATA_OBJECT_FIELD_UNIQUE', [ @@ -22,7 +22,7 @@ import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.ent ]) @Index('IDX_SEARCH_FIELD_METADATA_WORKSPACE_ID', ['workspaceId']) @Index('IDX_SEARCH_FIELD_METADATA_OBJECT_METADATA_ID', ['objectMetadataId']) -export class SearchFieldMetadataEntity { +export class SearchFieldMetadataEntity extends WorkspaceRelatedEntity { @PrimaryGeneratedColumn('uuid') id: string; @@ -45,11 +45,4 @@ export class SearchFieldMetadataEntity { @UpdateDateColumn({ type: 'timestamptz' }) updatedAt: Date; - - @Column({ nullable: false, type: 'uuid' }) - workspaceId: string; - - @ManyToOne(() => WorkspaceEntity, { onDelete: 'CASCADE' }) - @JoinColumn({ name: 'workspaceId' }) - workspace: Relation; } diff --git a/packages/twenty-server/src/engine/metadata-modules/serverless-function-layer/serverless-function-layer.entity.ts b/packages/twenty-server/src/engine/metadata-modules/serverless-function-layer/serverless-function-layer.entity.ts index d4f0418d2f7..755017fb7ad 100644 --- a/packages/twenty-server/src/engine/metadata-modules/serverless-function-layer/serverless-function-layer.entity.ts +++ b/packages/twenty-server/src/engine/metadata-modules/serverless-function-layer/serverless-function-layer.entity.ts @@ -1,3 +1,4 @@ +import { PackageJson } from 'twenty-shared/application'; import { Column, CreateDateColumn, @@ -7,12 +8,12 @@ import { Relation, UpdateDateColumn, } from 'typeorm'; -import { PackageJson } from 'twenty-shared/application'; import { ServerlessFunctionEntity } from 'src/engine/metadata-modules/serverless-function/serverless-function.entity'; +import { WorkspaceRelatedEntity } from 'src/engine/workspace-manager/workspace-sync/types/workspace-related-entity'; @Entity('serverlessFunctionLayer') -export class ServerlessFunctionLayerEntity { +export class ServerlessFunctionLayerEntity extends WorkspaceRelatedEntity { @PrimaryGeneratedColumn('uuid') id: string; @@ -25,9 +26,6 @@ export class ServerlessFunctionLayerEntity { @Column({ type: 'text', nullable: false }) checksum: string; - @Column({ nullable: false, type: 'uuid' }) - workspaceId: string; - @OneToMany( () => ServerlessFunctionEntity, (serverlessFunction) => serverlessFunction.serverlessFunctionLayer, diff --git a/packages/twenty-server/src/engine/metadata-modules/serverless-function/serverless-function.entity.ts b/packages/twenty-server/src/engine/metadata-modules/serverless-function/serverless-function.entity.ts index 3848f2d1d2b..95143acaf98 100644 --- a/packages/twenty-server/src/engine/metadata-modules/serverless-function/serverless-function.entity.ts +++ b/packages/twenty-server/src/engine/metadata-modules/serverless-function/serverless-function.entity.ts @@ -13,13 +13,11 @@ import { UpdateDateColumn, } from 'typeorm'; -import { SyncableEntity } from 'src/engine/workspace-manager/workspace-sync/interfaces/syncable-entity.interface'; - +import { SyncableEntity } from 'src/engine/workspace-manager/workspace-sync/types/syncable-entity.interface'; import { CronTriggerEntity } from 'src/engine/metadata-modules/cron-trigger/entities/cron-trigger.entity'; import { DatabaseEventTriggerEntity } from 'src/engine/metadata-modules/database-event-trigger/entities/database-event-trigger.entity'; import { RouteTriggerEntity } from 'src/engine/metadata-modules/route-trigger/route-trigger.entity'; import { ServerlessFunctionLayerEntity } from 'src/engine/metadata-modules/serverless-function-layer/serverless-function-layer.entity'; -import { ServerlessFunctionEntityRelationProperties } from 'src/engine/metadata-modules/serverless-function/types/flat-serverless-function.type'; const DEFAULT_SERVERLESS_TIMEOUT_SECONDS = 300; // 5 minutes @@ -31,12 +29,6 @@ export enum ServerlessFunctionRuntime { export const DEFAULT_HANDLER_PATH = 'src/index.ts'; export const DEFAULT_HANDLER_NAME = 'main'; -export const SERVERLESS_FUNCTION_ENTITY_RELATION_PROPERTIES = [ - 'cronTriggers', - 'databaseEventTriggers', - 'routeTriggers', -] as const satisfies readonly ServerlessFunctionEntityRelationProperties[]; - @Entity('serverlessFunction') @Index('IDX_SERVERLESS_FUNCTION_ID_DELETED_AT', ['id', 'deletedAt']) export class ServerlessFunctionEntity diff --git a/packages/twenty-server/src/engine/metadata-modules/serverless-function/types/flat-serverless-function.type.ts b/packages/twenty-server/src/engine/metadata-modules/serverless-function/types/flat-serverless-function.type.ts index 2b49aa83c27..a2952556d6c 100644 --- a/packages/twenty-server/src/engine/metadata-modules/serverless-function/types/flat-serverless-function.type.ts +++ b/packages/twenty-server/src/engine/metadata-modules/serverless-function/types/flat-serverless-function.type.ts @@ -1,30 +1,9 @@ import { type Sources } from 'twenty-shared/types'; -import { type WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; -import { type CronTriggerEntity } from 'src/engine/metadata-modules/cron-trigger/entities/cron-trigger.entity'; -import { type DatabaseEventTriggerEntity } from 'src/engine/metadata-modules/database-event-trigger/entities/database-event-trigger.entity'; import { type FlatEntityFrom } from 'src/engine/metadata-modules/flat-entity/types/flat-entity.type'; -import { type RouteTriggerEntity } from 'src/engine/metadata-modules/route-trigger/route-trigger.entity'; -import { type ServerlessFunctionLayerEntity } from 'src/engine/metadata-modules/serverless-function-layer/serverless-function-layer.entity'; import { type ServerlessFunctionEntity } from 'src/engine/metadata-modules/serverless-function/serverless-function.entity'; -import { type ExtractRecordTypeOrmRelationProperties } from 'src/engine/workspace-manager/workspace-migration-v2/types/extract-record-typeorm-relation-properties.type'; -export type ServerlessFunctionEntityRelationProperties = - ExtractRecordTypeOrmRelationProperties< - ServerlessFunctionEntity, - | CronTriggerEntity - | DatabaseEventTriggerEntity - | RouteTriggerEntity - | WorkspaceEntity - | ServerlessFunctionLayerEntity - >; - -export type FlatServerlessFunction = FlatEntityFrom< - ServerlessFunctionEntity, - ServerlessFunctionEntityRelationProperties -> & { - databaseEventTriggerIds: string[]; - cronTriggerIds: string[]; - routeTriggerIds: string[]; - code?: Sources; -}; +export type FlatServerlessFunction = + FlatEntityFrom & { + code?: Sources; + }; diff --git a/packages/twenty-server/src/engine/metadata-modules/types/cached-field-metadata-entity.ts b/packages/twenty-server/src/engine/metadata-modules/types/cached-field-metadata-entity.ts deleted file mode 100644 index f9f8dbe960c..00000000000 --- a/packages/twenty-server/src/engine/metadata-modules/types/cached-field-metadata-entity.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { type FieldMetadataType } from 'twenty-shared/types'; - -import { type FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity'; -import { type FieldMetadataEntityRelationProperties } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; - -export type CachedFieldMetadataEntity< - T extends FieldMetadataType = FieldMetadataType, -> = Omit, FieldMetadataEntityRelationProperties>; diff --git a/packages/twenty-server/src/engine/metadata-modules/view-field/entities/view-field.entity.ts b/packages/twenty-server/src/engine/metadata-modules/view-field/entities/view-field.entity.ts index a938889f03c..85ac8f09f03 100644 --- a/packages/twenty-server/src/engine/metadata-modules/view-field/entities/view-field.entity.ts +++ b/packages/twenty-server/src/engine/metadata-modules/view-field/entities/view-field.entity.ts @@ -11,10 +11,8 @@ import { UpdateDateColumn, } from 'typeorm'; -import { SyncableEntity } from 'src/engine/workspace-manager/workspace-sync/interfaces/syncable-entity.interface'; - +import { SyncableEntity } from 'src/engine/workspace-manager/workspace-sync/types/syncable-entity.interface'; import { AggregateOperations } from 'src/engine/api/graphql/graphql-query-runner/constants/aggregate-operations.constant'; -import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity'; import { ViewEntity } from 'src/engine/metadata-modules/view/entities/view.entity'; @@ -67,9 +65,6 @@ export class ViewFieldEntity @Column({ nullable: false, type: 'uuid' }) viewId: string; - @Column({ nullable: false, type: 'uuid' }) - workspaceId: string; - @CreateDateColumn({ type: 'timestamptz' }) createdAt: Date; @@ -79,10 +74,6 @@ export class ViewFieldEntity @DeleteDateColumn({ type: 'timestamptz' }) deletedAt: Date | null; - @ManyToOne(() => WorkspaceEntity, { onDelete: 'CASCADE' }) - @JoinColumn({ name: 'workspaceId' }) - workspace: Relation; - @ManyToOne(() => ViewEntity, (view) => view.viewFields, { onDelete: 'CASCADE', }) diff --git a/packages/twenty-server/src/engine/metadata-modules/view-filter-group/entities/view-filter-group.entity.ts b/packages/twenty-server/src/engine/metadata-modules/view-filter-group/entities/view-filter-group.entity.ts index 4f3a1dfb612..73e5bc009de 100644 --- a/packages/twenty-server/src/engine/metadata-modules/view-filter-group/entities/view-filter-group.entity.ts +++ b/packages/twenty-server/src/engine/metadata-modules/view-filter-group/entities/view-filter-group.entity.ts @@ -12,9 +12,7 @@ import { UpdateDateColumn, } from 'typeorm'; -import { SyncableEntity } from 'src/engine/workspace-manager/workspace-sync/interfaces/syncable-entity.interface'; - -import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; +import { SyncableEntity } from 'src/engine/workspace-manager/workspace-sync/types/syncable-entity.interface'; import { ViewFilterGroupLogicalOperator } from 'src/engine/metadata-modules/view-filter-group/enums/view-filter-group-logical-operator'; import { ViewFilterEntity } from 'src/engine/metadata-modules/view-filter/entities/view-filter.entity'; import { ViewEntity } from 'src/engine/metadata-modules/view/entities/view.entity'; @@ -45,9 +43,6 @@ export class ViewFilterGroupEntity extends SyncableEntity { @Column({ nullable: false, type: 'uuid' }) viewId: string; - @Column({ nullable: false, type: 'uuid' }) - workspaceId: string; - @CreateDateColumn({ type: 'timestamptz' }) createdAt: Date; @@ -57,10 +52,6 @@ export class ViewFilterGroupEntity extends SyncableEntity { @DeleteDateColumn({ type: 'timestamptz' }) deletedAt?: Date | null; - @ManyToOne(() => WorkspaceEntity, { onDelete: 'CASCADE' }) - @JoinColumn({ name: 'workspaceId' }) - workspace: Relation; - @ManyToOne(() => ViewEntity, (view) => view.viewFilterGroups, { onDelete: 'CASCADE', }) diff --git a/packages/twenty-server/src/engine/metadata-modules/view-filter/entities/view-filter.entity.ts b/packages/twenty-server/src/engine/metadata-modules/view-filter/entities/view-filter.entity.ts index 8e2f5dd5a77..63ce62d1ad4 100644 --- a/packages/twenty-server/src/engine/metadata-modules/view-filter/entities/view-filter.entity.ts +++ b/packages/twenty-server/src/engine/metadata-modules/view-filter/entities/view-filter.entity.ts @@ -12,9 +12,7 @@ import { UpdateDateColumn, } from 'typeorm'; -import { SyncableEntity } from 'src/engine/workspace-manager/workspace-sync/interfaces/syncable-entity.interface'; - -import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; +import { SyncableEntity } from 'src/engine/workspace-manager/workspace-sync/types/syncable-entity.interface'; import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity'; import { ViewFilterGroupEntity } from 'src/engine/metadata-modules/view-filter-group/entities/view-filter-group.entity'; import { ViewFilterValue } from 'src/engine/metadata-modules/view-filter/types/view-filter-value.type'; @@ -65,9 +63,6 @@ export class ViewFilterEntity @Column({ nullable: false, type: 'uuid' }) viewId: string; - @Column({ nullable: false, type: 'uuid' }) - workspaceId: string; - @CreateDateColumn({ type: 'timestamptz' }) createdAt: Date; @@ -77,10 +72,6 @@ export class ViewFilterEntity @DeleteDateColumn({ type: 'timestamptz' }) deletedAt: Date | null; - @ManyToOne(() => WorkspaceEntity, { onDelete: 'CASCADE' }) - @JoinColumn({ name: 'workspaceId' }) - workspace: Relation; - @ManyToOne(() => ViewEntity, (view) => view.viewFilters, { onDelete: 'CASCADE', }) diff --git a/packages/twenty-server/src/engine/metadata-modules/view-group/entities/view-group.entity.ts b/packages/twenty-server/src/engine/metadata-modules/view-group/entities/view-group.entity.ts index 2f1456526bf..6bf16d26884 100644 --- a/packages/twenty-server/src/engine/metadata-modules/view-group/entities/view-group.entity.ts +++ b/packages/twenty-server/src/engine/metadata-modules/view-group/entities/view-group.entity.ts @@ -11,9 +11,7 @@ import { UpdateDateColumn, } from 'typeorm'; -import { SyncableEntity } from 'src/engine/workspace-manager/workspace-sync/interfaces/syncable-entity.interface'; - -import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; +import { SyncableEntity } from 'src/engine/workspace-manager/workspace-sync/types/syncable-entity.interface'; import { ViewEntity } from 'src/engine/metadata-modules/view/entities/view.entity'; @Entity({ name: 'viewGroup', schema: 'core' }) @@ -40,9 +38,6 @@ export class ViewGroupEntity @Column({ nullable: false, type: 'uuid' }) viewId: string; - @Column({ nullable: false, type: 'uuid' }) - workspaceId: string; - @CreateDateColumn({ type: 'timestamptz' }) createdAt: Date; @@ -52,10 +47,6 @@ export class ViewGroupEntity @DeleteDateColumn({ type: 'timestamptz' }) deletedAt: Date | null; - @ManyToOne(() => WorkspaceEntity, { onDelete: 'CASCADE' }) - @JoinColumn({ name: 'workspaceId' }) - workspace: Relation; - @ManyToOne(() => ViewEntity, (view) => view.viewGroups, { onDelete: 'CASCADE', }) diff --git a/packages/twenty-server/src/engine/metadata-modules/view-sort/entities/view-sort.entity.ts b/packages/twenty-server/src/engine/metadata-modules/view-sort/entities/view-sort.entity.ts index b79ff9f2540..b5c002cf839 100644 --- a/packages/twenty-server/src/engine/metadata-modules/view-sort/entities/view-sort.entity.ts +++ b/packages/twenty-server/src/engine/metadata-modules/view-sort/entities/view-sort.entity.ts @@ -11,9 +11,7 @@ import { UpdateDateColumn, } from 'typeorm'; -import { SyncableEntity } from 'src/engine/workspace-manager/workspace-sync/interfaces/syncable-entity.interface'; - -import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; +import { SyncableEntity } from 'src/engine/workspace-manager/workspace-sync/types/syncable-entity.interface'; import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity'; import { ViewSortDirection } from 'src/engine/metadata-modules/view-sort/enums/view-sort-direction'; import { ViewEntity } from 'src/engine/metadata-modules/view/entities/view.entity'; @@ -55,9 +53,6 @@ export class ViewSortEntity extends SyncableEntity { @Column({ nullable: false, type: 'uuid' }) viewId: string; - @Column({ nullable: false, type: 'uuid' }) - workspaceId: string; - @CreateDateColumn({ type: 'timestamptz' }) createdAt: Date; @@ -67,10 +62,6 @@ export class ViewSortEntity extends SyncableEntity { @DeleteDateColumn({ type: 'timestamptz' }) deletedAt?: Date | null; - @ManyToOne(() => WorkspaceEntity, { onDelete: 'CASCADE' }) - @JoinColumn({ name: 'workspaceId' }) - workspace: Relation; - @ManyToOne(() => ViewEntity, (view) => view.viewSorts, { onDelete: 'CASCADE', }) diff --git a/packages/twenty-server/src/engine/metadata-modules/view/entities/view.entity.ts b/packages/twenty-server/src/engine/metadata-modules/view/entities/view.entity.ts index 1fdf47e3b63..87d1b80edd4 100644 --- a/packages/twenty-server/src/engine/metadata-modules/view/entities/view.entity.ts +++ b/packages/twenty-server/src/engine/metadata-modules/view/entities/view.entity.ts @@ -13,11 +13,9 @@ import { UpdateDateColumn, } from 'typeorm'; -import { SyncableEntity } from 'src/engine/workspace-manager/workspace-sync/interfaces/syncable-entity.interface'; - +import { SyncableEntity } from 'src/engine/workspace-manager/workspace-sync/types/syncable-entity.interface'; import { AggregateOperations } from 'src/engine/api/graphql/graphql-query-runner/constants/aggregate-operations.constant'; import { UserWorkspaceEntity } from 'src/engine/core-modules/user-workspace/user-workspace.entity'; -import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; 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 { ViewFieldEntity } from 'src/engine/metadata-modules/view-field/entities/view-field.entity'; @@ -155,9 +153,6 @@ export class ViewEntity extends SyncableEntity implements Required { @Column({ nullable: false, default: false, type: 'boolean' }) shouldHideEmptyGroups: boolean; - @Column({ nullable: false, type: 'uuid' }) - workspaceId: string; - @CreateDateColumn({ type: 'timestamptz' }) createdAt: Date; @@ -187,12 +182,6 @@ export class ViewEntity extends SyncableEntity implements Required { @JoinColumn({ name: 'createdByUserWorkspaceId' }) createdBy: Relation; - @ManyToOne(() => WorkspaceEntity, { - onDelete: 'CASCADE', - }) - @JoinColumn({ name: 'workspaceId' }) - workspace: Relation; - @OneToMany(() => ViewFieldEntity, (viewField) => viewField.view) viewFields: Relation; diff --git a/packages/twenty-server/src/engine/metadata-modules/workspace-migration/factories/composite-column-action.factory.ts b/packages/twenty-server/src/engine/metadata-modules/workspace-migration/factories/composite-column-action.factory.ts index 32119a827e5..5cb9cce7009 100644 --- a/packages/twenty-server/src/engine/metadata-modules/workspace-migration/factories/composite-column-action.factory.ts +++ b/packages/twenty-server/src/engine/metadata-modules/workspace-migration/factories/composite-column-action.factory.ts @@ -21,7 +21,7 @@ import { } from 'src/engine/metadata-modules/workspace-migration/workspace-migration.exception'; // TODO: could we export this to GraphQL ? -// TOOD: once this module is removed, replace existing usages with CompositeFieldMetadataType from composite-field-metadata-type.type.ts +// TODO: once this module is removed, replace existing usages with CompositeFieldMetadataType from composite-field-metadata-type.type.ts export type CompositeFieldMetadataType = | FieldMetadataType.ADDRESS | FieldMetadataType.CURRENCY 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 fbc9f7c7d4d..094507bf867 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 @@ -1,12 +1,13 @@ +import { type RelationOnDeleteAction } from 'twenty-shared/types'; import { Column, CreateDateColumn, 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 { WorkspaceRelatedEntity } from 'src/engine/workspace-manager/workspace-sync/types/workspace-related-entity'; export enum WorkspaceMigrationColumnActionType { CREATE = 'CREATE', @@ -129,7 +130,7 @@ export type WorkspaceMigrationTableAction = { }; @Entity('workspaceMigration') -export class WorkspaceMigrationEntity { +export class WorkspaceMigrationEntity extends WorkspaceRelatedEntity { @PrimaryGeneratedColumn('uuid') id: string; @@ -145,9 +146,6 @@ export class WorkspaceMigrationEntity { @Column({ nullable: true, type: 'timestamptz' }) appliedAt?: Date; - @Column({ nullable: false, type: 'uuid' }) - workspaceId: string; - @CreateDateColumn({ type: 'timestamptz' }) createdAt: Date; } diff --git a/packages/twenty-server/src/engine/utils/is-cached-field-metadata-of-type.util.ts b/packages/twenty-server/src/engine/utils/is-cached-field-metadata-of-type.util.ts deleted file mode 100644 index 5429a7cc38b..00000000000 --- a/packages/twenty-server/src/engine/utils/is-cached-field-metadata-of-type.util.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { type FieldMetadataType } from 'twenty-shared/types'; - -import { type CachedFieldMetadataEntity } from 'src/engine/metadata-modules/types/cached-field-metadata-entity'; - -export function isCachedFieldMetadataEntityOfType< - Field extends CachedFieldMetadataEntity, - Type extends FieldMetadataType, ->( - fieldMetadata: Pick, - type: Type, -): fieldMetadata is CachedFieldMetadataEntity & - CachedFieldMetadataEntity { - return fieldMetadata.type === type; -} diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/types/extract-record-typeorm-relation-properties.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/types/extract-record-typeorm-relation-properties.type.ts deleted file mode 100644 index c174352c468..00000000000 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/types/extract-record-typeorm-relation-properties.type.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { type Relation } from 'typeorm'; - -export type ExtractRecordTypeOrmRelationProperties = - NonNullable< - { - [P in keyof T]: NonNullable extends Relation< - TRelationTargets | TRelationTargets[] - > - ? P - : never; - }[keyof T] - >; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/types/metadata-entities-relation-targets.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/types/metadata-entities-relation-targets.type.ts deleted file mode 100644 index 6845f52a1a2..00000000000 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/types/metadata-entities-relation-targets.type.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { type ApplicationEntity } from 'src/engine/core-modules/application/application.entity'; -import { type DataSourceEntity } from 'src/engine/metadata-modules/data-source/data-source.entity'; -import { type FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity'; -import { type IndexFieldMetadataEntity } from 'src/engine/metadata-modules/index-metadata/index-field-metadata.entity'; -import { type IndexMetadataEntity } from 'src/engine/metadata-modules/index-metadata/index-metadata.entity'; -import { type ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; -import { type FieldPermissionEntity } from 'src/engine/metadata-modules/object-permission/field-permission/field-permission.entity'; -import { type ObjectPermissionEntity } from 'src/engine/metadata-modules/object-permission/object-permission.entity'; -import { type ViewEntity } from 'src/engine/metadata-modules/view/entities/view.entity'; - -export type MetadataEntitiesRelationTarget = - | ObjectMetadataEntity - | FieldMetadataEntity - | IndexFieldMetadataEntity - | FieldPermissionEntity - | DataSourceEntity - | ApplicationEntity - | IndexMetadataEntity - | ObjectPermissionEntity - | ViewEntity; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/remove-suffix.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/remove-suffix.type.ts new file mode 100644 index 00000000000..52fae25f36f --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/remove-suffix.type.ts @@ -0,0 +1,4 @@ +export type RemoveSuffix< + T extends string, + P extends string, +> = T extends `${infer Prefix}${P}` ? Prefix : T; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/interfaces/partial-index-metadata.interface.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/interfaces/partial-index-metadata.interface.ts index 9f9aa6e45e7..fb2e77e80b4 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/interfaces/partial-index-metadata.interface.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/interfaces/partial-index-metadata.interface.ts @@ -10,6 +10,7 @@ export type PartialIndexMetadata = Omit< | 'universalIdentifier' | 'application' | 'applicationId' + | 'workspace' > & { columns: string[]; }; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-sync/types/all-non-workspace-related-entity.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-sync/types/all-non-workspace-related-entity.type.ts new file mode 100644 index 00000000000..39ba5c56b23 --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-sync/types/all-non-workspace-related-entity.type.ts @@ -0,0 +1,41 @@ +import { type ApplicationVariableEntity } from 'src/engine/core-modules/applicationVariable/application-variable.entity'; +import { type BillingMeterEntity } from 'src/engine/core-modules/billing/entities/billing-meter.entity'; +import { type BillingPriceEntity } from 'src/engine/core-modules/billing/entities/billing-price.entity'; +import { type BillingProductEntity } from 'src/engine/core-modules/billing/entities/billing-product.entity'; +import { type BillingSubscriptionItemEntity } from 'src/engine/core-modules/billing/entities/billing-subscription-item.entity'; +import { type TwoFactorAuthenticationMethodEntity } from 'src/engine/core-modules/two-factor-authentication/entities/two-factor-authentication-method.entity'; +import { type UserEntity } from 'src/engine/core-modules/user/user.entity'; +import { type WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; +import { type AgentMessagePartEntity } from 'src/engine/metadata-modules/ai/ai-agent-execution/entities/agent-message-part.entity'; +import { type AgentMessageEntity } from 'src/engine/metadata-modules/ai/ai-agent-execution/entities/agent-message.entity'; +import { type AgentTurnEntity } from 'src/engine/metadata-modules/ai/ai-agent-execution/entities/agent-turn.entity'; +import { type AgentTurnEvaluationEntity } from 'src/engine/metadata-modules/ai/ai-agent-monitor/entities/agent-turn-evaluation.entity'; +import { type AgentChatThreadEntity } from 'src/engine/metadata-modules/ai/ai-chat/entities/agent-chat-thread.entity'; +import { type IndexFieldMetadataEntity } from 'src/engine/metadata-modules/index-metadata/index-field-metadata.entity'; + +/** + * Union of all entities that don't have a direct `workspaceId` field + * (i.e., they don't extend `WorkspaceRelatedEntity`). + * + * This type is used alongside `WorkspaceRelatedEntity` to enable TypeScript + * to properly extract entity relation properties for dynamic typing purposes. + * + * @see ExtractEntityRelatedEntityProperties + * @see ExtractEntityManyToOneEntityRelationProperties + * @see ExtractEntityOneToManyEntityRelationProperties + */ +export type AllNonWorkspaceRelatedEntity = + | AgentChatThreadEntity + | AgentMessagePartEntity + | AgentMessageEntity + | AgentTurnEntity + | AgentTurnEvaluationEntity + | IndexFieldMetadataEntity + | ApplicationVariableEntity + | BillingMeterEntity + | BillingPriceEntity + | BillingProductEntity + | BillingSubscriptionItemEntity + | TwoFactorAuthenticationMethodEntity + | UserEntity + | WorkspaceEntity; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-sync/interfaces/syncable-entity.interface.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-sync/types/syncable-entity.interface.ts similarity index 76% rename from packages/twenty-server/src/engine/workspace-manager/workspace-sync/interfaces/syncable-entity.interface.ts rename to packages/twenty-server/src/engine/workspace-manager/workspace-sync/types/syncable-entity.interface.ts index 59110bb1a1f..90ad4f6afea 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-sync/interfaces/syncable-entity.interface.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-sync/types/syncable-entity.interface.ts @@ -1,11 +1,12 @@ import { Column, Index, JoinColumn, ManyToOne, Relation } from 'typeorm'; import type { ApplicationEntity } from 'src/engine/core-modules/application/application.entity'; +import { WorkspaceRelatedEntity } from 'src/engine/workspace-manager/workspace-sync/types/workspace-related-entity'; @Index(['workspaceId', 'universalIdentifier'], { unique: true, }) -export abstract class SyncableEntity { +export abstract class SyncableEntity extends WorkspaceRelatedEntity { @Column({ nullable: true, type: 'uuid' }) // TODO should not be nullable universalIdentifier: string; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-sync/types/workspace-related-entity.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-sync/types/workspace-related-entity.ts new file mode 100644 index 00000000000..0c89bdb5463 --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-sync/types/workspace-related-entity.ts @@ -0,0 +1,12 @@ +import { Column, JoinColumn, ManyToOne, Relation } from 'typeorm'; + +import type { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; + +export abstract class WorkspaceRelatedEntity { + @Column({ nullable: false, type: 'uuid' }) + workspaceId: string; + + @ManyToOne('WorkspaceEntity', { onDelete: 'CASCADE' }) + @JoinColumn({ name: 'workspaceId' }) + workspace: Relation; +} diff --git a/packages/twenty-server/src/modules/workflow/workflow-trigger/automated-trigger/listeners/workflow-database-event-trigger.listener.ts b/packages/twenty-server/src/modules/workflow/workflow-trigger/automated-trigger/listeners/workflow-database-event-trigger.listener.ts index 1ee405f1270..5a324f0641e 100644 --- a/packages/twenty-server/src/modules/workflow/workflow-trigger/automated-trigger/listeners/workflow-database-event-trigger.listener.ts +++ b/packages/twenty-server/src/modules/workflow/workflow-trigger/automated-trigger/listeners/workflow-database-event-trigger.listener.ts @@ -1,16 +1,16 @@ import { Injectable, Logger } from '@nestjs/common'; -import { type ObjectRecord } from 'twenty-shared/types'; -import { isDefined } from 'twenty-shared/utils'; -import { In, Raw } from 'typeorm'; import { type ObjectRecordCreateEvent, type ObjectRecordDeleteEvent, type ObjectRecordDestroyEvent, + type ObjectRecordNonDestructiveEvent, type ObjectRecordUpdateEvent, type ObjectRecordUpsertEvent, - type ObjectRecordNonDestructiveEvent, } from 'twenty-shared/database-events'; +import { type ObjectRecord } from 'twenty-shared/types'; +import { isDefined } from 'twenty-shared/utils'; +import { In, Raw } from 'typeorm'; import { OnDatabaseBatchEvent } from 'src/engine/api/graphql/graphql-query-runner/decorators/on-database-batch-event.decorator'; import { DatabaseEventAction } from 'src/engine/api/graphql/graphql-query-runner/enums/database-event-action'; diff --git a/packages/twenty-server/src/utils/__test__/get-field-metadata-entity.mock.ts b/packages/twenty-server/src/utils/__test__/get-field-metadata-entity.mock.ts index 2ac20d68395..be9be295a9f 100644 --- a/packages/twenty-server/src/utils/__test__/get-field-metadata-entity.mock.ts +++ b/packages/twenty-server/src/utils/__test__/get-field-metadata-entity.mock.ts @@ -2,6 +2,7 @@ import { faker } from '@faker-js/faker'; import { type FieldMetadataType } from 'twenty-shared/types'; import { type ApplicationEntity } from 'src/engine/core-modules/application/application.entity'; +import { type WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; import { type FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity'; import { type IndexFieldMetadataEntity } from 'src/engine/metadata-modules/index-metadata/index-field-metadata.entity'; import { type ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; @@ -20,6 +21,7 @@ export const getMockFieldMetadataEntity = < overrides: GetMockFieldMetadataEntityOverride, ): FieldMetadataEntity => { return { + workspace: {} as WorkspaceEntity, calendarViews: [], mainGroupByFieldMetadataViews: [], viewFilters: [], diff --git a/packages/twenty-server/src/utils/__test__/get-object-metadata-entity.mock.ts b/packages/twenty-server/src/utils/__test__/get-object-metadata-entity.mock.ts index 60dfb031644..5a48de52c8d 100644 --- a/packages/twenty-server/src/utils/__test__/get-object-metadata-entity.mock.ts +++ b/packages/twenty-server/src/utils/__test__/get-object-metadata-entity.mock.ts @@ -1,6 +1,7 @@ import { faker } from '@faker-js/faker'; import { type ApplicationEntity } from 'src/engine/core-modules/application/application.entity'; +import { type WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; import { type DataSourceEntity } from 'src/engine/metadata-modules/data-source/data-source.entity'; import { type ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; @@ -17,6 +18,7 @@ export const getMockObjectMetadataEntity = ( overrides: GetMockObjectMetadataEntityOverride, ): ObjectMetadataEntity => { return { + workspace: {} as WorkspaceEntity, createdAt: new Date(), updatedAt: new Date(), dataSource: {} as DataSourceEntity, diff --git a/packages/twenty-server/test/integration/graphql/utils/get-current-user.util.ts b/packages/twenty-server/test/integration/graphql/utils/get-current-user.util.ts index 4e2358644f0..b014138438f 100644 --- a/packages/twenty-server/test/integration/graphql/utils/get-current-user.util.ts +++ b/packages/twenty-server/test/integration/graphql/utils/get-current-user.util.ts @@ -44,7 +44,6 @@ export const getCurrentUser = async ({ currentUserWorkspace { id userId - workspaceId } } }