pointsight/apiHandler/autobahn/main.js

189 lines
5.0 KiB
JavaScript
Raw Normal View History

2022-03-06 18:36:36 +01:00
var fs = require("fs");
const bent = require("bent");
const mysql = require("mysql");
const tools = require("../../functions");
let con = undefined;
function initialize(connection) {
con = connection;
var array = fs
.readFileSync("./apiHandler/autobahn/db_table_config.sql")
.toString()
.split("\n");
for (i in array) {
con.query(array[i], function (err, result) {
tools.handleMysqlErrors(err, getModuleMeta().title);
console.log("Table created for autobahn");
});
}
const roadURL = "https://verkehr.autobahn.de/o/autobahn/";
const baseURL = "https://verkehr.autobahn.de/o/autobahn/#/services/webcam";
var hws = [];
var index_count_cams = 0;
console.log(
"[" +
getModuleMeta().title +
"] Starting requests"
);
const roadRequest = bent(roadURL, "GET", "json", 200);
roadRequest().then(
function (body) {
hws = body.roads;
for (h in hws) {
if (!hws[h].includes("/")) {
let camRequest = bent(
baseURL.replace("#", hws[h]),
"GET",
"json",
200
);
camRequest().then(
function (body) {
for (var i in body.webcam) {
var q =
"INSERT INTO autobahn (name, source_id, loc, protocol_id, link) VALUES (?, ?, POINT(?, ?), 0, ?)"
if (body.webcam[i].linkurl != "") {
index_count_cams += 1;
con.query(q, [body.webcam[i].title, getModuleMeta().exactName, body.webcam[i].coordinate.lat, body.webcam[i].coordinate.long, body.webcam[i].linkurl], function (err, result) {
tools.handleMysqlErrors(err, getModuleMeta().title);
});
}
}
},
function (err) {
console.warn(
"[" +
getModuleMeta().title +
"] Was unable to resolve request with error: " +
err
);
}
);
}
}
},
function (err) {
console.warn(
"[" +
getModuleMeta().title +
"] Was unable to resolve request with error: " +
err
);
}
);
console.log(
"[" +
getModuleMeta().title +
"] Done"
);
}
function queryData(boundNorthEastLatLng, boundSouthWestLatLng, 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.
var connection = con;
let elementsToQuery = "*";
if (minimal) {
elementsToQuery = "id,loc,source_id";
}
const sqlQuery = " \
SELECT " + elementsToQuery + " \
FROM autobahn \
WHERE MBRContains( \
GeomFromText( 'LINESTRING(? ?,? ?)' ), \
loc)";
connection.query(
sqlQuery,
[boundNorthEastLatLng.lat, boundNorthEastLatLng.lng, boundSouthWestLatLng.lat, boundSouthWestLatLng.lng],
function (err, rows, fields) {
// Call reject on error states,
// call resolve with results
if (err) {
return reject(err);
}
let results = [];
for (let e = 0; e < rows.length; e++) {
const currentRow = rows[e];
element = {
type: "webcam-iframe",
source: "Autobahn",
titel: currentRow.name,
description: "An example webcam with a url",
url: currentRow.link,
uid: currentRow.source_id + "_" + currentRow.id,
location: currentRow.loc,
icon: "cctvIcon",
};
if (minimal) {
const stripableElements = ["title", "description", "url", "type"];
for (h in stripableElements) {
delete element[stripableElements[h]];
}
}
results.push(element);
}
resolve(results);
}
);
});
}
function queryItem(uid) {
const uidParts = uid.split("_");
const sqlQuery = "SELECT * FROM " + getModuleMeta().exactName + " WHERE id=?";
return new Promise(function (resolve, reject) {
con.query(sqlQuery, [parseInt(uidParts[1])], function (err, rows, fields) {
if (err) {
return reject(err);
}
const results = [];
for (let e = 0; e < rows.length; e++) {
const currentRow = rows[e];
const element = {
type: "webcam-iframe",
source: "Autobahn",
titel: currentRow.name,
description: "An example webcam with a url",
url: currentRow.link,
uid: currentRow.source_id + "_" + currentRow.id,
location: currentRow.loc,
icon: "cctvIcon",
};
results.push(element);
}
resolve(results);
});
});
}
function getModuleMeta() {
return {
title: "Autobahn",
exactName: "autobahn",
country: ["DEU"],
tags: ["webcam"],
limited: false,
};
}
module.exports = { initialize, queryData, getModuleMeta, queryItem };