@ministryofjustice/hmpps-digital-prison-reporting-frontend 5.2.3 → 5.2.4

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.
Files changed (68) hide show
  1. package/README.md +26 -3
  2. package/_networkMocks/dashboard/definitions/visualisations/complete-dataset/list/definition-invalid-vis-defs.d.ts +2 -0
  3. package/_networkMocks/dashboard/definitions/visualisations/complete-dataset/list/definition-invalid.d.ts +2 -0
  4. package/_networkMocks/dashboard/definitions/visualisations/complete-dataset/list/vis-definitions/invalid.d.ts +2 -0
  5. package/_networkMocks/dashboard/definitions/visualisations/mocks.d.ts +34 -0
  6. package/_networkMocks/report/mocks.d.ts +15 -0
  7. package/cjs/dpr/components/_dashboards/dashboard-list/utils.js +2 -0
  8. package/cjs/dpr/components/_dashboards/dashboard-list/utils.js.map +1 -1
  9. package/cjs/dpr/components/_dashboards/dashboard-list/validate.js +23 -0
  10. package/cjs/dpr/components/_dashboards/dashboard-list/validate.js.map +1 -0
  11. package/cjs/dpr/components/_dashboards/dashboard-visualisation/Validate.js +13 -4
  12. package/cjs/dpr/components/_dashboards/dashboard-visualisation/Validate.js.map +1 -1
  13. package/cjs/dpr/data/reportingClient.js +8 -0
  14. package/cjs/dpr/data/reportingClient.js.map +1 -1
  15. package/cjs/dpr/routes/journeys/download-report/utils.js +22 -106
  16. package/cjs/dpr/routes/journeys/download-report/utils.js.map +1 -1
  17. package/cjs/dpr/routes/journeys/view-report/async/dashboard/utils.js +3 -0
  18. package/cjs/dpr/routes/journeys/view-report/async/dashboard/utils.js.map +1 -1
  19. package/cjs/dpr/routes/journeys/view-report/async/dashboard/validate.js +26 -0
  20. package/cjs/dpr/routes/journeys/view-report/async/dashboard/validate.js.map +1 -0
  21. package/cjs/dpr/services/reportingService.js +3 -0
  22. package/cjs/dpr/services/reportingService.js.map +1 -1
  23. package/cjs/dpr/utils/ErrorHandler.js +11 -11
  24. package/cjs/dpr/utils/ErrorHandler.js.map +1 -1
  25. package/cypress-tests/mockApis/dashboards.d.ts +2 -0
  26. package/cypress-tests/mockApis/reporting.d.ts +1 -0
  27. package/dpr/components/_dashboards/dashboard-list/utils.js +2 -0
  28. package/dpr/components/_dashboards/dashboard-list/utils.js.map +1 -1
  29. package/dpr/components/_dashboards/dashboard-list/validate.js +21 -0
  30. package/dpr/components/_dashboards/dashboard-list/validate.js.map +1 -0
  31. package/dpr/components/_dashboards/dashboard-visualisation/Validate.js +11 -5
  32. package/dpr/components/_dashboards/dashboard-visualisation/Validate.js.map +1 -1
  33. package/dpr/data/reportingClient.d.ts +1 -0
  34. package/dpr/data/reportingClient.js +8 -0
  35. package/dpr/data/reportingClient.js.map +1 -1
  36. package/dpr/routes/journeys/download-report/utils.js +23 -106
  37. package/dpr/routes/journeys/download-report/utils.js.map +1 -1
  38. package/dpr/routes/journeys/view-report/async/dashboard/utils.js +3 -0
  39. package/dpr/routes/journeys/view-report/async/dashboard/utils.js.map +1 -1
  40. package/dpr/routes/journeys/view-report/async/dashboard/validate.js +24 -0
  41. package/dpr/routes/journeys/view-report/async/dashboard/validate.js.map +1 -0
  42. package/dpr/services/reportingService.d.ts +1 -0
  43. package/dpr/services/reportingService.js +3 -0
  44. package/dpr/services/reportingService.js.map +1 -1
  45. package/dpr/utils/ErrorHandler.js +11 -11
  46. package/dpr/utils/ErrorHandler.js.map +1 -1
  47. package/package.json +1 -2
  48. package/playwright.config.d.ts +9 -0
  49. package/src/dpr/components/_charts/chart/bar/validate.d.ts +2 -2
  50. package/src/dpr/components/_charts/chart/bar-timeseries/validate.d.ts +2 -2
  51. package/src/dpr/components/_charts/chart/doughnut/validate.d.ts +2 -2
  52. package/src/dpr/components/_charts/chart/line/validate.d.ts +2 -2
  53. package/src/dpr/components/_charts/chart/line-timeseries/validate.d.ts +2 -2
  54. package/src/dpr/components/_dashboards/dashboard-list/validate.d.ts +4 -4
  55. package/src/dpr/components/_dashboards/dashboard-visualisation/Validate.d.ts +24 -16
  56. package/src/dpr/components/_dashboards/scorecard-group/validate.d.ts +2 -2
  57. package/src/dpr/data/reportingClient.d.ts +1 -0
  58. package/src/dpr/routes/journeys/download-report/async-tests.cy.d.ts +1 -0
  59. package/src/dpr/routes/journeys/download-report/sync-tests.cy.d.ts +1 -0
  60. package/src/dpr/routes/journeys/download-report/utils.d.ts +0 -5
  61. package/src/dpr/routes/journeys/view-report/async/dashboard/utils.d.ts +4 -4
  62. package/src/dpr/routes/journeys/view-report/async/dashboard/validate.d.ts +122 -0
  63. package/src/dpr/routes/journeys/view-report/async/report/utils.d.ts +2 -2
  64. package/src/dpr/routes/journeys/view-report/sync/dashboard/utils.d.ts +4 -4
  65. package/src/dpr/routes/journeys/view-report/sync/report/utils.d.ts +4 -4
  66. package/src/dpr/services/reportingService.d.ts +1 -0
  67. package/src/dpr/utils/localsHelper.d.ts +38 -24
  68. /package/src/dpr/{routes/journeys/download-report/tests.cy.d.ts → components/_dashboards/visual-regression-tests/bar-chart-complete-dataset.spec.d.ts} +0 -0
package/README.md CHANGED
@@ -21,12 +21,35 @@ Both tasks use the `package` directory.
21
21
 
22
22
  ## Test Application
23
23
 
24
- To start the Test Application, run: `npm run start-test-app`. This builds the NPM package and starts the server at http://localhost:3010.
24
+ To start the Test Application, run: `npm run start:dev:noMockClients` as well as `npm run wiremock` in a separate tab. This builds the NPM package and starts the server at http://localhost:3010.
25
25
 
26
26
  The Test Application is used both for visually checking components, and also by the integration tests (run using Cypress).
27
27
 
28
- ## Running and testing local builds
29
- To run the app in dev mode, use `start:dev` for the test app, and `docs:local` for the docs. To run the production build of docs, you should run `npm run docs`, then you'll need to configure a reverse proxy - nginx is the easiest. Install it through homebrew `brew install nginx`, then ensure it's running by running `brew services start nginx`. then run `sudo nginx -t` and you should see it's got a default config at `/opt/homebrew/etc/nginx/nginx.conf` - if it isn't there, just use whatever path it gives back, then add a new file into `/opt/homebrew/etc/nginx/servers/dev.conf` with this content:
28
+ ## Running and testing local builds
29
+ To run the main suite of browser-based tests, start up the main app by running `npm run start:dev:noMockClients` then `npm run int-test` or `npm run int-test-ui` for getting the cypress UI up to choose individual tests to run.
30
+
31
+ There are also a few jest tests - you can run these plus the small docs tests by running `npm run test`.
32
+
33
+ We also have a small number of visual regression tests using Playwright that are **only** for our chart based pages - you can run these with `npm run int-test-visual` which will start up the server and mocks itself. Please ensure any other running server processes are stopped before running this!
34
+
35
+ ### How to update and create new visual regression tests
36
+ There may ocassionally be the need to create new visual regression tests, again, only for our charting based pages. To do this, you should develop the test as normal, but use `npm run int-test-visual-ui` which will allow you to see what the test is doing in the UI. Once you have the test on the page you want to capture a screenshot of for comparison, use
37
+
38
+ ```typescript
39
+ await expect(page).toHaveScreenshot({
40
+ fullPage: true,
41
+ })
42
+ ```
43
+
44
+ and then run your test. It will fail locally on this last step, which is expected, as you are not creating screenshots. These will be created by CI as screenshots on different OSes can have slightly different pixel values. You should push this branch and make a PR, which will set off the CI run, and if all is well, create the screenshots as an artifact of the CI run in GitHub Actions (but fail the run). You should create a folder based on the name of the file running the test - if the file is called `some-chart-test.spec.ts`, create a folder called `some-chart-test.spec.ts-screenshots/` and download the screenshots artifact and put the new screenshots in there. You should then double check these to ensure no sensitive data is being captured, then commit and push them up. This time, the CI run should use these screenshots and pass. If they do not, some common pitfalls include:
45
+
46
+ - Animations: Ideally set or disable animations so the snapshot isn't capturing charts, CSS animations etc half way through loading.
47
+ - Noise: Things like "Last Updated" timestamps can be very annoying and will break the test every time the clock ticks. You should mask those bits out so Playwright ignores them.
48
+ - As a last resort, look at having some **small** pixel tolerances - no more than 1 or 2% - on the `toHaveScreenshot` call - use `maxDiffPixelRatio` which has a range from 0-1, so no more than 0.01-0.02 here.
49
+
50
+ ### Running the app in dev mode
51
+
52
+ To run the app in dev mode, use `start:dev:noMockClients` for the test app, and `docs:local` for the docs. To run the production build of docs, you should run `npm run docs`, then you'll need to configure a reverse proxy - nginx is the easiest. Install it through homebrew `brew install nginx`, then ensure it's running by running `brew services start nginx`. then run `sudo nginx -t` and you should see it's got a default config at `/opt/homebrew/etc/nginx/nginx.conf` - if it isn't there, just use whatever path it gives back, then add a new file into `/opt/homebrew/etc/nginx/servers/dev.conf` with this content:
30
53
 
31
54
  ```
32
55
  server {
@@ -0,0 +1,2 @@
1
+ import { components } from '../../../../../../src/dpr/types/api';
2
+ export declare const definition: components['schemas']['DashboardDefinition'];
@@ -0,0 +1,2 @@
1
+ import { components } from '../../../../../../src/dpr/types/api';
2
+ export declare const definition: components['schemas']['DashboardDefinition'];
@@ -0,0 +1,2 @@
1
+ import { components } from '../../../../../../../src/dpr/types/api';
2
+ export declare const invalidDefinition: components['schemas']['DashboardVisualisationDefinition'];
@@ -66,6 +66,40 @@ export declare const listPartialDatasetHistoricMock: {
66
66
  fixedDelayMilliseconds: number;
67
67
  };
68
68
  };
69
+ export declare const listInvalidVisDefMock: {
70
+ priority: number;
71
+ request: {
72
+ method: "GET" | "POST" | "DELETE" | "PUT" | "OPTIONS";
73
+ queryParameters?: object | undefined;
74
+ bodyPatterns?: Array<object> | undefined;
75
+ urlPathPattern: string;
76
+ };
77
+ response: {
78
+ status: number;
79
+ headers: {
80
+ "Content-Type": "application/json;charset=UTF-8";
81
+ };
82
+ jsonBody: object;
83
+ fixedDelayMilliseconds: number;
84
+ };
85
+ };
86
+ export declare const listInvalidDefMock: {
87
+ priority: number;
88
+ request: {
89
+ method: "GET" | "POST" | "DELETE" | "PUT" | "OPTIONS";
90
+ queryParameters?: object | undefined;
91
+ bodyPatterns?: Array<object> | undefined;
92
+ urlPathPattern: string;
93
+ };
94
+ response: {
95
+ status: number;
96
+ headers: {
97
+ "Content-Type": "application/json;charset=UTF-8";
98
+ };
99
+ jsonBody: object;
100
+ fixedDelayMilliseconds: number;
101
+ };
102
+ };
69
103
  export declare const scorecardsCompleteDatasetMock: {
70
104
  priority: number;
71
105
  request: {
@@ -99,6 +99,21 @@ export declare const getAsyncReportDownloadMock: {
99
99
  body: string;
100
100
  };
101
101
  };
102
+ export declare const getSyncReportDownloadMock: {
103
+ priority: number;
104
+ request: {
105
+ method: string;
106
+ urlPathPattern: string;
107
+ };
108
+ response: {
109
+ status: number;
110
+ headers: {
111
+ 'Content-Type': string;
112
+ 'Content-Disposition': string;
113
+ };
114
+ body: string;
115
+ };
116
+ };
102
117
  export declare const reportsFinishedStatusMock: {
103
118
  priority: number;
104
119
  request: {
@@ -3,8 +3,10 @@
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var datasetHelper = require('../../../utils/datasetHelper.js');
6
+ var validate = require('./validate.js');
6
7
 
7
8
  const createList = (listDefinition, dashboardData) => {
9
+ validate.ListSchema.parse(listDefinition);
8
10
  const { columns, options } = listDefinition;
9
11
  const listOptions = options;
10
12
  const showLatest = listOptions?.showLatest !== undefined ? listOptions.showLatest : true;
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sources":["../../../../../../../../../../../src/dpr/components/_dashboards/dashboard-list/utils.ts"],"sourcesContent":["/* eslint-disable no-param-reassign */\nimport { DashboardDataResponse } from '../../../types/Metrics'\nimport {\n ListDashboardVisualisationOptions,\n MoJTable,\n MoJTableHead,\n MoJTableRow,\n} from '../dashboard-visualisation/types'\nimport DatasetHelper from '../../../utils/datasetHelper'\nimport { components } from '../../../types/api'\n\nexport const createList = (\n listDefinition: components['schemas']['DashboardVisualisationDefinition'],\n dashboardData: DashboardDataResponse[],\n): { table: MoJTable; ts: string } => {\n const { columns, options } = listDefinition\n const listOptions = <ListDashboardVisualisationOptions>options\n const showLatest = listOptions?.showLatest !== undefined ? listOptions.showLatest : true\n const columnsAsList = listOptions?.columnsAsList\n const { measures, keys } = columns\n const showAllData = (!measures && !keys) || (!measures.length && !keys)\n\n let datasetData: DashboardDataResponse[] = [...dashboardData]\n if (showLatest) {\n datasetData = DatasetHelper.getLastestDataset(datasetData)\n }\n\n let head\n let rows\n let ts\n\n if (showAllData) {\n ;({ head, rows, ts } = createFullList(datasetData))\n } else if (columnsAsList) {\n ;({ head, rows, ts } = createListFromColumns(listDefinition, datasetData))\n } else {\n ;({ head, rows, ts } = creatListFromRows(listDefinition, datasetData))\n }\n\n if (rows.length && measures) rows = sumColumns(rows, measures)\n\n return {\n table: {\n head,\n rows,\n },\n ts,\n }\n}\n\nconst createListFromColumns = (\n listDefinition: components['schemas']['DashboardVisualisationDefinition'],\n dashboardData: DashboardDataResponse[],\n) => {\n const { columns } = listDefinition\n const { keys, measures } = columns\n const groupKey = DatasetHelper.getGroupKey(dashboardData, keys || [])\n\n const timestampData = dashboardData[0]?.['ts']?.raw\n const ts = timestampData ? `${timestampData}` : ''\n\n const head: MoJTableHead[] = []\n head.push({ text: '' })\n dashboardData.forEach((row) => {\n head.push({\n text: groupKey ? `${row[groupKey.id].raw}` : '',\n })\n })\n\n const rows: MoJTableRow[][] = []\n measures.forEach((measure) => {\n rows.push([{ text: measure.display }] as MoJTableRow[])\n })\n\n measures.forEach((measure, index) => {\n dashboardData.forEach((row) => {\n rows[index].push({ text: `${row[measure.id].raw}` })\n })\n })\n\n return {\n rows,\n head,\n ts,\n }\n}\n\nexport const createTableRows = (\n data: DashboardDataResponse[],\n measures?: components['schemas']['DashboardVisualisationColumnDefinition'][],\n): MoJTableRow[][] => {\n return data.map((dataRow) => {\n const row: MoJTableRow[] = measures?.length ? Array(measures.length) : Array(Object.keys(data[0]).length)\n Object.keys(dataRow).forEach((key, index) => {\n const headIndex = measures?.length ? measures.findIndex((m) => m.id === key) : index\n const text = dataRow[key].raw\n row.splice(headIndex, 1, { text } as MoJTableRow)\n })\n\n return row\n })\n}\n\nconst creatListFromRows = (\n listDefinition: components['schemas']['DashboardVisualisationDefinition'],\n dashboardData: DashboardDataResponse[],\n) => {\n const { measures } = listDefinition.columns\n\n const head: MoJTableHead[] = measures.map((column) => {\n return { text: column.display || '' }\n })\n\n const dataSetRows = DatasetHelper.getDatasetRows(listDefinition, dashboardData)\n const displayRows = DatasetHelper.filterRowsByDisplayColumns(listDefinition, dataSetRows)\n const rows = createTableRows(displayRows, measures)\n\n const timestampData = dataSetRows[0]?.['ts']?.raw\n const ts = timestampData ? `${timestampData}` : ''\n\n return {\n head,\n rows,\n ts,\n }\n}\n\nconst createFullList = (dashboardData: DashboardDataResponse[]) => {\n const head: MoJTableHead[] = Object.keys(dashboardData[0]).map((key) => {\n return { text: key || '' }\n })\n const rows = createTableRows(dashboardData)\n\n const latestData = DatasetHelper.getLastestDataset(dashboardData)\n const timestampData = latestData[0]?.['ts']?.raw\n const ts = timestampData ? `${timestampData}` : ''\n\n return {\n head,\n rows,\n ts,\n }\n}\n\nconst sumColumns = (\n rowsData: MoJTableRow[][],\n measures: components['schemas']['DashboardVisualisationColumnDefinition'][],\n) => {\n const sumColumnIndexes: number[] = measures.flatMap((col, idx) => (col.aggregate ? [idx] : []))\n\n if (sumColumnIndexes.length) {\n const sumRow: MoJTableRow[] = [{ html: `<strong>Total<strong>` }]\n for (let index = 1; index < measures.length; index += 1) {\n sumRow[index] = { text: '' }\n }\n\n rowsData.push(sumRow)\n sumColumnIndexes.forEach((index) => {\n const total = rowsData.reduce((acc, row) => {\n const rowIndex = row[index]\n if (rowIndex && rowIndex.text) {\n acc += Number(rowIndex.text)\n }\n return acc\n }, 0)\n rowsData[rowsData.length - 1][index] = {\n html: `<strong>${total}<strong>`,\n }\n })\n }\n\n return rowsData\n}\n\nexport default {\n createList,\n createTableRows,\n}\n"],"names":["DatasetHelper"],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","sources":["../../../../../../../../../../../src/dpr/components/_dashboards/dashboard-list/utils.ts"],"sourcesContent":["/* eslint-disable no-param-reassign */\nimport { DashboardDataResponse } from '../../../types/Metrics'\nimport {\n ListDashboardVisualisationOptions,\n MoJTable,\n MoJTableHead,\n MoJTableRow,\n} from '../dashboard-visualisation/types'\nimport DatasetHelper from '../../../utils/datasetHelper'\nimport { components } from '../../../types/api'\nimport ListVisSchemas from './validate'\n\nexport const createList = (\n listDefinition: components['schemas']['DashboardVisualisationDefinition'],\n dashboardData: DashboardDataResponse[],\n): { table: MoJTable; ts: string } => {\n ListVisSchemas.ListSchema.parse(listDefinition)\n const { columns, options } = listDefinition\n const listOptions = <ListDashboardVisualisationOptions>options\n const showLatest = listOptions?.showLatest !== undefined ? listOptions.showLatest : true\n const columnsAsList = listOptions?.columnsAsList\n const { measures, keys } = columns\n const showAllData = (!measures && !keys) || (!measures.length && !keys)\n\n let datasetData: DashboardDataResponse[] = [...dashboardData]\n if (showLatest) {\n datasetData = DatasetHelper.getLastestDataset(datasetData)\n }\n\n let head\n let rows\n let ts\n\n if (showAllData) {\n ;({ head, rows, ts } = createFullList(datasetData))\n } else if (columnsAsList) {\n ;({ head, rows, ts } = createListFromColumns(listDefinition, datasetData))\n } else {\n ;({ head, rows, ts } = creatListFromRows(listDefinition, datasetData))\n }\n\n if (rows.length && measures) rows = sumColumns(rows, measures)\n\n return {\n table: {\n head,\n rows,\n },\n ts,\n }\n}\n\nconst createListFromColumns = (\n listDefinition: components['schemas']['DashboardVisualisationDefinition'],\n dashboardData: DashboardDataResponse[],\n) => {\n const { columns } = listDefinition\n const { keys, measures } = columns\n const groupKey = DatasetHelper.getGroupKey(dashboardData, keys || [])\n\n const timestampData = dashboardData[0]?.['ts']?.raw\n const ts = timestampData ? `${timestampData}` : ''\n\n const head: MoJTableHead[] = []\n head.push({ text: '' })\n dashboardData.forEach((row) => {\n head.push({\n text: groupKey ? `${row[groupKey.id].raw}` : '',\n })\n })\n\n const rows: MoJTableRow[][] = []\n measures.forEach((measure) => {\n rows.push([{ text: measure.display }] as MoJTableRow[])\n })\n\n measures.forEach((measure, index) => {\n dashboardData.forEach((row) => {\n rows[index].push({ text: `${row[measure.id].raw}` })\n })\n })\n\n return {\n rows,\n head,\n ts,\n }\n}\n\nexport const createTableRows = (\n data: DashboardDataResponse[],\n measures?: components['schemas']['DashboardVisualisationColumnDefinition'][],\n): MoJTableRow[][] => {\n return data.map((dataRow) => {\n const row: MoJTableRow[] = measures?.length ? Array(measures.length) : Array(Object.keys(data[0]).length)\n Object.keys(dataRow).forEach((key, index) => {\n const headIndex = measures?.length ? measures.findIndex((m) => m.id === key) : index\n const text = dataRow[key].raw\n row.splice(headIndex, 1, { text } as MoJTableRow)\n })\n\n return row\n })\n}\n\nconst creatListFromRows = (\n listDefinition: components['schemas']['DashboardVisualisationDefinition'],\n dashboardData: DashboardDataResponse[],\n) => {\n const { measures } = listDefinition.columns\n\n const head: MoJTableHead[] = measures.map((column) => {\n return { text: column.display || '' }\n })\n\n const dataSetRows = DatasetHelper.getDatasetRows(listDefinition, dashboardData)\n const displayRows = DatasetHelper.filterRowsByDisplayColumns(listDefinition, dataSetRows)\n const rows = createTableRows(displayRows, measures)\n\n const timestampData = dataSetRows[0]?.['ts']?.raw\n const ts = timestampData ? `${timestampData}` : ''\n\n return {\n head,\n rows,\n ts,\n }\n}\n\nconst createFullList = (dashboardData: DashboardDataResponse[]) => {\n const head: MoJTableHead[] = Object.keys(dashboardData[0]).map((key) => {\n return { text: key || '' }\n })\n const rows = createTableRows(dashboardData)\n\n const latestData = DatasetHelper.getLastestDataset(dashboardData)\n const timestampData = latestData[0]?.['ts']?.raw\n const ts = timestampData ? `${timestampData}` : ''\n\n return {\n head,\n rows,\n ts,\n }\n}\n\nconst sumColumns = (\n rowsData: MoJTableRow[][],\n measures: components['schemas']['DashboardVisualisationColumnDefinition'][],\n) => {\n const sumColumnIndexes: number[] = measures.flatMap((col, idx) => (col.aggregate ? [idx] : []))\n\n if (sumColumnIndexes.length) {\n const sumRow: MoJTableRow[] = [{ html: `<strong>Total<strong>` }]\n for (let index = 1; index < measures.length; index += 1) {\n sumRow[index] = { text: '' }\n }\n\n rowsData.push(sumRow)\n sumColumnIndexes.forEach((index) => {\n const total = rowsData.reduce((acc, row) => {\n const rowIndex = row[index]\n if (rowIndex && rowIndex.text) {\n acc += Number(rowIndex.text)\n }\n return acc\n }, 0)\n rowsData[rowsData.length - 1][index] = {\n html: `<strong>${total}<strong>`,\n }\n })\n }\n\n return rowsData\n}\n\nexport default {\n createList,\n createTableRows,\n}\n"],"names":["ListVisSchemas","DatasetHelper"],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ 'use strict';
2
+
3
+ var z = require('zod');
4
+ var Validate = require('../dashboard-visualisation/Validate.js');
5
+
6
+ const ListOptions = z.z.object({
7
+ showLatest: z.z.boolean().default(true),
8
+ columnsAsList: z.z.boolean().optional(),
9
+ });
10
+ const ListSchema = z.z.object({
11
+ ...Validate.DashboardVisualisationSchema.shape,
12
+ type: z.z.literal('list'),
13
+ options: z.z.object(ListOptions.shape).optional(),
14
+ columns: z.z.object({
15
+ ...Validate.DashboardColumns.shape,
16
+ measures: z.z.array(Validate.DashboardVisualisationMeasureSchema),
17
+ }),
18
+ });
19
+ const ListSchemas = {
20
+ ListSchema};
21
+
22
+ module.exports = ListSchemas;
23
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sources":["../../../../../../../../../../../src/dpr/components/_dashboards/dashboard-list/validate.ts"],"sourcesContent":["import { z } from 'zod'\nimport {\n DashboardVisualisationSchema,\n DashboardColumns,\n DashboardVisualisationMeasureSchema,\n} from '../dashboard-visualisation/Validate'\n\nconst ListOptions = z.object({\n showLatest: z.boolean().default(true),\n columnsAsList: z.boolean().optional(),\n})\n\nconst ListSchema = z.object({\n ...DashboardVisualisationSchema.shape,\n type: z.literal('list'),\n options: z.object(ListOptions.shape).optional(),\n columns: z.object({\n ...DashboardColumns.shape,\n measures: z.array(DashboardVisualisationMeasureSchema),\n }),\n})\n\nconst ListSchemas = {\n ListSchema,\n ListOptions,\n}\n\nexport default ListSchemas\n"],"names":["z","DashboardVisualisationSchema","DashboardColumns","DashboardVisualisationMeasureSchema"],"mappings":";;;;;AAOA,MAAM,WAAW,GAAGA,GAAC,CAAC,MAAM,CAAC;IAC3B,UAAU,EAAEA,GAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;AACrC,IAAA,aAAa,EAAEA,GAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;AACtC,CAAA,CAAC;AAEF,MAAM,UAAU,GAAGA,GAAC,CAAC,MAAM,CAAC;IAC1B,GAAGC,qCAA4B,CAAC,KAAK;AACrC,IAAA,IAAI,EAAED,GAAC,CAAC,OAAO,CAAC,MAAM,CAAC;IACvB,OAAO,EAAEA,GAAC,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE;AAC/C,IAAA,OAAO,EAAEA,GAAC,CAAC,MAAM,CAAC;QAChB,GAAGE,yBAAgB,CAAC,KAAK;AACzB,QAAA,QAAQ,EAAEF,GAAC,CAAC,KAAK,CAACG,4CAAmC,CAAC;KACvD,CAAC;AACH,CAAA,CAAC;AAEF,MAAM,WAAW,GAAG;IAClB;;;;"}
@@ -1,5 +1,7 @@
1
1
  'use strict';
2
2
 
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
3
5
  var z = require('zod');
4
6
 
5
7
  const dashboardBucket = z.z.object({
@@ -28,13 +30,17 @@ const DashboardVisualisationMeasureSchema = z.z.object({
28
30
  aggregate: z.z.enum(['sum', 'average']).optional(),
29
31
  });
30
32
  const DashboardColumns = z.z.object({
31
- keys: z.z.array(DashboardVisualisationKeySchema),
32
- measures: z.z.array(DashboardVisualisationMeasureSchema).length(1, 'Measure must contain a single item'),
33
+ keys: z.z.array(DashboardVisualisationKeySchema).optional(),
34
+ measures: z.z.array(DashboardVisualisationMeasureSchema, {
35
+ error: (issue) => issue.input === undefined
36
+ ? 'Dashboard visualisation definition: measures is required'
37
+ : 'Dashboard visualisation definition: measures must be an array',
38
+ }),
33
39
  filters: z.z.array(dashboardVisFilter).min(1).optional(),
34
40
  expectNulls: z.z.boolean().default(false),
35
41
  });
36
42
  const dashboardOptions = z.z.object({
37
- ...dashboardBucket.shape,
43
+ ...BucketOptionsSchema.shape,
38
44
  showLatest: z.z.boolean().default(true),
39
45
  columnsAsList: z.z.boolean().optional(),
40
46
  });
@@ -53,12 +59,15 @@ const DashboardVisualisationSchema = z.z.object({
53
59
  ]),
54
60
  display: z.z.string().optional(),
55
61
  description: z.z.string().optional(),
56
- options: z.z.object(dashboardOptions.shape),
62
+ options: z.z.object(dashboardOptions.shape).optional(),
57
63
  columns: z.z.object(DashboardColumns.shape),
58
64
  });
65
+ const DashboardVisualisationSchemas = {
66
+ DashboardVisualisationSchema};
59
67
 
60
68
  exports.BucketOptionsSchema = BucketOptionsSchema;
61
69
  exports.DashboardColumns = DashboardColumns;
62
70
  exports.DashboardVisualisationMeasureSchema = DashboardVisualisationMeasureSchema;
63
71
  exports.DashboardVisualisationSchema = DashboardVisualisationSchema;
72
+ exports.default = DashboardVisualisationSchemas;
64
73
  //# sourceMappingURL=Validate.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Validate.js","sources":["../../../../../../../../../../../src/dpr/components/_dashboards/dashboard-visualisation/Validate.ts"],"sourcesContent":["import { z } from 'zod'\n\nconst dashboardBucket = z.object({\n min: z.number().optional(),\n max: z.number().optional(),\n hexColour: z.string().optional(),\n})\n\nexport const BucketOptionsSchema = z.object({\n useRagColour: z.boolean().default(false),\n buckets: z.array(dashboardBucket).default([]),\n baseColour: z.string().regex(/^#/).optional(),\n})\n\nconst dashboardVisFilter = z.object({\n id: z.string(),\n equals: z.string().nullable(),\n})\n\nconst DashboardVisualisationKeySchema = z.object({\n id: z.string(),\n display: z.string().optional(),\n optional: z.boolean().default(false),\n})\n\nexport const DashboardVisualisationMeasureSchema = z.object({\n id: z.string(),\n display: z.string().optional(),\n unit: z.enum(['NUMBER', 'PERCENTAGE']).optional(),\n aggregate: z.enum(['sum', 'average']).optional(),\n})\n\nexport const DashboardColumns = z.object({\n keys: z.array(DashboardVisualisationKeySchema),\n measures: z.array(DashboardVisualisationMeasureSchema).length(1, 'Measure must contain a single item'),\n filters: z.array(dashboardVisFilter).min(1).optional(),\n expectNulls: z.boolean().default(false),\n})\n\nconst dashboardOptions = z.object({\n ...dashboardBucket.shape,\n showLatest: z.boolean().default(true),\n columnsAsList: z.boolean().optional(),\n})\n\nexport const DashboardVisualisationSchema = z.object({\n id: z.string(),\n type: z.enum([\n 'list',\n 'doughnut',\n 'bar',\n 'bar-timeseries',\n 'line',\n 'scorecard',\n 'scorecard-group',\n 'matrix-timeseries',\n 'line-timeseries',\n ]),\n display: z.string().optional(),\n description: z.string().optional(),\n options: z.object(dashboardOptions.shape),\n columns: z.object(DashboardColumns.shape),\n})\n\nconst DashboardVisualisationSchemas = {\n DashboardVisualisationSchema,\n DashboardVisualisationMeasureSchema,\n DashboardVisualisationKeySchema,\n}\n\nexport default DashboardVisualisationSchemas\n"],"names":["z"],"mappings":";;;;AAEA,MAAM,eAAe,GAAGA,GAAC,CAAC,MAAM,CAAC;AAC/B,IAAA,GAAG,EAAEA,GAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;AAC1B,IAAA,GAAG,EAAEA,GAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;AAC1B,IAAA,SAAS,EAAEA,GAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;AACjC,CAAA,CAAC;AAEK,MAAM,mBAAmB,GAAGA,GAAC,CAAC,MAAM,CAAC;IAC1C,YAAY,EAAEA,GAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IACxC,OAAO,EAAEA,GAAC,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;AAC7C,IAAA,UAAU,EAAEA,GAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE;AAC9C,CAAA;AAED,MAAM,kBAAkB,GAAGA,GAAC,CAAC,MAAM,CAAC;AAClC,IAAA,EAAE,EAAEA,GAAC,CAAC,MAAM,EAAE;AACd,IAAA,MAAM,EAAEA,GAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;AAC9B,CAAA,CAAC;AAEF,MAAM,+BAA+B,GAAGA,GAAC,CAAC,MAAM,CAAC;AAC/C,IAAA,EAAE,EAAEA,GAAC,CAAC,MAAM,EAAE;AACd,IAAA,OAAO,EAAEA,GAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,QAAQ,EAAEA,GAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;AACrC,CAAA,CAAC;AAEK,MAAM,mCAAmC,GAAGA,GAAC,CAAC,MAAM,CAAC;AAC1D,IAAA,EAAE,EAAEA,GAAC,CAAC,MAAM,EAAE;AACd,IAAA,OAAO,EAAEA,GAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;AAC9B,IAAA,IAAI,EAAEA,GAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC,QAAQ,EAAE;AACjD,IAAA,SAAS,EAAEA,GAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE;AACjD,CAAA;AAEM,MAAM,gBAAgB,GAAGA,GAAC,CAAC,MAAM,CAAC;AACvC,IAAA,IAAI,EAAEA,GAAC,CAAC,KAAK,CAAC,+BAA+B,CAAC;AAC9C,IAAA,QAAQ,EAAEA,GAAC,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,oCAAoC,CAAC;AACtG,IAAA,OAAO,EAAEA,GAAC,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACtD,WAAW,EAAEA,GAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;AACxC,CAAA;AAED,MAAM,gBAAgB,GAAGA,GAAC,CAAC,MAAM,CAAC;IAChC,GAAG,eAAe,CAAC,KAAK;IACxB,UAAU,EAAEA,GAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;AACrC,IAAA,aAAa,EAAEA,GAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;AACtC,CAAA,CAAC;AAEK,MAAM,4BAA4B,GAAGA,GAAC,CAAC,MAAM,CAAC;AACnD,IAAA,EAAE,EAAEA,GAAC,CAAC,MAAM,EAAE;AACd,IAAA,IAAI,EAAEA,GAAC,CAAC,IAAI,CAAC;QACX,MAAM;QACN,UAAU;QACV,KAAK;QACL,gBAAgB;QAChB,MAAM;QACN,WAAW;QACX,iBAAiB;QACjB,mBAAmB;QACnB,iBAAiB;KAClB,CAAC;AACF,IAAA,OAAO,EAAEA,GAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;AAC9B,IAAA,WAAW,EAAEA,GAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAClC,OAAO,EAAEA,GAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC;IACzC,OAAO,EAAEA,GAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC;AAC1C,CAAA;;;;;;;"}
1
+ {"version":3,"file":"Validate.js","sources":["../../../../../../../../../../../src/dpr/components/_dashboards/dashboard-visualisation/Validate.ts"],"sourcesContent":["import { z } from 'zod'\n\nconst dashboardBucket = z.object({\n min: z.number().optional(),\n max: z.number().optional(),\n hexColour: z.string().optional(),\n})\n\nexport const BucketOptionsSchema = z.object({\n useRagColour: z.boolean().default(false),\n buckets: z.array(dashboardBucket).default([]),\n baseColour: z.string().regex(/^#/).optional(),\n})\n\nconst dashboardVisFilter = z.object({\n id: z.string(),\n equals: z.string().nullable(),\n})\n\nconst DashboardVisualisationKeySchema = z.object({\n id: z.string(),\n display: z.string().optional(),\n optional: z.boolean().default(false),\n})\n\nexport const DashboardVisualisationMeasureSchema = z.object({\n id: z.string(),\n display: z.string().optional(),\n unit: z.enum(['NUMBER', 'PERCENTAGE']).optional(),\n aggregate: z.enum(['sum', 'average']).optional(),\n})\n\nexport const DashboardColumns = z.object({\n keys: z.array(DashboardVisualisationKeySchema).optional(),\n measures: z.array(DashboardVisualisationMeasureSchema, {\n error: (issue) =>\n issue.input === undefined\n ? 'Dashboard visualisation definition: measures is required'\n : 'Dashboard visualisation definition: measures must be an array',\n }),\n filters: z.array(dashboardVisFilter).min(1).optional(),\n expectNulls: z.boolean().default(false),\n})\n\nconst dashboardOptions = z.object({\n ...BucketOptionsSchema.shape,\n showLatest: z.boolean().default(true),\n columnsAsList: z.boolean().optional(),\n})\n\nexport const DashboardVisualisationSchema = z.object({\n id: z.string(),\n type: z.enum([\n 'list',\n 'doughnut',\n 'bar',\n 'bar-timeseries',\n 'line',\n 'scorecard',\n 'scorecard-group',\n 'matrix-timeseries',\n 'line-timeseries',\n ]),\n display: z.string().optional(),\n description: z.string().optional(),\n options: z.object(dashboardOptions.shape).optional(),\n columns: z.object(DashboardColumns.shape),\n})\n\nconst DashboardVisualisationSchemas = {\n DashboardVisualisationSchema,\n DashboardVisualisationMeasureSchema,\n DashboardVisualisationKeySchema,\n}\n\nexport default DashboardVisualisationSchemas\n"],"names":["z"],"mappings":"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"}
@@ -109,6 +109,14 @@ class ReportingClient {
109
109
  token,
110
110
  }, res);
111
111
  }
112
+ downloadSyncReport(token, resourceName, reportQuery, res) {
113
+ this.logInfo('Streaming download data', { resourceName });
114
+ return this.restClient.getStream({
115
+ path: `/${resourceName}/download`,
116
+ query: reportQuery.toRecordWithFilterPrefix(true),
117
+ token,
118
+ }, res);
119
+ }
112
120
  getAsyncReport(token, reportId, variantId, tableId, query) {
113
121
  this.logInfo('Get Data', { reportId, variantId, tableId });
114
122
  return this.restClient
@@ -1 +1 @@
1
- {"version":3,"file":"reportingClient.js","sources":["../../../../../../../../../src/dpr/data/reportingClient.ts"],"sourcesContent":["import { Response } from 'express'\nimport ReportQuery from '../types/ReportQuery'\nimport logger from '../utils/logger'\nimport RestClient from './restClient'\nimport Dict = NodeJS.Dict\nimport { components, operations } from '../types/api'\nimport { ApiConfig, Count, ListWithWarnings } from './types'\nimport type { ResultWithHeaders } from './restClient'\n\nclass ReportingClient {\n restClient: RestClient\n\n constructor(config: ApiConfig) {\n this.restClient = new RestClient('Reporting API Client', config)\n }\n\n getCount(resourceName: string, token: string, countRequest: ReportQuery): Promise<number> {\n logger.info(`Reporting client: Get count. { resourceName: ${resourceName} }`)\n\n return this.restClient\n .get({\n path: `/${resourceName}/count`,\n query: countRequest.toRecordWithFilterPrefix(true),\n token,\n })\n .then((response) => (<Count>response).count)\n }\n\n getList(resourceName: string, token: string, listRequest: ReportQuery): Promise<Array<Dict<string>>> {\n return this.getListWithWarnings(resourceName, token, listRequest).then((response) => response.data)\n }\n\n getListWithWarnings(resourceName: string, token: string, listRequest: ReportQuery): Promise<ListWithWarnings> {\n logger.info(`Reporting client: Get list. { resourceName: ${resourceName} }`)\n\n return this.restClient\n .getWithHeaders<Array<Dict<string>>>({\n path: `/${resourceName}`,\n query: listRequest.toRecordWithFilterPrefix(true),\n token,\n })\n .then((response: ResultWithHeaders<Array<Dict<string>>>) => ({\n data: response.data,\n warnings: {\n noDataAvailable: response.headers['x-no-data-warning'],\n },\n }))\n }\n\n getDefinitionSummary(\n token: string,\n reportId: string,\n definitionsPath?: string,\n ): Promise<components['schemas']['ReportDefinitionSummary']> {\n this.logInfo('Get definition summary', { reportId })\n\n const queryParams: operations['definitionSummary']['parameters']['query'] = {\n ...(definitionsPath && { dataProductDefinitionsPath: definitionsPath }),\n }\n\n return this.restClient\n .get({\n path: `/definitions/${reportId}`,\n query: queryParams,\n token,\n })\n .then((response) => <components['schemas']['ReportDefinitionSummary']>response)\n }\n\n getDefinitions(\n token: string,\n definitionsPath?: string,\n ): Promise<Array<components['schemas']['ReportDefinitionSummary']>> {\n this.logInfo('Get definitions')\n\n const queryParams: operations['definitions_1']['parameters']['query'] = {\n renderMethod: 'HTML',\n ...(definitionsPath && { dataProductDefinitionsPath: definitionsPath }),\n }\n\n return this.restClient\n .get({\n path: '/definitions',\n query: queryParams,\n token,\n })\n .then((response) => <Array<components['schemas']['ReportDefinitionSummary']>>response)\n }\n\n getDefinition(\n token: string,\n reportId: string,\n variantId: string,\n definitionsPath?: string,\n queryData?: Dict<string | string[]>,\n ): Promise<components['schemas']['SingleVariantReportDefinition']> {\n const query = {\n ...queryData,\n dataProductDefinitionsPath: definitionsPath,\n }\n\n this.logInfo('Get definition', { reportId, variantId, ...query })\n\n return this.restClient\n .get({\n path: `/definitions/${reportId}/${variantId}`,\n query,\n token,\n })\n .then((response) => <components['schemas']['SingleVariantReportDefinition']>response)\n }\n\n requestAsyncReport(\n token: string,\n reportId: string,\n variantId: string,\n query: Record<string, string | boolean | number>,\n ): Promise<Dict<string>> {\n this.logInfo('Request report', { reportId, variantId })\n\n return this.restClient\n .get({\n path: `/async/reports/${reportId}/${variantId}`,\n token,\n query,\n })\n .then((response) => <Dict<string>>response)\n }\n\n cancelAsyncRequest(\n token: string,\n reportId: string,\n variantId: string,\n executionId: string,\n dataProductDefinitionsPath?: string,\n ): Promise<Dict<string>> {\n this.logInfo('Cancel Request', { reportId, variantId, executionId })\n\n return this.restClient\n .delete({\n path: `/reports/${reportId}/${variantId}/statements/${executionId}`,\n token,\n query: {\n dataProductDefinitionsPath,\n },\n })\n .then((response) => <Dict<string>>response)\n }\n\n downloadAsyncReport(\n token: string,\n reportId: string,\n variantId: string,\n tableId: string,\n query: Record<string, string | string[]>,\n res: Response,\n ): Promise<void> {\n this.logInfo('Streaming download data', { reportId, variantId, tableId })\n\n return this.restClient.getStream(\n {\n path: `/reports/${reportId}/${variantId}/tables/${tableId}/download`,\n query,\n token,\n },\n res,\n )\n }\n\n getAsyncReport(\n token: string,\n reportId: string,\n variantId: string,\n tableId: string,\n query: Record<string, string | string[]>,\n ): Promise<Array<Record<string, string>>> {\n this.logInfo('Get Data', { reportId, variantId, tableId })\n\n return this.restClient\n .get({\n path: `/reports/${reportId}/${variantId}/tables/${tableId}/result`,\n token,\n query,\n })\n .then((response) => <Array<Record<string, string>>>response)\n }\n\n getAsyncSummaryReport(\n token: string,\n reportId: string,\n variantId: string,\n tableId: string,\n summaryId: string,\n query: Dict<string | number>,\n ): Promise<Array<Record<string, string>>> {\n this.logInfo('Get summary data', { reportId, variantId, tableId, summaryId })\n\n return this.restClient\n .get({\n path: `/reports/${reportId}/${variantId}/tables/${tableId}/result/summary/${summaryId}`,\n token,\n query,\n })\n .then((response) => <Array<Record<string, string>>>response)\n }\n\n getAsyncReportStatus(\n token: string,\n reportId: string,\n variantId: string,\n executionId: string,\n dataProductDefinitionsPath?: string,\n tableId?: string,\n ): Promise<components['schemas']['StatementExecutionStatus']> {\n this.logInfo('Get status', { reportId, variantId, tableId, executionId })\n\n return this.restClient\n .get({\n path: `/reports/${reportId}/${variantId}/statements/${executionId}/status`,\n token,\n query: {\n dataProductDefinitionsPath,\n tableId,\n },\n })\n .then((response) => <components['schemas']['StatementExecutionStatus']>response)\n }\n\n getAsyncCount(token: string, tableId: string, dataProductDefinitionsPath?: string): Promise<number> {\n this.logInfo('Get count', { tableId })\n\n return this.restClient\n .get({\n path: `/report/tables/${tableId}/count`,\n token,\n query: {\n dataProductDefinitionsPath,\n },\n })\n .then((response) => (<Count>response).count)\n }\n\n getAsyncInteractiveCount(\n token: string,\n tableId: string,\n reportId: string,\n id: string,\n filters: ReportQuery,\n ): Promise<number> {\n this.logInfo('Get interactive count', { tableId, reportId, id })\n\n return this.restClient\n .get({\n path: `/reports/${reportId}/${id}/tables/${tableId}/count`,\n token,\n query: filters.toRecordWithFilterPrefix(true),\n })\n .then((response) => (<Count>response).count)\n }\n\n logInfo(title: string, args?: Dict<string>) {\n logger.info(`Reporting Client: ${title}:`)\n if (args && Object.keys(args).length) logger.info(JSON.stringify(args, null, 2))\n }\n}\n\nexport { ReportingClient }\nexport default ReportingClient\n"],"names":["RestClient","logger"],"mappings":"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"}
1
+ {"version":3,"file":"reportingClient.js","sources":["../../../../../../../../../src/dpr/data/reportingClient.ts"],"sourcesContent":["import { Response } from 'express'\nimport ReportQuery from '../types/ReportQuery'\nimport logger from '../utils/logger'\nimport RestClient from './restClient'\nimport Dict = NodeJS.Dict\nimport { components, operations } from '../types/api'\nimport { ApiConfig, Count, ListWithWarnings } from './types'\nimport type { ResultWithHeaders } from './restClient'\n\nclass ReportingClient {\n restClient: RestClient\n\n constructor(config: ApiConfig) {\n this.restClient = new RestClient('Reporting API Client', config)\n }\n\n getCount(resourceName: string, token: string, countRequest: ReportQuery): Promise<number> {\n logger.info(`Reporting client: Get count. { resourceName: ${resourceName} }`)\n\n return this.restClient\n .get({\n path: `/${resourceName}/count`,\n query: countRequest.toRecordWithFilterPrefix(true),\n token,\n })\n .then((response) => (<Count>response).count)\n }\n\n getList(resourceName: string, token: string, listRequest: ReportQuery): Promise<Array<Dict<string>>> {\n return this.getListWithWarnings(resourceName, token, listRequest).then((response) => response.data)\n }\n\n getListWithWarnings(resourceName: string, token: string, listRequest: ReportQuery): Promise<ListWithWarnings> {\n logger.info(`Reporting client: Get list. { resourceName: ${resourceName} }`)\n\n return this.restClient\n .getWithHeaders<Array<Dict<string>>>({\n path: `/${resourceName}`,\n query: listRequest.toRecordWithFilterPrefix(true),\n token,\n })\n .then((response: ResultWithHeaders<Array<Dict<string>>>) => ({\n data: response.data,\n warnings: {\n noDataAvailable: response.headers['x-no-data-warning'],\n },\n }))\n }\n\n getDefinitionSummary(\n token: string,\n reportId: string,\n definitionsPath?: string,\n ): Promise<components['schemas']['ReportDefinitionSummary']> {\n this.logInfo('Get definition summary', { reportId })\n\n const queryParams: operations['definitionSummary']['parameters']['query'] = {\n ...(definitionsPath && { dataProductDefinitionsPath: definitionsPath }),\n }\n\n return this.restClient\n .get({\n path: `/definitions/${reportId}`,\n query: queryParams,\n token,\n })\n .then((response) => <components['schemas']['ReportDefinitionSummary']>response)\n }\n\n getDefinitions(\n token: string,\n definitionsPath?: string,\n ): Promise<Array<components['schemas']['ReportDefinitionSummary']>> {\n this.logInfo('Get definitions')\n\n const queryParams: operations['definitions_1']['parameters']['query'] = {\n renderMethod: 'HTML',\n ...(definitionsPath && { dataProductDefinitionsPath: definitionsPath }),\n }\n\n return this.restClient\n .get({\n path: '/definitions',\n query: queryParams,\n token,\n })\n .then((response) => <Array<components['schemas']['ReportDefinitionSummary']>>response)\n }\n\n getDefinition(\n token: string,\n reportId: string,\n variantId: string,\n definitionsPath?: string,\n queryData?: Dict<string | string[]>,\n ): Promise<components['schemas']['SingleVariantReportDefinition']> {\n const query = {\n ...queryData,\n dataProductDefinitionsPath: definitionsPath,\n }\n\n this.logInfo('Get definition', { reportId, variantId, ...query })\n\n return this.restClient\n .get({\n path: `/definitions/${reportId}/${variantId}`,\n query,\n token,\n })\n .then((response) => <components['schemas']['SingleVariantReportDefinition']>response)\n }\n\n requestAsyncReport(\n token: string,\n reportId: string,\n variantId: string,\n query: Record<string, string | boolean | number>,\n ): Promise<Dict<string>> {\n this.logInfo('Request report', { reportId, variantId })\n\n return this.restClient\n .get({\n path: `/async/reports/${reportId}/${variantId}`,\n token,\n query,\n })\n .then((response) => <Dict<string>>response)\n }\n\n cancelAsyncRequest(\n token: string,\n reportId: string,\n variantId: string,\n executionId: string,\n dataProductDefinitionsPath?: string,\n ): Promise<Dict<string>> {\n this.logInfo('Cancel Request', { reportId, variantId, executionId })\n\n return this.restClient\n .delete({\n path: `/reports/${reportId}/${variantId}/statements/${executionId}`,\n token,\n query: {\n dataProductDefinitionsPath,\n },\n })\n .then((response) => <Dict<string>>response)\n }\n\n downloadAsyncReport(\n token: string,\n reportId: string,\n variantId: string,\n tableId: string,\n query: Record<string, string | string[]>,\n res: Response,\n ): Promise<void> {\n this.logInfo('Streaming download data', { reportId, variantId, tableId })\n\n return this.restClient.getStream(\n {\n path: `/reports/${reportId}/${variantId}/tables/${tableId}/download`,\n query,\n token,\n },\n res,\n )\n }\n\n downloadSyncReport(token: string, resourceName: string, reportQuery: ReportQuery, res: Response): Promise<void> {\n this.logInfo('Streaming download data', { resourceName })\n\n return this.restClient.getStream(\n {\n path: `/${resourceName}/download`,\n query: reportQuery.toRecordWithFilterPrefix(true),\n token,\n },\n res,\n )\n }\n\n getAsyncReport(\n token: string,\n reportId: string,\n variantId: string,\n tableId: string,\n query: Record<string, string | string[]>,\n ): Promise<Array<Record<string, string>>> {\n this.logInfo('Get Data', { reportId, variantId, tableId })\n\n return this.restClient\n .get({\n path: `/reports/${reportId}/${variantId}/tables/${tableId}/result`,\n token,\n query,\n })\n .then((response) => <Array<Record<string, string>>>response)\n }\n\n getAsyncSummaryReport(\n token: string,\n reportId: string,\n variantId: string,\n tableId: string,\n summaryId: string,\n query: Dict<string | number>,\n ): Promise<Array<Record<string, string>>> {\n this.logInfo('Get summary data', { reportId, variantId, tableId, summaryId })\n\n return this.restClient\n .get({\n path: `/reports/${reportId}/${variantId}/tables/${tableId}/result/summary/${summaryId}`,\n token,\n query,\n })\n .then((response) => <Array<Record<string, string>>>response)\n }\n\n getAsyncReportStatus(\n token: string,\n reportId: string,\n variantId: string,\n executionId: string,\n dataProductDefinitionsPath?: string,\n tableId?: string,\n ): Promise<components['schemas']['StatementExecutionStatus']> {\n this.logInfo('Get status', { reportId, variantId, tableId, executionId })\n\n return this.restClient\n .get({\n path: `/reports/${reportId}/${variantId}/statements/${executionId}/status`,\n token,\n query: {\n dataProductDefinitionsPath,\n tableId,\n },\n })\n .then((response) => <components['schemas']['StatementExecutionStatus']>response)\n }\n\n getAsyncCount(token: string, tableId: string, dataProductDefinitionsPath?: string): Promise<number> {\n this.logInfo('Get count', { tableId })\n\n return this.restClient\n .get({\n path: `/report/tables/${tableId}/count`,\n token,\n query: {\n dataProductDefinitionsPath,\n },\n })\n .then((response) => (<Count>response).count)\n }\n\n getAsyncInteractiveCount(\n token: string,\n tableId: string,\n reportId: string,\n id: string,\n filters: ReportQuery,\n ): Promise<number> {\n this.logInfo('Get interactive count', { tableId, reportId, id })\n\n return this.restClient\n .get({\n path: `/reports/${reportId}/${id}/tables/${tableId}/count`,\n token,\n query: filters.toRecordWithFilterPrefix(true),\n })\n .then((response) => (<Count>response).count)\n }\n\n logInfo(title: string, args?: Dict<string>) {\n logger.info(`Reporting Client: ${title}:`)\n if (args && Object.keys(args).length) logger.info(JSON.stringify(args, null, 2))\n }\n}\n\nexport { ReportingClient }\nexport default ReportingClient\n"],"names":["RestClient","logger"],"mappings":"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"}
@@ -2,69 +2,11 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var json2Csv = require('json-2-csv');
6
5
  var UserReports = require('../../../types/UserReports.js');
7
6
  var localsHelper = require('../../../utils/localsHelper.js');
8
7
  var ReportQuery = require('../../../types/ReportQuery.js');
9
8
  var logger = require('../../../utils/logger.js');
10
9
 
11
- const convertToCsv = (reportData, options) => {
12
- const csvData = json2Csv.json2csv(reportData, options);
13
- return csvData;
14
- };
15
- const getKeys = (reportData, fields) => {
16
- const keys = [];
17
- const keyNames = [];
18
- reportData.forEach((row) => {
19
- Object.keys(row).forEach((key) => {
20
- const field = fields.find((f) => f.name === key);
21
- if (field && !keyNames.includes(key)) {
22
- keyNames.push(key);
23
- keys.push({
24
- field: key,
25
- title: field.display,
26
- });
27
- }
28
- });
29
- });
30
- return keys;
31
- };
32
- const applyColumnsAndSort = (data, columns) => {
33
- return data.map((row) => {
34
- return Object.keys(row)
35
- .filter((key) => columns.includes(key))
36
- .reduce((obj, key) => {
37
- // eslint-disable-next-line no-param-reassign
38
- obj[key] = row[key];
39
- return obj;
40
- }, {});
41
- });
42
- };
43
- const removeHtmlTags = (reportData, reportDefinition) => {
44
- // Find HMTL field + name
45
- const { specification } = reportDefinition.variant;
46
- if (specification) {
47
- const { fields } = specification;
48
- const htmlFields = fields.filter((field) => {
49
- return field.type === 'HTML';
50
- });
51
- if (htmlFields.length) {
52
- reportData.map((d) => {
53
- htmlFields.forEach((field) => {
54
- const { name } = field;
55
- const colValue = d[name];
56
- if (colValue) {
57
- const innerText = /target="_blank">(.*?)<\/a>/g.exec(colValue);
58
- // eslint-disable-next-line prefer-destructuring, no-param-reassign
59
- d[name] = innerText ? innerText[1] : colValue;
60
- }
61
- });
62
- return d;
63
- });
64
- }
65
- }
66
- return reportData;
67
- };
68
10
  const streamDownloadAsyncData = async (args) => {
69
11
  const { token, services, tableId, reportId, id, queryParams, res } = args;
70
12
  const query = {
@@ -72,75 +14,51 @@ const streamDownloadAsyncData = async (args) => {
72
14
  };
73
15
  return services.reportingService.downloadAsyncReport(token, reportId, id, tableId, query, res);
74
16
  };
75
- const downloadSyncData = async (args) => {
76
- const { token, services, queryParams, definition } = args;
17
+ const streamDownloadSyncData = async (args) => {
18
+ const { token, services, queryParams, definition, res } = args;
77
19
  const { variant } = definition;
78
20
  const { resourceName, specification } = variant;
79
- let data = [];
80
- if (specification) {
81
- const countReportQuery = new ReportQuery.ReportQuery({
82
- fields: specification.fields,
83
- template: specification.template,
84
- queryParams,
85
- definitionsPath: queryParams.dataProductDefinitionsPath,
86
- });
87
- const count = await services.reportingService.getCount(resourceName, token, countReportQuery);
88
- const dataReportQuery = new ReportQuery.ReportQuery({
89
- fields: specification.fields,
90
- template: specification.template,
91
- queryParams: {
92
- ...queryParams,
93
- pageSize: count.toString(),
94
- },
95
- definitionsPath: queryParams.dataProductDefinitionsPath,
96
- });
97
- const reportData = await services.reportingService.getListWithWarnings(resourceName, token, dataReportQuery);
98
- data = reportData.data;
21
+ if (!specification) {
22
+ logger.default.error(`No specification found for definition ID: ${definition.id} variant ID: ${variant.id}`);
23
+ throw new Error(`No specification found for definition ID: ${definition.id} variant ID: ${variant.id}`);
99
24
  }
100
- return data;
25
+ const reportQuery = new ReportQuery.ReportQuery({
26
+ fields: specification.fields,
27
+ template: specification.template,
28
+ queryParams: {
29
+ ...queryParams,
30
+ },
31
+ definitionsPath: queryParams.dataProductDefinitionsPath,
32
+ });
33
+ return services.reportingService.downloadSyncReport(token, resourceName, reportQuery, res);
101
34
  };
102
35
  const downloadReport = async ({ req, services, res, redirect, loadType, }) => {
103
36
  const { dprUser, token } = localsHelper.default.getValues(res);
104
- const { reportId, id, tableId, dataProductDefinitionsPath, reportName, name, cols: columns, sortedAsc, sortColumn, } = req.body;
37
+ const { reportId, id, tableId, dataProductDefinitionsPath, cols: columns, sortedAsc, sortColumn } = req.body;
105
38
  const { downloadPermissionService } = services;
106
39
  const canDownloadReport = await downloadPermissionService.downloadEnabledForReport(dprUser.id, reportId, id);
107
40
  if (!canDownloadReport) {
108
41
  res.redirect(redirect);
109
42
  }
110
43
  else {
111
- const definition = await services.reportingService.getDefinition(token, reportId, id, dataProductDefinitionsPath);
112
- const queryParams = {
44
+ const streamDownloadQueryParams = {
113
45
  dataProductDefinitionsPath,
46
+ ...(columns && { columns: JSON.parse(columns) }),
114
47
  ...(sortedAsc && { sortedAsc }),
115
48
  ...(sortColumn && { sortColumn }),
116
49
  };
117
- let reportData;
50
+ const definition = await services.reportingService.getDefinition(token, reportId, id, dataProductDefinitionsPath);
51
+ logger.default.info(`Initiating streaming...`);
118
52
  if (loadType === UserReports.LoadType.SYNC) {
119
- reportData = await downloadSyncData({
53
+ await streamDownloadSyncData({
120
54
  definition,
121
55
  services,
122
56
  token,
123
- queryParams,
57
+ queryParams: streamDownloadQueryParams,
58
+ res,
124
59
  });
125
- if (columns) {
126
- reportData = applyColumnsAndSort(reportData, JSON.parse(columns));
127
- }
128
- reportData = removeHtmlTags(reportData, definition);
129
- const fields = definition.variant.specification?.fields || [];
130
- const keys = getKeys(reportData, fields);
131
- const csvData = convertToCsv(reportData, { keys, emptyFieldValue: '' });
132
- res.setHeader('Content-Type', 'application/json');
133
- res.setHeader('Content-disposition', `attachment; filename=${reportName}-${name}-${new Date().toISOString()}.csv`);
134
- res.end(csvData);
135
60
  }
136
61
  else {
137
- logger.default.info(`Initiating streaming...`);
138
- const streamDownloadQueryParams = {
139
- dataProductDefinitionsPath,
140
- ...(columns && { columns: JSON.parse(columns) }),
141
- ...(sortedAsc && { sortedAsc }),
142
- ...(sortColumn && { sortColumn }),
143
- };
144
62
  await streamDownloadAsyncData({
145
63
  services,
146
64
  token,
@@ -155,10 +73,8 @@ const downloadReport = async ({ req, services, res, redirect, loadType, }) => {
155
73
  };
156
74
  var DownloadUtils = {
157
75
  downloadReport,
158
- getKeys,
159
76
  };
160
77
 
161
78
  exports.default = DownloadUtils;
162
79
  exports.downloadReport = downloadReport;
163
- exports.getKeys = getKeys;
164
80
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sources":["../../../../../../../../../../../src/dpr/routes/journeys/download-report/utils.ts"],"sourcesContent":["import { Response, Request } from 'express'\nimport { json2csv, Json2CsvOptions } from 'json-2-csv'\nimport { KeysList } from 'json-2-csv/lib/types'\nimport { Services } from '../../../types/Services'\nimport Dict = NodeJS.Dict\nimport { LoadType } from '../../../types/UserReports'\nimport { components } from '../../../types/api'\nimport LocalsHelper from '../../../utils/localsHelper'\nimport { Template } from '../../../types/Templates'\nimport ReportQuery from '../../../types/ReportQuery'\nimport logger from '../../../utils/logger'\n\nconst convertToCsv = (reportData: Dict<string>[], options: Json2CsvOptions) => {\n const csvData = json2csv(reportData, options)\n return csvData\n}\n\nexport const getKeys = (reportData: Dict<string>[], fields: components['schemas']['FieldDefinition'][]): KeysList => {\n const keys: KeysList = []\n const keyNames: string[] = []\n reportData.forEach((row) => {\n Object.keys(row).forEach((key) => {\n const field = fields.find((f) => f.name === key)\n if (field && !keyNames.includes(key)) {\n keyNames.push(key)\n keys.push({\n field: key,\n title: field.display,\n })\n }\n })\n })\n return keys\n}\n\nconst applyColumnsAndSort = (data: Dict<string>[], columns: string[]) => {\n return data.map((row) => {\n return Object.keys(row)\n .filter((key) => columns.includes(key))\n .reduce((obj: Dict<string>, key) => {\n // eslint-disable-next-line no-param-reassign\n obj[key] = row[key]\n return obj\n }, {})\n })\n}\n\nconst removeHtmlTags = (\n reportData: Dict<string>[],\n reportDefinition: components['schemas']['SingleVariantReportDefinition'],\n) => {\n // Find HMTL field + name\n const { specification } = reportDefinition.variant\n if (specification) {\n const { fields } = specification\n const htmlFields = fields.filter((field) => {\n return field.type === 'HTML'\n })\n\n if (htmlFields.length) {\n reportData.map((d) => {\n htmlFields.forEach((field) => {\n const { name } = field\n const colValue = d[name]\n if (colValue) {\n const innerText = /target=\"_blank\">(.*?)<\\/a>/g.exec(colValue)\n // eslint-disable-next-line prefer-destructuring, no-param-reassign\n d[name] = innerText ? innerText[1] : colValue\n }\n })\n return d\n })\n }\n }\n return reportData\n}\n\nconst streamDownloadAsyncData = async (args: {\n services: Services\n token: string\n tableId: string\n reportId: string\n id: string\n queryParams: {\n dataProductDefinitionsPath: string\n columns: string[]\n sortedAsc?: string\n sortColumn?: string\n }\n res: Response\n}) => {\n const { token, services, tableId, reportId, id, queryParams, res } = args\n const query: Record<string, string | string[]> = {\n ...queryParams,\n }\n return services.reportingService.downloadAsyncReport(token, reportId, id, tableId, query, res)\n}\n\nconst downloadSyncData = async (args: {\n definition: components['schemas']['SingleVariantReportDefinition']\n services: Services\n token: string\n queryParams: {\n dataProductDefinitionsPath: string\n sortedAsc?: string\n sortColumn?: string\n }\n}) => {\n const { token, services, queryParams, definition } = args\n const { variant } = definition\n const { resourceName, specification } = variant\n let data: Dict<string>[] = []\n\n if (specification) {\n const countReportQuery = new ReportQuery({\n fields: specification.fields,\n template: specification.template as Template,\n queryParams,\n definitionsPath: <string>queryParams.dataProductDefinitionsPath,\n })\n const count = await services.reportingService.getCount(resourceName, token, countReportQuery)\n\n const dataReportQuery = new ReportQuery({\n fields: specification.fields,\n template: specification.template as Template,\n queryParams: {\n ...queryParams,\n pageSize: count.toString(),\n },\n definitionsPath: <string>queryParams.dataProductDefinitionsPath,\n })\n const reportData = await services.reportingService.getListWithWarnings(resourceName, token, dataReportQuery)\n data = reportData.data\n }\n\n return data\n}\n\nexport const downloadReport = async ({\n req,\n services,\n res,\n redirect,\n loadType,\n}: {\n req: Request\n services: Services\n res: Response\n redirect: string\n loadType?: LoadType\n}) => {\n const { dprUser, token } = LocalsHelper.getValues(res)\n const {\n reportId,\n id,\n tableId,\n dataProductDefinitionsPath,\n reportName,\n name,\n cols: columns,\n sortedAsc,\n sortColumn,\n } = req.body\n const { downloadPermissionService } = services\n const canDownloadReport = await downloadPermissionService.downloadEnabledForReport(dprUser.id, reportId, id)\n\n if (!canDownloadReport) {\n res.redirect(redirect)\n } else {\n const definition = await services.reportingService.getDefinition(token, reportId, id, dataProductDefinitionsPath)\n const queryParams = {\n dataProductDefinitionsPath,\n ...(sortedAsc && { sortedAsc }),\n ...(sortColumn && { sortColumn }),\n }\n\n let reportData\n if (loadType === LoadType.SYNC) {\n reportData = await downloadSyncData({\n definition,\n services,\n token,\n queryParams,\n })\n if (columns) {\n reportData = applyColumnsAndSort(reportData, JSON.parse(columns))\n }\n reportData = removeHtmlTags(reportData, definition)\n const fields = definition.variant.specification?.fields || []\n const keys: KeysList = getKeys(reportData, fields)\n const csvData = convertToCsv(reportData, { keys, emptyFieldValue: '' })\n\n res.setHeader('Content-Type', 'application/json')\n res.setHeader('Content-disposition', `attachment; filename=${reportName}-${name}-${new Date().toISOString()}.csv`)\n res.end(csvData)\n } else {\n logger.info(`Initiating streaming...`)\n const streamDownloadQueryParams = {\n dataProductDefinitionsPath,\n ...(columns && { columns: JSON.parse(columns) }),\n ...(sortedAsc && { sortedAsc }),\n ...(sortColumn && { sortColumn }),\n }\n await streamDownloadAsyncData({\n services,\n token,\n reportId,\n id,\n tableId,\n queryParams: streamDownloadQueryParams,\n res,\n })\n }\n }\n}\n\nexport default {\n downloadReport,\n getKeys,\n}\n"],"names":["json2csv","ReportQuery","LocalsHelper","LoadType","logger"],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","sources":["../../../../../../../../../../../src/dpr/routes/journeys/download-report/utils.ts"],"sourcesContent":["import { Response, Request } from 'express'\nimport { Services } from '../../../types/Services'\nimport { LoadType } from '../../../types/UserReports'\nimport { components } from '../../../types/api'\nimport LocalsHelper from '../../../utils/localsHelper'\nimport { Template } from '../../../types/Templates'\nimport ReportQuery from '../../../types/ReportQuery'\nimport logger from '../../../utils/logger'\n\nconst streamDownloadAsyncData = async (args: {\n services: Services\n token: string\n tableId: string\n reportId: string\n id: string\n queryParams: {\n dataProductDefinitionsPath: string\n columns: string[]\n sortedAsc?: string\n sortColumn?: string\n }\n res: Response\n}) => {\n const { token, services, tableId, reportId, id, queryParams, res } = args\n const query: Record<string, string | string[]> = {\n ...queryParams,\n }\n return services.reportingService.downloadAsyncReport(token, reportId, id, tableId, query, res)\n}\n\nconst streamDownloadSyncData = async (args: {\n definition: components['schemas']['SingleVariantReportDefinition']\n services: Services\n token: string\n queryParams: {\n dataProductDefinitionsPath: string\n sortedAsc?: string\n sortColumn?: string\n columns: string\n }\n res: Response\n}) => {\n const { token, services, queryParams, definition, res } = args\n const { variant } = definition\n const { resourceName, specification } = variant\n if (!specification) {\n logger.error(`No specification found for definition ID: ${definition.id} variant ID: ${variant.id}`)\n throw new Error(`No specification found for definition ID: ${definition.id} variant ID: ${variant.id}`)\n }\n const reportQuery = new ReportQuery({\n fields: specification.fields,\n template: specification.template as Template,\n queryParams: {\n ...queryParams,\n },\n definitionsPath: <string>queryParams.dataProductDefinitionsPath,\n })\n return services.reportingService.downloadSyncReport(token, resourceName, reportQuery, res)\n}\n\nexport const downloadReport = async ({\n req,\n services,\n res,\n redirect,\n loadType,\n}: {\n req: Request\n services: Services\n res: Response\n redirect: string\n loadType?: LoadType\n}) => {\n const { dprUser, token } = LocalsHelper.getValues(res)\n const { reportId, id, tableId, dataProductDefinitionsPath, cols: columns, sortedAsc, sortColumn } = req.body\n const { downloadPermissionService } = services\n const canDownloadReport = await downloadPermissionService.downloadEnabledForReport(dprUser.id, reportId, id)\n\n if (!canDownloadReport) {\n res.redirect(redirect)\n } else {\n const streamDownloadQueryParams = {\n dataProductDefinitionsPath,\n ...(columns && { columns: JSON.parse(columns) }),\n ...(sortedAsc && { sortedAsc }),\n ...(sortColumn && { sortColumn }),\n }\n const definition = await services.reportingService.getDefinition(token, reportId, id, dataProductDefinitionsPath)\n logger.info(`Initiating streaming...`)\n if (loadType === LoadType.SYNC) {\n await streamDownloadSyncData({\n definition,\n services,\n token,\n queryParams: streamDownloadQueryParams,\n res,\n })\n } else {\n await streamDownloadAsyncData({\n services,\n token,\n reportId,\n id,\n tableId,\n queryParams: streamDownloadQueryParams,\n res,\n })\n }\n }\n}\n\nexport default {\n downloadReport,\n}\n"],"names":["logger","ReportQuery","LocalsHelper","LoadType"],"mappings":"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"}
@@ -18,6 +18,7 @@ var localsHelper = require('../../../../../utils/localsHelper.js');
18
18
  var filtersTypeEnum = require('../../../../../components/_filters/filtersTypeEnum.js');
19
19
  var _enum = require('../../../../../components/_filters/filter-input/enum.js');
20
20
  var featureFlagsHelper = require('../../../../../utils/featureFlagsHelper.js');
21
+ var validate = require('./validate.js');
21
22
 
22
23
  const setDashboardActions = (dashboardDefinition, reportDefinition, requestData) => {
23
24
  const reportName = reportDefinition.name;
@@ -54,6 +55,8 @@ const getDefinitionData = async ({ req, res, services, queryData, }) => {
54
55
  const dataProductDefinitionsPath = req.query['dataProductDefinitionsPath'];
55
56
  // Dashboard Definition,
56
57
  const dashboardDefinition = await services.dashboardService.getDefinition(token, reportId, id, dataProductDefinitionsPath, queryData);
58
+ // Validate definition
59
+ validate.DashboardSchema.parse(dashboardDefinition);
57
60
  // Report summary data
58
61
  const reportDefinition = await definitionUtils.default.getReportSummary(reportId, services.reportingService, token, dataProductDefinitionsPath);
59
62
  // Get the filters