rinogeek's picture
first commit
fafd0bb
# ============================================
# 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
@api_view(['POST'])
@permission_classes([AllowAny])
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)
@api_view(['POST'])
@permission_classes([AllowAny])
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)
@api_view(['GET'])
@permission_classes([AllowAny])
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)
@api_view(['GET'])
@permission_classes([AllowAny])
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)