From ed07afa774c4695bda12fb973188af882e6d47a5 Mon Sep 17 00:00:00 2001 From: neo773 <62795688+neo773@users.noreply.github.com> Date: Fri, 10 Apr 2026 16:18:04 +0530 Subject: [PATCH] Workspace export command follow-up (#19549) Did QA with a new workspace as well as the seeded YC workspace. --- .../workspace-export.service.ts | 47 ++++++++++++------- 1 file changed, 29 insertions(+), 18 deletions(-) diff --git a/packages/twenty-server/src/database/commands/workspace-export/workspace-export.service.ts b/packages/twenty-server/src/database/commands/workspace-export/workspace-export.service.ts index 5058528c32..92249419f7 100644 --- a/packages/twenty-server/src/database/commands/workspace-export/workspace-export.service.ts +++ b/packages/twenty-server/src/database/commands/workspace-export/workspace-export.service.ts @@ -32,18 +32,14 @@ type WorkspaceExportParams = { tableFilter?: string[]; }; -type RowFilter = { - filterColumn: string; - filterValue: string; -}; - type WriteRowsOptions = { schemaName: string; tableName: string; displayName: string; queryRunner: QueryRunner; stream: WriteStream; - rowFilter?: RowFilter; + whereClause?: string; + queryParameters?: unknown[]; jsonColumns?: Set; excludedColumns?: Set; }; @@ -157,7 +153,8 @@ export class WorkspaceExportService { displayName: workspaceEntityMetadata.tableName, queryRunner, stream, - rowFilter: { filterColumn: 'id', filterValue: workspaceId }, + whereClause: '"id" = $1', + queryParameters: [workspaceId], jsonColumns: this.buildJsonColumnSet(workspaceEntityMetadata), }); } @@ -174,16 +171,32 @@ export class WorkspaceExportService { displayName: entityMetadata.tableName, queryRunner, stream, - rowFilter: { - filterColumn: 'workspaceId', - filterValue: workspaceId, - }, + whereClause: '"workspaceId" = $1', + queryParameters: [workspaceId], jsonColumns: this.buildJsonColumnSet(entityMetadata), }); } catch (error) { this.logger.warn(`${entityMetadata.tableName}: skipped`, error); } } + + const userEntityMetadata = this.dataSource.entityMetadatas.find( + (entityMetadata) => entityMetadata.tableName === 'user', + ); + + if (userEntityMetadata) { + await this.writeRows({ + schemaName: userEntityMetadata.schema || 'core', + tableName: userEntityMetadata.tableName, + displayName: userEntityMetadata.tableName, + queryRunner, + stream, + whereClause: + '"id" IN (SELECT "userId" FROM "core"."userWorkspace" WHERE "workspaceId" = $1)', + queryParameters: [workspaceId], + jsonColumns: this.buildJsonColumnSet(userEntityMetadata), + }); + } } private buildJsonColumnSet(entityMetadata: EntityMetadata): Set { @@ -200,17 +213,15 @@ export class WorkspaceExportService { displayName, queryRunner, stream, - rowFilter, + whereClause, + queryParameters = [], jsonColumns, excludedColumns, }: WriteRowsOptions): Promise { - const whereClause = rowFilter - ? ` WHERE "${rowFilter.filterColumn}" = $1` - : ''; - const queryParameters = rowFilter ? [rowFilter.filterValue] : []; + const whereFragment = whereClause ? ` WHERE ${whereClause}` : ''; const [{ count: totalCount }] = await queryRunner.query( - `SELECT COUNT(*)::int as count FROM "${schemaName}"."${tableName}"${whereClause}`, + `SELECT COUNT(*)::int as count FROM "${schemaName}"."${tableName}"${whereFragment}`, queryParameters, ); @@ -222,7 +233,7 @@ export class WorkspaceExportService { for (let offset = 0; offset < totalCount; offset += BATCH_SIZE) { const rows: Record[] = await queryRunner.query( - `SELECT * FROM "${schemaName}"."${tableName}"${whereClause} ORDER BY "id" LIMIT ${BATCH_SIZE} OFFSET ${offset}`, + `SELECT * FROM "${schemaName}"."${tableName}"${whereFragment} ORDER BY "id" LIMIT ${BATCH_SIZE} OFFSET ${offset}`, queryParameters, );