from rest_framework import generics, permissions, status from rest_framework.response import Response from rest_framework_simplejwt.tokens import RefreshToken from .serializers import UserSerializer, RegisterSerializer # Removed get_user_model as we are in 100% MongoDB mode. from django.contrib.auth import authenticate class LoginView(generics.GenericAPIView): permission_classes = (permissions.AllowAny,) serializer_class = RegisterSerializer # Reusing for username/password def post(self, request, *args, **kwargs): username = request.data.get('username') password = request.data.get('password') # Use global authenticate logic (tries all backends in settings.py) user = authenticate(request, username=username, password=password) if user: refresh = RefreshToken.for_user(user) return Response({ 'user': UserSerializer(user).data, 'refresh': str(refresh), 'access': str(refresh.access_token), }) return Response({'error': 'Invalid credentials'}, status=status.HTTP_401_UNAUTHORIZED) class RegisterView(generics.CreateAPIView): permission_classes = (permissions.AllowAny,) serializer_class = RegisterSerializer def create(self, request, *args, **kwargs): serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) user_data = serializer.save() # Wrapper to make simplejwt happy (it expects an object with id/pk) class UserWrapper: def __init__(self, data): self.id = data.get('id') self.pk = data.get('id') self.username = data.get('username') self.email = data.get('email') def __str__(self): return self.username user_obj = UserWrapper(user_data) refresh = RefreshToken.for_user(user_obj) return Response({ 'user': UserSerializer(user_data, context=self.get_serializer_context()).data, 'refresh': str(refresh), 'access': str(refresh.access_token), }, status=status.HTTP_201_CREATED) class ProfileView(generics.RetrieveUpdateAPIView): serializer_class = UserSerializer permission_classes = (permissions.IsAuthenticated,) def get_object(self): return self.request.user