From ded0b286ba80cb81b3ecede657460f41e0f1353a Mon Sep 17 00:00:00 2001 From: Alexander Onnikov Date: Tue, 9 Jul 2024 23:23:42 +0700 Subject: [PATCH] fix: track applied transactions in session op context (#6029) Signed-off-by: Alexander Onnikov --- server/core/src/server/storage.ts | 7 +++++-- server/core/src/triggers.ts | 17 +++++++++++++---- server/core/src/types.ts | 5 ++++- 3 files changed, 22 insertions(+), 7 deletions(-) diff --git a/server/core/src/server/storage.ts b/server/core/src/server/storage.ts index 74d0ba70d2..d0f718ff0a 100644 --- a/server/core/src/server/storage.ts +++ b/server/core/src/server/storage.ts @@ -719,7 +719,7 @@ export class TServerStorage implements ServerStorage { const applyTxes: Tx[] = [] - const triggerControl: Omit = { + const triggerControl: Omit = { operationContext: ctx, removedMap, workspace: this.workspaceId, @@ -752,7 +752,10 @@ export class TServerStorage implements ServerStorage { ...triggerControl, ctx: ctx.ctx, findAll: fAll(ctx.ctx), - result + txes: { + apply: applyTxes, + result + } }) result.push(...transactions) diff --git a/server/core/src/triggers.ts b/server/core/src/triggers.ts index fccfa4b3db..22c398a3f2 100644 --- a/server/core/src/triggers.ts +++ b/server/core/src/triggers.ts @@ -84,6 +84,7 @@ export class Triggers { performAsync?: (ctx: SessionOperationContext) => Promise }> { const result: Tx[] = [] + const apply: Tx[] = [] const suppressAsync = (ctx as SessionContextImpl).isAsyncContext ?? false @@ -97,7 +98,8 @@ export class Triggers { ctx: SessionOperationContext, matches: Tx[], { trigger, arrays }: TriggerRecord, - result: Tx[] + result: Tx[], + apply: Tx[] ): Promise => { const group = groupByArray(matches, (it) => it.modifiedBy) @@ -108,9 +110,13 @@ export class Triggers { txFactory: new TxFactory(core.account.System, true), findAll: async (clazz, query, options) => await ctrl.findAllCtx(ctx.ctx, clazz, query, options), apply: async (tx, needResult) => { + apply.push(...tx) return await ctrl.applyCtx(ctx, tx, needResult) }, - result + txes: { + apply, + result + } } for (const [k, v] of group.entries()) { const m = arrays ? [v] : v @@ -146,8 +152,10 @@ export class Triggers { {}, async (ctx) => { const tresult: Tx[] = [] - await applyTrigger(ctx, matches, { trigger, arrays }, tresult) + const tapply: Tx[] = [] + await applyTrigger(ctx, matches, { trigger, arrays }, tresult, tapply) result.push(...tresult) + apply.push(...tapply) }, { count: matches.length, arrays } ) @@ -161,10 +169,11 @@ export class Triggers { ? async (ctx) => { // If we have async triggers let's sheculed them after IO phase. const result: Tx[] = [] + const apply: Tx[] = [] for (const request of asyncRequest) { try { await ctx.with(request.trigger.resource, {}, async (ctx) => { - await applyTrigger(ctx, request.matches, request, result) + await applyTrigger(ctx, request.matches, request, result, apply) }) } catch (err: any) { ctx.ctx.error('failed to process trigger', { diff --git a/server/core/src/types.ts b/server/core/src/types.ts index a5ae0cb31e..f8d28769fb 100644 --- a/server/core/src/types.ts +++ b/server/core/src/types.ts @@ -173,7 +173,10 @@ export interface TriggerControl { ) => Promise> // Current set of transactions to being processed for apply/bulks - result: Tx[] + txes: { + apply: Tx[] + result: Tx[] + } } /**