-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdash_server.js
103 lines (92 loc) · 3.63 KB
/
dash_server.js
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
var express = require('express'),
app = express(),
bodyParser = require('body-parser'),
config = require('./db/config.js'),
{ Pool } = require('pg'),
pool = new Pool(config.pg_credentials),
types = require('pg').types,
{ createLogger, format, transports } = require('winston');
const logger = createLogger({
level: 'info',
format: format.combine(
format.timestamp(),
format.json()
),
defaultMeta: {service: 'user-service'},
transports: [
new transports.File({ filename: './logs/dash_server.log',
level: 'error',
timestamp: true }) ]
});
// Object mapping parameters for burndown-data endpoint to SQL queries in config.js
const burndownQueryTypes = {'all-funds': 'all_funds_bd_query',
'single-fund': 'single_fund_bd_query',
'single-ledger': 'single_ledger_bd_query'};
// Use the type parser to cast integers returned by postgres to floats -- otherwise, Node seems to convert these to strings
types.setTypeParser(1700, val => parseFloat(val));
async function getTable (query, params=null) {
/* Runs a static query against the PG database.*/
try {
let rowsObj = (params)? await pool.query(query, params): await pool.query(query);
return {rows: rowsObj.rows, cols: rowsObj.fields};
}
catch (e) {
logger.error(e);
}
}
// Directory for index.html, etc.
app.use('/', express.static(__dirname + '/public'));
// Express middleware for static files, redirecting the <script> and <link> tags from index.html
app.use('/handsontable', express.static(__dirname + '/node_modules/handsontable/dist'));
app.use('/d3', express.static(__dirname + '/node_modules/d3/dist'));
app.use('/bootstrap-css', express.static(__dirname + '/node_modules/bootstrap/dist/css'));
app.use('/bootstrap-js', express.static(__dirname + '/node_modules/bootstrap/dist/js'));
app.use('/jquery', express.static(__dirname + '/node_modules/jquery/dist'));
app.use('/pikaday-js', express.static(__dirname + '/node_modules/pikaday'));
app.use('/pikaday-css', express.static(__dirname + '/node_modules/pikaday/css'));
app.use('/pikaday-js', express.static(__dirname + '/node_modules/pikaday'));
app.use('/moment', express.static(__dirname + '/node_modules/moment/min'));
app.get('/test', async (req, res) => {
let data = await getTable(config.queries.orders_query);
res.send(data);
});
// Endpoint for AJAX request for POL-level data
app.get('/orders-data', async (req, res) => {
let data = await getTable(config.queries.orders_query);
res.send(data);
});
// Endpoint for AJAX request for fund data
app.get('/funds-data', async (req, res) => {
let data = await getTable(config.queries.funds_query);
res.send(data);
});
// Endpoint for refresh timestamp data
app.get('/timestamp-data', async (req, res) => {
let data = await getTable(config.queries.refresh_ts_query);
res.send(data);
});
/* Endpoint for AJAX request for burndown (timeseries) data
Expects 1 required URL parameter:
type={[single-fund, all-funds, single-ledger]}
Accepts additional URL parameters:
ledger={ledger_name}
fundCode={fund_code}
*/
app.get('/burndown-data', async (req, res) => {
let queryType = req.query.type,
data;
// validate query type param
if (Object.keys(burndownQueryTypes).includes(queryType)) {
if (queryType == 'all-funds') {
data = await getTable(config.queries[burndownQueryTypes[queryType]]);
}
else {
params = (req.query.fundCode)? req.query.fundCode : req.query.ledger;
params = Array(4).fill(params);
data = await getTable(config.queries[burndownQueryTypes[queryType]],
params);
}
res.send(data);
}
});
server = app.listen(3000);