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.`);
       });
     
 
 });
Example #4
0
    .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(()=>{
Example #5
0
/** @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]);
  }
}
Example #7
0
      .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 });

      })
Example #8
0
    .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;

    });
Example #9
0
  .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);
  });
Example #10
0
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]
});
Example #11
0
    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);
    });
   
});
Example #15
0
// 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;
Example #17
0
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