UNPKG

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