From 6cb282147eeed7bf188940a10fb227324b141134 Mon Sep 17 00:00:00 2001 From: Wang Zhuoxuan Date: Tue, 9 Jun 2026 18:18:17 +0800 Subject: [PATCH] Remove implicit first-visit heart grant from progress summary --- src/__tests__/services/learning/challenge-service.test.ts | 5 +---- src/services/learning/progress-summary-service.ts | 2 -- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/src/__tests__/services/learning/challenge-service.test.ts b/src/__tests__/services/learning/challenge-service.test.ts index 9a9c394..a8a2e82 100644 --- a/src/__tests__/services/learning/challenge-service.test.ts +++ b/src/__tests__/services/learning/challenge-service.test.ts @@ -306,7 +306,6 @@ describe('challenge-service', () => { [freeUserRow], // deductDailyAttempt → getResourceUser [knowledgeCardRow], // getKnowledgeCard [{ groupId: 'week-2026-05-11-group-1' }], // addXp(first card): reuse weekly group - [userAfterAttempt], // grantDailyFirstVisitHeart → getResourceUser [userAfterAttempt], // getResourceUser (getProgressSummary) [{ tier: 'free', heartsRemaining: 5, heartsLastRestore: null }], // getHearts [{ checkInDays: 2, lastCheckInDate: new Date().toISOString() }], // calculateStreak @@ -342,7 +341,6 @@ describe('challenge-service', () => { [{ createdAt: new Date(Date.now() - 10 * 86_400_000).toISOString() }], // isNewUserProtected [freeUserRow], // deductDailyAttempt → getResourceUser [knowledgeCardRow], // getKnowledgeCard - [userAfter], // grantDailyFirstVisitHeart → getResourceUser [userAfter], // getResourceUser (getProgressSummary) [{ tier: 'free', heartsRemaining: 2, heartsLastRestore: null }], // getHearts [{ checkInDays: 0, lastCheckInDate: null }], // calculateStreak @@ -357,6 +355,7 @@ describe('challenge-service', () => { expect(result.answerState).toBe('wrong'); expect(result.xpDelta).toBe(0); + expect(result.progress.hearts).toBe(2); expect(db.update).toHaveBeenCalled(); }); @@ -386,7 +385,6 @@ describe('challenge-service', () => { [{ tier: 'pro', heartsRemaining: 99 }], // deductHeart: pro user [proUserRow], // deductDailyAttempt → getResourceUser [knowledgeCardRow], // getKnowledgeCard - [proUserAfter], // grantDailyFirstVisitHeart → getResourceUser [proUserAfter], // getResourceUser (getProgressSummary) [{ tier: 'pro', heartsRemaining: 99, heartsLastRestore: null }], // getHearts [{ checkInDays: 0, lastCheckInDate: null }], // calculateStreak @@ -415,7 +413,6 @@ describe('challenge-service', () => { [], // addXp(correct): no existing leaderboard group [freeUserRow], // deductDailyAttempt → getResourceUser // settleCompletedChallenge → getProgressSummary (before) - [userAfterAttempt], // grantDailyFirstVisitHeart → getResourceUser [userAfterAttempt], // getResourceUser [{ tier: 'free', heartsRemaining: 5, heartsLastRestore: null }], // getHearts [{ checkInDays: 2, lastCheckInDate: new Date().toISOString() }], // calculateStreak diff --git a/src/services/learning/progress-summary-service.ts b/src/services/learning/progress-summary-service.ts index 7595e0e..920df1c 100644 --- a/src/services/learning/progress-summary-service.ts +++ b/src/services/learning/progress-summary-service.ts @@ -223,8 +223,6 @@ export async function protectStreak(userId: string, _source: RewardSource): Prom } export async function getProgressSummary(userId: string): Promise { - await grantDailyFirstVisitHeart(userId); - const [user, hearts, streak, subscription, attempts] = await Promise.all([ getResourceUser(userId), getHearts(userId),