Query firebase from functions with express to filter item by a alphanumerical child value.
/*
CHAIN MULTIPLE QUERIES USING PROMISES IN FIREBASE REALTIMEDB
FROM EXPRESS IN FIREBASE FUNCTIONS
*/
ss.post("/test", (request,response) => {
//Get data
let shakes = request.body.shakes
let uid = request.body.uid
//The array to chain promises
let promises = [];
//Load coupons and gifts/
promises.push(db.ref('/gifts').orderByChild("active").equalTo("true").once('value'));
promises.push(db.ref('/coupons').orderByChild("active").equalTo("true").once('value'));
//Load users current data (todays count from timestamp, gifts, vouchers)
promises.push(db.ref('/shakes_user/' + uid).once('value'));
//Load users current gift_allowed status. (If false, user can't anymore gifts)
promises.push(db.ref('/shakes_user/' + uid + "/gift_allowed").once('value'));
// Wait for all promises to resolve
Promise.all(promises).then(function(res) {
// res[0] is gifts.
// res[1] is coupons.
// res[2] is current users data
// res[3] is current users gift_allowed status
let gifts = res[0]; //gift
let coupons = res[1]; //coupon
let user_data = res[2];
let gift_allowed = res[3];
//Array for merging both gift and coupons
let merged = [];
//Add gifts to the array only if the gift_allowed is true
if (gift_allowed) {
//Loop through gift and push items to the array.
gifts.forEach(function(item){
merged.push(item);
})
response.send("worked").end();
}
//Loop through coupons and push items to the array.
coupons.forEach(function(item){
merged.push(item);
})
//Get random value from the available coupons/gifts.
var random = merged[Math.floor(Math.random() * merged.length)];
response.send(random);
});
});
/*
ACCESS FIREBASE REALTIMEDB FROM FIREBASE FUNCTIONS
USING EXPRESS.JS
*/
const express = require("express")
var functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
ss.get("/gift", (request, response) => {
admin.database().ref('gifts').orderByChild('id').equalTo("gift123").once('child_added').then(snapshot => {
//console.log(snapshot.val())
response.send(snapshot.val())
})
})
const api = functions.https.onRequest(ss)
module.exports = {
api
}
[ {
"expires" : "1541901660",
"id" : "gift123",
"gift" : {
"description" : "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce non nisi blandit, tincidunt dui ut, facilisis diam.",
"img" : "gift.png",
"name" : "Gift Name"
},
"terms" : "Lorem ipsum dolor.",
"type" : "gift"
}, {
"expires" : "1541901660",
"id" : "honda_activa_1",
"gift" : {
"description" : "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce non nisi blandit, tincidunt dui ut, facilisis diam.",
"img" : "gift.png",
"name" : "Honda Activa"
},
"terms" : "Lorem ipsum dolor.",
"type" : "gift"
}, {
"expires" : "1541901660",
"id" : "ipad_2018",
"gift" : {
"description" : "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce non nisi blandit, tincidunt dui ut, facilisis diam.",
"img" : "gift.png",
"name" : "Ipad Pro"
},
"terms" : "Lorem ipsum dolor.",
"type" : "gift"
}, {
"expires" : "1541901660",
"id" : "ipad_2018",
"gift" : {
"description" : "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce non nisi blandit, tincidunt dui ut, facilisis diam.",
"img" : "gift.png",
"name" : "Macbook Pro 15"
},
"terms" : "Lorem ipsum dolor.",
"type" : "gift"
} ]
/*
LOAD A ITEM IN FIREBASE REALTIMEDB USING AN ID STORED IN
IT AS CHILD.
*/
//Get gift_id from post
let gift_id = request.body.gift_id
//Get from firebase by the gift_id
db.ref("gifts").orderByChild("id").equalTo(gift_id).once("value",snapshot => {
//Check if data is returned
if (snapshot.exists()){
response.send(snapshot.val())
} else {
response.send("Gift id " + gift_id + "doesn't exist.")
}
});