fix: catch race conditions when creating users

This commit is contained in:
2026-03-14 15:11:19 +03:00
parent 9787fb699a
commit f3811b7520
2 changed files with 78 additions and 7 deletions
+19 -7
View File
@@ -1,4 +1,5 @@
from django.contrib.auth import get_user_model
from django.db import IntegrityError
from rest_framework import generics, permissions, status
from rest_framework.response import Response
from django.utils.translation import gettext as _
@@ -125,13 +126,24 @@ class PhoneAuthRequestView(APIView):
{"detail": _("Email already in use.")},
status=status.HTTP_400_BAD_REQUEST,
)
user = User.objects.create_user(
email=email,
phone_number=phone_number,
first_name=data.get("first_name", ""),
last_name=data.get("last_name", ""),
role="customer",
)
try:
user = User.objects.create_user(
email=email,
phone_number=phone_number,
first_name=data.get("first_name", ""),
last_name=data.get("last_name", ""),
role="customer",
)
except IntegrityError:
user = User.objects.filter(phone_number=phone_number).first()
if not user:
# Another worker may have claimed this phone or email after our initial checks.
if email and User.objects.filter(email=email).exists():
return Response(
{"detail": _("Email already in use.")},
status=status.HTTP_400_BAD_REQUEST,
)
raise
try:
result = create_and_send_otp(