-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathreveal.js
More file actions
118 lines (97 loc) · 4 KB
/
reveal.js
File metadata and controls
118 lines (97 loc) · 4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
var express = require('express');
var reveal = require('reveal-sdk-node');
var cors = require('cors');
const fs = require("fs");
const { pipeline } = require("stream");
const { promisify } = require('util');
const pipelineAsync = promisify(pipeline);
const dashboardDefaultDirectory = "dashboards";
const dashboardDirectory = "dashboards-tenant1";
const app = express();
app.use(cors());
// Step 1: User context provider
const userContextProvider = (request) => {
console.log('All request headers:', request.headers);
const userId = request.headers['x-header-customerid'];
if (!userId) {
console.warn('x-header-customerId is not found in headers');
}
var props = new Map();
props.set("userId", userId);
return new reveal.RVUserContext(userId, props);
};
// Step 2: Data source provider
const dataSourceProvider = async (userContext, dataSource) => {
if (dataSource instanceof reveal.RVPostgresDataSource) {
dataSource.host = process.env.POSTGRES_HOST;
dataSource.database = process.env.POSTGRES_DATABASE;
dataSource.schema = process.env.POSTGRES_SCHEMA;
} else {
return null;
}
return dataSource;
};
// Step 3: Authentication provider
const authenticationProvider = async (userContext, dataSource) => {
if (dataSource instanceof reveal.RVPostgresDataSource || dataSource instanceof reveal.RVSnowflakeDataSource) {
return new reveal.RVUsernamePasswordDataSourceCredential("", "");
}
}
// Step 4: Data source item provider
const dataSourceItemProvider = async (userContext, dataSourceItem) => {
//console.log(`Loading data source item ${dataSourceItem.id}`);
if (dataSourceItem instanceof reveal.RVLocalFileDataSourceItem)
{
dataSourceItem.Uri = "local:/" + dataSourceItem.Id + ".xlsx";
}
if (dataSourceItem instanceof reveal.RVPostgresDataSourceItem) {
// console.log(`Loading data source Table ${dataSourceItem.table}`);
if (dataSourceItem.table == "customers") {
dataSourceItem.customQuery = "SELECT * FROM customers where customerid = '" + userContext.properties.get("userId") + "'";
// console.log(dataSourceItem.customQuery);
}
if (dataSourceItem.id == "customers-dynamic") {
dataSourceItem.customQuery = "SELECT `URID`, `Procedure`, `Time` FROM `devAppLog`";
}
if (dataSourceItem.id == "customers-alfki-function") {
dataSourceItem.schema = "public";
dataSourceItem.functionName = "customerordersf";
dataSourceItem.functionParameters = { custid: userContext.properties.get("userId") };
}
if (dataSourceItem.id == "ordersqry") {
dataSourceItem.table = "OrdersQry";
}
}
await dataSourceProvider(userContext, dataSourceItem.dataSource);
return dataSourceItem;
}
// Step 5: Dashboard provider
const dashboardProvider = async (userContext, dashboardId) => {
console.log(`Loading dashboard ${dashboardId}`);
return fs.createReadStream(`${dashboardDefaultDirectory}/${dashboardId}.rdash`);
}
// Step 6: Dashboard storage provider
const dashboardStorageProvider = async (userContext, dashboardId, stream) => {
console.log(`Saving dashboard ${dashboardId}`);
const userId = userContext.properties.get("userId");
let savePath;
if (userId === 'ALFKI') {
savePath = `${dashboardDefaultDirectory}/${dashboardId}.rdash`;
console.log(`Saving dashboard ${dashboardId} for user ${userId} to ${savePath}`);
} else {
savePath = `${dashboardDefaultDirectory}/${dashboardId}.rdash`;
}
await pipelineAsync(stream, fs.createWriteStream(savePath));
};
// Reveal options
const revealOptions = {
userContextProvider: userContextProvider,
authenticationProvider: authenticationProvider,
dataSourceProvider: dataSourceProvider,
dataSourceItemProvider: dataSourceItemProvider,
dashboardProvider: dashboardProvider,
dashboardStorageProvider: dashboardStorageProvider,
localFileStoragePath: "data"
};
// Export the middleware for reveal
module.exports = reveal(revealOptions);