Files
sensorapi/databases/mongo.js
T
2023-03-08 16:17:02 +01:00

253 lines
7.5 KiB
JavaScript

/* Interface for MongoDB
*/
import { MongoClient } from 'mongodb'
import { logit, logerror } from '../utilities/logit.js'
import { DateTime } from 'luxon'
import {returnOnError} from "../utilities/reporterror.js";
// const nodemailer = require('nodemailer');
let MONGOHOST = process.env.MONGOHOST;
let MONGOPORT = process.env.MONGOPORT;
let MONGOAUTH = process.env.MONGOAUTH;
let MONGOUSRP = process.env.MONGOUSRP;
let MONGOBASE = process.env.MONGOBASE;
if (MONGOHOST === undefined) { MONGOHOST = 'localhost';}
if (MONGOPORT === undefined) { MONGOPORT = 27097; }
if (MONGOAUTH === undefined) { MONGOAUTH = 'false'; }
if (MONGOBASE === undefined) { MONGOBASE = 'allsensors'; }
let MONGO_URL = 'mongodb://'+MONGOHOST+':'+MONGOPORT; // URL to mongo database
if (MONGOAUTH === 'true') {
MONGO_URL = 'mongodb://'+MONGOUSRP+'@' + MONGOHOST + ':' + MONGOPORT + '/?authSource=' + MONGOBASE; // URL to mongo database
}
let statistics = {}
let client
export const connectMongo = async () => {
try {
logit(`Try to connect to ${MONGO_URL}`)
// let client = await MongoClient.connect(MONGO_URL, { useNewUrlParser: true , useUnifiedTopology: true })
let client = await MongoClient.connect(MONGO_URL)
logit(`Mongodbase connected to ${MONGO_URL}`)
return client
}
catch(error){
throw(error)
}
}
export const closeMongo = async (client) => {
client.close()
}
const listDatabases = async (client) => {
let databasesList = await client.db().admin().listDatabases();
console.log("Databases:");
databasesList.databases.forEach(db => console.log(` - ${db.name}`));
}
/* ***************************************************
// READ routines
******************************************************/
// Read properties from the database
export const readProperties = async (query, limit = 0) => {
let ret = {err: null, values: null}
client = await connectMongo()
try {
if ("sid" in query) { // if sid is given, read property for sid
ret.values = await client.db(MONGOBASE).collection("properties").findOne({_id: query.sid})
} else { // otherwise read props corresponding to query
ret.values = await client.db(MONGOBASE).collection("properties").find(query).limit(limit).toArray()
}
} catch (e) {
ret.err = e
}
finally {
await closeMongo(client)
client = null
}
return ret
}
// read mapdata from database
export const readMapdata = async (query, limit) => {
let ret = {err: null, values: []}
client = await connectMongo()
try {
ret.values = await client.db(MONGOBASE).collection("mapdata").find(query).limit(limit).toArray()
} catch (e) {
ret.err = e
}
finally {
await closeMongo(client)
client = null
}
return ret
}
export const getallProperties = async (client) => {
return await client.db(MONGOBASE).collection("properties")
.find().toArray()
}
export const getOneproperty = async (sid) => {
let ret = {error: false}
client = await connectMongo()
try {
ret.properties = await client.db(MONGOBASE).collection("properties")
.findOne({_id: sid})
} catch (e) {
ret = {error: true, errortext: e}
}
finally {
await closeMongo(client)
client = null
}
return ret
}
export const doAggregate = async (coll, query, conn, clos) => {
let ret = {error: false}
if (conn) {
client = await connectMongo()
}
try {
ret.values = await client.db(MONGOBASE).collection(coll).aggregate(query).toArray()
} catch (e) {
ret = {error: true, errortext: e}
}
finally {
if (clos) {
await closeMongo(client)
client = null
}
}
return ret
}
export const writeOneproperty = async (client, prop) => {
try {
let result = await client.db(MONGOBASE).collection("properties")
.insertOne(prop)
} catch(e) {
if (e.code === 11000) {
return false
} else {
throw(e)
}
}
return true
}
export const writeProperties = async (client, props) => {
let start = DateTime.now();
if (props.new.length !== 0) {
try {
let result = await client.db(MONGOBASE).collection("properties")
.insertMany(props.new)
} catch (e) {
console.error(e)
}
}
if (props.loc.length !== 0) {
try {
for (let item of props.loc) {
let result = await client.db(MONGOBASE).collection("properties")
.updateOne({_id: item._id}, {
$set: {location_id: item.location_id},
$push: {location: { $each: [item.location[0]], $position: 0}}
})
}
} catch (e) {
console.error(e)
}
}
if (props.sname.lenth !== 0) {
try {
for (let item of props.sname) {
let result = await client.db(MONGOBASE).collection("properties")
.updateOne({_id: item._id}, {
$set: {name: item.name, since: item.since}
})
}
} catch (e) {
console.error(e)
}
}
statistics.writePropsTime = DateTime.now().diff(start, ['seconds']).toObject().seconds
logit(`Write properties to mongoDB: ${statistics.writePropsTime} sec.`)
}
export const writeDataArray = async (data, collection, conn, clos) => {
let start = DateTime.now();
let result
if (conn) {
client = await connectMongo()
}
try {
result = await client.db(MONGOBASE).collection(collection)
.insertMany(data)
} catch (e) {
console.error(e)
} finally {
if(clos) {
await closeMongo(client)
client = null
}
}
statistics.writeDataTime = DateTime.now().diff(start, ['seconds']).toObject().seconds
logit(`Write Data to mongoDB: ${statistics.writeDataTime} sec.`)
return result
}
export const writeStatistic = async (client, stat) => {
let start = DateTime.now();
let entry = { timestamp: new Date(), ...stat }
try {
let result = await client.db(MONGOBASE).collection("statistics")
.insertOne(entry)
} catch (e) {
console.error(e)
}
statistics.writeStatisticTime = DateTime.now().diff(start, ['seconds']).toObject().seconds
logit(`Write statistics to mongoDB: ${statistics.writeStatisticTime} sec.`)
}
export const readAKWs = async (options) => {
let ret = {values: { akws: [], th1_akws: []}, err: null}
let erg = []
client = await connectMongo()
try {
let docs = await client.db(MONGOBASE).collection("akws")
.find().toArray()
if(docs == null) {
return returnOnError(ret, 'akws - docs == null', readAKWs.name)
}
logit(`getawkdata: data fetched from akws, length= ${docs.length}`);
ret.values.akws = docs
let docs1 = await client.db(MONGOBASE).collection("th1_akws")
.find().toArray()
if(docs1 == null) {
return returnOnError(ret, 'th1_akws - docs == null', readAKWs.name)
}
logit(`getawkdata: data fetched from th1_akws, length= ${docs1.length}`)
ret.values.th1_akws = docs1
} catch (e) {
return returnOnError(ret, e, readAKWs.name)
}
finally {
await closeMongo(client)
client = null
}
return ret
}