Clean up Firestore and Storage when deleting a document

When you delete a document in Firestore, its subcollections and their documents are not automatically recursively deleted. Here is a simple Cloud Function that takes care of it. As a bonus, it also deletes all stored files in Firebase Storage in a folder with the same name as the document id.

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();
const client = require('firebase-tools');
const bucket = admin.storage().bucket('gs://your-bucket.appspot.com');

exports.onDeleteCampaign = functions.firestore.document('campaigns/{campaignId}').onDelete((snap, context) => {
  const campaignId = context.params.campaignId;

  // Delete all nested sub collections
  const prom1 = client.firestore.delete(`campaigns/${campaignId}`, {
    project: process.env.GCLOUD_PROJECT,
    recursive: true,
    yes: true
  }); 

  // And delete any uploaded images
  const prom2 = deleteFiles(campaignId);

  return Promise.all([prom1, prom2]);
});

async function deleteFiles(campaignId) {
  const options = {
    prefix: `campaign/${campaignId}`,
  };

  const [files] = await bucket.getFiles(options);
  const deletePromises = files.map(file => file.delete());
  return Promise.all(deletePromises);
}

For example in my case all images for a campaign are stored as campaign/{campaignId}/subfolder/filename, and that makes it easy to delete all images using the Cloud Function above.

Written by

Kevin Renskers

Freelance software developer with over 25 years of experience. Writes articles about Swift, Python, and TypeScript. Builds Critical Notes, and maintains a bunch of open source projects.

More articles

› See all articles