From b73958739ec6ebdad50ca8279ab9f8790180270c Mon Sep 17 00:00:00 2001 From: forge-bot Date: Sat, 18 Jul 2026 11:07:06 +0000 Subject: [PATCH] =?UTF-8?q?[framework]=20TxCore=20=E2=86=92=20common-frame?= =?UTF-8?q?work=20(ACM-FW-001)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../acquirecore/framework/TxTemplate.java | 74 +++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 boot/common-framework/src/main/java/com/klaro/acquirecore/framework/TxTemplate.java diff --git a/boot/common-framework/src/main/java/com/klaro/acquirecore/framework/TxTemplate.java b/boot/common-framework/src/main/java/com/klaro/acquirecore/framework/TxTemplate.java new file mode 100644 index 0000000..e57dda7 --- /dev/null +++ b/boot/common-framework/src/main/java/com/klaro/acquirecore/framework/TxTemplate.java @@ -0,0 +1,74 @@ +package com.klaro.acquirecore.framework; + +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; +import java.time.Instant; + +/** + * Template for executing transactional operations. + * Migrated from txcore.c tx_begin/tx_commit functions. + * Provides @Transactional equivalent functionality. + */ +@Component +public class TxTemplate { + + @Transactional + public TxResult execute(TxServiceRegistry.TxOperation operation) { + TxContext context = new TxContext(); + context.setStatus(TxContext.TransactionStatus.ACTIVE); + try { + T result = operation.execute(context); + context.setStatus(TxContext.TransactionStatus.COMMITTED); + context.setCommittedAt(Instant.now()); + return TxResult.success(result, context); + } catch (Exception e) { + context.setStatus(TxContext.TransactionStatus.ROLLED_BACK); + context.setErrorMessage(e.getMessage()); + throw new TxExecutionException("Transaction failed", e, context); + } + } + + @Transactional + public TxResult execute(String serviceName, TxServiceRegistry.TxOperation operation) { + TxContext context = new TxContext(serviceName); + context.setStatus(TxContext.TransactionStatus.ACTIVE); + try { + T result = operation.execute(context); + context.setStatus(TxContext.TransactionStatus.COMMITTED); + context.setCommittedAt(Instant.now()); + return TxResult.success(result, context); + } catch (Exception e) { + context.setStatus(TxContext.TransactionStatus.ROLLED_BACK); + context.setErrorMessage(e.getMessage()); + throw new TxExecutionException("Transaction failed for service: " + serviceName, e, context); + } + } + + public TxContext txBegin() { + return new TxContext(); + } + + public TxContext txBegin(String serviceName) { + return new TxContext(serviceName); + } + + @Transactional + public TxResult txCommit(TxContext context) { + if (context == null) { + return TxResult.failure("INVALID_CONTEXT", "Transaction context is null"); + } + context.setStatus(TxContext.TransactionStatus.COMMITTED); + context.setCommittedAt(Instant.now()); + return TxResult.success(null, context); + } + + @Transactional + public TxResult txRollback(TxContext context, String reason) { + if (context == null) { + return TxResult.failure("INVALID_CONTEXT", "Transaction context is null"); + } + context.setStatus(TxContext.TransactionStatus.ROLLED_BACK); + context.setErrorMessage(reason); + return TxResult.success(null, context); + } +}