From d8689b0a5e62320f56f5e17f522df2fefc261446 Mon Sep 17 00:00:00 2001 From: Shams mosowi Date: Tue, 19 Jan 2021 15:41:10 +0800 Subject: [PATCH] update binding doc once target doc is deleted --- .../functions/src/propagates/TargetFns.ts | 68 +++++++++---------- .../functions/src/propagates/index.ts | 5 +- 2 files changed, 36 insertions(+), 37 deletions(-) diff --git a/FT_functions/functions/src/propagates/TargetFns.ts b/FT_functions/functions/src/propagates/TargetFns.ts index 96d801ba..140d6029 100644 --- a/FT_functions/functions/src/propagates/TargetFns.ts +++ b/FT_functions/functions/src/propagates/TargetFns.ts @@ -29,19 +29,17 @@ export const addTargetRef = ( targetFieldKey: string, trackedFields ) => - db - .doc(`${TARGET_SUB_COLLECTION}/${encodeURIComponent(sourceDocPath)}`) - .set( - { - [encodeURIComponent(targetRef.parent.path)]: { - [targetFieldKey]: { - trackedFields, - targets: { [targetRef.id]: true }, - }, + db.doc(`${TARGET_SUB_COLLECTION}/${encodeURIComponent(sourceDocPath)}`).set( + { + [encodeURIComponent(targetRef.parent.path)]: { + [targetFieldKey]: { + trackedFields, + targets: { [targetRef.id]: true }, }, }, - { merge: true } - ); + }, + { merge: true } + ); // remove propagation reference from source subcollection export const removeTargetRef = ( @@ -49,18 +47,16 @@ export const removeTargetRef = ( sourceDocPath: string, targetFieldKey: string ) => - db - .doc(`${TARGET_SUB_COLLECTION}/${encodeURIComponent(sourceDocPath)}`) - .set( - { - [encodeURIComponent(targetRef.parent.path)]: { - [targetFieldKey]: { - targets: { [targetRef.id]: fieldValue.delete() }, - }, + db.doc(`${TARGET_SUB_COLLECTION}/${encodeURIComponent(sourceDocPath)}`).set( + { + [encodeURIComponent(targetRef.parent.path)]: { + [targetFieldKey]: { + targets: { [targetRef.id]: fieldValue.delete() }, }, }, - { merge: true } - ); + }, + { merge: true } + ); // db // .doc(`${sourceDocPath}/${TARGET_SUB_COLLECTION}/${encodeURIComponent(targetRef.parent.path)}`) @@ -74,31 +70,33 @@ export const removeTargetRef = ( // removes all references of deleted targets export const removeRefsOnTargetDelete = ( - targetRef: FirebaseFirestore.DocumentReference + targetRef: FirebaseFirestore.DocumentReference, + targetFieldKey: string ) => new Promise((resolve, reject) => db - .collectionGroup(TARGET_SUB_COLLECTION) - .where("targetCollectionPath", "==", targetRef.parent.path) + .collection(TARGET_SUB_COLLECTION) + .where( + `${targetRef.parent.path}.${targetFieldKey}.targets.${targetRef.id}`, + "==", + true + ) .get() .then((queryResult) => resolve( Promise.all( - queryResult.docs.map((doc) => { - const { targetCollectionPath, ...targetFields } = doc.data(); - const update = Object.keys(targetFields).reduce( - (acc, targetFieldKey) => { - return { - ...acc, + queryResult.docs.map((doc) => + doc.ref.set( + { + [encodeURIComponent(targetRef.parent.path)]: { [targetFieldKey]: { targets: { [targetRef.id]: fieldValue.delete() }, }, - }; + }, }, - {} - ); - return doc.ref.set(update, { merge: true }); - }) + { merge: true } + ) + ) ) ) ) diff --git a/FT_functions/functions/src/propagates/index.ts b/FT_functions/functions/src/propagates/index.ts index 5576e0b8..06320b57 100644 --- a/FT_functions/functions/src/propagates/index.ts +++ b/FT_functions/functions/src/propagates/index.ts @@ -72,8 +72,9 @@ export default function propagate( ); const promises = [propagateChangesPromise]; if (triggerType === "delete") { - const removeRefsPromise = removeRefsOnTargetDelete(change.before.ref); - promises.push(removeRefsPromise); + config.forEach((c) => + promises.push(removeRefsOnTargetDelete(change.before.ref, c.fieldName)) + ); } else { config.forEach((c) => promises.push(updateLinks(change, c))); }