update binding doc once target doc is deleted

This commit is contained in:
Shams mosowi
2021-01-19 15:41:10 +08:00
parent 25da01ca70
commit d8689b0a5e
2 changed files with 36 additions and 37 deletions

View File

@@ -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 }
)
)
)
)
)

View File

@@ -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)));
}