Image from the "TWIL" blog post showing how Firebase tools integrate with JavaScript and React-Native for app development.

Welcome to "TWIL," our series designed to be your weekly dose of micro-learning. In this session, Marisa takes us through the interconnected world of Firebase: Firestore, Storage, and Cloud Functions. Learn how to build real-time apps with React-Native by using Firebase’s suite of tools to update Firestore documents with video paths from Cloud Storage asynchronously, all orchestrated via Cloud Functions. Lean in as we unveil the streamlined process of linking documents to media, a valuable snippet for developers looking to enhance functionality in real-time applications.

Firebase: Firestore, Storage and Cloud Functions 🤝

Use case

Say we have a document stored in Firestore. We upload a video to Cloud Storage, and we want to take the path of the video and add it to the document in Firestore. We can use Cloud Functions to accomplish this!

Video Data Document

{
	scheduled: "September 18, 2019 at 10:30:00 AM UTC-4",
	completed: "September 18, 2019 at 10:28:00 AM UTC-4",
	file: "<cloud-storage-url>", // updated after video has finished uploading
}

Firestore

let documentID = ""

try {
  // Get or Create a collection reference
  const collectionRef = firestore().collection(
    `company/${COMPANY_ID}/client/${CLIENT_ID}/videos`,
  )

  // Grab the docuemnt reference so that we can get the document id at the end of the path
  const documentRef = await collectionRef.add(clientData) // `add` will auto-id this document for us
  documentID = documentRef.path.split("/")[5]

  console.log("*** Firestore reference created and uploaded at:", documentRef.path)
} catch (error) {
  console.log("*** Firestore - error getting collection:", { error })
}

Cloud Storage

// Record a video and return the data for it
const data = await camera.recordAsync(options)

// Get the storage object reference at the specified path (we use the same path as the document in firestore)
const reference = storage().ref(
  `company/${COMPANY_ID}/client/${CLIENT_ID}/videos/${documentID}.mov`,
)
console.log("*** Storage reference created at:", reference.fullPath)

// Put the video file at the reference path
reference.putFile(data.uri)

Cloud Function

const functions = require("firebase-functions")
const admin = require("firebase-admin")

admin.initializeApp()
const firestore = admin.firestore()

/**
 * Triggered by a new object being created in Storage.
 *
 * - Check if the object is a video, if not, return.
 * - If so, get the corresponding Firestore document reference for this video. The paths should match.
 * - Update the document reference with the file path for the uploaded video.
 */
exports.updateDocument = functions.storage.object().onFinalize(async object => {
  const { contentType } = object
  const filePath = object.name

  // Exit if this is triggered on a file that is not a video
  if (!contentType.startsWith("video/")) {
    return console.log("This is not a video.")
  }

  // Get document reference for this filePath
  const documentRef = await firestore.doc(filePath.replace(".mov", ""))

  // Update document with filepath for uploaded video
  await documentRef.update({ file: filePath })
  return true
})
  • JavaScript
  • React-Native
  • Firebase
  • Google Cloud Storage
  • Google Cloud Functions
  • Async
Marisa Gomez's profile picture
Marisa Gomez

Senior Software Engineer

Related Posts

A software developer reviewing code and test results on a large monitor in a modern office environment. The screen displays multiple lines of syntax-highlighted code alongside what appears to be an evaluation or testing panel with color-coded output logs, suggesting an active model comparison or performance benchmarking workflow. A laptop sits open in the foreground, reinforcing a multi-screen development setup typical of AI and machine learning engineering work. The shallow depth of field and over-the-shoulder perspective emphasize the deliberation involved in evaluating technical systems for production readiness.
July 22, 2025 • Frank Valcarcel

How to Choose an LLM When Every Model Claims State of the Art

Benchmark scores don’t tell you whether a model will work for your business. Here’s how to evaluate LLMs on the three axes that actually matter: quality, throughput, and cost.

A conceptual illustration shows a chat bubble icon at the center of a complex maze, representing the challenges of evaluating Large Language Models for commercial applications. The intricate blue-tinted labyrinth symbolizes the many considerations Cuttlesoft navigates when implementing AI solutions in enterprise software - from API integration and cost management to security compliance. This visual metaphor captures the complexity of choosing the right LLM technology for custom software development across healthcare, finance, and enterprise sectors. The centered message icon highlights Cuttlesoft's focus on practical communication AI applications while the maze's structure suggests the methodical evaluation process used to select appropriate AI tools and frameworks for client solutions.
September 12, 2024 • Frank Valcarcel

Benchmarking AI: Evaluating Large Language Models (LLMs)

Large Language Models like GPT-4 are revolutionizing AI, but their power demands rigorous assessment. How do we ensure these marvels perform as intended? Welcome to the crucial world of LLM evaluation.

Let's work together

Tell us about your project and how Cuttlesoft can help. Schedule a consultation with one of our experts today.

Contact Us