UNPKG

5.3 kBJavaScriptView Raw
1/**
2 * joola.io
3 *
4 * Copyright Joola Smart Solutions, Ltd. <info@joo.la>
5 *
6 * Licensed under GNU General Public License 3.0 or later.
7 * Some rights reserved. See LICENSE, AUTHORS.
8 *
9 * @license GPL-3.0+ <http://spdx.org/licenses/GPL-3.0+>
10 */
11
12var
13 router = require('./index'),
14 url = require('url'),
15
16 _metrics = require('../lib/objects/metrics'),
17 _datatables = require('../lib/objects/datatables'),
18 _datasources = require('../lib/objects/datasources'),
19 auth = require('../lib/auth/manager'),
20 connector = require('../lib/connectors/connector');
21
22/**
23 * Lists all available dimensions. You can provide parameters and ask for a specific data source and datatable.
24 *
25 * The returned list will contain only dimensions authorized for the authenticated user.
26 *
27 * @method list
28 * @param {string} [datasourceid] Datasource ID.
29 * @param {string} [datatableid] Datatable ID.
30 * @return {object} json structure listing all dimensions.
31 */
32exports.index = exports.list = {
33 name: 'metrics/list',
34 description: 'i list all metrics available',
35 inputs: {
36 required: [],
37 optional: ['datasourceid', 'datatableid']
38 },
39 outputExample: {},
40 permission: ['access_system'],
41 run: function (req, res) {
42 var response = {};
43
44 if (!req.user)
45 return router.responseError(new router.AuthErrorTemplate('Missing user token'), req, res);
46
47 var metrics = _metrics.list(req.params.datasourceid, req.params.datatableid);
48
49 if (!metrics)
50 return router.responseError(new router.ErrorTemplate('Failed to find metric'), req, res);
51
52 var __metrics = [];
53 _.each(metrics, function (m) {
54 if (auth.hasRole(m.roles, req.user._roles)) {
55 __metrics.push(m);
56 }
57 });
58
59 response.metrics = __metrics;
60 return router.responseSuccess(response, req, res);
61 }
62};
63
64/**
65 * Lists all available dimensions. You can provide parameters and ask for a specific data source and datatable.
66 *
67 * The returned list will contain only dimensions authorized for the authenticated user.
68 *
69 * @method get
70 * @param {string} [dimensionid] Dimension ID.
71 * @return {object} json structure holding the dimension details.
72 */
73exports.get = {
74 name: 'metrics/get',
75 description: 'i get a specific metric',
76 inputs: {
77 required: ['id'],
78 optional: []
79 },
80 outputExample: {},
81 permission: ['access_system'],
82 run: function (req, res) {
83 var response = {};
84 response.metric = null;
85
86 if (!req.user)
87 return router.responseError(new router.AuthErrorTemplate('Missing user token'), req, res);
88
89 var metric = _metrics.get(req.params.id);
90 if (!metric)
91 return router.responseError(new router.ErrorTemplate('Failed to find metric'), req, res);
92
93 if (auth.hasRole(metric.roles, req.user._roles))
94 response.metric = metric;
95 return router.responseSuccess(response, req, res);
96 }
97};
98
99/**
100 * Validates the dimension database integrity.
101 *
102 * @method get
103 * @param {string} [dimensionid] Dimension ID.
104 * @return {object} json structure holding the validation details.
105 */
106exports.validate = {
107 name: 'metrics/validate',
108 description: 'i validate a specific metric',
109 inputs: {
110 required: ['id'],
111 optional: []
112 },
113 outputExample: {},
114 permission: ['manage_system'],
115 run: function (req, res) {
116 var response = {};
117 var metric = _metrics.get(req.params.id);
118 var datatable = _datatables.get(metric.datatableid);
119 var datasource = _datasources.get(datatable.datasourceid);
120 var query = connector.createQuery();
121
122 response.metric = ce.clone(metric);
123 response.validated = false;
124
125 query.sql = 'SELECT ' + metric.column + ' FROM ' + datatable.name + ';';
126 query.limit = 1;
127 query.datasource = datasource;
128 connector.executeQuery(query, function (query, rows, fields, error) {
129 response.queryInformation = ce.clone(query);
130 if (error)
131 throw error;
132 else {
133 response.validated = true;
134 }
135 return router.responseSuccess(response, req, res);
136 });
137 }
138};
139
140exports.values = {
141 name: 'metrics/values',
142 description: 'i query for all values available for a metric (limit 100)',
143 inputs: {
144 required: ['metricid'],
145 optional: []
146 },
147 outputExample: {},
148 permission: ['manage_system'],
149 run: function (req, res) {
150 var response = {};
151
152 var metric = _metrics.get(req.params.metricid);
153 var datatable = _datatables.get(metric.datatableid);
154 var datasource = _datasources.get(datatable.datasourceid);
155 var query = connector.createQuery();
156
157 response.metric = ce.clone(metric);
158
159 query.sql = 'SELECT ' + metric.column + ' FROM ' + datatable.name + ';';
160 query.limit = 100;
161 query.datasource = datasource;
162 connector.executeQuery(query, function (query, rows, fields, error) {
163 response.queryInformation = ce.clone(query);
164 if (error)
165 throw error;
166 else {
167 response.values = [];
168 if (typeof(rows) == 'Array') {
169 rows.forEach(function (row) {
170 response.values.push(row[metric.column]);
171 });
172 }
173 }
174 return router.responseSuccess(response, req, res);
175 });
176 }
177};
\No newline at end of file