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": "حساب کاربری با موفقیت حذف شد."})