diff --git a/src/api/controllers/collect.ts b/src/api/controllers/collect.ts index 3e0680885c8df42f2232e4e5f66bb61756dc5495..4939c3d9bc72c7dc8e699da9afa0e4b4f4530714 100644 --- a/src/api/controllers/collect.ts +++ b/src/api/controllers/collect.ts @@ -19,7 +19,7 @@ */ import * as express from "express"; -import { Request } from "../types"; +import Request from "../types"; import { Source, Field } from "../../core/source"; import { EnumType } from "../../core/enumType"; import { DataType } from "../../common/types"; @@ -31,7 +31,7 @@ import { EnumHandler } from "../../util/enumHandler"; * objetct is a valid object of that type * or false otherwise. */ -interface Valid{ +interface Valid { [key: string]: (value: any) => boolean; } @@ -47,71 +47,64 @@ export class CollectCtrl { * @param next - Call next middleware or controller. Not used but required * by typescript definition of route. */ - public static write(req: Request, res: express.Response, next: express.NextFunction) { - + public static write( + req: Request, + res: express.Response, + next: express.NextFunction + ) { const validador: Valid = { - "integer": function(value: any) { + integer: function (value: any) { let test = parseInt(value, 10); - if (test === undefined || isNaN(value) ) { + if (test === undefined || isNaN(value)) { return false; - } - - else { + } else { return true; } }, - "float": function(value: any) { + float: function (value: any) { let test = parseFloat(value); - if (test === undefined || isNaN(value) ) { + if (test === undefined || isNaN(value)) { return false; - } - - else { + } else { return true; } }, - "string": function(value: any) { - let test = typeof(value); + string: function (value: any) { + let test = typeof value; if (test === "string") { return true; - } - - else{ + } else { return false; } }, - "date": function(value: any) { - + date: function (value: any) { let test: string[] = []; let date = new Date(value); try { test = date.toISOString().split("T"); - } - catch (e) { + } catch (e) { return false; } - if (test[0] === value){ + if (test[0] === value) { return true; - } - else{ + } else { return false; } - }, - "boolean": function(value: any) { - let test = typeof(value); - if(test === "boolean"){ + boolean: function (value: any) { + let test = typeof value; + if (test === "boolean") { return true; - }else{ + } else { let test: string = value; test = test.toLocaleLowerCase(); - if (test === "true" || test === "false"){ + if (test === "true" || test === "false") { return true; - }else{ + } else { return false; } } - } + }, }; let fields: Field[] = []; @@ -127,76 +120,103 @@ export class CollectCtrl { fields = source.fields; - for (let i = 0; i < fields.length; i++){ + for (let i = 0; i < fields.length; i++) { data[i] = req.body[fields[i].name]; // check if the data is empty, however since data may be // true/false, it must guarantee that it isn't a boolean // then it'll test if it's empty - if (!(typeof(data[i]) === "boolean") && !data[i]){ - const message = "[Collect error] '" + fields[i].name + - "' is mandatory, but no data was received. Review the data sent." + if (!(typeof data[i] === "boolean") && !data[i]) { + const message = + "[Collect error] '" + + fields[i].name + + "' is mandatory, but no data was received. Review the data sent."; throw new Error(message); } - req.log.debug("Sucessfuly accepted the data: " + data[i] + " from source: ",source.name); + req.log.debug( + "Sucessfuly accepted the data: " + + data[i] + + " from source: ", + source.name + ); } - for (let i = 0; i < fields.length; i++){ + for (let i = 0; i < fields.length; i++) { // check if it's a valid enumtype - if (fields[i].dataType === DataType.ENUMTYPE){ + if (fields[i].dataType === DataType.ENUMTYPE) { enumType = req.engine.getEnumTypeByName(fields[i].enumType); types = enumType.values; let found: boolean = false; - for (let j = 0; j < types.length; j++){ - if (data[i] === types[j]){ - found = true; - break; + for (let j = 0; j < types.length; j++) { + if (data[i] === types[j]) { + found = true; + break; } } if (!found) { - const message = "[Collect error] EnumType: '" + data[i] + "' from '" + fields[i].name + - "' isn't allowed on " + fields[i].enumType + - ". Review configuration files." + const message = + "[Collect error] EnumType: '" + + data[i] + + "' from '" + + fields[i].name + + "' isn't allowed on " + + fields[i].enumType + + ". Review configuration files."; throw new Error(message); } - }else if (!validador[EnumHandler.stringfyDataType(fields[i].dataType)](data[i]) === true){ - const message = "[Collect error] Datatype: '" + data[i] + "' from '" + fields[i].name + - "' could not be converted to type: " + [EnumHandler.stringfyDataType(fields[i].dataType)] + - ". Review configuration files." - throw new Error(message); + } else if ( + !validador[ + EnumHandler.stringfyDataType(fields[i].dataType) + ](data[i]) === true + ) { + const message = + "[Collect error] Datatype: '" + + data[i] + + "' from '" + + fields[i].name + + "' could not be converted to type: " + + [EnumHandler.stringfyDataType(fields[i].dataType)] + + ". Review configuration files."; + throw new Error(message); } - req.log.debug("Sucessfuly accepted the enumType data: " + data[i] + " from source: ",source.name); + req.log.debug( + "Sucessfuly accepted the enumType data: " + + data[i] + + " from source: ", + source.name + ); } - } - - catch (e) { - const message = "Query execution failed: " + - "Could not construct query with the given parameters." + } catch (e) { + const message = + "Query execution failed: " + + "Could not construct query with the given parameters."; req.log.warn(message); res.status(500).json({ message: message, - error: e.message - }); + error: e.message, + }); return; } - req.adapter.insertIntoSource(source, req.body, (err: Error, result: any[]) => { - if (err) { - const message = "Insertion has failed"; - req.log.error(message,err); - res.status(500).json({ - message: message, - error: err - }); - return; - } - else{ - const message = "Data has been successfully received and stored by the server"; - req.log.info(message); - res.status(200).json({message: message}); - return; + req.adapter.insertIntoSource( + source, + req.body, + (err: Error, result: any[]) => { + if (err) { + const message = "Insertion has failed"; + req.log.error(message, err); + res.status(500).json({ + message: message, + error: err, + }); + return; + } else { + const message = + "Data has been successfully received and stored by the server"; + req.log.info(message); + res.status(200).json({ message: message }); + return; + } } - - }); - + ); } } diff --git a/src/api/controllers/data.ts b/src/api/controllers/data.ts index 2dbd01b6d9bdf0775c02709f29029cff78f5d9ff..d332d0c4277b9b77be6d3ae96179d741c5c62c66 100644 --- a/src/api/controllers/data.ts +++ b/src/api/controllers/data.ts @@ -19,7 +19,7 @@ */ import * as express from "express"; -import { Request } from "../types"; +import Request from "../types"; import { Query, QueryOpts } from "../../common/query"; /** @@ -34,34 +34,49 @@ export class DataCtrl { * @param next - Call next middleware or controller. Not used but required * by typescript definition of route. */ - public static read(req: Request, res: express.Response, next: express.NextFunction) { - req.log.info("Query: ",req.query); - let metrics = req.query.metrics.split(",").filter((item: string) => item !== ""); - let dimensions = req.query.dimensions.split(",").filter((item: string) => item !== ""); - let clauses = []; + public static read( + req: Request, + res: express.Response, + next: express.NextFunction + ) { + req.log.info("Query: ", req.query); + let metrics = (<string>req.query.metrics) + .split(",") + .filter((item: string) => item !== ""); + let dimensions = (<string>req.query.dimensions) + .split(",") + .filter((item: string) => item !== ""); + let clauses: string[] = []; + let sort: string[] = []; if (req.query.filters) { - clauses = req.query.filters.split(";").filter((item: string) => item !== ""); + clauses = (<string>req.query.filters) + .split(";") + .filter((item: string) => item !== ""); } if (req.query.sort) { - sort = req.query.sort.split(",").filter((item: string) => item !== ""); + sort = (<string>req.query.sort) + .split(",") + .filter((item: string) => item !== ""); } let format = "json"; if (req.query.format) { - format = req.query.format; + format = <string>req.query.format; } let view; try { - const qOpt: QueryOpts = { metrics: [], dimensions: []}; + const qOpt: QueryOpts = { metrics: [], dimensions: [] }; let query = new Query(qOpt); for (let i = 0; i < metrics.length; ++i) { query.metrics.push(req.engine.getMetricByName(metrics[i])); } for (let i = 0; i < dimensions.length; ++i) { - query.dimensions.push(req.engine.getDimensionByName(dimensions[i])); + query.dimensions.push( + req.engine.getDimensionByName(dimensions[i]) + ); } for (let i = 0; i < clauses.length; ++i) { @@ -71,68 +86,70 @@ export class DataCtrl { for (let i = 0; i < sort.length; ++i) { const m = query.metrics.find((item) => item.name === sort[i]); if (!m) { - const d = query.dimensions.find((item) => item.name === sort[i]); + const d = query.dimensions.find( + (item) => item.name === sort[i] + ); if (!d) { throw new Error( - "The item '" + sort[i] + - "' is not present in neither metrics nor dimensions list"); - } - else { + "The item '" + + sort[i] + + "' is not present in neither metrics nor dimensions list" + ); + } else { query.sort.push(d); } - } - - else { + } else { query.sort.push(m); } - } view = req.engine.query(query); - } - catch (e) { - const message = "Query execution failed: " + - "Could not construct query with the given parameters." - req.log.warn(message,e); + } catch (e) { + const message = + "Query execution failed: " + + "Could not construct query with the given parameters."; + req.log.warn(message, e); res.status(500).json({ message: message, - error: e.message - }); + error: e.message, + }); return; } req.adapter.getDataFromView(view, (err: Error, result: any[]) => { if (err) { - const message = "Query execution failed " + - "failed on execute query on database." - req.log.error(message,err); + const message = + "Query execution failed " + + "failed on execute query on database."; + req.log.error(message, err); res.status(500).json({ message: message, - error: err - }); + error: err, + }); return; } if (format === "json") { req.log.info("Response (json) send with success"); res.status(200).json(result); - } - - else { + } else { req.csvParser(result, format, (error: Error, csv: string) => { if (error) { - const message = "Error generating csv file. " + - "Try json format." - req.log.error(message,error); + const message = + "Error generating csv file. " + "Try json format."; + req.log.error(message, error); res.status(500).json({ message: message, - error: error + error: error, }); return; } req.log.info("Response (csv) send with success"); res.setHeader("Content-Type", "text/csv"); - res.setHeader("Content-disposition", "attachment;filename=data.csv"); + res.setHeader( + "Content-disposition", + "attachment;filename=data.csv" + ); res.status(200).send(csv); }); } diff --git a/src/api/controllers/engine.ts b/src/api/controllers/engine.ts index 998c14e3bf645e892f9bdfd8f7352d1c2bff8aa7..1a34762efaaac6fb8c03e50e0e9be682de4cc99d 100644 --- a/src/api/controllers/engine.ts +++ b/src/api/controllers/engine.ts @@ -19,7 +19,7 @@ */ import * as express from "express"; -import { Request } from "../types"; +import Request from "../types"; /** * Constroller responsable for the static part from the API. In other @@ -35,25 +35,29 @@ export class EngineCtrl { * @param next - Call next middleware or controller. Not used but required * by typescript definition of route. */ - private static respondList(list: any[], fileName: string, req: Request, res: express.Response, next: express.NextFunction) { + private static respondList( + list: any[], + fileName: string, + req: Request, + res: express.Response, + next: express.NextFunction + ) { let format = "json"; if (req.query.format) { - format = req.query.format; + format = <string>req.query.format; } if (format === "json") { req.log.info("Response (json) send with success"); res.status(200).json(list); - } - - else { + } else { req.csvParser(list, format, (error: Error, csv: string) => { if (error) { - req.log.error("Error generating csv file: ",error); + req.log.error("Error generating csv file: ", error); res.status(500).json({ - message: "Error generating csv file. " + - "Try json format.", - error: error + message: + "Error generating csv file. " + "Try json format.", + error: error, }); return; } @@ -74,8 +78,14 @@ export class EngineCtrl { * @param next - Call next middleware or controller. Not used but required * by typescript definition of route. */ - public static metrics(req: Request, res: express.Response, next: express.NextFunction) { - const metrics = req.engine.getMetricsDescription(req.query.tags); + public static metrics( + req: Request, + res: express.Response, + next: express.NextFunction + ) { + const metrics = req.engine.getMetricsDescription( + <string>req.query.tags + ); EngineCtrl.respondList(metrics, "metrics", req, res, next); } @@ -86,8 +96,14 @@ export class EngineCtrl { * @param next - Call next middleware or controller. Not used but required * by typescript definition of route. */ - public static dimensions(req: Request, res: express.Response, next: express.NextFunction) { - const dimensions = req.engine.getDimensionsDescription(req.query.tags); + public static dimensions( + req: Request, + res: express.Response, + next: express.NextFunction + ) { + const dimensions = req.engine.getDimensionsDescription( + <string>req.query.tags + ); EngineCtrl.respondList(dimensions, "dimensions", req, res, next); } @@ -98,7 +114,11 @@ export class EngineCtrl { * @param next - Call next middleware or controller. Not used but required * by typescript definition of route. */ - public static enumTypes(req: Request, res: express.Response, next: express.NextFunction) { + public static enumTypes( + req: Request, + res: express.Response, + next: express.NextFunction + ) { const enumTypes = req.engine.getEnumTypesDescription(); EngineCtrl.respondList(enumTypes, "enums", req, res, next); } @@ -110,9 +130,13 @@ export class EngineCtrl { * @param next - Call next middleware or controller. Not used but required * by typescript definition of route. */ - public static sources(req: Request, res: express.Response, next: express.NextFunction) { - const sources = req.engine.getSourcesDescription(); - EngineCtrl.respondList(sources, "sources", req, res, next); + public static sources( + req: Request, + res: express.Response, + next: express.NextFunction + ) { + const sources = req.engine.getSourcesDescription(); + EngineCtrl.respondList(sources, "sources", req, res, next); } /** @@ -122,8 +146,12 @@ export class EngineCtrl { * @param next - Call next middleware or controller. Not used but required * by typescript definition of route. */ - public static tags(req: Request, res: express.Response, next: express.NextFunction) { - const tags = req.engine.getTagsDescription(); - EngineCtrl.respondList(tags, "tags", req, res, next); + public static tags( + req: Request, + res: express.Response, + next: express.NextFunction + ) { + const tags = req.engine.getTagsDescription(); + EngineCtrl.respondList(tags, "tags", req, res, next); } }