NOTE: Adapted from One Word's /functions doc. Fix any errors you see!
This is code that doesn't make sense on the frontend client, e.g.
- Long-running or slow operation (database)
- Tasks that need to be run every so often (syncing email list to Mailjet)
- Anything we should't trust to clients (secrets, auth)
If you want to make and test changes, you'll have to do a bit of setup...
Adapted from https://firebase.google.com/docs/functions/get-started
$ cd functions
to switch to this folder$ yarn global add firebase-tools
to install the Firebase CLI globally$ yarn
to install JS dependencies$ firebase login
to authenticate the CLI tools to Firebase$ firebase use dev
to choose the dev project
$ firebase functions:config:get > .runtimeconfig.json
to cache secrets for local dev- Install gcloud CLI
$ brew install java
to install java if you don't already have it$ echo 'export PATH="/usr/local/opt/openjdk/bin:$PATH"' >> ~/.zshrc
to add java to your path
$ gcloud auth login
to authenticate the CLI tools to Google Cloud$ gcloud config set project <project-id>
to choose the project ($ gcloud projects list
to see options)$ mkdir firestore_export
to create a folder to store the exported database$ yarn db:update-local-from-remote
to pull the remote db from Firestore to local- TODO: this won't work when open source, we'll have to point to the public db
$ firebase use dev
if you haven't already$ yarn serve
to spin up the emulators- The Emulator UI is at http://localhost:4000; the functions are hosted on :5001. Note: You have to kill and restart emulators when you change code; no hot reload =(
$ yarn dev:emulate
in/web
to connect to emulators with the frontend- Note: emulated database is cleared after every shutdown
db:update-local-from-remote
- Pull the remote db from Firestore to local, also calls:db:backup-remote
- Exports the remote dev db to the backup folder on Google Cloud Storage (called on everydb:update-local-from-remote
)db:rename-remote-backup-folder
- Renames the remote backup folder (called on everydb:backup-remote
to preserve the previous db backup)
db:backup-local
- Save the local db changes to the disk (overwrites existing)
- Find local logs directly in the shell that ran
$ yarn dev
- Find deployed logs here
$ firebase use prod
to switch to prod$ yarn deploy
to push your changes live! (Future TODO: auto-deploy functions on Git push)
Secrets are strings that shouldn't be checked into Git (eg API keys, passwords). We store these using environment config on Firebase Functions. Some useful workflows:
- Set a secret:
$ firebase functions:config:set stripe.test_secret="THE-API-KEY"
- Preview all secrets:
$ firebase functions:config:get
- Cache for local dev:
$ firebase functions:config:get > .runtimeconfig.json