@@ -78,6 +78,7 @@ import { SQLServer } from './sql-server';
7878import { makeSchema } from './graphql' ;
7979import { ConfigItem , prepareAnnotation } from './helpers/prepareAnnotation' ;
8080import transformData from './helpers/transformData' ;
81+ import { shouldAddLimit } from './helpers/shouldAddLimit' ;
8182import {
8283 transformCube ,
8384 transformMeasure ,
@@ -1042,26 +1043,55 @@ class ApiGateway {
10421043 const requestStarted = new Date ( ) ;
10431044 try {
10441045 if ( ! query ) {
1045- throw new UserError (
1046- 'A user\'s query must contain a body'
1047- ) ;
1046+ throw new UserError ( 'A user\'s query must contain a body' ) ;
10481047 }
10491048
10501049 if ( ! Array . isArray ( query ) && ! query . query ) {
10511050 throw new UserError (
10521051 'A user\'s query must contain at least one query param.'
10531052 ) ;
10541053 }
1055-
1054+
10561055 query = {
10571056 ...query ,
1058- requestId : context . requestId
1057+ requestId : context . requestId ,
10591058 } ;
10601059
1061- if ( query . resultFilter ?. objectTypes && ! Array . isArray ( query . resultFilter . objectTypes ) ) {
1062- throw new UserError (
1063- 'A query.resultFilter.objectTypes must be an array of strings'
1064- ) ;
1060+ const orchestratorApi = this . getAdapterApi ( context ) ;
1061+
1062+ if ( shouldAddLimit ( query . query ) ) {
1063+ if (
1064+ ! query . limit ||
1065+ ! Number . isInteger ( query . limit ) ||
1066+ query . limit < 0
1067+ ) {
1068+ throw new UserError (
1069+ 'A user\'s query must contain limit query param and it must be positive number'
1070+ ) ;
1071+ }
1072+
1073+ if ( query . limit > getEnv ( 'dbQueryDefaultLimit' ) ) {
1074+ throw new UserError ( 'The query limit has been exceeded' ) ;
1075+ }
1076+
1077+ if (
1078+ query . resultFilter ?. objectTypes &&
1079+ ! Array . isArray ( query . resultFilter . objectTypes )
1080+ ) {
1081+ throw new UserError (
1082+ 'A query.resultFilter.objectTypes must be an array of strings'
1083+ ) ;
1084+ }
1085+
1086+ query . query = query . query . trim ( ) ;
1087+ if ( query . query . charAt ( query . query . length - 1 ) === ';' ) {
1088+ query . query = query . query . slice ( 0 , - 1 ) ;
1089+ }
1090+
1091+ const driver = await orchestratorApi
1092+ . driverFactory ( query . dataSource || 'default' ) ;
1093+
1094+ driver . wrapQueryWithLimit ( query ) ;
10651095 }
10661096
10671097 this . log (
@@ -1072,7 +1102,8 @@ class ApiGateway {
10721102 context
10731103 ) ;
10741104
1075- const result = await this . getAdapterApi ( context ) . executeQuery ( query ) ;
1105+ const result = await orchestratorApi . executeQuery ( query ) ;
1106+
10761107 if ( result . data . length ) {
10771108 const objectLimit = Number ( query . resultFilter ?. objectLimit ) || 100 ;
10781109 const stringLimit = Number ( query . resultFilter ?. stringLimit ) || 100 ;
0 commit comments