iot-firebase/IoT-Node/server.js
2020-10-05 10:08:16 +01:00

202 lines
4.6 KiB
JavaScript

let express = require('express')
let logger = require('morgan')
let bodyParser = require('body-parser')
let admin = require("firebase-admin");
let serviceAccount = require("./secrets/de-iot-firebase-adminsdk-puz9e-be74faaf8c.json");
let firebaseadmin = admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
databaseURL: "https://de-iot.firebaseio.com"
})
const axios = require('axios')
let db = admin.firestore();
let FieldValue = require('firebase-admin').firestore.FieldValue;
let auth = admin.auth();
let app = express()
app.use(bodyParser.json())
app.use(bodyParser.urlencoded({extended: true}))
app.use(logger('dev'))
app.use(express.static('views'))
app.set('view engine', 'ejs')
app.set('views', __dirname + '/views')
app.get('/', function(request, responce){
responce.render('index.ejs')
})
app.post('/submit', function(request, responce){
if (dataValidation(request)) {
let uid = authCheck(request)
if (uid) {
let data = {
timestamp: FieldValue.serverTimestamp(),
value1: request.body.var1,
value2: Number(request.body.var2),
uploader: uid
}
db.collection('logs').doc().set(data)
.then(function(){
responce.send({success:true, error:null})
})
.catch(e => (console.log(e)))
}
else {
responce.send({success:false, error:"Auth Error"})
}
}
else {
responce.send({success:false, error:"Data Validation"})
}
})
app.post('/light', async function(request, responce){
if (dataVal5(request)) {
let uid = await authCheck(request)
if (uid) {
let data = {
isOn: s2b(request.body.state),
brightness: Number(request.body.brightness),
color: String(request.body.color),
lastChangedBy: uid
}
.then(function(){
responce.send({success:true, error:null})
})
.catch(e => {
console.log(e)
responce.send({success:false, error:"Internal, " + e})
})
}
else {
responce.send({success:false, error:"Auth Error"})
}
}
else {
responce.send({success:false, error:"Data Validation"})
console.log(request.body)
}
})
app.post('/zlight', async function(request, responce){
let isOn = s2b(request.body.state)
let brightness = Number(request.body.brightness)
let color = Number(request.body.color)
let sendD = {
brightness: brightness,
temperature: color,
transition_period: 250,
power: isOn
}
console.log(sendD)
axios.post('http://192.168.1.175:8080/api/v1/devices/local/led/brightness', sendD)
.then((res) => {
console.log(`statusCode: ${res.statusCode}`)
responce.send({success:true})
})
.catch((error) => {
console.error(error)
})
})
app.post('/gst-debug', async function(request, responce){
db.collection('apiData').doc('light').get()
.then(doc => {
let data = doc.data()
responce.send({success:true, state:data.isOn})
})
})
app.post('/get-api', async function(request, responce){
if (dataVal6(request)) {
let uid = await authCheck(request)
if (uid) {
var targetService = String(request.body.service)
db.collection('apiData').doc(targetService).get()
.then(doc => {
if (!doc.exists) {
responce.send({success:false, error:"Service does not exist"})
} else {
responce.send({success:true, data:doc.data()})
}
})
.catch(e => {
responce.send({success:false, error:"Internal, " + e})
});
}
else {
responce.send({success:false, error:"Auth Error"})
}
}
else {
responce.send({success:false, error:"Data Validation"})
}
})
function dataValidation(data){
if (data.body.var1) {
if (data.body.var2) {
if (Number(data.body.var2)) {
return true
}
}
}
return false
}
function dataVal6(data){
if (String(data.body.service) && String(data.body.authToken)) {
return true
}
return false
}
function dataVal5(data){
if ((data.body.state == 'true' || data.body.state == 'false') && Number(data.body.brightness) && String(data.body.color) && String(data.body.authToken)) {
return true
}
return false
}
function s2b(string){
switch(string.toLowerCase().trim()){
case "true": case "yes": case 'on': case "1": return true
case "false": case "no": case 'off': case "0": case null: return false
default: return false
}
}
async function authCheck(data) {
let uid = false
console.log(data.body.authToken)
decodedToken = await admin.auth().verifyIdToken(data.body.authToken).catch(e=>{console.log(e)})
uid = decodedToken.uid
return uid
}
app.get('*', function(request, responce){
responce.render('404.ejs')
})
app.post('*', function(request, responce){
responce.status(404).send({success:false, error:"404"})
})
var port = 5050
app.listen(port, function() {
console.log('Server running on port ' + port)
})