@forestadmin/forestadmin-client 1.0.0-alpha.1 → 1.0.0-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,66 @@
1
+ export declare type KeysOfUnion<T> = T extends T ? keyof T : never;
2
+ export interface BaseChart {
3
+ type: ChartType;
4
+ }
5
+ export interface SmartRouteChart extends BaseChart {
6
+ type: Exclude<ChartType, ChartType.Smart>;
7
+ smartRoute: string;
8
+ }
9
+ export interface ApiRouteChart extends BaseChart {
10
+ type: Exclude<ChartType, ChartType.Smart>;
11
+ apiRoute: string;
12
+ }
13
+ export interface QueryChart extends BaseChart {
14
+ type: Exclude<ChartType, ChartType.Smart>;
15
+ query: string;
16
+ }
17
+ export interface FilterableChart extends BaseChart {
18
+ filter?: string | null;
19
+ }
20
+ export interface AggregatedChart extends BaseChart {
21
+ aggregator: 'Sum' | 'Count';
22
+ aggregateFieldName: string | null;
23
+ }
24
+ export interface CollectionChart extends BaseChart {
25
+ sourceCollectionName: string | number;
26
+ }
27
+ export interface GroupedByChart extends BaseChart {
28
+ groupByFieldName: string | null;
29
+ }
30
+ export interface LeaderboardChart extends BaseChart, AggregatedChart, CollectionChart {
31
+ type: ChartType.Leaderboard;
32
+ labelFieldName: string;
33
+ relationshipFieldName: string;
34
+ limit: number;
35
+ }
36
+ export interface LineChart extends BaseChart, FilterableChart, AggregatedChart, CollectionChart, GroupedByChart {
37
+ type: ChartType.Line;
38
+ timeRange: 'Day' | 'Week' | 'Month' | 'Year';
39
+ }
40
+ export interface ObjectiveChart extends BaseChart, FilterableChart, AggregatedChart, CollectionChart {
41
+ type: ChartType.Objective;
42
+ objective: number;
43
+ }
44
+ export interface PercentageChart extends BaseChart {
45
+ type: ChartType.Percentage;
46
+ numeratorChartId: string;
47
+ denominatorChartId: string;
48
+ }
49
+ export declare enum ChartType {
50
+ Pie = "Pie",
51
+ Value = "Value",
52
+ Leaderboard = "Leaderboard",
53
+ Line = "Line",
54
+ Objective = "Objective",
55
+ Percentage = "Percentage",
56
+ Smart = "Smart"
57
+ }
58
+ export interface PieChart extends BaseChart, FilterableChart, AggregatedChart, CollectionChart, GroupedByChart {
59
+ type: ChartType.Pie;
60
+ }
61
+ export interface ValueChart extends BaseChart, FilterableChart, AggregatedChart, CollectionChart {
62
+ type: ChartType.Value;
63
+ }
64
+ export declare type Chart = ApiRouteChart | QueryChart | SmartRouteChart | LeaderboardChart | LineChart | ObjectiveChart | PercentageChart | PieChart | ValueChart;
65
+ export declare type ChartKeys = KeysOfUnion<Chart>;
66
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ChartType = void 0;
4
+ var ChartType;
5
+ (function (ChartType) {
6
+ ChartType["Pie"] = "Pie";
7
+ ChartType["Value"] = "Value";
8
+ ChartType["Leaderboard"] = "Leaderboard";
9
+ ChartType["Line"] = "Line";
10
+ ChartType["Objective"] = "Objective";
11
+ ChartType["Percentage"] = "Percentage";
12
+ ChartType["Smart"] = "Smart";
13
+ })(ChartType = exports.ChartType || (exports.ChartType = {}));
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2hhcnRzL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQXNFQSxJQUFZLFNBUVg7QUFSRCxXQUFZLFNBQVM7SUFDbkIsd0JBQVcsQ0FBQTtJQUNYLDRCQUFlLENBQUE7SUFDZix3Q0FBMkIsQ0FBQTtJQUMzQiwwQkFBYSxDQUFBO0lBQ2Isb0NBQXVCLENBQUE7SUFDdkIsc0NBQXlCLENBQUE7SUFDekIsNEJBQWUsQ0FBQTtBQUNqQixDQUFDLEVBUlcsU0FBUyxHQUFULGlCQUFTLEtBQVQsaUJBQVMsUUFRcEIifQ==
package/dist/index.d.ts CHANGED
@@ -1,8 +1,12 @@
1
1
  import { ForestAdminClientOptions } from './types';
2
2
  import ForestAdminClient from './forest-admin-client-with-cache';
3
- export { ForestAdminClientOptions, Logger, LoggerLevel, ForestAdminClient } from './types';
4
- export { CollectionActionEvent } from './permissions/types';
5
3
  export { default as JTWTokenExpiredError } from './permissions/errors/jwt-token-expired-error';
6
4
  export { default as JTWUnableToVerifyError } from './permissions/errors/jwt-unable-to-verify-error';
5
+ export { default as ChainedSQLQueryError } from './permissions/errors/chained-sql-query-error';
6
+ export { default as EmptySQLQueryError } from './permissions/errors/empty-sql-query-error';
7
+ export { default as NonSelectSQLQueryError } from './permissions/errors/non-select-sql-query-error';
8
+ export { ForestAdminClientOptions, Logger, LoggerLevel, ForestAdminClient } from './types';
9
+ export { CollectionActionEvent } from './permissions/types';
7
10
  export default function createForestAdminClient(options: ForestAdminClientOptions): ForestAdminClient;
11
+ export * from './charts/types';
8
12
  //# sourceMappingURL=index.d.ts.map
package/dist/index.js CHANGED
@@ -1,20 +1,40 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
2
16
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
17
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
18
  };
5
19
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.JTWUnableToVerifyError = exports.JTWTokenExpiredError = exports.CollectionActionEvent = void 0;
20
+ exports.CollectionActionEvent = exports.NonSelectSQLQueryError = exports.EmptySQLQueryError = exports.ChainedSQLQueryError = exports.JTWUnableToVerifyError = exports.JTWTokenExpiredError = void 0;
7
21
  const action_permission_1 = __importDefault(require("./permissions/action-permission"));
8
22
  const forest_admin_client_with_cache_1 = __importDefault(require("./forest-admin-client-with-cache"));
9
23
  const permission_with_cache_1 = __importDefault(require("./permissions/permission-with-cache"));
10
24
  const rendering_permission_1 = __importDefault(require("./permissions/rendering-permission"));
11
25
  const user_permission_1 = __importDefault(require("./permissions/user-permission"));
12
- var types_1 = require("./permissions/types");
13
- Object.defineProperty(exports, "CollectionActionEvent", { enumerable: true, get: function () { return types_1.CollectionActionEvent; } });
14
26
  var jwt_token_expired_error_1 = require("./permissions/errors/jwt-token-expired-error");
15
27
  Object.defineProperty(exports, "JTWTokenExpiredError", { enumerable: true, get: function () { return __importDefault(jwt_token_expired_error_1).default; } });
16
28
  var jwt_unable_to_verify_error_1 = require("./permissions/errors/jwt-unable-to-verify-error");
17
29
  Object.defineProperty(exports, "JTWUnableToVerifyError", { enumerable: true, get: function () { return __importDefault(jwt_unable_to_verify_error_1).default; } });
30
+ var chained_sql_query_error_1 = require("./permissions/errors/chained-sql-query-error");
31
+ Object.defineProperty(exports, "ChainedSQLQueryError", { enumerable: true, get: function () { return __importDefault(chained_sql_query_error_1).default; } });
32
+ var empty_sql_query_error_1 = require("./permissions/errors/empty-sql-query-error");
33
+ Object.defineProperty(exports, "EmptySQLQueryError", { enumerable: true, get: function () { return __importDefault(empty_sql_query_error_1).default; } });
34
+ var non_select_sql_query_error_1 = require("./permissions/errors/non-select-sql-query-error");
35
+ Object.defineProperty(exports, "NonSelectSQLQueryError", { enumerable: true, get: function () { return __importDefault(non_select_sql_query_error_1).default; } });
36
+ var types_1 = require("./permissions/types");
37
+ Object.defineProperty(exports, "CollectionActionEvent", { enumerable: true, get: function () { return types_1.CollectionActionEvent; } });
18
38
  function createForestAdminClient(options) {
19
39
  const optionsWithDefaults = {
20
40
  forestServerUrl: 'https://api.forestadmin.com',
@@ -30,4 +50,5 @@ function createForestAdminClient(options) {
30
50
  return new forest_admin_client_with_cache_1.default(optionsWithDefaults, permissionService, renderingPermission);
31
51
  }
32
52
  exports.default = createForestAdminClient;
33
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQ0Esd0ZBQXNFO0FBQ3RFLHNHQUFpRTtBQUNqRSxnR0FBb0U7QUFDcEUsOEZBQTRFO0FBQzVFLG9GQUFrRTtBQUdsRSw2Q0FBNEQ7QUFBbkQsOEdBQUEscUJBQXFCLE9BQUE7QUFDOUIsd0ZBQStGO0FBQXRGLGdKQUFBLE9BQU8sT0FBd0I7QUFDeEMsOEZBQW9HO0FBQTNGLHFKQUFBLE9BQU8sT0FBMEI7QUFFMUMsU0FBd0IsdUJBQXVCLENBQzdDLE9BQWlDO0lBRWpDLE1BQU0sbUJBQW1CLEdBQXlDO1FBQ2hFLGVBQWUsRUFBRSw2QkFBNkI7UUFDOUMsaUNBQWlDLEVBQUUsRUFBRSxHQUFHLEVBQUU7UUFDMUMsc0NBQXNDO1FBQ3RDLE1BQU0sRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLElBQUksRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQ2pFLEdBQUcsT0FBTztLQUNYLENBQUM7SUFFRixNQUFNLGdCQUFnQixHQUFHLElBQUksMkJBQXVCLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUMxRSxNQUFNLGNBQWMsR0FBRyxJQUFJLHlCQUFxQixDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDdEUsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLDhCQUEwQixDQUFDLG1CQUFtQixFQUFFLGNBQWMsQ0FBQyxDQUFDO0lBQ2hHLE1BQU0saUJBQWlCLEdBQUcsSUFBSSwrQkFBaUIsQ0FBQyxnQkFBZ0IsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO0lBRXZGLE9BQU8sSUFBSSx3Q0FBaUIsQ0FBQyxtQkFBbUIsRUFBRSxpQkFBaUIsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO0FBQzVGLENBQUM7QUFqQkQsMENBaUJDIn0=
53
+ __exportStar(require("./charts/types"), exports);
54
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQSx3RkFBc0U7QUFDdEUsc0dBQWlFO0FBQ2pFLGdHQUFvRTtBQUNwRSw4RkFBNEU7QUFDNUUsb0ZBQWtFO0FBRWxFLHdGQUErRjtBQUF0RixnSkFBQSxPQUFPLE9BQXdCO0FBQ3hDLDhGQUFvRztBQUEzRixxSkFBQSxPQUFPLE9BQTBCO0FBQzFDLHdGQUErRjtBQUF0RixnSkFBQSxPQUFPLE9BQXdCO0FBQ3hDLG9GQUEyRjtBQUFsRiw0SUFBQSxPQUFPLE9BQXNCO0FBQ3RDLDhGQUFvRztBQUEzRixxSkFBQSxPQUFPLE9BQTBCO0FBRTFDLDZDQUE0RDtBQUFuRCw4R0FBQSxxQkFBcUIsT0FBQTtBQUU5QixTQUF3Qix1QkFBdUIsQ0FDN0MsT0FBaUM7SUFFakMsTUFBTSxtQkFBbUIsR0FBeUM7UUFDaEUsZUFBZSxFQUFFLDZCQUE2QjtRQUM5QyxpQ0FBaUMsRUFBRSxFQUFFLEdBQUcsRUFBRTtRQUMxQyxzQ0FBc0M7UUFDdEMsTUFBTSxFQUFFLENBQUMsS0FBSyxFQUFFLEdBQUcsSUFBSSxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDakUsR0FBRyxPQUFPO0tBQ1gsQ0FBQztJQUVGLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSwyQkFBdUIsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBQzFFLE1BQU0sY0FBYyxHQUFHLElBQUkseUJBQXFCLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUN0RSxNQUFNLG1CQUFtQixHQUFHLElBQUksOEJBQTBCLENBQUMsbUJBQW1CLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDaEcsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLCtCQUFpQixDQUFDLGdCQUFnQixFQUFFLG1CQUFtQixDQUFDLENBQUM7SUFFdkYsT0FBTyxJQUFJLHdDQUFpQixDQUFDLG1CQUFtQixFQUFFLGlCQUFpQixFQUFFLG1CQUFtQixDQUFDLENBQUM7QUFDNUYsQ0FBQztBQWpCRCwwQ0FpQkM7QUFFRCxpREFBK0IifQ==
@@ -0,0 +1,4 @@
1
+ export default class ChainedSQLQueryError extends Error {
2
+ constructor();
3
+ }
4
+ //# sourceMappingURL=chained-sql-query-error.d.ts.map
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ class ChainedSQLQueryError extends Error {
4
+ constructor() {
5
+ super('You cannot chain SQL queries.');
6
+ }
7
+ }
8
+ exports.default = ChainedSQLQueryError;
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhaW5lZC1zcWwtcXVlcnktZXJyb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcGVybWlzc2lvbnMvZXJyb3JzL2NoYWluZWQtc3FsLXF1ZXJ5LWVycm9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsTUFBcUIsb0JBQXFCLFNBQVEsS0FBSztJQUNyRDtRQUNFLEtBQUssQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7Q0FDRjtBQUpELHVDQUlDIn0=
@@ -0,0 +1,4 @@
1
+ export default class EmptySQLQueryError extends Error {
2
+ constructor();
3
+ }
4
+ //# sourceMappingURL=empty-sql-query-error.d.ts.map
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ class EmptySQLQueryError extends Error {
4
+ constructor() {
5
+ super('You cannot execute an empty SQL query.');
6
+ }
7
+ }
8
+ exports.default = EmptySQLQueryError;
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1wdHktc3FsLXF1ZXJ5LWVycm9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3Blcm1pc3Npb25zL2Vycm9ycy9lbXB0eS1zcWwtcXVlcnktZXJyb3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxNQUFxQixrQkFBbUIsU0FBUSxLQUFLO0lBQ25EO1FBQ0UsS0FBSyxDQUFDLHdDQUF3QyxDQUFDLENBQUM7SUFDbEQsQ0FBQztDQUNGO0FBSkQscUNBSUMifQ==
@@ -0,0 +1,4 @@
1
+ export default class NonSelectSQLQueryError extends Error {
2
+ constructor();
3
+ }
4
+ //# sourceMappingURL=non-select-sql-query-error.d.ts.map
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ class NonSelectSQLQueryError extends Error {
4
+ constructor() {
5
+ super('Only SELECT queries are allowed.');
6
+ }
7
+ }
8
+ exports.default = NonSelectSQLQueryError;
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9uLXNlbGVjdC1zcWwtcXVlcnktZXJyb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcGVybWlzc2lvbnMvZXJyb3JzL25vbi1zZWxlY3Qtc3FsLXF1ZXJ5LWVycm9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsTUFBcUIsc0JBQXVCLFNBQVEsS0FBSztJQUN2RDtRQUNFLEtBQUssQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO0lBQzVDLENBQUM7Q0FDRjtBQUpELHlDQUlDIn0=
@@ -1,4 +1,7 @@
1
- import { Chart } from './types';
1
+ import { Chart } from '../charts/types';
2
2
  export declare function hashServerCharts(charts: Chart[]): Set<string>;
3
- export declare function hashChartRequest(chart: Record<string, any>): string;
3
+ export declare function isGroupedByChart(chart: Chart): chart is Chart & {
4
+ groupByFieldName?: string;
5
+ };
6
+ export declare function hashChartRequest(chart: Chart): string;
4
7
  //# sourceMappingURL=hash-chart.d.ts.map
@@ -3,46 +3,44 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.hashChartRequest = exports.hashServerCharts = void 0;
6
+ exports.hashChartRequest = exports.isGroupedByChart = exports.hashServerCharts = void 0;
7
7
  const object_hash_1 = __importDefault(require("object-hash"));
8
- const types_1 = require("./types");
9
8
  function hashChart(chart) {
9
+ const knownChartKeys = [
10
+ 'type',
11
+ 'apiRoute',
12
+ 'smartRoute',
13
+ 'query',
14
+ 'labelFieldName',
15
+ 'filter',
16
+ 'sourceCollectionName',
17
+ 'aggregator',
18
+ 'aggregateFieldName',
19
+ 'groupByFieldName',
20
+ 'relationshipFieldName',
21
+ 'limit',
22
+ 'timeRange',
23
+ 'objective',
24
+ 'numeratorChartId',
25
+ 'denominatorChartId',
26
+ ];
10
27
  const hash = (0, object_hash_1.default)(chart, {
11
28
  respectType: false,
12
- excludeKeys: key => chart[key] === null || chart[key] === undefined,
29
+ excludeKeys: key => chart[key] === null || chart[key] === undefined || !knownChartKeys.includes(key),
13
30
  });
14
31
  return hash;
15
32
  }
16
33
  function hashServerCharts(charts) {
17
- const frontendCharts = charts.map(chart => ({
18
- type: chart.type,
19
- filters: chart.filter,
20
- aggregate: chart.aggregator,
21
- aggregate_field: chart.aggregateFieldName,
22
- collection: chart.sourceCollectionId,
23
- time_range: chart.timeRange,
24
- group_by_date_field: (chart.type === types_1.ChartType.Line && chart.groupByFieldName) || null,
25
- group_by_field: (chart.type !== types_1.ChartType.Line && chart.groupByFieldName) || null,
26
- limit: chart.limit,
27
- label_field: chart.labelFieldName,
28
- relationship_field: chart.relationshipFieldName,
29
- query: chart.query,
30
- }));
31
- const hashes = frontendCharts.map(hashChart);
34
+ const hashes = charts.map(hashChart);
32
35
  return new Set(hashes);
33
36
  }
34
37
  exports.hashServerCharts = hashServerCharts;
35
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
38
+ function isGroupedByChart(chart) {
39
+ return 'groupByFieldName' in chart;
40
+ }
41
+ exports.isGroupedByChart = isGroupedByChart;
36
42
  function hashChartRequest(chart) {
37
- const hashed = {
38
- ...chart,
39
- // When the server sends the data of the allowed charts, the target column is not specified
40
- // for relations => allow them all.
41
- ...(chart?.group_by_field?.includes(':')
42
- ? { group_by_field: chart.group_by_field.substring(0, chart.group_by_field.indexOf(':')) }
43
- : {}),
44
- };
45
- return hashChart(hashed);
43
+ return hashChart(chart);
46
44
  }
47
45
  exports.hashChartRequest = hashChartRequest;
48
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFzaC1jaGFydC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wZXJtaXNzaW9ucy9oYXNoLWNoYXJ0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDhEQUFxQztBQUVyQyxtQ0FVaUI7QUFFakIsU0FBUyxTQUFTLENBQUMsS0FBOEI7SUFDL0MsTUFBTSxJQUFJLEdBQUcsSUFBQSxxQkFBVSxFQUFDLEtBQUssRUFBRTtRQUM3QixXQUFXLEVBQUUsS0FBSztRQUNsQixXQUFXLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSSxJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxTQUFTO0tBQ3BFLENBQUMsQ0FBQztJQUVILE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVELFNBQWdCLGdCQUFnQixDQUFDLE1BQWU7SUFDOUMsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDMUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJO1FBQ2hCLE9BQU8sRUFBRyxLQUF5QixDQUFDLE1BQU07UUFDMUMsU0FBUyxFQUFHLEtBQXlCLENBQUMsVUFBVTtRQUNoRCxlQUFlLEVBQUcsS0FBeUIsQ0FBQyxrQkFBa0I7UUFDOUQsVUFBVSxFQUFHLEtBQXlCLENBQUMsa0JBQWtCO1FBQ3pELFVBQVUsRUFBRyxLQUFtQixDQUFDLFNBQVM7UUFDMUMsbUJBQW1CLEVBQ2pCLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxpQkFBUyxDQUFDLElBQUksSUFBSyxLQUFtQixDQUFDLGdCQUFnQixDQUFDLElBQUksSUFBSTtRQUNsRixjQUFjLEVBQ1osQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLGlCQUFTLENBQUMsSUFBSSxJQUFLLEtBQXdCLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxJQUFJO1FBQ3ZGLEtBQUssRUFBRyxLQUEwQixDQUFDLEtBQUs7UUFDeEMsV0FBVyxFQUFHLEtBQTBCLENBQUMsY0FBYztRQUN2RCxrQkFBa0IsRUFBRyxLQUEwQixDQUFDLHFCQUFxQjtRQUNyRSxLQUFLLEVBQUcsS0FBb0IsQ0FBQyxLQUFLO0tBQ25DLENBQUMsQ0FBQyxDQUFDO0lBRUosTUFBTSxNQUFNLEdBQUcsY0FBYyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUU3QyxPQUFPLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3pCLENBQUM7QUFyQkQsNENBcUJDO0FBRUQsOERBQThEO0FBQzlELFNBQWdCLGdCQUFnQixDQUFDLEtBQTBCO0lBQ3pELE1BQU0sTUFBTSxHQUFHO1FBQ2IsR0FBRyxLQUFLO1FBQ1IsMkZBQTJGO1FBQzNGLG1DQUFtQztRQUNuQyxHQUFHLENBQUMsS0FBSyxFQUFFLGNBQWMsRUFBRSxRQUFRLENBQUMsR0FBRyxDQUFDO1lBQ3RDLENBQUMsQ0FBQyxFQUFFLGNBQWMsRUFBRSxLQUFLLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTtZQUMxRixDQUFDLENBQUMsRUFBRSxDQUFDO0tBQ1IsQ0FBQztJQUVGLE9BQU8sU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQzNCLENBQUM7QUFYRCw0Q0FXQyJ9
46
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFzaC1jaGFydC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wZXJtaXNzaW9ucy9oYXNoLWNoYXJ0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDhEQUFxQztBQUlyQyxTQUFTLFNBQVMsQ0FBQyxLQUFZO0lBQzdCLE1BQU0sY0FBYyxHQUFnQjtRQUNsQyxNQUFNO1FBQ04sVUFBVTtRQUNWLFlBQVk7UUFDWixPQUFPO1FBQ1AsZ0JBQWdCO1FBQ2hCLFFBQVE7UUFDUixzQkFBc0I7UUFDdEIsWUFBWTtRQUNaLG9CQUFvQjtRQUNwQixrQkFBa0I7UUFDbEIsdUJBQXVCO1FBQ3ZCLE9BQU87UUFDUCxXQUFXO1FBQ1gsV0FBVztRQUNYLGtCQUFrQjtRQUNsQixvQkFBb0I7S0FDckIsQ0FBQztJQUVGLE1BQU0sSUFBSSxHQUFHLElBQUEscUJBQVUsRUFBQyxLQUFLLEVBQUU7UUFDN0IsV0FBVyxFQUFFLEtBQUs7UUFDbEIsV0FBVyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQ2pCLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLFNBQVMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsR0FBZ0IsQ0FBQztLQUNoRyxDQUFDLENBQUM7SUFFSCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRCxTQUFnQixnQkFBZ0IsQ0FBQyxNQUFlO0lBQzlDLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7SUFFckMsT0FBTyxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUN6QixDQUFDO0FBSkQsNENBSUM7QUFFRCxTQUFnQixnQkFBZ0IsQ0FBQyxLQUFZO0lBQzNDLE9BQU8sa0JBQWtCLElBQUksS0FBSyxDQUFDO0FBQ3JDLENBQUM7QUFGRCw0Q0FFQztBQUVELFNBQWdCLGdCQUFnQixDQUFDLEtBQVk7SUFDM0MsT0FBTyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDMUIsQ0FBQztBQUZELDRDQUVDIn0=
@@ -1,3 +1,4 @@
1
+ import { Chart } from '../charts/types';
1
2
  import { CollectionActionEvent } from './types';
2
3
  import { PermissionService } from '../types';
3
4
  import ActionPermission from './action-permission';
@@ -33,10 +34,10 @@ export default class PermissionServiceWithCache implements PermissionService {
33
34
  collectionName: string;
34
35
  customActionName: string;
35
36
  }): Promise<boolean>;
36
- canRetrieveChart({ renderingId, userId, chartRequest, }: {
37
+ canExecuteChart({ renderingId, userId, chartRequest, }: {
37
38
  renderingId: number;
38
39
  userId: number;
39
- chartRequest: unknown;
40
+ chartRequest: Chart;
40
41
  }): Promise<boolean>;
41
42
  }
42
43
  //# sourceMappingURL=permission-with-cache.d.ts.map
@@ -28,8 +28,8 @@ class PermissionServiceWithCache {
28
28
  (0, generate_action_identifier_1.generateCustomActionIdentifier)(types_1.CustomActionEvent.RequireApproval, customActionName, collectionName),
29
29
  ]);
30
30
  }
31
- async canRetrieveChart({ renderingId, userId, chartRequest, }) {
32
- return this.renderingPermissionService.canRetrieveChart({
31
+ async canExecuteChart({ renderingId, userId, chartRequest, }) {
32
+ return this.renderingPermissionService.canExecuteChart({
33
33
  renderingId,
34
34
  userId,
35
35
  chartRequest,
@@ -37,4 +37,4 @@ class PermissionServiceWithCache {
37
37
  }
38
38
  }
39
39
  exports.default = PermissionServiceWithCache;
40
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbi13aXRoLWNhY2hlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Blcm1pc3Npb25zL3Blcm1pc3Npb24td2l0aC1jYWNoZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLG1DQUFtRTtBQUVuRSw2RUFHc0M7QUFJdEMsTUFBcUIsMEJBQTBCO0lBQzdDLFlBQ21CLHVCQUF5QyxFQUN6QywwQkFBc0Q7UUFEdEQsNEJBQXVCLEdBQXZCLHVCQUF1QixDQUFrQjtRQUN6QywrQkFBMEIsR0FBMUIsMEJBQTBCLENBQTRCO0lBQ3RFLENBQUM7SUFFRyxLQUFLLENBQUMsZUFBZSxDQUFDLEVBQzNCLE1BQU0sRUFDTixjQUFjLEVBQ2QsS0FBSyxHQUtOO1FBQ0MsT0FBTyxJQUFJLENBQUMsdUJBQXVCLENBQUMsR0FBRyxDQUNyQyxHQUFHLE1BQU0sRUFBRSxFQUNYLElBQUEsK0RBQWtDLEVBQUMsS0FBSyxFQUFFLGNBQWMsQ0FBQyxDQUMxRCxDQUFDO0lBQ0osQ0FBQztJQUVNLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxNQUtuQztRQUNDLE9BQU8sSUFBSSxDQUFDLDBCQUEwQixDQUFDLHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3hFLENBQUM7SUFFTSxzQkFBc0IsQ0FBQyxFQUM1QixNQUFNLEVBQ04sY0FBYyxFQUNkLGdCQUFnQixHQUtqQjtRQUNDLE9BQU8sSUFBSSxDQUFDLHVCQUF1QixDQUFDLEdBQUcsQ0FDckMsR0FBRyxNQUFNLEVBQUUsRUFDWCxJQUFBLDJEQUE4QixFQUFDLHlCQUFpQixDQUFDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxjQUFjLENBQUMsQ0FDNUYsQ0FBQztJQUNKLENBQUM7SUFFTSxzQkFBc0IsQ0FBQyxFQUM1QixNQUFNLEVBQ04sY0FBYyxFQUNkLGdCQUFnQixFQUNoQixXQUFXLEdBTVo7UUFDQyxNQUFNLGdCQUFnQixHQUNwQixXQUFXLEtBQUssTUFBTTtZQUNwQixDQUFDLENBQUMsSUFBQSwyREFBOEIsRUFDNUIseUJBQWlCLENBQUMsV0FBVyxFQUM3QixnQkFBZ0IsRUFDaEIsY0FBYyxDQUNmO1lBQ0gsQ0FBQyxDQUFDLElBQUEsMkRBQThCLEVBQzVCLHlCQUFpQixDQUFDLE9BQU8sRUFDekIsZ0JBQWdCLEVBQ2hCLGNBQWMsQ0FDZixDQUFDO1FBRVIsT0FBTyxJQUFJLENBQUMsdUJBQXVCLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSxFQUFFLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBRU0sS0FBSyxDQUFDLGdDQUFnQyxDQUFDLEVBQzVDLE1BQU0sRUFDTixjQUFjLEVBQ2QsZ0JBQWdCLEdBS2pCO1FBQ0MsT0FBTyxJQUFJLENBQUMsdUJBQXVCLENBQUMsUUFBUSxDQUFDLEdBQUcsTUFBTSxFQUFFLEVBQUU7WUFDeEQsSUFBQSwyREFBOEIsRUFBQyx5QkFBaUIsQ0FBQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxDQUFDO1lBQzNGLElBQUEsMkRBQThCLEVBQzVCLHlCQUFpQixDQUFDLGVBQWUsRUFDakMsZ0JBQWdCLEVBQ2hCLGNBQWMsQ0FDZjtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsRUFDNUIsV0FBVyxFQUNYLE1BQU0sRUFDTixZQUFZLEdBS2I7UUFDQyxPQUFPLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxnQkFBZ0IsQ0FBQztZQUN0RCxXQUFXO1lBQ1gsTUFBTTtZQUNOLFlBQVk7U0FDYixDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUExR0QsNkNBMEdDIn0=
40
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbi13aXRoLWNhY2hlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Blcm1pc3Npb25zL3Blcm1pc3Npb24td2l0aC1jYWNoZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUNBLG1DQUFtRTtBQUVuRSw2RUFHc0M7QUFJdEMsTUFBcUIsMEJBQTBCO0lBQzdDLFlBQ21CLHVCQUF5QyxFQUN6QywwQkFBc0Q7UUFEdEQsNEJBQXVCLEdBQXZCLHVCQUF1QixDQUFrQjtRQUN6QywrQkFBMEIsR0FBMUIsMEJBQTBCLENBQTRCO0lBQ3RFLENBQUM7SUFFRyxLQUFLLENBQUMsZUFBZSxDQUFDLEVBQzNCLE1BQU0sRUFDTixjQUFjLEVBQ2QsS0FBSyxHQUtOO1FBQ0MsT0FBTyxJQUFJLENBQUMsdUJBQXVCLENBQUMsR0FBRyxDQUNyQyxHQUFHLE1BQU0sRUFBRSxFQUNYLElBQUEsK0RBQWtDLEVBQUMsS0FBSyxFQUFFLGNBQWMsQ0FBQyxDQUMxRCxDQUFDO0lBQ0osQ0FBQztJQUVNLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxNQUtuQztRQUNDLE9BQU8sSUFBSSxDQUFDLDBCQUEwQixDQUFDLHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3hFLENBQUM7SUFFTSxzQkFBc0IsQ0FBQyxFQUM1QixNQUFNLEVBQ04sY0FBYyxFQUNkLGdCQUFnQixHQUtqQjtRQUNDLE9BQU8sSUFBSSxDQUFDLHVCQUF1QixDQUFDLEdBQUcsQ0FDckMsR0FBRyxNQUFNLEVBQUUsRUFDWCxJQUFBLDJEQUE4QixFQUFDLHlCQUFpQixDQUFDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxjQUFjLENBQUMsQ0FDNUYsQ0FBQztJQUNKLENBQUM7SUFFTSxzQkFBc0IsQ0FBQyxFQUM1QixNQUFNLEVBQ04sY0FBYyxFQUNkLGdCQUFnQixFQUNoQixXQUFXLEdBTVo7UUFDQyxNQUFNLGdCQUFnQixHQUNwQixXQUFXLEtBQUssTUFBTTtZQUNwQixDQUFDLENBQUMsSUFBQSwyREFBOEIsRUFDNUIseUJBQWlCLENBQUMsV0FBVyxFQUM3QixnQkFBZ0IsRUFDaEIsY0FBYyxDQUNmO1lBQ0gsQ0FBQyxDQUFDLElBQUEsMkRBQThCLEVBQzVCLHlCQUFpQixDQUFDLE9BQU8sRUFDekIsZ0JBQWdCLEVBQ2hCLGNBQWMsQ0FDZixDQUFDO1FBRVIsT0FBTyxJQUFJLENBQUMsdUJBQXVCLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSxFQUFFLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBRU0sS0FBSyxDQUFDLGdDQUFnQyxDQUFDLEVBQzVDLE1BQU0sRUFDTixjQUFjLEVBQ2QsZ0JBQWdCLEdBS2pCO1FBQ0MsT0FBTyxJQUFJLENBQUMsdUJBQXVCLENBQUMsUUFBUSxDQUFDLEdBQUcsTUFBTSxFQUFFLEVBQUU7WUFDeEQsSUFBQSwyREFBOEIsRUFBQyx5QkFBaUIsQ0FBQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxDQUFDO1lBQzNGLElBQUEsMkRBQThCLEVBQzVCLHlCQUFpQixDQUFDLGVBQWUsRUFDakMsZ0JBQWdCLEVBQ2hCLGNBQWMsQ0FDZjtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxLQUFLLENBQUMsZUFBZSxDQUFDLEVBQzNCLFdBQVcsRUFDWCxNQUFNLEVBQ04sWUFBWSxHQUtiO1FBQ0MsT0FBTyxJQUFJLENBQUMsMEJBQTBCLENBQUMsZUFBZSxDQUFDO1lBQ3JELFdBQVc7WUFDWCxNQUFNO1lBQ04sWUFBWTtTQUNiLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQTFHRCw2Q0EwR0MifQ==
@@ -1,4 +1,5 @@
1
1
  import type { GenericTree } from '@forestadmin/datasource-toolkit';
2
+ import { Chart } from '../charts/types';
2
3
  import { CollectionRenderingPermissionV4, Team } from './types';
3
4
  import { ForestAdminClientOptionsWithDefaults } from '../types';
4
5
  import UserPermissionService from './user-permission';
@@ -25,9 +26,10 @@ export default class RenderingPermissionService {
25
26
  }): Promise<boolean>;
26
27
  private canExecuteSegmentQueryOrRetry;
27
28
  private loadPermissions;
28
- canRetrieveChart({ renderingId, chartRequest, userId, }: {
29
+ private isQueryChart;
30
+ canExecuteChart({ renderingId, chartRequest, userId, }: {
29
31
  renderingId: number | string;
30
- chartRequest: unknown;
32
+ chartRequest: Chart;
31
33
  userId: number | string;
32
34
  }): Promise<boolean>;
33
35
  private canRetrieveChartHashOrRetry;
@@ -9,6 +9,7 @@ const hash_chart_1 = require("./hash-chart");
9
9
  const forest_http_api_1 = __importDefault(require("./forest-http-api"));
10
10
  const generate_user_scope_1 = __importDefault(require("./generate-user-scope"));
11
11
  const is_segment_query_authorized_1 = __importDefault(require("./is-segment-query-authorized"));
12
+ const verify_sql_query_1 = __importDefault(require("./verify-sql-query"));
12
13
  class RenderingPermissionService {
13
14
  constructor(options, userPermissions) {
14
15
  this.options = options;
@@ -38,12 +39,12 @@ class RenderingPermissionService {
38
39
  return (0, generate_user_scope_1.default)(collectionPermissions.scope, permissions.team, userInfo);
39
40
  }
40
41
  async canExecuteSegmentQuery({ renderingId, collectionName, segmentQuery, }) {
41
- return this.canExecuteSegmentQueryOrRetry({
42
+ return ((await this.canExecuteSegmentQueryOrRetry({
42
43
  renderingId,
43
44
  collectionName,
44
45
  segmentQuery,
45
46
  allowRetry: true,
46
- });
47
+ })) && (0, verify_sql_query_1.default)(segmentQuery));
47
48
  }
48
49
  async canExecuteSegmentQueryOrRetry({ renderingId, collectionName, segmentQuery, allowRetry, }) {
49
50
  const permissions = await this.permissionsByRendering.fetch(`${renderingId}`);
@@ -68,15 +69,25 @@ class RenderingPermissionService {
68
69
  async loadPermissions(renderingId) {
69
70
  this.options.logger('Debug', `Loading rendering permissions for rendering ${renderingId}`);
70
71
  const rawPermissions = await forest_http_api_1.default.getRenderingPermissions(renderingId, this.options);
72
+ const charts = (0, hash_chart_1.hashServerCharts)(rawPermissions.stats);
71
73
  return {
72
74
  team: rawPermissions.team,
73
75
  collections: rawPermissions.collections,
74
- charts: (0, hash_chart_1.hashServerCharts)(rawPermissions.stats),
76
+ charts,
75
77
  };
76
78
  }
77
- async canRetrieveChart({ renderingId, chartRequest, userId, }) {
79
+ isQueryChart(chartRequest) {
80
+ return 'query' in chartRequest;
81
+ }
82
+ async canExecuteChart({ renderingId, chartRequest, userId, }) {
78
83
  const chartHash = (0, hash_chart_1.hashChartRequest)(chartRequest);
79
- return this.canRetrieveChartHashOrRetry({ renderingId, chartHash, userId, allowRetry: true });
84
+ return ((await this.canRetrieveChartHashOrRetry({
85
+ renderingId,
86
+ chartHash,
87
+ userId,
88
+ allowRetry: true,
89
+ })) &&
90
+ (!this.isQueryChart(chartRequest) || (0, verify_sql_query_1.default)(chartRequest.query)));
80
91
  }
81
92
  async canRetrieveChartHashOrRetry({ renderingId, userId, chartHash, allowRetry, }) {
82
93
  const [userInfo, permissions] = await Promise.all([
@@ -107,4 +118,4 @@ class RenderingPermissionService {
107
118
  }
108
119
  }
109
120
  exports.default = RenderingPermissionService;
110
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyaW5nLXBlcm1pc3Npb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcGVybWlzc2lvbnMvcmVuZGVyaW5nLXBlcm1pc3Npb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSwwREFBaUM7QUFHakMsbUNBQW1HO0FBRW5HLDZDQUFrRTtBQUNsRSx3RUFBOEM7QUFFOUMsZ0ZBQXNEO0FBQ3RELGdHQUFrRTtBQVFsRSxNQUFxQiwwQkFBMEI7SUFHN0MsWUFDbUIsT0FBNkMsRUFDN0MsZUFBc0M7UUFEdEMsWUFBTyxHQUFQLE9BQU8sQ0FBc0M7UUFDN0Msb0JBQWUsR0FBZixlQUFlLENBQXVCO1FBRXZELElBQUksQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLG1CQUFRLENBQUM7WUFDekMsR0FBRyxFQUFFLEdBQUc7WUFDUixHQUFHLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQ0FBaUMsR0FBRyxJQUFJO1lBQzFELFdBQVcsRUFBRSxXQUFXLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDO1NBQzlELENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxLQUFLLENBQUMsUUFBUSxDQUFDLEVBQ3BCLFdBQVcsRUFDWCxjQUFjLEVBQ2QsTUFBTSxHQUtQO1FBQ0MsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsV0FBVyxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDekYsQ0FBQztJQUVPLEtBQUssQ0FBQyxlQUFlLENBQUMsRUFDNUIsV0FBVyxFQUNYLGNBQWMsRUFDZCxNQUFNLEVBQ04sVUFBVSxHQU1YO1FBQ0MsTUFBTSxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsR0FBNEMsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDO1lBQ3pGLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsR0FBRyxXQUFXLEVBQUUsQ0FB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
121
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyaW5nLXBlcm1pc3Npb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcGVybWlzc2lvbnMvcmVuZGVyaW5nLXBlcm1pc3Npb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSwwREFBaUM7QUFJakMsbUNBQW1HO0FBRW5HLDZDQUFrRTtBQUNsRSx3RUFBOEM7QUFFOUMsZ0ZBQXNEO0FBQ3RELGdHQUFrRTtBQUNsRSwwRUFBZ0Q7QUFRaEQsTUFBcUIsMEJBQTBCO0lBRzdDLFlBQ21CLE9BQTZDLEVBQzdDLGVBQXNDO1FBRHRDLFlBQU8sR0FBUCxPQUFPLENBQXNDO1FBQzdDLG9CQUFlLEdBQWYsZUFBZSxDQUF1QjtRQUV2RCxJQUFJLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxtQkFBUSxDQUFDO1lBQ3pDLEdBQUcsRUFBRSxHQUFHO1lBQ1IsR0FBRyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsaUNBQWlDLEdBQUcsSUFBSTtZQUMxRCxXQUFXLEVBQUUsV0FBVyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQztTQUM5RCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUNwQixXQUFXLEVBQ1gsY0FBYyxFQUNkLE1BQU0sR0FLUDtRQUNDLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3pGLENBQUM7SUFFTyxLQUFLLENBQUMsZUFBZSxDQUFDLEVBQzVCLFdBQVcsRUFDWCxjQUFjLEVBQ2QsTUFBTSxFQUNOLFVBQVUsR0FNWDtRQUNDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLEdBQTRDLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQztZQUN6RixJQUFJLENBQUMsc0JBQXNCLENBQUMsS0FBSyxDQUFDLEdBQUcs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
@@ -1,4 +1,5 @@
1
1
  import type { GenericTree } from '@forestadmin/datasource-toolkit';
2
+ import type { Chart } from '../charts/types';
2
3
  export declare type EnvironmentPermissionsV4 = EnvironmentPermissionsV4Remote | true;
3
4
  export declare type RightDescriptionWithRolesV4 = {
4
5
  roles: number[];
@@ -60,75 +61,12 @@ export declare enum CustomActionEvent {
60
61
  SelfApprove = "self-approve",
61
62
  RequireApproval = "require-approval"
62
63
  }
63
- export declare enum ChartType {
64
- Pie = "Pie",
65
- Value = "Value",
66
- Leaderboard = "Leaderboard",
67
- Line = "Line",
68
- Objective = "Objective",
69
- Percentage = "Percentage",
70
- Smart = "Smart"
71
- }
72
64
  export interface DisplaySettings {
73
65
  x: number;
74
66
  y: number;
75
67
  width: number;
76
68
  height: number;
77
69
  }
78
- export interface BaseChart {
79
- type: ChartType;
80
- }
81
- export interface SmartRouteChart extends BaseChart {
82
- type: Exclude<ChartType, ChartType.Smart>;
83
- smartRoute: string;
84
- }
85
- export interface ApiRouteChart extends BaseChart {
86
- type: Exclude<ChartType, ChartType.Smart>;
87
- apiRoute: string;
88
- }
89
- export interface QueryChart extends BaseChart {
90
- type: Exclude<ChartType, ChartType.Smart>;
91
- query: string;
92
- }
93
- export interface FilterableChart extends BaseChart {
94
- filter?: string;
95
- }
96
- export interface AggregatedChart extends BaseChart {
97
- aggregator: 'Sum' | 'Count';
98
- aggregateFieldName: string | null;
99
- }
100
- export interface CollectionChart extends BaseChart {
101
- sourceCollectionId: string | number;
102
- }
103
- export interface GroupedByChart extends BaseChart {
104
- groupByFieldName: string | null;
105
- }
106
- export interface LeaderboardChart extends BaseChart, AggregatedChart, CollectionChart {
107
- type: ChartType.Leaderboard;
108
- labelFieldName: string;
109
- relationshipFieldName: string;
110
- limit: number;
111
- }
112
- export interface LineChart extends BaseChart, FilterableChart, AggregatedChart, CollectionChart, GroupedByChart {
113
- type: ChartType.Line;
114
- timeRange: 'Day' | 'Week' | 'Month' | 'Year';
115
- }
116
- export interface ObjectiveChart extends BaseChart, FilterableChart, AggregatedChart, CollectionChart {
117
- type: ChartType.Objective;
118
- objective: number;
119
- }
120
- export interface PercentageChart extends BaseChart {
121
- type: ChartType.Percentage;
122
- numeratorChartId: string;
123
- denominatorChartId: string;
124
- }
125
- export interface PieChart extends BaseChart, FilterableChart, AggregatedChart, CollectionChart, GroupedByChart {
126
- type: ChartType.Pie;
127
- }
128
- export interface ValueChart extends BaseChart, FilterableChart, AggregatedChart, CollectionChart {
129
- type: ChartType.Value;
130
- }
131
- export declare type Chart = ApiRouteChart | QueryChart | SmartRouteChart | LeaderboardChart | LineChart | ObjectiveChart | PercentageChart | PieChart | ValueChart;
132
70
  export interface CollectionColumn {
133
71
  id: string | number;
134
72
  fieldName: string;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ChartType = exports.CustomActionEvent = exports.CollectionActionEvent = exports.PermissionLevel = void 0;
3
+ exports.CustomActionEvent = exports.CollectionActionEvent = exports.PermissionLevel = void 0;
4
4
  var PermissionLevel;
5
5
  (function (PermissionLevel) {
6
6
  PermissionLevel["Admin"] = "admin";
@@ -24,14 +24,4 @@ var CustomActionEvent;
24
24
  CustomActionEvent["SelfApprove"] = "self-approve";
25
25
  CustomActionEvent["RequireApproval"] = "require-approval";
26
26
  })(CustomActionEvent = exports.CustomActionEvent || (exports.CustomActionEvent = {}));
27
- var ChartType;
28
- (function (ChartType) {
29
- ChartType["Pie"] = "Pie";
30
- ChartType["Value"] = "Value";
31
- ChartType["Leaderboard"] = "Leaderboard";
32
- ChartType["Line"] = "Line";
33
- ChartType["Objective"] = "Objective";
34
- ChartType["Percentage"] = "Percentage";
35
- ChartType["Smart"] = "Smart";
36
- })(ChartType = exports.ChartType || (exports.ChartType = {}));
37
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcGVybWlzc2lvbnMvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBd0NBLElBQVksZUFLWDtBQUxELFdBQVksZUFBZTtJQUN6QixrQ0FBZSxDQUFBO0lBQ2YsMENBQXVCLENBQUE7SUFDdkIsb0NBQWlCLENBQUE7SUFDakIsZ0NBQWEsQ0FBQTtBQUNmLENBQUMsRUFMVyxlQUFlLEdBQWYsdUJBQWUsS0FBZix1QkFBZSxRQUsxQjtBQVlELElBQVkscUJBT1g7QUFQRCxXQUFZLHFCQUFxQjtJQUMvQiwwQ0FBaUIsQ0FBQTtJQUNqQiwwQ0FBaUIsQ0FBQTtJQUNqQixzQ0FBYSxDQUFBO0lBQ2Isc0NBQWEsQ0FBQTtJQUNiLDBDQUFpQixDQUFBO0lBQ2pCLG9DQUFXLENBQUE7QUFDYixDQUFDLEVBUFcscUJBQXFCLEdBQXJCLDZCQUFxQixLQUFyQiw2QkFBcUIsUUFPaEM7QUFFRCxJQUFZLGlCQUtYO0FBTEQsV0FBWSxpQkFBaUI7SUFDM0Isd0NBQW1CLENBQUE7SUFDbkIsd0NBQW1CLENBQUE7SUFDbkIsaURBQTRCLENBQUE7SUFDNUIseURBQW9DLENBQUE7QUFDdEMsQ0FBQyxFQUxXLGlCQUFpQixHQUFqQix5QkFBaUIsS0FBakIseUJBQWlCLFFBSzVCO0FBRUQsSUFBWSxTQVFYO0FBUkQsV0FBWSxTQUFTO0lBQ25CLHdCQUFXLENBQUE7SUFDWCw0QkFBZSxDQUFBO0lBQ2Ysd0NBQTJCLENBQUE7SUFDM0IsMEJBQWEsQ0FBQTtJQUNiLG9DQUF1QixDQUFBO0lBQ3ZCLHNDQUF5QixDQUFBO0lBQ3pCLDRCQUFlLENBQUE7QUFDakIsQ0FBQyxFQVJXLFNBQVMsR0FBVCxpQkFBUyxLQUFULGlCQUFTLFFBUXBCIn0=
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcGVybWlzc2lvbnMvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBMENBLElBQVksZUFLWDtBQUxELFdBQVksZUFBZTtJQUN6QixrQ0FBZSxDQUFBO0lBQ2YsMENBQXVCLENBQUE7SUFDdkIsb0NBQWlCLENBQUE7SUFDakIsZ0NBQWEsQ0FBQTtBQUNmLENBQUMsRUFMVyxlQUFlLEdBQWYsdUJBQWUsS0FBZix1QkFBZSxRQUsxQjtBQVlELElBQVkscUJBT1g7QUFQRCxXQUFZLHFCQUFxQjtJQUMvQiwwQ0FBaUIsQ0FBQTtJQUNqQiwwQ0FBaUIsQ0FBQTtJQUNqQixzQ0FBYSxDQUFBO0lBQ2Isc0NBQWEsQ0FBQTtJQUNiLDBDQUFpQixDQUFBO0lBQ2pCLG9DQUFXLENBQUE7QUFDYixDQUFDLEVBUFcscUJBQXFCLEdBQXJCLDZCQUFxQixLQUFyQiw2QkFBcUIsUUFPaEM7QUFFRCxJQUFZLGlCQUtYO0FBTEQsV0FBWSxpQkFBaUI7SUFDM0Isd0NBQW1CLENBQUE7SUFDbkIsd0NBQW1CLENBQUE7SUFDbkIsaURBQTRCLENBQUE7SUFDNUIseURBQW9DLENBQUE7QUFDdEMsQ0FBQyxFQUxXLGlCQUFpQixHQUFqQix5QkFBaUIsS0FBakIseUJBQWlCLFFBSzVCIn0=
@@ -0,0 +1,2 @@
1
+ export default function verifySQLQuery(inputQuery: string | null): boolean;
2
+ //# sourceMappingURL=verify-sql-query.d.ts.map
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const chained_sql_query_error_1 = __importDefault(require("./errors/chained-sql-query-error"));
7
+ const empty_sql_query_error_1 = __importDefault(require("./errors/empty-sql-query-error"));
8
+ const non_select_sql_query_error_1 = __importDefault(require("./errors/non-select-sql-query-error"));
9
+ const QUERY_SELECT = /^SELECT\s[^]*FROM\s[^]*$/i;
10
+ function verifySQLQuery(inputQuery) {
11
+ if (!inputQuery?.trim()) {
12
+ throw new empty_sql_query_error_1.default();
13
+ }
14
+ if (inputQuery.includes(';') && inputQuery.indexOf(';') < inputQuery.length - 1) {
15
+ throw new chained_sql_query_error_1.default();
16
+ }
17
+ if (!QUERY_SELECT.test(inputQuery)) {
18
+ throw new non_select_sql_query_error_1.default();
19
+ }
20
+ return true;
21
+ }
22
+ exports.default = verifySQLQuery;
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyaWZ5LXNxbC1xdWVyeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wZXJtaXNzaW9ucy92ZXJpZnktc3FsLXF1ZXJ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsK0ZBQW9FO0FBQ3BFLDJGQUFnRTtBQUNoRSxxR0FBeUU7QUFFekUsTUFBTSxZQUFZLEdBQUcsMkJBQTJCLENBQUM7QUFFakQsU0FBd0IsY0FBYyxDQUFDLFVBQXlCO0lBQzlELElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLEVBQUU7UUFDdkIsTUFBTSxJQUFJLCtCQUFrQixFQUFFLENBQUM7S0FDaEM7SUFFRCxJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksVUFBVSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtRQUMvRSxNQUFNLElBQUksaUNBQW9CLEVBQUUsQ0FBQztLQUNsQztJQUVELElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFO1FBQ2xDLE1BQU0sSUFBSSxvQ0FBc0IsRUFBRSxDQUFDO0tBQ3BDO0lBRUQsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBZEQsaUNBY0MifQ==
package/dist/types.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import type { GenericTree } from '@forestadmin/datasource-toolkit';
2
- import { CollectionActionEvent } from './permissions/types';
2
+ import type { Chart } from './charts/types';
3
+ import type { CollectionActionEvent } from './permissions/types';
3
4
  export declare type LoggerLevel = 'Debug' | 'Info' | 'Warn' | 'Error';
4
5
  export declare type Logger = (level: LoggerLevel, message: unknown) => void;
5
6
  export declare type ForestAdminClientOptions = {
@@ -41,10 +42,10 @@ export interface PermissionService {
41
42
  collectionName: string;
42
43
  customActionName: string;
43
44
  }): Promise<boolean>;
44
- canRetrieveChart(params: {
45
+ canExecuteChart(params: {
45
46
  renderingId: number | string;
46
47
  userId: number | string;
47
- chartRequest: unknown;
48
+ chartRequest: Chart;
48
49
  }): Promise<boolean>;
49
50
  canExecuteSegmentQuery(params: {
50
51
  userId: number | string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@forestadmin/forestadmin-client",
3
- "version": "1.0.0-alpha.1",
3
+ "version": "1.0.0-alpha.2",
4
4
  "main": "dist/index.js",
5
5
  "license": "GPL-3.0",
6
6
  "publishConfig": {
@@ -29,10 +29,10 @@
29
29
  "test": "jest"
30
30
  },
31
31
  "devDependencies": {
32
+ "@forestadmin/datasource-toolkit": "1.0.1-alpha.1",
32
33
  "@types/jsonwebtoken": "^8.5.8",
33
34
  "@types/lru-cache": "^7.6.1",
34
35
  "@types/superagent": "^4.1.15",
35
- "fishery": "^2.1.0",
36
- "@forestadmin/datasource-toolkit": "1.0.1-alpha.1"
36
+ "fishery": "^2.1.0"
37
37
  }
38
38
  }