from django.shortcuts import get_object_or_404 from drf_spectacular.utils import extend_schema from rest_framework.permissions import IsAuthenticated from rest_framework.response import Response from rest_framework.views import APIView from .models import BugReport, Ticket, TicketMessage from .serializers import ( BugReportCreateRequestSerializer, BugReportCreateResponseSerializer, TicketCreateRequestSerializer, TicketCreateResponseSerializer, TicketDetailResponseSerializer, TicketMessageCreateRequestSerializer, TicketMessageCreateResponseSerializer, ) class BugReportCreateView(APIView): """POST /api/support/bug-reports — ثبت گزارش باگ""" permission_classes = [IsAuthenticated] @extend_schema( request=BugReportCreateRequestSerializer, responses=BugReportCreateResponseSerializer, tags=['Support (support)'], ) def post(self, request): serializer = BugReportCreateRequestSerializer(data=request.data) serializer.is_valid(raise_exception=True) v = serializer.validated_data bug = BugReport.objects.create( user_id=request.user.id, title=v['title'], description=v['description'], screenshot_url=v.get('screenshotUrl', ''), ) data = {'bugReportId': str(bug.pk), 'status': bug.status} return Response(BugReportCreateResponseSerializer(data).data) class TicketCreateView(APIView): """POST /api/support/tickets — ایجاد تیکت""" permission_classes = [IsAuthenticated] @extend_schema( request=TicketCreateRequestSerializer, responses=TicketCreateResponseSerializer, tags=['Support (support)'], ) def post(self, request): serializer = TicketCreateRequestSerializer(data=request.data) serializer.is_valid(raise_exception=True) v = serializer.validated_data ticket = Ticket.objects.create( user_id=request.user.id, subject=v['subject'], category=v['category'], priority=v.get('priority', 'normal'), ) data = {'ticketId': str(ticket.pk), 'status': ticket.status} return Response(TicketCreateResponseSerializer(data).data) class TicketDetailView(APIView): """ GET /api/support/tickets/{id} — جزئیات و پیام‌های تیکت فقط تیکت متعلق به همون کاربر برمی‌گرده (فیلتر با user_id، دقیقاً همون الگوی محدودسازی به مالک که در progress/views.py برای UserStats و در ai_tutor/views.py برای Conversation استفاده شده). """ permission_classes = [IsAuthenticated] @extend_schema(responses=TicketDetailResponseSerializer, tags=['Support (support)']) def get(self, request, ticket_id): ticket = get_object_or_404(Ticket, pk=ticket_id, user_id=request.user.id) messages = [ {'id': str(m.pk), 'sender': m.sender, 'text': m.text} for m in ticket.messages.all() ] data = { 'ticketId': str(ticket.pk), 'subject': ticket.subject, 'status': ticket.status, 'messages': messages, } return Response(TicketDetailResponseSerializer(data).data) class TicketMessageCreateView(APIView): """ POST /api/support/tickets/{id}/messages — ارسال پیام در تیکت این Endpoint سمت کاربره، پس sender همیشه 'user' ثبت می‌شه. پاسخ پشتیبانی (sender='support') از پنل ادمین ثبت می‌شه و طبق سند معماری از همون‌جا رویداد TicketReplied برای Notifications ساطع می‌شه (پیاده‌سازی در support/admin.py، نه اینجا). """ permission_classes = [IsAuthenticated] @extend_schema( request=TicketMessageCreateRequestSerializer, responses=TicketMessageCreateResponseSerializer, tags=['Support (support)'], ) def post(self, request, ticket_id): ticket = get_object_or_404(Ticket, pk=ticket_id, user_id=request.user.id) serializer = TicketMessageCreateRequestSerializer(data=request.data) serializer.is_valid(raise_exception=True) v = serializer.validated_data message = TicketMessage.objects.create(ticket=ticket, sender='user', text=v['text']) data = {'messageId': str(message.pk), 'success': True} return Response(TicketMessageCreateResponseSerializer(data).data)