// Assumes that group members are stored in a subcollection under /groups/{groupId}/members/{userId} const memberPath = '/familyMembers/{familyMemberId}/parents/{parentId}'; // Trigger updates to our generated maps if group membership changes exports.memberAdded = functions.firestore.document(memberPath).onCreate(memberAdded); exports.memberDeleted = functions.firestore.document(memberPath).onDelete(memberDeleted); async function getAllowedDocuments(parentId) { // what goes here? return ['foo', 'bar']; } async function getDisallowedDocuments(parentId) { // what goes here? return ['foo', 'bar']; } async function memberAdded(snap, context) { const [parentId] = context.params; const docs = await getAllowedDocuments(parentId); const batch = admin.firestore().batch(); docs.forEach(docId => { const doc = admin.firestore().doc(`accessMap/${parentId}/docs/${docId}`); batch.set(doc, {}); ); await batch.commit(); } async function memberDeleted(snap, context) { const [parentId] = context.params; const docs = await getDisallowedDocuments(parentId); const batch = admin.firestore().batch(); docs.forEach(docId => { const doc = admin.firestore().doc(`accessMap/${parentId}/docs/${docId}`); batch.delete(doc); ); await batch.commit(); }