101 lines
3.5 KiB
Python
101 lines
3.5 KiB
Python
|
|
from rest_framework import status
|
||
|
|
from rest_framework.permissions import AllowAny, IsAuthenticated
|
||
|
|
from rest_framework.response import Response
|
||
|
|
from rest_framework.views import APIView
|
||
|
|
from rest_framework_simplejwt.tokens import RefreshToken
|
||
|
|
|
||
|
|
from apps.account.models import TermsAndConditions
|
||
|
|
|
||
|
|
from .selectors import UserSelector
|
||
|
|
from .serializers import (
|
||
|
|
ConfirmWithOTPSerializer,
|
||
|
|
LogoutSerializer,
|
||
|
|
ProfileUpdateSerializer,
|
||
|
|
RequestOTPSerializer,
|
||
|
|
VerifyOTPSerializer,
|
||
|
|
)
|
||
|
|
from .services import UserService
|
||
|
|
from .throttles import OTPVerifyThrottle, PhoneRateThrottle
|
||
|
|
|
||
|
|
|
||
|
|
class RequestOTPView(APIView):
|
||
|
|
"""ارسال کد تایید به شماره موبایل (کاربر جدید هم همینجا خودکار ساخته میشود)"""
|
||
|
|
|
||
|
|
permission_classes = [AllowAny]
|
||
|
|
throttle_classes = [PhoneRateThrottle]
|
||
|
|
|
||
|
|
def post(self, request):
|
||
|
|
serializer = RequestOTPSerializer(data=request.data)
|
||
|
|
serializer.is_valid(raise_exception=True)
|
||
|
|
result = UserService.send_login_code(
|
||
|
|
serializer.validated_data["phone"], referral_code=serializer.validated_data.get("referral_code")
|
||
|
|
)
|
||
|
|
return Response(result, status=status.HTTP_200_OK)
|
||
|
|
|
||
|
|
|
||
|
|
class TermsView(APIView):
|
||
|
|
"""متن قوانین و مقررات — قبل از لاگین هم باید قابلخواندن باشد."""
|
||
|
|
|
||
|
|
permission_classes = [AllowAny]
|
||
|
|
|
||
|
|
def get(self, request):
|
||
|
|
return Response({"content": TermsAndConditions.get_solo().content})
|
||
|
|
|
||
|
|
|
||
|
|
class VerifyOTPView(APIView):
|
||
|
|
"""تایید کد و دریافت توکنهای JWT"""
|
||
|
|
|
||
|
|
permission_classes = [AllowAny]
|
||
|
|
throttle_classes = [OTPVerifyThrottle]
|
||
|
|
|
||
|
|
def post(self, request):
|
||
|
|
serializer = VerifyOTPSerializer(data=request.data)
|
||
|
|
serializer.is_valid(raise_exception=True)
|
||
|
|
user = serializer.validated_data["user"]
|
||
|
|
return Response(UserSelector.get_token_response(user), status=status.HTTP_200_OK)
|
||
|
|
|
||
|
|
|
||
|
|
class LogoutView(APIView):
|
||
|
|
permission_classes = [IsAuthenticated]
|
||
|
|
|
||
|
|
def post(self, request):
|
||
|
|
serializer = LogoutSerializer(data=request.data)
|
||
|
|
serializer.is_valid(raise_exception=True)
|
||
|
|
try:
|
||
|
|
RefreshToken(serializer.validated_data["refresh"]).blacklist()
|
||
|
|
except Exception:
|
||
|
|
pass
|
||
|
|
return Response({"message": "خروج با موفقیت انجام شد."})
|
||
|
|
|
||
|
|
|
||
|
|
class ProfileView(APIView):
|
||
|
|
permission_classes = [IsAuthenticated]
|
||
|
|
|
||
|
|
def get(self, request):
|
||
|
|
return Response({"success": True, "data": UserSelector.get_user_profile(request.user)})
|
||
|
|
|
||
|
|
def patch(self, request):
|
||
|
|
serializer = ProfileUpdateSerializer(data=request.data, partial=True)
|
||
|
|
serializer.is_valid(raise_exception=True)
|
||
|
|
user = UserService.update_user_profile(request.user, serializer.validated_data)
|
||
|
|
return Response(
|
||
|
|
{
|
||
|
|
"success": True,
|
||
|
|
"message": "پروفایل با موفقیت بروزرسانی شد.",
|
||
|
|
"data": UserSelector.get_user_profile(user),
|
||
|
|
}
|
||
|
|
)
|
||
|
|
|
||
|
|
|
||
|
|
class ProfileDeleteView(APIView):
|
||
|
|
"""حذف حساب کاربری — نیاز به تایید OTP دارد (اول /auth/request-otp/ بزن)"""
|
||
|
|
|
||
|
|
permission_classes = [IsAuthenticated]
|
||
|
|
|
||
|
|
def delete(self, request):
|
||
|
|
serializer = ConfirmWithOTPSerializer(data=request.data)
|
||
|
|
serializer.is_valid(raise_exception=True)
|
||
|
|
UserService.verify_otp_for_action(request.user, serializer.validated_data["otp"])
|
||
|
|
request.user.delete()
|
||
|
|
return Response({"message": "حساب کاربری با موفقیت حذف شد."})
|