help-desk/backend/helpdesk/views/ticket_views.py
2025-12-01 05:43:37 +07:00

63 lines
3.0 KiB
Python

from rest_framework import viewsets, status
from rest_framework.response import Response
from rest_framework.decorators import action
from helpdesk.services.ticket_service import ticket_service
from helpdesk.serializers.ticket_list_serializers import TicketListSerializer
from rest_framework.permissions import IsAuthenticated
from drf_spectacular.utils import extend_schema, extend_schema_view
@extend_schema_view(
list=extend_schema(tags=['2. Application Service']),
retrieve=extend_schema(tags=['2. Application Service']),
resolve_ticket=extend_schema(tags=['2. Application Service']),
assign_ticket=extend_schema(tags=['2. Application Service']),
)
class TicketViewSet(viewsets.ReadOnlyModelViewSet):
"""View สำหรับดึงรายการ Ticket ทั้งหมด (Unified Inbox List)"""
serializer_class = TicketListSerializer
permission_classes = [IsAuthenticated]
# 1. Viewset เรียก Service Layer
def get_queryset(self):
return ticket_service.get_inbox_summary()
# Custom Actions สำหรับการจัดการ Ticket
@action(detail=True, methods=['post'], url_path='resolve', url_name='resolve')
@extend_schema(
summary='ปิด (Resolve) Ticket ด้วย ID',
description='เปลี่ยนสถานะ Ticket ที่กำหนดให้เป็น "Resolved" หรือ "Closed".',
)
def resolve_ticket(self, request, pk=None):
try:
updated_ticket = ticket_service.update_ticket_status(
ticket_id=pk,
new_status='RESOLVED',
)
return Response(self.get_serializer(updated_ticket).data)
except Exception as e:
return Response({"detail": str(e)}, status=status.HTTP_400_BAD_REQUEST)
@action(detail=True, methods=['post'], url_path='assign', url_name='assign')
@extend_schema(
summary='มอบหมาย (Assign) Ticket ให้ Agent',
description='มอบหมาย Ticket นี้ให้กับผู้ใช้/Agent ที่ระบุใน body (เช่น {"assignee_id": 123}).',
request={
'application/json': {'type': 'object', 'properties': {'assignee_id': {'type': 'integer'}}}
}
)
def assign_ticket(self, request, pk=None):
assignee_id = request.data.get('assignee_id')
if not assignee_id:
return Response({"assignee_id": "Field is required"}, status=status.HTTP_400_BAD_REQUEST)
try:
updated_ticket = ticket_service.assign_ticket_to_user(
ticket_id=pk,
assignee_id=assignee_id
)
return Response(self.get_serializer(updated_ticket).data)
except ValueError as e:
return Response({"detail": "User not found"}, status=status.HTTP_400_BAD_REQUEST)
except Exception as e:
return Response({"detail": str(e)}, status=status.HTTP_400_BAD_REQUEST)