UNPKG

wett

Version:

wett is a api layer between user api and db. provinding inbuilt user authentication via jwt and a db layer module to easily use multiple db with common functions

192 lines (153 loc) 4.52 kB
"use strict"; const firebase = require('firebase-admin'); const common = require('../../common'); module.exports = { db : null, init : function(cred,db){ firebase.initializeApp({ credential: firebase.credential.cert(cred), databaseURL: db }); this.db = firebase.firestore(); const settings = {timestampsInSnapshots: true}; this.db.settings(settings); common.success('db initiated'); return true; }, processAddress : function(address){ if(this.db == null || address == null || address == undefined){ return false; } let local = this.db; for(var i=0;i<address.length;i++){ let item = address[i]; if(item.type == 'doc'){ local = local.doc(item.query); } else if(item.type == 'collection'){ local = local.collection(item.query); } else if(item.type == 'where'){ local = local.where(item.query[0],item.query[1],item.query[2]); } else if(item.type == 'after'){ local = local.startAfter(item.query); } else if(item.type == 'before'){ local = local.endBefore(item.query); } else if(item.type == 'orderBy'){ if(item.query.direction == 'asc'){ local = local.orderBy(item.query.index,'asc'); } else { local = local.orderBy(item.query.index,'desc'); } } else if(item.type == 'limit'){ local = local.limit(item.query); } } return local; }, get : function(cursor){ return new Promise((resolve,reject)=>{ let dbLocal = require('../../db'); let address = this.processAddress(dbLocal('getAddress')); let last = dbLocal('getLastType'); if(address == false){ let error = 'failed-address_builder'; reject(error); } let query = address.get(); if(last == 'doc'){ return query.then((doc)=>{ if(cursor){ resolve(doc); } else { let data = doc.data(); resolve(data); } }) .catch((error)=>{ reject(error); }); } else if(last == 'collection'){ return query.then((querySnapshot)=>{ let data = []; querySnapshot.forEach((doc)=>{ data.push(doc.data()); }); resolve(data); }) .catch((error)=>{ reject(error); }); } else { let error = 'invalid_global_address'; reject(error); } }); }, insert : function(object){ return new Promise((resolve,reject)=>{ let dbLocal = require('../../db'); let address = this.processAddress(dbLocal('getAddress')); return address.set(object) .then(()=>{ resolve(); }) .catch((error)=>{ reject(error); }); }); }, update : function(object){ return new Promise((resolve,reject)=>{ let dbLocal = require('../../db'); let address = this.processAddress(dbLocal('getAddress')); return address.update(object) .then(()=>{ resolve(); }) .catch((error)=>{ reject(error); }); }); }, delete : function(){ let wrath = require('./wrath'); let dbLocal = require('../../db'); let address = this.processAddress(dbLocal('getAddress')); let last = dbLocal('getLastType'); if(last == 'doc'){ return wrath.clearDoc(address); } else if(last == 'collection'){ return wrath.clearCollection(address); } }, commit : function(object){ return new Promise((resolve,reject)=>{ let error; if(object.length == 0){ error = 'do something in the batch first'; reject(error); } const batch = this.db.batch(); for(var i=0;i<object.length;i++){ let holder = object[i]; let local = this.processAddress(holder.address); if(holder.opp == 'insert'){ batch.set(local,holder.data); } if(holder.opp == 'update'){ batch.update(local,holder.data); } if(holder.opp == 'delete'){ batch.delete(local); } } return batch.commit() .then(()=>{ resolve(); }) .catch((error)=>{ reject(error); }); }); //promise ends here } }