From 7fd86a860c82e6e62e62c159fe9f107a191dc5d5 Mon Sep 17 00:00:00 2001 From: Weiko Date: Fri, 13 Sep 2024 12:03:27 +0200 Subject: [PATCH] [metadata] fix soft delete for standard objects missing deletedAt fieldMetadata (#7017) This https://github.com/twentyhq/twenty/pull/7006 introduced a regression. The goal was to set "isSoftDeletable" to all standard objects but it was done at the wrong level, meaning it was setting the boolean correctly but not creating the corresponding fieldMetadata. I took the occasion to update the new graphql query runner to use that boolean and automatically add a filter on soft delete in case it's true. Also adding **IsQueryRunnerTwentyORMEnabled** by default in the seeds --- .../src/database/typeorm-seeds/core/feature-flags.ts | 5 +++++ .../resolvers/graphql-query-find-many-resolver.service.ts | 2 +- .../resolvers/graphql-query-find-one-resolver.service.ts | 5 ++++- .../twenty-orm/decorators/workspace-entity.decorator.ts | 2 +- .../interfaces/workspace-entity-metadata-args.interface.ts | 2 +- .../factories/standard-object.factory.ts | 2 +- 6 files changed, 13 insertions(+), 5 deletions(-) diff --git a/packages/twenty-server/src/database/typeorm-seeds/core/feature-flags.ts b/packages/twenty-server/src/database/typeorm-seeds/core/feature-flags.ts index 27b27fcc37e..8d303623545 100644 --- a/packages/twenty-server/src/database/typeorm-seeds/core/feature-flags.ts +++ b/packages/twenty-server/src/database/typeorm-seeds/core/feature-flags.ts @@ -55,6 +55,11 @@ export const seedFeatureFlags = async ( workspaceId: workspaceId, value: false, }, + { + key: FeatureFlagKey.IsQueryRunnerTwentyORMEnabled, + workspaceId: workspaceId, + value: true, + }, ]) .execute(); }; diff --git a/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/resolvers/graphql-query-find-many-resolver.service.ts b/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/resolvers/graphql-query-find-many-resolver.service.ts index d05a4f7f459..076d4c0c470 100644 --- a/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/resolvers/graphql-query-find-many-resolver.service.ts +++ b/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/resolvers/graphql-query-find-many-resolver.service.ts @@ -74,7 +74,7 @@ export class GraphqlQueryFindManyResolverService { ); const where = graphqlQueryParser.parseFilter( args.filter ?? ({} as Filter), - true, + objectMetadataItem.isSoftDeletable ?? false, ); const cursor = this.getCursor(args); diff --git a/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/resolvers/graphql-query-find-one-resolver.service.ts b/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/resolvers/graphql-query-find-one-resolver.service.ts index 063fb5c8375..99657e6e169 100644 --- a/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/resolvers/graphql-query-find-one-resolver.service.ts +++ b/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/resolvers/graphql-query-find-one-resolver.service.ts @@ -56,7 +56,10 @@ export class GraphqlQueryFindOneResolverService { objectMetadataItem, graphqlFields(info), ); - const where = graphqlQueryParser.parseFilter(args.filter ?? ({} as Filter)); + const where = graphqlQueryParser.parseFilter( + args.filter ?? ({} as Filter), + objectMetadataItem.isSoftDeletable ?? false, + ); const objectRecord = await repository.findOne({ where, select, relations }); diff --git a/packages/twenty-server/src/engine/twenty-orm/decorators/workspace-entity.decorator.ts b/packages/twenty-server/src/engine/twenty-orm/decorators/workspace-entity.decorator.ts index 3b9e5b6f1d6..9abdea4db90 100644 --- a/packages/twenty-server/src/engine/twenty-orm/decorators/workspace-entity.decorator.ts +++ b/packages/twenty-server/src/engine/twenty-orm/decorators/workspace-entity.decorator.ts @@ -48,7 +48,7 @@ export function WorkspaceEntity( isAuditLogged, isSystem, gate, - softDelete: options.softDelete, + softDelete: options.softDelete ?? true, }); }; } diff --git a/packages/twenty-server/src/engine/twenty-orm/interfaces/workspace-entity-metadata-args.interface.ts b/packages/twenty-server/src/engine/twenty-orm/interfaces/workspace-entity-metadata-args.interface.ts index 0f506c5e25a..ecaf7dc00f2 100644 --- a/packages/twenty-server/src/engine/twenty-orm/interfaces/workspace-entity-metadata-args.interface.ts +++ b/packages/twenty-server/src/engine/twenty-orm/interfaces/workspace-entity-metadata-args.interface.ts @@ -64,5 +64,5 @@ export interface WorkspaceEntityMetadataArgs { /** * Enable soft delete. */ - readonly softDelete?: boolean; + readonly softDelete: boolean; } diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/factories/standard-object.factory.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/factories/standard-object.factory.ts index 83c78d9d759..ecfe6d63ea9 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/factories/standard-object.factory.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/factories/standard-object.factory.ts @@ -54,7 +54,7 @@ export class StandardObjectFactory { isCustom: false, isRemote: false, isSystem: workspaceEntityMetadataArgs.isSystem ?? false, - isSoftDeletable: workspaceEntityMetadataArgs.softDelete ?? true, + isSoftDeletable: workspaceEntityMetadataArgs.softDelete, }; } }