Browse Source

Refactor CourseOnlineClassTokenValidateAPIView to improve permission handling and logging

- Updated permission classes to allow any user for GET requests, enhancing accessibility.
- Added detailed logging for both GET and POST requests to track request data and processing steps.
- Improved handling of user authentication status in log messages for better traceability.
master
mortezaei 3 months ago
parent
commit
8f3d6f703d
  1. 33
      apps/course/views/course.py

33
apps/course/views/course.py

@ -415,13 +415,9 @@ class CourseOnlineClassTokenAPIView(GenericAPIView):
class CourseOnlineClassTokenValidateAPIView(GenericAPIView): class CourseOnlineClassTokenValidateAPIView(GenericAPIView):
permission_classes = [AllowAny]
serializer_class = OnlineClassTokenVerifySerializer serializer_class = OnlineClassTokenVerifySerializer
def get_permissions(self):
if self.request.method == 'GET':
return [IsAuthenticated()]
return [AllowAny()]
@swagger_auto_schema( @swagger_auto_schema(
tags=['Imam-Javad - Course'], tags=['Imam-Javad - Course'],
operation_description="Get course and user data for authenticated user.", operation_description="Get course and user data for authenticated user.",
@ -452,6 +448,14 @@ class CourseOnlineClassTokenValidateAPIView(GenericAPIView):
} }
) )
def get(self, request, slug, *args, **kwargs): def get(self, request, slug, *args, **kwargs):
print("=" * 80)
print(f"[Online Validate GET] REQUEST RECEIVED {request.data}")
print(f"[Online Validate GET] slug={slug}")
print(f"[Online Validate GET] user={request.user}")
print(f"[Online Validate GET] user.is_authenticated={request.user.is_authenticated}")
print(f"[Online Validate GET] user.id={request.user.id if request.user.is_authenticated else 'N/A'}")
print("=" * 80)
logger.info(f"[Online Validate GET] Request received - slug={slug} user_id={request.user.id if request.user.is_authenticated else 'anonymous'}") logger.info(f"[Online Validate GET] Request received - slug={slug} user_id={request.user.id if request.user.is_authenticated else 'anonymous'}")
detail_view = CourseDetailAPIView() detail_view = CourseDetailAPIView()
@ -459,6 +463,7 @@ class CourseOnlineClassTokenValidateAPIView(GenericAPIView):
course = get_object_or_404(queryset, slug=slug) course = get_object_or_404(queryset, slug=slug)
user = request.user user = request.user
print(f"[Online Validate GET] Course found - course_id={course.id} slug={slug} is_online={course.is_online}")
logger.info(f"[Online Validate GET] Course found - course_id={course.id} slug={slug} is_online={course.is_online}") logger.info(f"[Online Validate GET] Course found - course_id={course.id} slug={slug} is_online={course.is_online}")
# DEPRECATED: Polling approach replaced by webhook integration # DEPRECATED: Polling approach replaced by webhook integration
@ -469,11 +474,12 @@ class CourseOnlineClassTokenValidateAPIView(GenericAPIView):
user_data = UserProfileSerializer(user, context={'request': request}).data user_data = UserProfileSerializer(user, context={'request': request}).data
metadata = self._build_metadata( metadata = self._build_metadata(
course, course,
{'user_id': user.id, 'extra': {}, 'generated_at': timezone.now().isoformat()},
{'user_id': user.id if user.is_authenticated else None, 'extra': {}, 'generated_at': timezone.now().isoformat()},
user=user, user=user,
) )
logger.info(f"[Online Validate GET] Success - user_id={user.id} course={slug} can_create={metadata.get('can_create_live_session')} can_join={metadata.get('can_join_live_session')}")
print(f"[Online Validate GET] Success - metadata={metadata}")
logger.info(f"[Online Validate GET] Success - user_id={user.id if user.is_authenticated else 'anonymous'} course={slug} can_create={metadata.get('can_create_live_session')} can_join={metadata.get('can_join_live_session')}")
return Response({ return Response({
'course': course_data, 'course': course_data,
@ -504,29 +510,40 @@ class CourseOnlineClassTokenValidateAPIView(GenericAPIView):
} }
) )
def post(self, request, *args, **kwargs): def post(self, request, *args, **kwargs):
print("=" * 80)
print(f"[Online Validate POST] REQUEST RECEIVED")
print(f"[Online Validate POST] request.data={request.data}")
print(f"[Online Validate POST] has_token={'token' in request.data}")
print("=" * 80)
logger.info(f"[Online Validate POST] Request received - has_token={'token' in request.data}") logger.info(f"[Online Validate POST] Request received - has_token={'token' in request.data}")
serializer = self.get_serializer(data=request.data) serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True) serializer.is_valid(raise_exception=True)
token_value = serializer.validated_data['token'] token_value = serializer.validated_data['token']
print(f"[Online Validate POST] Token extracted - token={token_value[:16]}...")
logger.info(f"[Online Validate POST] Token extracted - token={token_value[:16]}...") logger.info(f"[Online Validate POST] Token extracted - token={token_value[:16]}...")
manager = OnlineClassTokenManager() manager = OnlineClassTokenManager()
try: try:
payload = manager.get_payload(token_value) payload = manager.get_payload(token_value)
print(f"[Online Validate POST] Token decoded successfully - payload={payload}")
logger.info(f"[Online Validate POST] Token decoded successfully - payload={payload}") logger.info(f"[Online Validate POST] Token decoded successfully - payload={payload}")
except Exception as e: except Exception as e:
print(f"[Online Validate POST] Token decode FAILED - error={str(e)} type={type(e).__name__}")
logger.error(f"[Online Validate POST] Token decode failed - error={str(e)} type={type(e).__name__}") logger.error(f"[Online Validate POST] Token decode failed - error={str(e)} type={type(e).__name__}")
raise raise
course_id = payload.get('course_id') course_id = payload.get('course_id')
user_id = payload.get('user_id') user_id = payload.get('user_id')
if not course_id or not user_id: if not course_id or not user_id:
print(f"[Online Validate POST] Invalid token payload - course_id={course_id} user_id={user_id}")
logger.warning(f"[Online Validate POST] Invalid token payload - course_id={course_id} user_id={user_id}") logger.warning(f"[Online Validate POST] Invalid token payload - course_id={course_id} user_id={user_id}")
raise AppAPIException({'message': 'Token payload is invalid.'}, status_code=status.HTTP_400_BAD_REQUEST) raise AppAPIException({'message': 'Token payload is invalid.'}, status_code=status.HTTP_400_BAD_REQUEST)
print(f"[Online Validate POST] Processing for user_id={user_id} course_id={course_id}")
logger.info(f"[Online Validate POST] Processing for user_id={user_id} course_id={course_id}") logger.info(f"[Online Validate POST] Processing for user_id={user_id} course_id={course_id}")
detail_view = CourseDetailAPIView() detail_view = CourseDetailAPIView()
@ -534,12 +551,14 @@ class CourseOnlineClassTokenValidateAPIView(GenericAPIView):
course = get_object_or_404(queryset, pk=course_id) course = get_object_or_404(queryset, pk=course_id)
user = get_object_or_404(UserModel.objects.all(), pk=user_id) user = get_object_or_404(UserModel.objects.all(), pk=user_id)
print(f"[Online Validate POST] Course found - slug={course.slug} is_online={course.is_online}")
logger.info(f"[Online Validate POST] Course found - slug={course.slug} is_online={course.is_online}") logger.info(f"[Online Validate POST] Course found - slug={course.slug} is_online={course.is_online}")
course_data = CourseDetailSerializer(course, context={'request': request}).data course_data = CourseDetailSerializer(course, context={'request': request}).data
user_data = UserProfileSerializer(user, context={'request': request}).data user_data = UserProfileSerializer(user, context={'request': request}).data
metadata = self._build_metadata(course, payload, user=user) metadata = self._build_metadata(course, payload, user=user)
print(f"[Online Validate POST] Success - metadata={metadata}")
logger.info(f"[Online Validate POST] Success - user_id={user_id} course={course.slug} can_create={metadata.get('can_create_live_session')} can_join={metadata.get('can_join_live_session')}") logger.info(f"[Online Validate POST] Success - user_id={user_id} course={course.slug} can_create={metadata.get('can_create_live_session')} can_join={metadata.get('can_join_live_session')}")
return Response({ return Response({

Loading…
Cancel
Save