You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
manifold/functions
FRC 4d214c01b4
Tipping in posts (#1045)
2 years ago
..
src Tipping in posts (#1045) 2 years ago
.env.dev Correctly configure env var for firebase functions 2 years ago
.env.prod Correctly configure env var for firebase functions 2 years ago
.eslintrc.js Don't break build on unused import (#1046) 2 years ago
.gitignore [WIP] Fully customizable notifications (#860) 2 years ago
.yarnrc when adding package, don't put ^ before version (#645) 2 years ago
README.md Update functions readme with local dev details 2 years ago
package.json Add /createcomment API endpoint (#946) 2 years ago
tsconfig.json Typescript project references take 2 (#586) 2 years ago

README.md

NOTE: Adapted from One Word's /functions doc. Fix any errors you see!

Firestore Cloud Functions

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...

Installing

Adapted from https://firebase.google.com/docs/functions/get-started

  1. $ cd functions to switch to this folder
  2. $ yarn global add firebase-tools to install the Firebase CLI globally
  3. $ yarn to install JS dependencies
  4. $ firebase login to authenticate the CLI tools to Firebase
  5. $ firebase use dev to choose the dev project

(Installing) For local development

  1. Install gcloud CLI

  2. If you don't have java (or see the error Error: Process java -version has exited with code 1. Please make sure Java is installed and on your system PATH.):

    1. $ brew install java
    2. $ sudo ln -sfn /opt/homebrew/opt/openjdk/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk.jdk
  3. $ gcloud auth login to authenticate the CLI tools to Google Cloud

  4. $ gcloud config set project <project-id> to choose the project ($ gcloud projects list to see options)

  5. $ mkdir firestore_export to create a folder to store the exported database

  6. $ yarn db:update-local-from-remote to pull the remote db from Firestore to local 0. TODO: this won't work when open source, we'll have to point to the public db

Developing locally

  1. $ ./dev.sh localdb to start the local emulator and front end
  2. If you change db trigger code, you have to start (doesn't have to complete) the deploy of it to dev to cause a hard emulator code refresh $ firebase deploy --only functions:dbTriggerNameHere
    • There's surely a better way to cause/react to a db trigger update but just adding this here for now as it works
  3. If you want to test a scheduled function replace your function in test-scheduled-function.ts and send a GET to http://localhost:8088/testscheduledfunction (Best user experience is via Postman!)

Firestore Commands

  • 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 every db:update-local-from-remote)
    • db:rename-remote-backup-folder - Renames the remote backup folder (called on every db:backup-remote to preserve the previous db backup)
  • db:backup-local - Save the local db changes to the disk (overwrites existing)

Debugging

  • Find local logs directly in the shell that ran $ yarn dev
  • Find deployed logs here

Deploying

  1. After merging, you need to manually deploy to backend:
  2. git checkout main
  3. git pull origin main
  4. $ firebase use prod to switch to prod
  5. $ firebase deploy --only functions to push your changes live! (Future TODO: auto-deploy functions on Git push)

Secrets management

Secrets are strings that shouldn't be checked into Git (eg API keys, passwords). We store these using Google Secret Manager, which provides them as environment variables to functions that require them. Some useful workflows:

  • Set a secret: $ firebase functions:secrets:set STRIPE_APIKEY
    • Then, enter the secret in the prompt.
  • Read a secret: $ firebase functions:secrets:access STRIPE_APIKEY