Files
lsp/db/dbcontroller.js
2025-09-17 18:05:08 +02:00

271 lines
5.8 KiB
JavaScript

const MongoClient = require('mongodb').MongoClient;
const models = require('../models')
const mongodb_hostname = process.env.MONGODB_HOST || '0.0.0.0';
const mongodb_port = process.env.MONGODB_PORT || 27017;
const mongodb_database = process.env.MONGODB_DATABASE || 'lsp';
const mongodb_url = 'mongodb://' + mongodb_hostname + ':' + mongodb_port;
const client = new MongoClient(mongodb_url, { useUnifiedTopology: true });
const bucketMaxSize = 4096;
var _db;
var _data;
var _ipx_data;
var _events;
var _alerts;
var days = function(date) {
return new Date((date - date%86400) * 1000);
}
var init = async function () {
await client.connect(function (err) {
if (err) {
console.log('MongoDB Client error');
console.log(err);
return { error: "Error connecting to DB: " + err }
} else {
_db = client.db(mongodb_database);
_devices = _db.collection('devices');
_data = _db.collection('data');
_ipx_data = _db.collection('ipx-data');
_events = _db.collection('events');
_alerts = _db.collection('alerts');
console.log('MongoDB Client connected');
////////////////////////////
// FLUSH DB BY UNCOMMENTING
// _devices.deleteMany(function(err, objects){});
// _data.deleteMany(function(err, objects){});
// _ipx_data.deleteMany(function(err, objects){});
// _events.deleteMany(function(err, objects){});
// _alerts.deleteMany(function(err, objects){});
return null;
}
});
}
var addData = async function (relay, device, element) {
try {
const model = await models.data.validateAsync(element);
await _data.updateOne(
{
device: device,
date: days(element.date),
bucketSize: { $lt: bucketMaxSize },
},
{
$addToSet: {
data: model
},
$min: { min: model.value },
$max: { max: model.value },
$inc: { bucketSize: 1 },
},
{
upsert: true
})
.then(err => {
return err;
})
} catch (err) {
return err;
}
}
var addEvent = async function (relay, device, element) {
try {
const model = await models.event.validateAsync(element);
await _events.updateOne(
{
device: device,
date: days(element.date),
bucketSize: { $lt: bucketMaxSize },
},
{
$addToSet: {
events: model
},
$min: { first: model.date },
$max: { last: model.date },
$inc: { bucketSize: 1 },
},
{
upsert: true
})
.then(err => {
return err;
})
} catch (err) {
return err;
}
}
var addAlert = async function (relay, device, element) {
try {
const model = await models.alert.validateAsync(element);
await _alerts.updateOne(
{
device: device,
relay: relay,
bucketSize: { $lt: bucketMaxSize },
},
{
$addToSet: {
alerts: model
},
$min: { first: model.date },
$max: { last: model.date },
$inc: { bucketSize: 1 },
},
{
upsert: true
})
.then(err => {
return err;
})
} catch (err) {
console.log(err)
return err;
}
}
var addIPXData = async function (relay, device, child, element) {
try {
const model = await models.ipxdata.validateAsync(element);
await _ipx_data.updateOne(
{
device: device,
child: child,
date: days(element.date),
bucketSize: { $lt: bucketMaxSize },
},
{
$addToSet: {
data: model
},
$min: { first: model.date },
$max: { last: model.date },
$inc: { bucketSize: 1 },
},
{
upsert: true
})
.then(err => {
return err;
})
} catch (err) {
return err;
}
}
var addDevice = async function (element) {
try {
const model = await models.device.validateAsync(element);
await _devices.updateOne(
{
msn: model.msn
},
{
$set: model
},
{
upsert: true
})
.then(err => {
return err;
})
} catch (err) {
return err;
}
}
var updateDevice = async function (model) {
try {
await _devices.updateOne(
{
msn: model.msn
},
{
$set: model
},
{
upsert: true
})
.then(err => {
return err;
})
} catch (err) {
return err;
}
}
var getDevice = async function (msn) {
try {
if (!msn) { throw ("msn_not_provided")}
return await _devices.findOne(
{
$or : [{relayMsn: msn}, {msn: msn}]
})
.then(element => {
return element;
})
} catch (err) {
throw err
}
}
var getDeviceChildren = async function (msn) {
try {
if (!msn) { throw ("msn_not_provided")}
return await _devices.findOne(
{
relayMsn: msn
})
.then(element => {
return element.inventory;
})
} catch (err) {
throw err
}
}
var getDeviceParents = async function (msn) {
try {
if (!msn) { throw ("msn_not_provided")}
return await _devices.find(
{
inventory: { $in: {msn: msn} }
})
.then(elements => {
return elements;
})
} catch (err) {
throw err
}
}
exports.init = init
exports.addData = addData
exports.addEvent = addEvent
exports.addAlert = addAlert
exports.addIPXData = addIPXData
exports.addDevice = addDevice
exports.updateDevice = updateDevice
exports.getDevice = getDevice
exports.getDeviceChildren = getDeviceChildren
exports.getDeviceParents = getDeviceParents