diff --git a/server-plugins/chunter-resources/src/index.ts b/server-plugins/chunter-resources/src/index.ts index 2c09727fe9..427aa8c4d5 100644 --- a/server-plugins/chunter-resources/src/index.ts +++ b/server-plugins/chunter-resources/src/index.ts @@ -76,9 +76,13 @@ function getCreateBacklinksTxes ( return getBacklinksTxes(txFactory, backlinks, []) } -async function getUpdateBacklinksTxes (control: TriggerControl, txFactory: TxFactory, doc: Doc): Promise { - const backlinkId = doc._id - const backlinkClass = doc._class +async function getUpdateBacklinksTxes ( + control: TriggerControl, + txFactory: TxFactory, + doc: Doc, + backlinkId: Ref, + backlinkClass: Ref> +): Promise { const attachedDocId = doc._id // collect attribute backlinks @@ -278,17 +282,29 @@ async function ThreadMessageDelete (tx: Tx, control: TriggerControl): Promise): TxCUD { + // Try to guess backlink target Tx for TxCollectionCUD txes based on collaborators availability + if (hierarchy.isDerived(tx._class, core.class.TxCollectionCUD)) { + const cltx = tx as TxCollectionCUD + tx = TxProcessor.extractTx(cltx) as TxCUD + + const mixin = hierarchy.classHierarchyMixin(tx.objectClass, notification.mixin.ClassCollaborators) + return mixin !== undefined ? tx : cltx + } + return tx +} + async function BacklinksCreate (tx: Tx, control: TriggerControl): Promise { - const hierarchy = control.hierarchy const ctx = TxProcessor.extractTx(tx) as TxCreateDoc if (ctx._class !== core.class.TxCreateDoc) return [] - if (hierarchy.isDerived(ctx.objectClass, chunter.class.Backlink)) return [] + if (control.hierarchy.isDerived(ctx.objectClass, chunter.class.Backlink)) return [] const txFactory = new TxFactory(control.txFactory.account) - const doc = TxProcessor.createDoc2Doc(ctx) - const collTx = tx as TxCollectionCUD - const txes: Tx[] = getCreateBacklinksTxes(control, txFactory, doc, collTx.objectId, collTx.objectClass) + const doc = TxProcessor.createDoc2Doc(ctx) + const targetTx = guessBacklinkTx(control.hierarchy, tx as TxCUD) + const txes: Tx[] = getCreateBacklinksTxes(control, txFactory, doc, targetTx.objectId, targetTx.objectClass) + if (txes.length !== 0) { await control.apply(txes, true) } @@ -297,19 +313,18 @@ async function BacklinksCreate (tx: Tx, control: TriggerControl): Promise } async function BacklinksUpdate (tx: Tx, control: TriggerControl): Promise { - const hierarchy = control.hierarchy const ctx = TxProcessor.extractTx(tx) as TxUpdateDoc if (ctx._class !== core.class.TxUpdateDoc) return [] - if (hierarchy.isDerived(ctx.objectClass, chunter.class.Backlink)) return [] + if (control.hierarchy.isDerived(ctx.objectClass, chunter.class.Backlink)) return [] const rawDoc = (await control.findAll(ctx.objectClass, { _id: ctx.objectId }))[0] - if (rawDoc === undefined) return [] - - const txFactory = new TxFactory(control.txFactory.account) if (rawDoc !== undefined) { + const txFactory = new TxFactory(control.txFactory.account) + const doc = TxProcessor.updateDoc2Doc(rawDoc, ctx) - const txes: Tx[] = await getUpdateBacklinksTxes(control, txFactory, doc) + const targetTx = guessBacklinkTx(control.hierarchy, tx as TxCUD) + const txes: Tx[] = await getUpdateBacklinksTxes(control, txFactory, doc, targetTx.objectId, targetTx.objectClass) if (txes.length !== 0) { await control.apply(txes, true)