Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Cloud Functions for Firebase organization

I know this was already asked here, BUT it does not answer my question. My question is how can we break apart index.js for Cloud Functions including the onWrite calls and such.

I realize you can use "require" and bring in outside code. It still leaves a bit of code ( in Franks OCR example, for example) , in index.js.

Ideally I'd love to be able to move an entire onWrite event trigger to another file.

EXAMPLE in index.js:

exports.sysQueueUserNew = functions.database.ref("/sys/queue/user_new/{queueId}").onWrite((event) => {
      // do something
})

How can I move the entire function event watch/call to another js file, and call it from index.js?

My index.js has grown quite large, and reading it for organizational purposes has become a PAIN.

Ideally I'd like my index.js to be very organized such as:

--in  index.js --
    /// User cleanup
    userHelpers()    

    /// SYS Logs
    sysLogs()

--and in userHelpers.js have the onWrite trigger for example---
   functions.database.ref("/sys/queue/user_new/{queueId}").onWrite((event) => {
      // create user
   })

etc....

Is this possible without having to have code written like so (a' la Franks OCR example):

var test = require('./test')

exports.sysQueueUserNew = functions.database.ref("/sys/queue/user_new/{queueId}").onWrite((event) => {
      // do something
      test.doCleanup()
})

Thanks in advance....

like image 616
paulyfl Avatar asked Apr 11 '17 19:04

paulyfl


Video Answer


2 Answers

You can easily spread your functions across multiple files. Here's an example:

////////////// index.js

exports.sysQueueUserNew = require('./sys-queue-user-new');
exports.userCleanup = require('./user-cleanup');

///////////// sys-queue-user-new.js

const functions = require('firebase-functions');

module.exports = functions.database
  .ref("/sys/queue/user_new/{queueId}")
  .onWrite(e => {
    // do something
  });

///////////// user-cleanup.js

const functions = require('firebase-functions');

module.exports = functions.auth.user().onDelete(e => {
  // do something
});
like image 125
Michael Bleigh Avatar answered Oct 03 '22 16:10

Michael Bleigh


As a variant of Michael's answer, I found this organization very neat and kind of object-oriented.

// index.js
const admin = require('firebase-admin')
admin.initializeApp(functions.config().firebase)

const user = require('./user')(admin)
exports.sendWelcomeEmail = user.sendWelcomeEmail

// user.js
const functions = require('firebase-functions')

module.exports = function(admin) {

    let sendWelcomeEmail = functions.auth.user().onCreate(event => {
        // return admin.database().ref().update({})
    })

    return {
        sendWelcomeEmail: sendWelcomeEmail
    }
}
like image 37
eyeezzi Avatar answered Oct 03 '22 16:10

eyeezzi