From 72f5c96e69e07991e87dc87140a2fcaabbe1f5f4 Mon Sep 17 00:00:00 2001 From: Pranav C Date: Fri, 10 Dec 2021 14:53:00 +0530 Subject: [PATCH] fix: maintain table list order in GQL Signed-off-by: Pranav C --- .../src/lib/noco/common/BaseApiBuilder.ts | 40 ++++++++++++++----- .../nocodb/src/lib/noco/gql/GqlApiBuilder.ts | 15 +++++-- .../src/lib/noco/rest/RestApiBuilder.ts | 21 ++++------ 3 files changed, 48 insertions(+), 28 deletions(-) diff --git a/packages/nocodb/src/lib/noco/common/BaseApiBuilder.ts b/packages/nocodb/src/lib/noco/common/BaseApiBuilder.ts index d9fbea1793..b19a77b78f 100644 --- a/packages/nocodb/src/lib/noco/common/BaseApiBuilder.ts +++ b/packages/nocodb/src/lib/noco/common/BaseApiBuilder.ts @@ -2126,8 +2126,11 @@ export default abstract class BaseApiBuilder } protected async syncRelations(): Promise { - const [relations, missingRelations] = await this.getRelationsAndMissingRelations() - if(!missingRelations) return false; + const [ + relations, + missingRelations + ] = await this.getRelationsAndMissingRelations(); + if (!missingRelations) return false; this.relationsCount = relations.length + missingRelations.length; @@ -2158,7 +2161,7 @@ export default abstract class BaseApiBuilder protected async getRelationsAndMissingRelations(): Promise<[any, any]> { // Relations in metadata - let relations = await this.xcMeta.metaList( + const relations = await this.xcMeta.metaList( this.projectId, this.dbAlias, 'nc_relations', @@ -2177,7 +2180,6 @@ export default abstract class BaseApiBuilder 'db_type', 'dr', 'fkn' - ] } ); @@ -2186,13 +2188,15 @@ export default abstract class BaseApiBuilder const dbRelations = (await this.sqlClient.relationListAll())?.data?.list; // Relations missing in metadata - const missingRelations = dbRelations.filter(dbRelation => { - return relations.every(relation => relation?.fkn !== dbRelation?.cstn) - }).map(relation => { - relation.enabled = true; - relation.fkn = relation?.cstn; - return relation - }); + const missingRelations = dbRelations + .filter(dbRelation => { + return relations.every(relation => relation?.fkn !== dbRelation?.cstn); + }) + .map(relation => { + relation.enabled = true; + relation.fkn = relation?.cstn; + return relation; + }); return [relations, missingRelations]; } @@ -2929,6 +2933,20 @@ export default abstract class BaseApiBuilder public getMeta(tableName: string): any { return this.metas?.[tableName]; } + protected async getOrderVal(): Promise { + const order = + ( + await this.xcMeta + .knex('nc_models') + .where({ + project_id: this.projectId, + db_alias: this.dbAlias + }) + .max('order as max') + .first() + )?.max || 0; + return order; + } } export { IGNORE_TABLES }; diff --git a/packages/nocodb/src/lib/noco/gql/GqlApiBuilder.ts b/packages/nocodb/src/lib/noco/gql/GqlApiBuilder.ts index f78972c032..26ee5c3776 100644 --- a/packages/nocodb/src/lib/noco/gql/GqlApiBuilder.ts +++ b/packages/nocodb/src/lib/noco/gql/GqlApiBuilder.ts @@ -725,9 +725,15 @@ export class GqlApiBuilder extends BaseApiBuilder implements XcMetaMgr { args?.tableNames, args?.type ); + + let order = await this.getOrderVal(); + let tables; /* Get all relations */ - let [relations, missingRelations] = await this.getRelationsAndMissingRelations() + let [ + relations, + missingRelations + ] = await this.getRelationsAndMissingRelations(); relations = relations.concat(missingRelations); // set table name alias @@ -761,7 +767,8 @@ export class GqlApiBuilder extends BaseApiBuilder implements XcMetaMgr { tables = args.tableNames.map(({ tn, _tn }) => ({ tn, _tn, - type: args.type + type: args.type, + order: ++order })); tables.push(...relatedTableList.map(t => ({ tn: t }))); @@ -777,6 +784,7 @@ export class GqlApiBuilder extends BaseApiBuilder implements XcMetaMgr { this.viewsCount++; v.type = 'view'; v.tn = v.view_name; + v.order = ++order; return v; }) .filter(v => { @@ -839,7 +847,7 @@ export class GqlApiBuilder extends BaseApiBuilder implements XcMetaMgr { } this.tablesCount = tables.length; - this.syncRelations() + await this.syncRelations(); if (tables.length) { relations.forEach(rel => (rel.enabled = true)); @@ -928,6 +936,7 @@ export class GqlApiBuilder extends BaseApiBuilder implements XcMetaMgr { this.dbAlias, 'nc_models', { + order: table.order || ++order, title: table.tn, type: table.type || 'table', meta: JSON.stringify(this.metas[table.tn]), diff --git a/packages/nocodb/src/lib/noco/rest/RestApiBuilder.ts b/packages/nocodb/src/lib/noco/rest/RestApiBuilder.ts index 005ebe17f8..0bb67c179c 100644 --- a/packages/nocodb/src/lib/noco/rest/RestApiBuilder.ts +++ b/packages/nocodb/src/lib/noco/rest/RestApiBuilder.ts @@ -354,21 +354,14 @@ export class RestApiBuilder extends BaseApiBuilder { ); let tables; const swaggerRefs: { [table: string]: any[] } = {}; - - let order = - ( - await this.xcMeta - .knex('nc_models') - .where({ - project_id: this.projectId, - db_alias: this.dbAlias - }) - .max('order as max') - .first() - )?.max || 0; + let order = await this.getOrderVal(); /* Get all relations */ - let [relations, missingRelations] = await this.getRelationsAndMissingRelations() + let [ + relations, + // eslint-disable-next-line prefer-const + missingRelations + ] = await this.getRelationsAndMissingRelations(); relations = relations.concat(missingRelations); // set table name alias @@ -459,7 +452,7 @@ export class RestApiBuilder extends BaseApiBuilder { r._rtn = this.getTableNameAlias(r.rtn); }); - this.syncRelations() + this.syncRelations(); const tableRoutes = tables.map(table => { return async () => {