fix heart refill and grant unlimited hearts to active subscribers
next_refill_at was set on UserHearts but never read or recalculated, so a heart lost to zero never came back. UserHearts.apply_regen() now catches up missed 24h intervals on read/deduct, and lose_heart() starts the timer only when it isn't already running. Any user with an active (non-expired) subscription now skips heart deduction entirely, regardless of which plan they're on — good enough for now until per-plan perks are needed. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -122,11 +122,18 @@ class UserHeartsView(APIView):
|
||||
|
||||
@extend_schema(responses=UserHeartsResponseSerializer, tags=['Progress & Gamification (progress)'])
|
||||
def get(self, request):
|
||||
from subscription.services import has_unlimited_hearts
|
||||
|
||||
user = request.user
|
||||
hearts, _ = UserHearts.objects.get_or_create(user_id=user.id)
|
||||
if hearts.apply_regen():
|
||||
hearts.save(update_fields=['current_hearts', 'next_refill_at'])
|
||||
|
||||
unlimited = has_unlimited_hearts(user.id)
|
||||
data = {
|
||||
'currentHearts': hearts.current_hearts,
|
||||
'currentHearts': hearts.max_hearts if unlimited else hearts.current_hearts,
|
||||
'maxHearts': hearts.max_hearts,
|
||||
'nextRefillAt': hearts.next_refill_at,
|
||||
'nextRefillAt': None if unlimited else hearts.next_refill_at,
|
||||
'isUnlimited': unlimited,
|
||||
}
|
||||
return Response(UserHeartsResponseSerializer(data).data)
|
||||
|
||||
Reference in New Issue
Block a user