fix(wallet): fix message format parsing in RewardEventConsumerController

The OutboxPublisherService sends payload fields directly at the message
root level, not nested under a 'payload' property. Update the consumer
to read fields directly from message instead of message.payload.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
hailin 2025-12-10 23:49:07 -08:00
parent 1acb314e7b
commit a1ca490ff4
1 changed files with 32 additions and 29 deletions

View File

@ -6,23 +6,24 @@ import Decimal from 'decimal.js';
/** /**
* *
*
* OutboxPublisherService payload
* accountSequence
*/ */
interface RewardSummaryUpdatedEvent { interface RewardSummaryUpdatedEvent {
eventType: string; // payload 字段直接展开在顶层
aggregateId: string; accountSequence: string;
payload: { userId: string;
accountSequence: string; pendingUsdt: number;
userId: string; pendingHashpower: number;
pendingUsdt: number; pendingExpireAt: string | null;
pendingHashpower: number; settleableUsdt: number;
pendingExpireAt: string | null; settleableHashpower: number;
settleableUsdt: number; settledTotalUsdt: number;
settleableHashpower: number; settledTotalHashpower: number;
settledTotalUsdt: number; expiredTotalUsdt: number;
settledTotalHashpower: number; expiredTotalHashpower: number;
expiredTotalUsdt: number; // outbox 元数据
expiredTotalHashpower: number;
};
_outbox?: { _outbox?: {
id: string; id: string;
aggregateId: string; aggregateId: string;
@ -56,13 +57,15 @@ export class RewardEventConsumerController {
const partition = context.getPartition(); const partition = context.getPartition();
const offset = context.getMessage().offset; const offset = context.getMessage().offset;
const outboxInfo = message._outbox; const outboxInfo = message._outbox;
const eventId = outboxInfo?.aggregateId || message.aggregateId; // eventId 和 eventType 来自 _outbox 元数据,或者使用 accountSequence 作为备用
const eventType = outboxInfo?.eventType || message.eventType; const eventId = outboxInfo?.aggregateId || message.accountSequence;
const eventType = outboxInfo?.eventType || 'reward.summary.updated';
this.logger.log( this.logger.log(
`[REWARD-EVENT] Received reward.summary.updated for ${eventId} ` + `[REWARD-EVENT] Received reward.summary.updated for ${eventId} ` +
`[partition=${partition}, offset=${offset}]`, `[partition=${partition}, offset=${offset}]`,
); );
this.logger.debug(`[REWARD-EVENT] Message content: ${JSON.stringify(message)}`);
try { try {
// 1. 幂等性检查 // 1. 幂等性检查
@ -85,23 +88,23 @@ export class RewardEventConsumerController {
} }
// 2. 更新 wallet_accounts 表的 rewards 数据 // 2. 更新 wallet_accounts 表的 rewards 数据
const payload = message.payload; // 注意payload 字段直接展开在消息顶层
const accountSequence = BigInt(payload.accountSequence); const accountSequence = BigInt(message.accountSequence);
await this.prisma.$transaction(async (tx) => { await this.prisma.$transaction(async (tx) => {
// 更新钱包账户的奖励数据 // 更新钱包账户的奖励数据
await tx.walletAccount.update({ await tx.walletAccount.update({
where: { accountSequence }, where: { accountSequence },
data: { data: {
pendingUsdt: new Decimal(payload.pendingUsdt), pendingUsdt: new Decimal(message.pendingUsdt),
pendingHashpower: new Decimal(payload.pendingHashpower), pendingHashpower: new Decimal(message.pendingHashpower),
pendingExpireAt: payload.pendingExpireAt ? new Date(payload.pendingExpireAt) : null, pendingExpireAt: message.pendingExpireAt ? new Date(message.pendingExpireAt) : null,
settleableUsdt: new Decimal(payload.settleableUsdt), settleableUsdt: new Decimal(message.settleableUsdt),
settleableHashpower: new Decimal(payload.settleableHashpower), settleableHashpower: new Decimal(message.settleableHashpower),
settledTotalUsdt: new Decimal(payload.settledTotalUsdt), settledTotalUsdt: new Decimal(message.settledTotalUsdt),
settledTotalHashpower: new Decimal(payload.settledTotalHashpower), settledTotalHashpower: new Decimal(message.settledTotalHashpower),
expiredTotalUsdt: new Decimal(payload.expiredTotalUsdt), expiredTotalUsdt: new Decimal(message.expiredTotalUsdt),
expiredTotalHashpower: new Decimal(payload.expiredTotalHashpower), expiredTotalHashpower: new Decimal(message.expiredTotalHashpower),
}, },
}); });
@ -117,7 +120,7 @@ export class RewardEventConsumerController {
this.logger.log( this.logger.log(
`[REWARD-EVENT] ✓ Updated rewards for accountSequence ${accountSequence}: ` + `[REWARD-EVENT] ✓ Updated rewards for accountSequence ${accountSequence}: ` +
`settleable=${payload.settleableUsdt}, pending=${payload.pendingUsdt}`, `settleable=${message.settleableUsdt}, pending=${message.pendingUsdt}`,
); );
// 3. 发送确认 // 3. 发送确认