Files
MathApp/support/views.py

127 lines
4.5 KiB
Python

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)