fix: wire quest progress tracking for transfer, daily, trivia, and exam events
Some checks failed
Deploy to Production / test (push) Failing after 31s
Some checks failed
Deploy to Production / test (push) Failing after 31s
These domain events were only connected to dashboard recording but never called questService.handleEvent(), so quests with triggers TRANSFER_OUT, DAILY_REWARD, TRIVIA_WIN, and EXAM_REWARD never tracked progress. Added userId and tx to event payloads and switched from emit to emitAsync for transaction atomicity. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -38,6 +38,22 @@ export function registerDomainEventListeners() {
|
||||
await questService.handleEvent(payload.userId, `ITEM_USE:${payload.itemId}`, 1, payload.tx);
|
||||
});
|
||||
|
||||
systemEvents.on(EVENTS.DOMAIN.TRANSFER_COMPLETED, async (payload: DomainEventPayloads[typeof EVENTS.DOMAIN.TRANSFER_COMPLETED]) => {
|
||||
await questService.handleEvent(payload.userId, 'TRANSFER_OUT', 1, payload.tx);
|
||||
});
|
||||
|
||||
systemEvents.on(EVENTS.DOMAIN.DAILY_CLAIMED, async (payload: DomainEventPayloads[typeof EVENTS.DOMAIN.DAILY_CLAIMED]) => {
|
||||
await questService.handleEvent(payload.userId, 'DAILY_REWARD', 1, payload.tx);
|
||||
});
|
||||
|
||||
systemEvents.on(EVENTS.DOMAIN.TRIVIA_WON, async (payload: DomainEventPayloads[typeof EVENTS.DOMAIN.TRIVIA_WON]) => {
|
||||
await questService.handleEvent(payload.userId, 'TRIVIA_WIN', 1, payload.tx);
|
||||
});
|
||||
|
||||
systemEvents.on(EVENTS.DOMAIN.EXAM_PASSED, async (payload: DomainEventPayloads[typeof EVENTS.DOMAIN.EXAM_PASSED]) => {
|
||||
await questService.handleEvent(payload.userId, 'EXAM_REWARD', 1, payload.tx);
|
||||
});
|
||||
|
||||
// --- Dashboard event recording (fire-and-forget) ---
|
||||
|
||||
systemEvents.on(EVENTS.DOMAIN.TRANSFER_COMPLETED, (payload: DomainEventPayloads[typeof EVENTS.DOMAIN.TRANSFER_COMPLETED]) => {
|
||||
|
||||
@@ -53,9 +53,9 @@ export interface DomainEventPayloads {
|
||||
[EVENTS.DOMAIN.XP_GAINED]: { userId: string; amount: number; tx: Transaction };
|
||||
[EVENTS.DOMAIN.ITEM_COLLECTED]: { userId: string; itemId: number; quantity: number; tx: Transaction };
|
||||
[EVENTS.DOMAIN.ITEM_USED]: { userId: string; itemId: number; tx: Transaction };
|
||||
[EVENTS.DOMAIN.TRANSFER_COMPLETED]: { username: string; amount: bigint; toUserId: string };
|
||||
[EVENTS.DOMAIN.DAILY_CLAIMED]: { username: string; amount: bigint };
|
||||
[EVENTS.DOMAIN.TRANSFER_COMPLETED]: { userId: string; username: string; amount: bigint; toUserId: string; tx: Transaction };
|
||||
[EVENTS.DOMAIN.DAILY_CLAIMED]: { userId: string; username: string; amount: bigint; tx: Transaction };
|
||||
[EVENTS.DOMAIN.TRIVIA_STARTED]: { username: string; difficulty: string };
|
||||
[EVENTS.DOMAIN.TRIVIA_WON]: { username: string | undefined; reward: bigint };
|
||||
[EVENTS.DOMAIN.EXAM_PASSED]: { username: string; reward: bigint };
|
||||
[EVENTS.DOMAIN.TRIVIA_WON]: { userId: string; username: string | undefined; reward: bigint; tx: Transaction };
|
||||
[EVENTS.DOMAIN.EXAM_PASSED]: { userId: string; username: string; reward: bigint; tx: Transaction };
|
||||
}
|
||||
|
||||
@@ -63,7 +63,7 @@ export const economyService = {
|
||||
});
|
||||
|
||||
// Record dashboard event
|
||||
systemEvents.emit(EVENTS.DOMAIN.TRANSFER_COMPLETED, { username: sender.username, amount, toUserId });
|
||||
await systemEvents.emitAsync(EVENTS.DOMAIN.TRANSFER_COMPLETED, { userId: fromUserId, username: sender.username, amount, toUserId, tx: txFn });
|
||||
|
||||
return { success: true, amount };
|
||||
}, tx);
|
||||
@@ -158,7 +158,7 @@ export const economyService = {
|
||||
});
|
||||
|
||||
// Record dashboard event
|
||||
systemEvents.emit(EVENTS.DOMAIN.DAILY_CLAIMED, { username: user.username, amount: totalReward });
|
||||
await systemEvents.emitAsync(EVENTS.DOMAIN.DAILY_CLAIMED, { userId, username: user.username, amount: totalReward, tx: txFn });
|
||||
|
||||
return { claimed: true, amount: totalReward, streak, nextReadyAt, isWeekly: isWeeklyCurrent, weeklyBonus: weeklyBonusAmount };
|
||||
}, tx);
|
||||
|
||||
@@ -243,7 +243,7 @@ export const examService = {
|
||||
}
|
||||
|
||||
// Record dashboard event
|
||||
systemEvents.emit(EVENTS.DOMAIN.EXAM_PASSED, { username: user.username, reward });
|
||||
await systemEvents.emitAsync(EVENTS.DOMAIN.EXAM_PASSED, { userId, username: user.username, reward, tx: txFn });
|
||||
|
||||
return {
|
||||
status: ExamStatus.AVAILABLE,
|
||||
|
||||
@@ -289,7 +289,7 @@ class TriviaService {
|
||||
where: eq(users.id, BigInt(userId))
|
||||
});
|
||||
|
||||
systemEvents.emit(EVENTS.DOMAIN.TRIVIA_WON, { username: user?.username, reward });
|
||||
await systemEvents.emitAsync(EVENTS.DOMAIN.TRIVIA_WON, { userId, username: user?.username, reward, tx });
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user