fix(mining-admin): handle CONTRIBUTION_CREDITED event for wallet sync
Add handler for CONTRIBUTION_CREDITED events from mining-wallet-service to sync user wallet data to synced_user_wallets table. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
465e398040
commit
839feab97d
|
|
@ -353,6 +353,12 @@ export class CdcSyncService implements OnModuleInit {
|
||||||
this.withIdempotency(this.walletHandlers.handleFeeConfigUpdated.bind(this.walletHandlers)),
|
this.withIdempotency(this.walletHandlers.handleFeeConfigUpdated.bind(this.walletHandlers)),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// CONTRIBUTION_CREDITED 事件 - 贡献值入账时更新用户钱包
|
||||||
|
this.cdcConsumer.registerServiceHandler(
|
||||||
|
'CONTRIBUTION_CREDITED',
|
||||||
|
this.withIdempotency(this.handleContributionCredited.bind(this)),
|
||||||
|
);
|
||||||
|
|
||||||
this.logger.log('CDC sync handlers registered with idempotency protection');
|
this.logger.log('CDC sync handlers registered with idempotency protection');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -813,4 +819,60 @@ export class CdcSyncService implements OnModuleInit {
|
||||||
this.logger.debug('Synced circulation pool');
|
this.logger.debug('Synced circulation pool');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ===========================================================================
|
||||||
|
// 钱包事件处理 (mining-wallet-service)
|
||||||
|
// ===========================================================================
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 处理 CONTRIBUTION_CREDITED 事件
|
||||||
|
* mining-wallet-service 在为用户入账贡献值时发布
|
||||||
|
* payload: { accountSequence, walletType, amount, balanceAfter, transactionId, ... }
|
||||||
|
*/
|
||||||
|
private async handleContributionCredited(event: ServiceEvent, tx: TransactionClient): Promise<void> {
|
||||||
|
const { payload } = event;
|
||||||
|
const walletType = payload.walletType || 'CONTRIBUTION';
|
||||||
|
|
||||||
|
// 先查找是否已存在
|
||||||
|
const existing = await tx.syncedUserWallet.findUnique({
|
||||||
|
where: {
|
||||||
|
accountSequence_walletType: {
|
||||||
|
accountSequence: payload.accountSequence,
|
||||||
|
walletType,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
if (existing) {
|
||||||
|
// 更新余额(使用最新的 balanceAfter)
|
||||||
|
await tx.syncedUserWallet.update({
|
||||||
|
where: { id: existing.id },
|
||||||
|
data: {
|
||||||
|
balance: payload.balanceAfter,
|
||||||
|
totalInflow: {
|
||||||
|
increment: parseFloat(payload.amount) || 0,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
// 创建新钱包记录
|
||||||
|
// originalId 使用 accountSequence + walletType 的组合生成一个稳定的 ID
|
||||||
|
const originalId = `wallet-${payload.accountSequence}-${walletType}`;
|
||||||
|
|
||||||
|
await tx.syncedUserWallet.create({
|
||||||
|
data: {
|
||||||
|
originalId,
|
||||||
|
accountSequence: payload.accountSequence,
|
||||||
|
walletType,
|
||||||
|
balance: payload.balanceAfter || 0,
|
||||||
|
frozenBalance: 0,
|
||||||
|
totalInflow: parseFloat(payload.amount) || 0,
|
||||||
|
totalOutflow: 0,
|
||||||
|
isActive: true,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
this.logger.debug(`Synced user wallet from CONTRIBUTION_CREDITED: ${payload.accountSequence}, balance: ${payload.balanceAfter}`);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue