Spaces:
Sleeping
Sleeping
| # ============================================ | |
| # apps/analytics/views.py | |
| # ============================================ | |
| from rest_framework import status | |
| from rest_framework.decorators import api_view, permission_classes | |
| from rest_framework.permissions import AllowAny | |
| from rest_framework.response import Response | |
| from apps.analytics.services import SearchTrackingService | |
| from apps.analytics.serializers import SearchLogSerializer, PopularSearchSerializer | |
| def log_search(request): | |
| """ | |
| Enregistrer une recherche | |
| POST /api/analytics/search-log/ | |
| Body: | |
| { | |
| "category": "QUESTIONS", | |
| "search_query": "python", | |
| "filters_applied": {"status": "unsolved"}, | |
| "results_count": 15 | |
| } | |
| """ | |
| serializer = SearchLogSerializer(data=request.data) | |
| if serializer.is_valid(): | |
| user = request.user if request.user.is_authenticated else None | |
| search_log = SearchTrackingService.log_search( | |
| category=serializer.validated_data['category'], | |
| search_query=serializer.validated_data['search_query'], | |
| user=user, | |
| filters_applied=serializer.validated_data.get('filters_applied', {}), | |
| results_count=serializer.validated_data.get('results_count', 0), | |
| request=request | |
| ) | |
| return Response( | |
| SearchLogSerializer(search_log).data, | |
| status=status.HTTP_201_CREATED | |
| ) | |
| return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) | |
| def log_result_click(request): | |
| """ | |
| Enregistrer le clic sur un résultat | |
| POST /api/analytics/result-click/ | |
| Body: | |
| { | |
| "search_log_id": 123, | |
| "result_id": "456", | |
| "position": 2 | |
| } | |
| """ | |
| search_log_id = request.data.get('search_log_id') | |
| result_id = request.data.get('result_id') | |
| position = request.data.get('position') | |
| if not all([search_log_id, result_id, position is not None]): | |
| return Response( | |
| {'error': 'Missing required fields'}, | |
| status=status.HTTP_400_BAD_REQUEST | |
| ) | |
| SearchTrackingService.log_result_click( | |
| search_log_id=search_log_id, | |
| result_id=result_id, | |
| position=position | |
| ) | |
| return Response({'status': 'success'}, status=status.HTTP_200_OK) | |
| def popular_searches(request): | |
| """ | |
| Récupérer les recherches populaires | |
| GET /api/analytics/popular-searches/?category=QUESTIONS&limit=10 | |
| """ | |
| category = request.query_params.get('category') | |
| limit = int(request.query_params.get('limit', 10)) | |
| searches = SearchTrackingService.get_popular_searches( | |
| category=category, | |
| limit=min(limit, 50) # Max 50 | |
| ) | |
| serializer = PopularSearchSerializer(searches, many=True) | |
| return Response(serializer.data) | |
| def trending_searches(request): | |
| """ | |
| Récupérer les recherches tendances | |
| GET /api/analytics/trending-searches/?category=QUESTIONS&days=7&limit=10 | |
| """ | |
| category = request.query_params.get('category') | |
| days = int(request.query_params.get('days', 7)) | |
| limit = int(request.query_params.get('limit', 10)) | |
| trending = SearchTrackingService.get_trending_searches( | |
| category=category, | |
| days=min(days, 30), # Max 30 jours | |
| limit=min(limit, 50) | |
| ) | |
| return Response(trending) | |