Initial commit

This commit is contained in:
2021-08-02 17:04:26 +02:00
commit fe1c8c4c15
15 changed files with 5058 additions and 0 deletions

View File

@@ -0,0 +1,88 @@
import mqtt from 'mqtt'
import config from '../config/config.js'
import request from 'request';
export default class MqttManager{
constructor(){}
init(){
this.messageHandlers = []
this.client = mqtt.connect(config.mqtt.url, config.mqtt.options)
console.log("[MQTT] Connected to MQTT broker ["+config.mqtt.url+"].");
this.ready = true
this.client.on('message', (topic, message) => {
if(this.getSubscribedTopics().includes(topic)){
console.log("[MQTT] Got message ["+message+"] on handled topic ["+topic+"].");
const suitingMessageHandlers = this.messageHandlers.filter(handler => handler.topic == topic && handler.message == message);
suitingMessageHandlers.forEach(handler => {
console.log("[MQTT] Sending web request ["+handler.requestUrl+"].");
request(handler.requestUrl, { json: true }, (err, res, body) => {
if (err) {
console.log("[MQTT] Error sending web request ["+handler.requestUrl+"].");
}else{
console.log("[MQTT] Sent web request ["+handler.requestUrl+"].");
}
});
});
}else{
console.log("[MQTT] Got message ["+message+"] on unhandled topic ["+topic+"].");
}
});
}
subscribe(topic){
this.client.subscribe(topic, function(err){
if(err != null){
console.log("[MQTT] Error subscribing to topic ["+topic+"].");
}else{
console.log("[MQTT] Subscribed to topic ["+topic+"].");
}
});
}
unsubscribe(topic){
this.client.unsubscribe(topic, function(err){
if(err != null){
console.log("[MQTT] Error unsubscribing to topic ["+topic+"].");
}else{
console.log("[MQTT] Unsubscribed to topic ["+topic+"].");
}
});
}
publishMessage(topic, message){
this.client.publish(topic, message);
console.log("[MQTT] Publishing message ["+message+"] in topic ["+topic+"].");
}
getSubscribedTopics(){
return this.messageHandlers.map(h => h.topic);
}
addMessageHandler(messageHandler){
if(!this.getSubscribedTopics().includes(messageHandler.topic)){
this.subscribe(messageHandler.topic)
}
this.messageHandlers.push(messageHandler);
console.log("[MQTT] Added new message handler ["+JSON.stringify(messageHandler)+"].");
}
removeMessageHandler(messageHandler){
const messageHandlerIndex = this.messageHandlers.findIndex(handler => handler.topic == messageHandler.topic && handler.message == messageHandler.message && handler.requestUrl == messageHandler.requestUrl);
if(messageHandlerIndex != -1){
this.messageHandlers = this.messageHandlers.splice(messageHandlerIndex,1);
console.log("[MQTT] Removed message handler ["+JSON.stringify(messageHandler)+"].");
}else{
console.log("[MQTT] Error removing message handler ["+JSON.stringify(messageHandler)+"].");
}
if(!this.getSubscribedTopics().includes(messageHandler.topic)){
this.unsubscribe(messageHandler.topic)
}
}
}

View File

@@ -0,0 +1,71 @@
import sqlite3 from'sqlite3'
import { open } from 'sqlite'
/**
* Manager for handling the sqlite database
*/
export default class SqliteManager{
constructor(){}
async init(){
sqlite3.verbose()
await open({filename: './database/loginbase.db', driver: sqlite3.Database}).then(
(db) => {
console.log('[SQLITE] Connected to the loginbase database.');
db.run("CREATE TABLE IF NOT EXISTS users (email TEXT PRIMARY KEY, password TEXT)");
console.log('[SQLITE] Created users table if it didnt exist.');
db.run("CREATE TABLE IF NOT EXISTS handlers (topic TEXT, message TEXT, requestUrl TEXT)");
console.log('[SQLITE] Created handlers table if it didnt exist.');
this.database = db
this.ready = true
})
}
async getUser(email){
const result = await this.database.get('SELECT * FROM users WHERE email = ?', email)
console.log('[SQLITE] Got user from database ['+JSON.stringify(result.email)+'].')
return result
}
async addUser(email, password){
try{
await this.database.run(`INSERT INTO users(email, password) VALUES(:email, :password)`, {':email': email, ':password':password});
console.log("[SQLITE] Inserted new user("+email+").")
return true
}catch(err){
console.log("[SQLITE] Failed inserting new user("+email+"): "+err)
return false
}
}
async getHandlers(){
const result = await this.database.all('SELECT * FROM handlers')
console.log('[SQLITE] Got handlers from database ['+JSON.stringify(result)+'].')
return result
}
async addHandler(topic, message, requestUrl){
try{
await this.database.run(`INSERT INTO handlers(topic, message, requestUrl) VALUES(:topic, :message, :requestUrl)`, {':topic': topic, ':message':message, ':requestUrl': requestUrl});
console.log("[SQLITE] Inserted new handler [topic: "+topic+", message: "+message+", requestUrl: "+requestUrl+"].")
return true
}catch(err){
console.log("[SQLITE] Failed inserting new handler [topic: "+topic+", message: "+message+", requestUrl: "+requestUrl+"].")
return false
}
}
async removeHandler(topic, message, requestUrl){
const result = await this.database.run('DELETE FROM handlers WHERE topic = :topic AND message = :message AND requestUrl = :requestUrl', {':topic': topic, ':message': message, ':requestUrl': requestUrl})
if(result.changes>=1){
console.log("[SQLITE] Deleted message handler [topic: "+topic+", message: "+message+", requestUrl: "+requestUrl+"].")
}else{
console.log("[SQLITE] Failed deleting message handler [topic: "+topic+", message: "+message+", requestUrl: "+requestUrl+"].")
}
return result
}
}