fix: catch race conditions when creating users
This commit is contained in:
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user