fix: two-phase invite consumption to prevent registration race condition

This commit is contained in:
shuaiplus
2026-06-24 01:44:50 +08:00
committed by Shuai
parent 7279668955
commit 850fe0f044
5 changed files with 41 additions and 7 deletions
+11
View File
@@ -366,9 +366,20 @@ export async function handleRegister(request: Request, env: Env): Promise<Respon
if (msg.includes('unique') || msg.includes('constraint')) {
return errorResponse('Email already registered', 409);
}
console.error('Registration failed after invite reservation:', error);
throw error;
}
try {
const assigned = await storage.assignInviteUsedBy(inviteCode, user.id);
if (!assigned) {
console.warn('Invite used_by was not assigned after registration', { inviteCode, userId: user.id });
}
} catch (error) {
// The invite is already consumed. Do not reactivate it after the user row exists.
console.error('Invite used_by assignment failed after registration:', error);
}
await writeAuditEvent(storage, {
actorUserId: user.id,
action: 'user.register.invite',