115 lines
3.5 KiB
JavaScript
115 lines
3.5 KiB
JavaScript
|
const fs = require("fs");
|
||
|
const request = require("request");
|
||
|
const mysql = require("mysql");
|
||
|
const tools = require("../../functions");
|
||
|
|
||
|
let con = undefined;
|
||
|
|
||
|
function initialize(conection) {
|
||
|
console.error("!! THE EXAMPLE MODULE HAS BEEN ENABLED, NEVER ENABLE TO EXAMPLE MODULE !!")
|
||
|
con = conection;
|
||
|
const filePath = "./apiHandler/" + getModuleMeta().exactName + "/db_table_config.sql"
|
||
|
const array = fs
|
||
|
.readFileSync(filePath)
|
||
|
.toString()
|
||
|
.split("\n");
|
||
|
|
||
|
for (i in array) {
|
||
|
con.query(array[i], function (err, result) {
|
||
|
if (err) throw err;
|
||
|
console.log("Table created for " + getModuleMeta().title);
|
||
|
});
|
||
|
}
|
||
|
|
||
|
const requestURL = "https://example.com/api.json";
|
||
|
const mysqlQuery = "INSERT INTO " + getModuleMeta().exactName + " (" + getModuleMeta().exactName + "_id, " + getModuleMeta().exactName + "_name, " + getModuleMeta().exactName + "_description, source_id, " + getModuleMeta().exactName + "_loc_lat, " + getModuleMeta().exactName + "_loc_lng, " + getModuleMeta().exactName + "_protocol_id, " + getModuleMeta().exactName + "_link) VALUES (?, ?, ?, ?, ?, ?, ?, ?)";
|
||
|
|
||
|
request(requestURL, { json: true }, (err, res2, body) => {
|
||
|
if (err) {
|
||
|
throw err;
|
||
|
}
|
||
|
console.log("[" + getModuleMeta().title + "] Request done")
|
||
|
for (let c = 0; c < body.length; c++) {
|
||
|
|
||
|
const elm = body[c];
|
||
|
con.query(mysqlQuery, [c, elm.name, "", 0, elm.currentLocation.coordinates[1], elm.currentLocation.coordinates[0], 0, "https://api.opensensemap.org/boxes/" + elm._id], function (err, result) {
|
||
|
if (err) { throw (err) }
|
||
|
})
|
||
|
}
|
||
|
console.log("[" + getModuleMeta().title + "] Insert into Database done!")
|
||
|
});
|
||
|
}
|
||
|
|
||
|
function queryData(lat, lng, radius, minimal) {
|
||
|
/*
|
||
|
radius in km
|
||
|
|
||
|
*/
|
||
|
|
||
|
return new Promise(function (resolve, reject) {
|
||
|
// The Promise constructor should catch any errors thrown on
|
||
|
// this tick. Alternately, try/catch and reject(err) on catch.
|
||
|
|
||
|
let elementsToQuery = "*";
|
||
|
if (minimal) {
|
||
|
elementsToQuery = "id,loc_lat,loc_lng,source_id";
|
||
|
}
|
||
|
|
||
|
const sqlQuery =
|
||
|
"SELECT \
|
||
|
" +
|
||
|
elementsToQuery +
|
||
|
", \
|
||
|
( 6371 \
|
||
|
* acos( cos( radians(?) ) \
|
||
|
* cos( radians( " + getModuleMeta().exactName + "_loc_lat ) ) \
|
||
|
* cos( radians( " + getModuleMeta().exactName + "_loc_lng ) - radians(?) ) \
|
||
|
+ sin( radians(?) ) \
|
||
|
* sin( radians( " + getModuleMeta().exactName + "_loc_lat ) ) \
|
||
|
) \
|
||
|
) \
|
||
|
AS distance \
|
||
|
FROM " + getModuleMeta().exactName + " \
|
||
|
HAVING distance < ? \
|
||
|
ORDER BY distance";
|
||
|
|
||
|
con.query(sqlQuery, [lat, lng, lat, radius], function (err, rows, fields) {
|
||
|
// Call reject on error states,
|
||
|
// call resolve with results
|
||
|
if (err) {
|
||
|
return reject(err);
|
||
|
}
|
||
|
|
||
|
const results = [];
|
||
|
for (let e = 0; e < rows.length; e++) {
|
||
|
const currentRow = rows[e]
|
||
|
const element = {
|
||
|
"type": "request-info",
|
||
|
"source": getModuleMeta().title,
|
||
|
"titel": currentRow.example_name,
|
||
|
"description": "",
|
||
|
"url": currentRow.example_link,
|
||
|
"distance": currentRow.distance,
|
||
|
"location": {
|
||
|
"lat": currentRow.example_loc_lat,
|
||
|
"lng": currentRow.example_loc_lng
|
||
|
}
|
||
|
}
|
||
|
results.push(element)
|
||
|
}
|
||
|
resolve(results);
|
||
|
});
|
||
|
});
|
||
|
}
|
||
|
|
||
|
function getModuleMeta() {
|
||
|
return {
|
||
|
title: "Example",
|
||
|
exactName: "example",
|
||
|
country: ["*"],
|
||
|
limited: false,
|
||
|
};
|
||
|
}
|
||
|
|
||
|
module.exports = { initialize, queryData, getModuleMeta };
|