Files

101 lines
3.5 KiB
Python
Raw Permalink Normal View History

2026-08-24 15:54:08 +03:30
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": "حساب کاربری با موفقیت حذف شد."})