fix: auth register api fixed

This commit is contained in:
behruz-dev
2025-07-29 18:01:49 +05:00
parent a697c6a6a3
commit 6bc284f1ec
6 changed files with 32 additions and 47 deletions

View File

@@ -6,4 +6,5 @@ CELERY_ACCEPT_CONTENT = ['json']
CELERY_TASK_SERIALIZER = 'json' CELERY_TASK_SERIALIZER = 'json'
CELERY_TIMEZONE = settings.TIME_ZONE CELERY_TIMEZONE = settings.TIME_ZONE
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') if not env('DEBUG'):
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')

View File

@@ -7,12 +7,15 @@ from config.env import env
r = redis.StrictRedis.from_url(env.str('REDIS_URL')) r = redis.StrictRedis.from_url(env.str('REDIS_URL'))
def cache_user_credentials(phone_number, password, time): def cache_user_credentials(phone_number, password, first_name, last_name, email, time):
key = f"user_credentials:{phone_number}" key = f"user_credentials:{phone_number}"
r.hmset(key, { r.hmset(key, {
"phone": phone_number, "phone": phone_number,
"password": password "password": password,
"first_name": first_name,
"last_name": last_name,
"email": email
}) })
r.expire(key, time) r.expire(key, time)
@@ -27,5 +30,8 @@ def get_user_creadentials(phone_number):
return { return {
"phone": data.get(b"phone").decode() if data.get(b"phone") else None, "phone": data.get(b"phone").decode() if data.get(b"phone") else None,
"password": data.get(b"password").decode() if data.get(b"password") else None "password": data.get(b"password").decode() if data.get(b"password") else None,
"first_name": data.get(b"first_name").decode() if data.get(b'first_name') else None,
"last_name": data.get(b"last_name").decode() if data.get(b'last_name') else None,
"email": data.get(b"email").decode() if data.get(b'email') else None,
} }

View File

@@ -12,7 +12,7 @@ class VerificationCode(BaseModel):
expiration_time = models.TimeField(null=True, blank=True) expiration_time = models.TimeField(null=True, blank=True)
def __str__(self): def __str__(self):
return f'{self.user.phone} - {self.code}' return f'{self.phone} - {self.code}'
class Meta: class Meta:
verbose_name = 'Verification Code' verbose_name = 'Verification Code'

View File

@@ -28,10 +28,18 @@ class LoginSerializer(serializers.Serializer):
class RegisterSerializer(serializers.Serializer): class RegisterSerializer(serializers.Serializer):
phone = serializers.CharField() phone = serializers.CharField()
password = serializers.CharField() password = serializers.CharField()
first_name = serializers.CharField()
last_name = serializers.CharField()
email = serializers.EmailField()
def validate_phone(self, value): def validate_phone(self, value):
if User.objects.filter(phone=value).exists(): if User.objects.filter(phone=value).exists():
raise serializers.ValidationError("User exists") raise serializers.ValidationError("User exists with this phone")
return value
def validate_email(self, value):
if User.objects.filter(email=value).exists():
raise serializers.ValidationError("User exists with this email")
return value return value
@@ -53,23 +61,3 @@ class ConfirmUserSerializer(serializers.Serializer):
class ChoiseRoleSerializer(serializers.Serializer): class ChoiseRoleSerializer(serializers.Serializer):
role = serializers.ChoiceField(choices=ROLE_CHOICES) role = serializers.ChoiceField(choices=ROLE_CHOICES)
class CompliteUserProfileSerializer(serializers.Serializer):
first_name = serializers.CharField()
last_name = serializers.CharField()
email = serializers.EmailField()
def validate(self, data):
user = User.objects.filter(email=data.get('email')).first()
if user:
raise serializers.ValidationError({'detail': "User with this email already exists"})
return data
def update(self, instance, validated_data):
with transaction.atomic():
instance.first_name = validated_data.get('first_name')
instance.last_name = validated_data.get('last_name')
instance.email = validated_data.get('email')
instance.save()
return instance

View File

@@ -1,6 +1,6 @@
from django.urls import path, include from django.urls import path, include
from core.apps.accounts.views.auth import LoginApiView, RegisterApiView, ConfirUserApiView, ChoiceUserRoleApiView, CompliteUserProfileApiView from core.apps.accounts.views.auth import LoginApiView, RegisterApiView, ConfirUserApiView, ChoiceUserRoleApiView
urlpatterns = [ urlpatterns = [
path('auth/', include( path('auth/', include(
@@ -9,7 +9,6 @@ urlpatterns = [
path('register/', RegisterApiView.as_view(), name='register'), path('register/', RegisterApiView.as_view(), name='register'),
path('confirm_user/', ConfirUserApiView.as_view(), name='confirm-user'), path('confirm_user/', ConfirUserApiView.as_view(), name='confirm-user'),
path('choise_user_role/', ChoiceUserRoleApiView.as_view(), name='choise-user-role'), path('choise_user_role/', ChoiceUserRoleApiView.as_view(), name='choise-user-role'),
path('complite_user_profile/', CompliteUserProfileApiView.as_view(), name='complite-user-profile'),
] ]
)) ))
] ]

View File

@@ -37,7 +37,10 @@ class RegisterApiView(generics.GenericAPIView):
serializer = self.serializer_class(data=request.data) serializer = self.serializer_class(data=request.data)
if serializer.is_valid(): if serializer.is_valid():
data = serializer.validated_data data = serializer.validated_data
cache_user_credentials(data['phone'], data['password'], 300) cache_user_credentials(
data['phone'], data['password'], data['first_name'],
data['last_name'], data['email'], 300
)
user_tasks.create_and_send_sms_code.delay(data['phone']) user_tasks.create_and_send_sms_code.delay(data['phone'])
return success_message("code is send", 200) return success_message("code is send", 200)
return error_message(serializer.errors, 400) return error_message(serializer.errors, 400)
@@ -56,7 +59,10 @@ class ConfirUserApiView(generics.GenericAPIView):
data = get_user_creadentials(phone) data = get_user_creadentials(phone)
if not data: if not data:
return error_message("Not found", 404) return error_message("Not found", 404)
user = User.objects.create_user(phone=data['phone']) user = User.objects.create_user(
phone=data['phone'], first_name=data['first_name'],
last_name=data['last_name'], email=data['email']
)
user.set_password(data['password']) user.set_password(data['password'])
user.save() user.save()
confirmation.is_verify = True confirmation.is_verify = True
@@ -82,18 +88,3 @@ class ChoiceUserRoleApiView(generics.GenericAPIView):
user.save() user.save()
return success_message('role choices', 200) return success_message('role choices', 200)
return error_message(serializer.errors, 400) return error_message(serializer.errors, 400)
class CompliteUserProfileApiView(generics.GenericAPIView):
serializer_class = auth_serializer.CompliteUserProfileSerializer
queryset = User.objects.all()
def put(self, request):
user = request.user
if user:
serializer = self.serializer_class(data=request.data, instance=user)
if serializer.is_valid():
serializer.save()
return success_message("profile complited", 200)
return error_message(serializer.errors, 400)
return error_message("User not found", 404)