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