fix: preserve points balance across account re-registration

Persist a per-email balance snapshot before account deletion and restore it on same-email re-registration, preventing both unintended balance reset and repeated signup bonus grants.
This commit is contained in:
qzl
2026-04-13 11:28:58 +08:00
parent ed8c2e3058
commit c55be6d3fd
9 changed files with 223 additions and 21 deletions
+27 -2
View File
@@ -148,7 +148,7 @@ class PointsRepository:
*,
email_hash: str,
user_email_snapshot: str,
first_user_id: UUID,
first_user_id_snapshot: UUID,
grant_event_id: str,
) -> bool:
stmt = (
@@ -156,7 +156,7 @@ class PointsRepository:
.values(
email_hash=email_hash,
user_email_snapshot=user_email_snapshot,
first_user_id=first_user_id,
first_user_id_snapshot=first_user_id_snapshot,
grant_event_id=grant_event_id,
)
.on_conflict_do_nothing(index_elements=[RegisterBonusClaims.email_hash])
@@ -164,3 +164,28 @@ class PointsRepository:
)
inserted_id = (await self._session.execute(stmt)).scalar_one_or_none()
return inserted_id is not None
async def get_register_bonus_claim(
self,
*,
email_hash: str,
) -> RegisterBonusClaims | None:
stmt = (
select(RegisterBonusClaims)
.where(RegisterBonusClaims.email_hash == email_hash)
.limit(1)
)
return (await self._session.execute(stmt)).scalar_one_or_none()
async def update_register_bonus_balance_snapshot(
self,
*,
email_hash: str,
balance_snapshot: int,
) -> bool:
claim = await self.get_register_bonus_claim(email_hash=email_hash)
if claim is None:
return False
claim.balance_snapshot = int(balance_snapshot)
await self._session.flush()
return True