From f6e804dfe7a41d50fd1a1470ea2fe111f4dd6abb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gerg=C5=91=20Jedlicska?= Date: Thu, 24 Oct 2024 19:27:44 +0200 Subject: [PATCH] feat(shared): add command pattern implementation --- packages/server/modules/shared/command.ts | 29 +++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 packages/server/modules/shared/command.ts diff --git a/packages/server/modules/shared/command.ts b/packages/server/modules/shared/command.ts new file mode 100644 index 000000000..bc87e4b7d --- /dev/null +++ b/packages/server/modules/shared/command.ts @@ -0,0 +1,29 @@ +import { EmitArg, EventBus, EventBusEmit } from '@/modules/shared/services/eventBus' +import { Knex } from 'knex' + +export const commandFactory = + ) => ReturnType>({ + db, + eventBus, + operationFactory + }: { + db: Knex + eventBus: EventBus + operationFactory: (arg: { db: Knex; emit: EventBusEmit }) => TOperation + }) => + async (...args: Parameters): Promise>> => { + const trx = await db.transaction() + + const events: EmitArg[] = [] + const emit: EventBusEmit = async ({ eventName, payload }) => { + events.push({ eventName, payload }) + } + + const result = await operationFactory({ db, emit })(...args) + + await trx.commit() + for (const event of events) { + eventBus.emit(event) + } + return result as Awaited> + }