complite auth api

This commit is contained in:
behruz-dev
2025-07-15 11:09:28 +05:00
parent dd56acf978
commit f1afb86f20
9 changed files with 163 additions and 18 deletions

View File

@@ -3,6 +3,9 @@ from django.contrib.auth import get_user_model
from rest_framework import serializers
from core.apps.accounts.tasks.user import create_and_send_sms_code
from core.apps.accounts.enums.user import ROLE_CHOICES
User = get_user_model()
class LoginSerializer(serializers.Serializer):
@@ -34,9 +37,57 @@ class RegisterSerializer(serializers.Serializer):
with transaction.atomic():
new_user = User.objects.create_user(
phone=validated_data.pop('phone'),
is_active=False
)
new_user.set_password(validated_data.pop('password'))
new_user.save()
create_and_send_sms_code.delay(new_user.id)
return new_user
class ConfirmUserSerializer(serializers.Serializer):
phone = serializers.CharField()
code = serializers.IntegerField()
def validate(self, data):
try:
user = User.objects.get(phone=data.get('phone'))
except User.DoesNotExist:
raise serializers.ValidationError({"detail": "User not found"})
if user.is_active:
raise serializers.ValidationError({"detail": "User already activated"})
data['user'] = user
return data
class ChoiseRoleSerializer(serializers.Serializer):
phone = serializers.CharField()
role = serializers.ChoiceField(choices=ROLE_CHOICES)
def validate(self, data):
try:
user = User.objects.get(phone=data.get("phone"), is_active=False)
except User.DoesNotExist:
raise serializers.ValidationError({"detail": "user not found"})
data['user'] = user
return data
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,9 +1,11 @@
from celery import shared_task
from core.apps.accounts.models.verification_code import VerificationCode
from core.apps.accounts.models.user import User
from core.services.sms import send_sms_eskiz
@shared_task
def create_and_send_sms_code(user):
user = User.objects.get(id=user)
code = user.generate_code()
send_sms_eskiz(user.phone, code)

View File

@@ -1,12 +1,15 @@
from django.urls import path, include
from core.apps.accounts.views.auth import LoginApiView, RegisterApiView
from core.apps.accounts.views.auth import LoginApiView, RegisterApiView, ConfirUserApiView, ChoiceUserRoleApiView, CompliteUserProfileApiView
urlpatterns = [
path('auth/', include(
[
path('login/', LoginApiView.as_view(), name='login'),
path('register/', RegisterApiView.as_view(), name='login'),
path('confirm_user/', ConfirUserApiView.as_view(), name='confirm-user'),
path('choise_user_role/', ChoiceUserRoleApiView.as_view(), name='choise-user-role'),
path('complite_user_profile/<str:phone>/', CompliteUserProfileApiView.as_view(), name='complite-user-profile'),
]
))
]

View File

@@ -1,4 +1,5 @@
from django.contrib.auth import get_user_model
from django.utils import timezone
from rest_framework import generics, status, views
from rest_framework.response import Response
@@ -8,6 +9,7 @@ from rest_framework_simplejwt.tokens import RefreshToken
from drf_spectacular.utils import extend_schema
from core.apps.accounts.serializers import auth as auth_serializer
from core.apps.accounts.models.verification_code import VerificationCode
User = get_user_model()
@@ -29,4 +31,67 @@ class LoginApiView(generics.GenericAPIView):
class RegisterApiView(generics.CreateAPIView):
serializer_class = auth_serializer.RegisterSerializer
queryset = User.objects.all()
permission_classes = []
permission_classes = []
@extend_schema(tags=['auth'])
class ConfirUserApiView(generics.GenericAPIView):
serializer_class = auth_serializer.ConfirmUserSerializer
queryset = User.objects.all()
permission_classes = []
def post(self, request):
serializer = self.serializer_class(data=request.data)
if serializer.is_valid():
user = serializer.validated_data.get('user')
code = serializer.validated_data.get('code')
code = VerificationCode.objects.filter(user=user, code=code).first()
if code:
if code.is_expired or code.expiration_time < timezone.now().time():
return Response({"success": True, "message": "code is expired"}, status=status.HTTP_400_BAD_REQUEST)
if code.is_verify:
return Response({"success": True, "message": "code is verified"}, status=status.HTTP_400_BAD_REQUEST)
user.save()
code.is_verify = True
code.is_expired = True
code.save()
return Response({"success": True, "message": "user activated"}, status=status.HTTP_202_ACCEPTED)
return Response({"success": False, "message": "code is wrong"}, status=status.HTTP_400_BAD_REQUEST)
return Response({"success": False, "message": serializer.errors}, status=status.HTTP_400_BAD_REQUEST)
@extend_schema(tags=['auth'])
class ChoiceUserRoleApiView(generics.GenericAPIView):
serializer_class = auth_serializer.ChoiseRoleSerializer
queryset = User.objects.all()
permission_classes = []
@extend_schema(description="roles -> PP(physcal person) or LP(legal person)")
def post(self, request):
serializer = self.serializer_class(data=request.data)
if serializer.is_valid():
user = serializer.validated_data.get('user')
role = serializer.validated_data.get('role')
user.role = role
user.save()
return Response({'success': True, 'message': "role is selected"}, status=status.HTTP_200_OK)
return Response({'success': False, "message": serializer.errors}, status=status.HTTP_400_BAD_REQUEST)
@extend_schema(tags=['auth'])
class CompliteUserProfileApiView(generics.GenericAPIView):
serializer_class = auth_serializer.CompliteUserProfileSerializer
queryset = User.objects.all()
permission_classes = []
def put(self, request, phone):
user = User.objects.filter(phone=phone, is_active=True).first()
if user:
serializer = self.serializer_class(data=request.data, instance=user)
if serializer.is_valid():
serializer.save()
token = RefreshToken.for_user(user)
return Response({'access_token': str(token.access_token), "refresh_token": str(token), "role": user.role}, status=status.HTTP_200_OK)
return Response({'success': False, 'message': serializer.errors}, status=status.HTTP_400_BAD_REQUEST)
return Response({'success': False, "message": "User not found"}, status=status.HTTP_404_NOT_FOUND)