function updateMembersCount(group_id, operation, app_id) { console.log(`updateMembersCount ${group_id} ${operation}.`); //update membersCount var conversationDocRef = admin.firestore().collection("conversations").doc(group_id); return admin.firestore().runTransaction(function(transaction) { // This code may get re-run multiple times if there are conflicts. return transaction.get(conversationDocRef).then(function(conversationDoc) { if (!conversationDoc.exists) { throw "Document does not exist!"; } var oldMemberCount = 0; if (conversationDoc.data().membersCount!=null){ oldMemberCount=conversationDoc.data().membersCount; } var newMembersCount = oldMemberCount + operation; console.log("newMembersCount", newMembersCount); var updates = {}; if (newMembersCount<=1) { updates.support_status = chatSupportApi.CHATSUPPORT_STATUS.CLOSED; } else if (newMembersCount==2) { updates.support_status = chatSupportApi.CHATSUPPORT_STATUS.UNSERVED; }else { //>2 updates.support_status = chatSupportApi.CHATSUPPORT_STATUS.SERVED; if (newMembersCount> 3) { chatSupportApi.removeBotFromGroupMember(group_id, app_id); } } updates.membersCount = newMembersCount; transaction.update(conversationDocRef, updates); }); }).then(function() { console.log("Transaction successfully committed!"); }).catch(function(error) { console.log("Transaction failed: ", error); }); }
async function generateAndSaveData(changedSpeaker) { const sessionsPromise = firestore().collection('sessions').get(); const schedulePromise = firestore().collection('schedule').orderBy('date', 'desc').get(); const speakersPromise = firestore().collection('speakers').get(); const [sessionsSnapshot, scheduleSnapshot, speakersSnapshot] = await Promise.all([sessionsPromise, schedulePromise, speakersPromise]); const sessions = {}; const schedule = {}; const speakers = {}; sessionsSnapshot.forEach((doc) => { sessions[doc.id] = doc.data(); }); scheduleSnapshot.forEach((doc) => { schedule[doc.id] = doc.data(); }); speakersSnapshot.forEach((doc) => { speakers[doc.id] = doc.data(); }); let generatedData = {}; const scheduleConfig = functions.config().schedule; if (!scheduleConfig || typeof scheduleConfig.enabled === 'undefined') { console.error('Schedule config is NOT set! Run `firebase functions:config:set schedule.enabled=true`, redeploy functions and try again.'); return null; } const scheduleEnabled = scheduleConfig.enabled === 'true'; if (!Object.keys(sessions).length) { generatedData = { ...speakers }; } else if (!scheduleEnabled || !Object.keys(schedule).length) { generatedData = mapSessionsSpeakers(sessions, speakers); } else { generatedData = mapSessionsSpeakersSchedule(sessions, speakers, schedule); } // If changed speaker does not have assigned session(s) yet if (changedSpeaker && !generatedData.speakers[changedSpeaker.id]) { generatedData.speakers[changedSpeaker.id] = changedSpeaker; } saveGeneratedData(generatedData.sessions, 'generatedSessions'); saveGeneratedData(generatedData.speakers, 'generatedSpeakers'); saveGeneratedData(generatedData.schedule, 'generatedSchedule'); }
exports.saveSupportMessagesToFirestore = functions.database.ref('/apps/{app_id}/messages/{recipient_id}/{message_id}').onCreate(event => { const message_id = event.params.message_id; const recipient_id = event.params.recipient_id; const app_id = event.params.app_id;; console.log("recipient_id : " + recipient_id + ", app_id: " + app_id + ", message_id: " + message_id); const message = event.data.current.val(); console.log('message ' + JSON.stringify(message)); console.log("message.status : " + message.status); if (message.status != chatApi.CHAT_MESSAGE_STATUS.DELIVERED){ return 0; } if (recipient_id.indexOf("support-group")==-1 ){ console.log('exit for recipient'); return 0; } console.log('it s a support message '); // var conversationId = recipient_id; // message.conversationId = conversationId; return admin.firestore().collection('messages').doc(message_id).set(message).then(writeResult => { // Send back a message that we've succesfully written the message console.log(`Message with ID: ${message_id} created.`); }); });
.then((url)=>{ console.log('signed url:',url[0]); const id = fileName.split(".")[0]; const gcsUrl = "gs://" + fileBucket + "/" + thumbFile.name; const client = new vision.ImageAnnotatorClient(); client.labelDetection(gcsUrl) .then(results => { const labels = results[0].labelAnnotations; let labelDescriptions = []; //console.log('Labels:'); labels.forEach(label => labelDescriptions.push(label.description)); return admin.firestore().collection("comments").doc(id).set({ labels : labelDescriptions },{ merge: true }); }) .then(()=>{ console.log('Google Vision response saved to the database'); }) .catch(err => { console.error('ERROR:', err); }); return admin.firestore().collection("comments").doc(id).set({ avatar : url[0] },{ merge: true }); }).then(()=>{
/** @internal */ function snapshotConstructor(event) { if (!firestoreInstance) { firestoreInstance = firebase.firestore(apps_1.apps().admin); } let valueProto = _getValueProto(event.data, event.resource, 'value'); let readTime = encoder_1.dateToTimestampProto(_.get(event, 'data.value.readTime')); return firestoreInstance.snapshot_(valueProto, readTime, 'json'); }
function saveGeneratedData(data, collectionName) { if (!data || !Object.keys(data).length) return; for (let index = 0; index < Object.keys(data).length; index++) { const key = Object.keys(data)[index]; firestore().collection(collectionName) .doc(key) .set(data[key]); } }
.then(results => { const labels = results[0].labelAnnotations; let labelDescriptions = []; //console.log('Labels:'); labels.forEach(label => labelDescriptions.push(label.description)); return admin.firestore().collection("comments").doc(id).set({ labels : labelDescriptions },{ merge: true }); })
.onCreate((snap, context) => { const newValue = snap.data(); const to = newValue.to; // console.log(to) var db = admin.firestore(); if (to === 'all') { //send push to topic 'notification' // The topic name can be optionally prefixed with "/topics/". var topic_name = 'notification'; // See documentation on defining a message payload. const text = newValue.message; const payload_all = { notification: { title: newValue.title, body: text ? text.length <= 100 ? text : text.substring(0, 97) + "..." : "" }, topic: topic_name }; // Send a message to devices subscribed to the provided topic. return admin.messaging().send(payload_all); } else { var dbRef = db.collection('users').doc(to); var query = dbRef.get() .then(doc => { if (doc.exists) { console.log('Token=>', doc.data().token); const text = newValue.message; const payload_user = { notification: { title: newValue.title, body: text ? text.length <= 100 ? text : text.substring(0, 97) + "..." : "" } }; return admin.messaging().sendToDevice(doc.data().token, payload_user); } else { throw new Error("Profile doesn't exist") } }) .catch(err => { console.log('Error getting documents', err); return "Error getting documents" }); } return snap.data; });
.onCreate(async (snapshot, context) => { const timestamp = context.params.timestamp; const message = snapshot.data(); console.log(timestamp, message); if (!message) return null; console.log('New message added at ', timestamp, ' with payload ', message); const deviceTokensPromise = firestore().collection('notificationsSubscribers').get(); const notificationsConfigPromise = firestore().collection('config').doc('notifications').get(); const [tokensSnapshot, notificationsConfigSnapshot] = await Promise.all([deviceTokensPromise, notificationsConfigPromise]); const notificationsConfig = notificationsConfigSnapshot.exists ? notificationsConfigSnapshot.data() : {}; const tokens = tokensSnapshot.docs.map(doc => doc.id); if (!tokens.length) { console.log('There are no notification tokens to send to.'); return null; } console.log('There are', tokens.length, 'tokens to send notifications to.'); const payload = { data: Object.assign({}, message, { icon: message.icon || notificationsConfig.icon }) }; const tokensToRemove = []; const messagingResponse = await messaging().sendToDevice(tokens, payload); messagingResponse.results.forEach((result, index) => { const error = result.error; if (error) { console.error('Failure sending notification to', tokens[index], error); if (error.code === 'messaging/invalid-registration-token' || error.code === 'messaging/registration-token-not-registered') { tokensToRemove.push(tokensSnapshot.ref.child(tokens[index]).remove()); } } }); return Promise.all(tokensToRemove); });
exports.addMessage = functions.https.onRequest((req, res) => { // [END addMessageTrigger] // Grab the text parameter. const original = req.query.text; // [START adminSdkAdd] // Push the new message into the Realtime Database using the Firebase Admin SDK. admin.firestore().collection('messages').add({original: original}).then(writeResult => { // Send back a message that we've succesfully written the message res.json({result: `Message with ID: ${writeResult.id} added.`}); }); // [END adminSdkAdd] });
functions.pubsub.topic('minute-tick').onPublish((event) => { var db = admin.firestore(); var liveSpots = db.collection('available_spots_live'); var batchSize = 500; var query = liveSpots .where('expires_at', '<', new Date()) .limit(batchSize); console.log("This job is ran every minute!"); return new Promise((resolve, reject) => { deleteQueryBatch(db, query, batchSize, resolve, reject); }); });
exports.createSupportConversationToFirestore = functions.database.ref('/apps/{app_id}/messages/{recipient_id}').onCreate(event => { const recipient_id = event.params.recipient_id; const app_id = event.params.app_id;; console.log("recipient_id : " + recipient_id + ", app_id: " + app_id); const messageWithMessageId = event.data.current.val(); console.log('messageWithMessageId ' + JSON.stringify(messageWithMessageId)); const message = messageWithMessageId[Object.keys(messageWithMessageId)[0]]; //returns 'someVal' console.log('message ' + JSON.stringify(message)); if (message.status != chatApi.CHAT_MESSAGE_STATUS.DELIVERED){ return 0; } if (recipient_id.indexOf("support-group")==-1 ){ console.log('exit for recipient'); return 0; } console.log('it s a support message '); var newRequest = {}; newRequest.created_on = admin.firestore.FieldValue.serverTimestamp(); newRequest.support_status = 0; //CREATED newRequest.requester_id = message.sender; newRequest.requester_fullname = message.sender_fullname; newRequest.first_text = message.text; newRequest.app_id = app_id; // var conversationId = createConversationId(sender_id, recipient_id); // console.log('conversationId', conversationId); var groupId = recipient_id; return admin.firestore().collection('conversations').doc(groupId).set(newRequest, { merge: true }).then(writeResult => { // return admin.firestore().collection('conversations').doc(groupId).update(message).then(writeResult => { // Send back a message that we've succesfully written the message console.log(`Conversation with ID: ${groupId} created.`); }); });
exports.removeMemberToReqFirestoreOnLeaveGroup = functions.database.ref('/apps/{app_id}/groups/{group_id}/members/{member_id}').onDelete(event => { const member_id = event.params.member_id; const group_id = event.params.group_id; const app_id = event.params.app_id;; // DEBUG console.log("member_id: "+ member_id + ", group_id : " + group_id + ", app_id: " + app_id); if (group_id.indexOf("support-group")==-1 ){ console.log('exit for recipient'); return 0; } console.log('it s a support message '); // var memberToRemove = {}; // memberToRemove[member_id] = true; // console.log("memberToRemove ", memberToRemove); // var dataToUpdate = {}; // dataToUpdate.members = member_id; // console.log("dataToUpdate ", dataToUpdate); // return admin.firestore().collection('conversations').doc(group_id).update({members:memberToAdd}).then(writeResult => { return admin.firestore().collection('conversations').doc(group_id).update({ ['members.' + member_id]: FieldValue.delete() }).then(writeResult => { // Send back a message that we've succesfully written the message console.log(`Member with ID: ${JSON.stringify(member_id)} removed from ${group_id}.`); return updateMembersCount(group_id, -1, app_id); }); });
exports.addMemberToReqFirestoreOnJoinGroup = functions.database.ref('/apps/{app_id}/groups/{group_id}/members/{member_id}').onCreate(event => { const member_id = event.params.member_id; const group_id = event.params.group_id; const app_id = event.params.app_id;; // DEBUG console.log("member_id: "+ member_id + ", group_id : " + group_id + ", app_id: " + app_id); if (group_id.indexOf("support-group")==-1 ){ console.log('exit for recipient'); return 0; } console.log('it s a support message '); var memberToAdd = {}; memberToAdd[member_id] = true; console.log("memberToAdd ", memberToAdd); var dataToUpdate = {}; dataToUpdate.members = memberToAdd; console.log("dataToUpdate ", dataToUpdate); // return admin.firestore().collection('conversations').doc(group_id).update({members:memberToAdd}).then(writeResult => { return admin.firestore().collection('conversations').doc(group_id).set(dataToUpdate,{merge:true}).then(writeResult => { // Send back a message that we've succesfully written the message console.log(`Member with ID: ${JSON.stringify(memberToAdd)} added to ${group_id}.`); return updateMembersCount(group_id, 1, app_id); }); });
// https://firebase.google.com/docs/firestore/quickstart var admin = require("firebase-admin"); var FieldValue = require("firebase-admin").firestore.FieldValue; var serviceAccount = require("./key/share-libros-firebase-adminsdk-fye8u-a62623af6a.json"); admin.initializeApp({ credential: admin.credential.cert(serviceAccount), databaseURL: "https://share-libros.firebaseio.com" }); var db = admin.firestore(); var userRef = db.collection('users').doc('user2'); // set data userRef.set({ first: "Yogesh", last: "Kumar", city: "Ajmer" }); // To update and merged into the existing document var userRef = db.collection('users').doc('user'); userRef.set({ first: "Yogesh Kumar", last: "Kasodiya", age: 28 }, { merge: true }); // get data db.collection('users').get()
// Using the firebase-admin approach where database security rules do not apply. // Here you are authenticating with a private key. The key JSON file is available via // the Firebase web UI: project settings > service accounts > generate new private key. var admin = require("firebase-admin"); const serviceAccountKeyFile = process.env.FIREBASE_SERVICE_ACCOUNT_KEY_FILE; if (!serviceAccountKeyFile) { console.error('Set FIREBASE_SERVICE_ACCOUNT_KEY_FILE to the path to your credentials file.'); process.exit(); } admin.initializeApp({ credential: admin.credential.cert(serviceAccountKeyFile), databaseURL: "https://projectionist-d5fef.firebaseio.com" }); var firestore = admin.firestore(); var storage = admin.storage(); var repl = require("repl"); var replServer = repl.start({ prompt: "firebase> ", }); replServer.context.admin = admin; replServer.context.firestore = firestore; replServer.context.storage = storage;
const admin = require('firebase-admin'); const functions = require('firebase-functions') admin.initializeApp(); // Since this code will be running in the Cloud Functions environment // we call initialize Firestore without any arguments because it // detects authentication from the environment. const firestore = admin.firestore(); // triggered when a movie is created exports.createMovie = functions .firestore .document('users/{userId}/movies/{movieId}') .onCreate((data, context) => { // get the counting document reference for the current user const counterRef = firestore.doc(`counters/${context.params.userId}`); // encapsulate into transaction return firestore.runTransaction(transaction => { return transaction.get(counterRef).then(counterDoc => { if (counterDoc.exists) { // if the movie count property does not exist, we set it to 1. Else we increment. var movies = !('movies' in counterDoc.data()) ? 1 : counterDoc.data()['movies'] + 1; // update the counts doc with the new movie count return transaction.update( counterRef, { movies: movies
// Initialize Firebase so it is available within functions try { admin.initializeApp(functions.config().firebase) } catch (e) { /* istanbul ignore next: not called in tests */ console.error( 'Caught error initializing app with functions.config():', e.message || e ) } // Set Firestore timestamp settings // NOTE: Skipped when running tests tests so it does not have to be mocked if (process.env.NODE_ENV !== 'test') { admin.firestore().settings({ timestampsInSnapshots: true }) } const codeFolder = process.env.NODE_ENV === 'test' ? './src' : './dist' // Load all folders within dist directory (mirrors layout of src) const files = glob.sync(codeFolder + '/**/index.js', { cwd: __dirname, ignore: [ './node_modules/**', codeFolder + '/utils/**', codeFolder + '/constants' ] }) // Loop over all folders found within dist loading only the relevant function
* distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /*jshint esversion: 6 */ /* jshint node: true */ 'use strict'; const admin = require('firebase-admin'); const functions = require('firebase-functions'); const http = require('http'); const https = require('https'); admin.initializeApp(functions.config().firebase); const db = admin.firestore(); // [START save_token_to_firebase] function saveOAuthToken(context, oauthToken) { const docRef = db.collection('DialogflowTokens').doc('OauthToken'); docRef.set(oauthToken); } // [END save_token_to_firebase] // [START generate_token] function generateAccessToken( context, serviceAccountAccessToken, serviceAccountTokenType ) { // With the service account's credentials, we can make a request to generate