feat: pagination with total count (#3384)
* feat: add totalCount * feat: add command for production to fix existing tables
This commit is contained in:
@ -10,6 +10,7 @@ import { DataSeedDemoWorkspaceCommand } from 'src/database/commands/data-seed-de
|
|||||||
import { WorkspaceDataSourceModule } from 'src/workspace/workspace-datasource/workspace-datasource.module';
|
import { WorkspaceDataSourceModule } from 'src/workspace/workspace-datasource/workspace-datasource.module';
|
||||||
import { WorkspaceSyncMetadataModule } from 'src/workspace/workspace-sync-metadata/workspace-sync-metadata.module';
|
import { WorkspaceSyncMetadataModule } from 'src/workspace/workspace-sync-metadata/workspace-sync-metadata.module';
|
||||||
import { ObjectMetadataModule } from 'src/metadata/object-metadata/object-metadata.module';
|
import { ObjectMetadataModule } from 'src/metadata/object-metadata/object-metadata.module';
|
||||||
|
import { WorkspaceAddTotalCountCommand } from 'src/database/commands/workspace-add-total-count.command';
|
||||||
|
|
||||||
@Module({
|
@Module({
|
||||||
imports: [
|
imports: [
|
||||||
@ -24,6 +25,7 @@ import { ObjectMetadataModule } from 'src/metadata/object-metadata/object-metada
|
|||||||
providers: [
|
providers: [
|
||||||
DataSeedWorkspaceCommand,
|
DataSeedWorkspaceCommand,
|
||||||
DataSeedDemoWorkspaceCommand,
|
DataSeedDemoWorkspaceCommand,
|
||||||
|
WorkspaceAddTotalCountCommand,
|
||||||
ConfirmationQuestion,
|
ConfirmationQuestion,
|
||||||
],
|
],
|
||||||
})
|
})
|
||||||
|
|||||||
@ -0,0 +1,49 @@
|
|||||||
|
import { Command, CommandRunner } from 'nest-commander';
|
||||||
|
import chalk from 'chalk';
|
||||||
|
|
||||||
|
import { TypeORMService } from 'src/database/typeorm/typeorm.service';
|
||||||
|
|
||||||
|
@Command({
|
||||||
|
name: 'workspace:add-total-count',
|
||||||
|
description: 'Add pg_graphql total count directive to all workspace tables',
|
||||||
|
})
|
||||||
|
export class WorkspaceAddTotalCountCommand extends CommandRunner {
|
||||||
|
constructor(private readonly typeORMService: TypeORMService) {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
async run(): Promise<void> {
|
||||||
|
const mainDataSource = this.typeORMService.getMainDataSource();
|
||||||
|
|
||||||
|
try {
|
||||||
|
await mainDataSource.query(`
|
||||||
|
DO $$
|
||||||
|
DECLARE
|
||||||
|
schema_cursor CURSOR FOR SELECT schema_name FROM information_schema.schemata WHERE schema_name LIKE 'workspace_%';
|
||||||
|
schema_name text;
|
||||||
|
table_rec record;
|
||||||
|
BEGIN
|
||||||
|
OPEN schema_cursor;
|
||||||
|
LOOP
|
||||||
|
FETCH schema_cursor INTO schema_name;
|
||||||
|
EXIT WHEN NOT FOUND;
|
||||||
|
|
||||||
|
FOR table_rec IN SELECT t.table_name FROM information_schema.tables t WHERE t.table_schema = schema_name
|
||||||
|
LOOP
|
||||||
|
EXECUTE 'COMMENT ON TABLE ' || quote_ident(schema_name) || '.' || quote_ident(table_rec.table_name) || ' IS e''@graphql({"totalCount": {"enabled": true}})'';';
|
||||||
|
END LOOP;
|
||||||
|
END LOOP;
|
||||||
|
CLOSE schema_cursor;
|
||||||
|
END $$;
|
||||||
|
`);
|
||||||
|
|
||||||
|
console.log(
|
||||||
|
chalk.green('Total count directive added to all workspace tables'),
|
||||||
|
);
|
||||||
|
} catch (error) {
|
||||||
|
console.log(
|
||||||
|
chalk.red('Error adding total count directive to all workspace tables'),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -140,6 +140,11 @@ export class WorkspaceMigrationRunnerService {
|
|||||||
}),
|
}),
|
||||||
true,
|
true,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// Enable totalCount for the table
|
||||||
|
await queryRunner.query(`
|
||||||
|
COMMENT ON TABLE "${schemaName}"."${tableName}" IS '@graphql({"totalCount": {"enabled": true}})';
|
||||||
|
`);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
import { Injectable, Logger } from '@nestjs/common';
|
import { Injectable, Logger } from '@nestjs/common';
|
||||||
|
|
||||||
import { GraphQLFieldConfigMap, GraphQLObjectType } from 'graphql';
|
import { GraphQLFieldConfigMap, GraphQLInt, GraphQLObjectType } from 'graphql';
|
||||||
|
|
||||||
import { WorkspaceBuildSchemaOptions } from 'src/workspace/workspace-schema-builder/interfaces/workspace-build-schema-optionts.interface';
|
import { WorkspaceBuildSchemaOptions } from 'src/workspace/workspace-schema-builder/interfaces/workspace-build-schema-optionts.interface';
|
||||||
import { ObjectMetadataInterface } from 'src/metadata/field-metadata/interfaces/object-metadata.interface';
|
import { ObjectMetadataInterface } from 'src/metadata/field-metadata/interfaces/object-metadata.interface';
|
||||||
@ -71,6 +71,11 @@ export class ConnectionTypeDefinitionFactory {
|
|||||||
),
|
),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
fields.totalCount = {
|
||||||
|
type: GraphQLInt,
|
||||||
|
description: 'Total number of records in the connection',
|
||||||
|
};
|
||||||
|
|
||||||
return fields;
|
return fields;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user