127 lines
4.5 KiB
Python
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)
|