Files
node-red-contrib-firebase-a…/rtdb-query.js
2019-06-09 19:17:30 +02:00

89 lines
2.5 KiB
JavaScript

let oldpath
let oldeventtype
module.exports = function(RED) {
function FirebaseAdmin(config) {
RED.nodes.createNode(this, config);
var node = this;
if(config.cred){
let c = RED.nodes.getNode(config.cred)
this.admin = c.admin
}
const cb = (res)=>{
console.log('firebase get result '+res)
console.dir(res)
let val = res.val()
console.log('val='+val)
node.send({payload:val})
}
node.on('input', function(msg) {
if(msg && msg.payload){
const path = msg.payload.path
const eventtype = msg.payload.on || 'value'
if(oldpath){
this.admin.database().ref(oldpath).off(oldeventtype, cb)
}
let ref = this.admin.database().ref(path)
// Decorate with queries
if(msg.payload.queries && msg.payload.queries.length > 0){
console.log('found queries')
let ordered = false
msg.payload.queries.forEach((query)=>{
console.dir(query)
if(query.orderBy){
ordered = true
console.log('setting explicit orderBy')
if(query.orderBy === 'value'){
ref = ref.orderByValue()
} else if(query.orderBy === 'key'){
ref = ref.orderByKey()
} else if(query.orderBy === 'child'){
ref = ref.orderByChild(query.value)
}
}
if(query.startAt){
console.log('startAt '+query.startAt)
ref = ref.startAt(query.startAt)
}
if(query.endAt){
console.log('endAt '+query.endAt)
ref = ref.endAt(query.endAt)
}
if(query.equalTo){
console.log('equalTo '+query.equalTo)
ref = ref.equalTo(query.equalTo)
}
if(query.limitTo){
console.log('limitTo '+query.limitTo+' -> '+query.value)
if(query.limitTo === 'first'){
ref = ref.limitToFirst(query.value)
} else if(query.limitTo === 'last'){
ref = ref.limitToLast(query.value)
}
}
})
if(!ordered) {
console.log('setting implicit orderBy')
ref = ref.orderByValue()
}
}
console.log('finished rtdb query is')
console.dir(ref.queryParams_)
ref.on(eventtype, cb)
oldpath = path
oldeventtype = eventtype
}
}.bind(this));
}
RED.nodes.registerType("rtdb-query", FirebaseAdmin);
}