from rest_framework import status, generics from rest_framework.decorators import api_view, permission_classes from rest_framework.response import Response from rest_framework.permissions import AllowAny, IsAuthenticated from rest_framework_simplejwt.tokens import RefreshToken from django.contrib.auth import authenticate from .models import CustomUser, UserProfile from .serializers import UserRegistrationSerializer, UserSerializer @api_view(['POST']) @permission_classes([AllowAny]) def register_user(request): serializer = UserRegistrationSerializer(data=request.data) if serializer.is_valid(): user = serializer.save() # Create user profile UserProfile.objects.create(user=user) # Generate tokens refresh = RefreshToken.for_user(user) return Response({ 'user': UserSerializer(user).data, 'refresh': str(refresh), 'access': str(refresh.access_token), }, status=status.HTTP_201_CREATED) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) @api_view(['POST']) @permission_classes([AllowAny]) def login_user(request): email = request.data.get('email') password = request.data.get('password') user = authenticate(request, email=email, password=password) if user is not None: refresh = RefreshToken.for_user(user) return Response({ 'user': UserSerializer(user).data, 'refresh': str(refresh), 'access': str(refresh.access_token), }) else: return Response( {'error': 'Invalid credentials'}, status=status.HTTP_401_UNAUTHORIZED ) @api_view(['GET']) @permission_classes([IsAuthenticated]) def get_user_profile(request): serializer = UserSerializer(request.user) return Response(serializer.data) @api_view(['PUT']) @permission_classes([IsAuthenticated]) def update_user_profile(request): serializer = UserSerializer(request.user, data=request.data, partial=True) if serializer.is_valid(): serializer.save() return Response(serializer.data) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) class UserDetailView(generics.RetrieveAPIView): serializer_class = UserSerializer permission_classes = [IsAuthenticated] def get_object(self): return self.request.user