[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<TEntity extends SyncableEntity> = Omit<
  TEntity,
  | `${ExtractEntityManyToOneEntityRelationProperties<TEntity> & string}Id`
  | ExtractEntityRelatedEntityProperties<TEntity>
  | 'application'
  | 'workspaceId'
  | 'applicationId'
  | keyof CastRecordTypeOrmDatePropertiesToString<TEntity>
> &
  CastRecordTypeOrmDatePropertiesToString<TEntity> & {
    [P in ExtractEntityManyToOneEntityRelationProperties<TEntity> &
      string as `${RemoveSuffix<P, 's'>}UniversalIdentifier`]: string;
  } & {
    [P in ExtractEntityOneToManyEntityRelationProperties<
      TEntity,
      SyncableEntity
    > &
      string as `${RemoveSuffix<P, 's'>}UniversalIdentifiers`]: string[];
  };

```
This commit is contained in:
Paul Rastoin
2025-12-30 14:47:02 +01:00
committed by GitHub
parent 720348c583
commit e3ffdb0c2b
101 changed files with 559 additions and 874 deletions
@@ -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<WorkspaceEntity>;
}
@@ -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<WorkspaceEntity>;
@OneToMany(() => AgentEntity, (agent) => agent.application, {
onDelete: 'CASCADE',
})
@@ -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<WorkspaceEntity>;
}
@@ -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;
@@ -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;
@@ -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;
@@ -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<WorkspaceEntity>;
}
@@ -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<WorkspaceEntity>;
@Field()
@Column({ nullable: false })
value: boolean;
@@ -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<WorkspaceEntity>;
@CreateDateColumn({ type: 'timestamptz' })
createdAt: Date;
}
@@ -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<WorkspaceEntity>;
@Column({ nullable: false, type: 'uuid' })
workspaceId: string;
}
@@ -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<WorkspaceEntity>;
}
@@ -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<WorkspaceEntity>;
@Column({ nullable: false, type: 'uuid' })
workspaceId: string;
@CreateDateColumn({ type: 'timestamptz' })
createdAt: Date;
@@ -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<WorkspaceEntity>;
@Field(() => UUIDScalarType, { nullable: false })
@Column({ nullable: false, type: 'uuid' })
workspaceId: string;
@Column({ nullable: true })
defaultAvatarUrl: string;
@@ -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<WorkspaceEntity>;
}
@@ -121,7 +121,7 @@ export class WorkspaceEntity {
@OneToMany(
() => UserWorkspaceEntity,
(userWorkspace: UserWorkspaceEntity) => userWorkspace.workspace,
(userWorkspace) => userWorkspace.workspace,
{
onDelete: 'CASCADE',
},