Переделаны часть обработчиков и роутов для работы с тикетами.
This commit is contained in:
@@ -4,11 +4,16 @@ from app.services.db_manager import DatabaseManager
|
||||
from instance.configdb import get_database_manager
|
||||
from uuid import UUID
|
||||
from pydantic import BaseModel
|
||||
from fastapi import Response, status
|
||||
from enum import Enum
|
||||
from typing import List, Literal, Optional
|
||||
from datetime import datetime
|
||||
import logging
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
class UpdateTicketStatusRequest(BaseModel):
|
||||
new_status: str
|
||||
|
||||
class TicketStatus(str, Enum):
|
||||
OPEN = "open"
|
||||
PENDING = "pending"
|
||||
@@ -31,7 +36,6 @@ class TicketMessageRequest(BaseModel):
|
||||
message: str
|
||||
|
||||
class TicketMessageResponse(BaseModel):
|
||||
id: int
|
||||
ticket_id: int
|
||||
sender: str
|
||||
message: str
|
||||
@@ -43,7 +47,7 @@ def handle_exception(e: Exception, message: str):
|
||||
logger.error(f"{message}: {e}")
|
||||
raise HTTPException(status_code=500, detail=f"{message}: {str(e)}")
|
||||
|
||||
@router.post("/support/tickets/{ticket_id}/messages", response_model=TicketMessageResponse, summary="Добавить сообщение")
|
||||
@router.post("/support/tickets/{ticket_id}/messages", summary="Добавить сообщение")
|
||||
async def add_message(
|
||||
ticket_id: int,
|
||||
request: TicketMessageRequest,
|
||||
@@ -63,10 +67,12 @@ async def add_message(
|
||||
TicketMessageResponse: Данные созданного сообщения.
|
||||
"""
|
||||
try:
|
||||
message = await database_manager.add_ticket_message(ticket_id=ticket_id, sender=sender, message=request.message)
|
||||
message = await database_manager.add_message_to_ticket(ticket_id=ticket_id, sender=sender, message=request.message)
|
||||
if not message:
|
||||
raise HTTPException(status_code=404, detail="Тикет не найден или ошибка добавления сообщения")
|
||||
return message
|
||||
if message != "OK":
|
||||
raise HTTPException(status_code=500, detail="Ошибка добавления сообщения")
|
||||
return Response(status_code=status.HTTP_200_OK)
|
||||
except Exception as e:
|
||||
handle_exception(e,"Ошибка добавления сообщения")
|
||||
|
||||
@@ -91,13 +97,67 @@ async def get_messages(
|
||||
"""
|
||||
try:
|
||||
messages = await database_manager.get_ticket_messages(ticket_id=ticket_id)
|
||||
if not messages:
|
||||
raise HTTPException(status_code=404, detail="Сообщения для тикета не найдены")
|
||||
return messages
|
||||
ticket_info = await database_manager.get_ticket(ticket_id)
|
||||
logger.info(messages)
|
||||
|
||||
result_messages = []
|
||||
if messages:
|
||||
for message in messages:
|
||||
correct_response = TicketMessageResponse(
|
||||
ticket_id=ticket_id,
|
||||
sender=message.sender,
|
||||
message=message.message,
|
||||
created_at=message.created_at
|
||||
)
|
||||
result_messages.append(correct_response)
|
||||
|
||||
result_messages.insert(0,
|
||||
TicketMessageResponse(
|
||||
ticket_id=ticket_id,
|
||||
sender="user",
|
||||
message=ticket_info['message'],
|
||||
created_at=ticket_info["created_at"]
|
||||
)
|
||||
)
|
||||
return result_messages
|
||||
except Exception as e:
|
||||
handle_exception(e,"Ошибка получения сообщения")
|
||||
|
||||
|
||||
@router.get("/support/ticket/{ticket_id}", response_model=TicketResponse, summary="Получить информацию о тикете")
|
||||
async def get_ticket(
|
||||
ticket_id: int,
|
||||
database_manager: DatabaseManager = Depends(get_database_manager)
|
||||
):
|
||||
"""
|
||||
Возвращает информацию о тикете.
|
||||
|
||||
Args:
|
||||
ticket_id (int): ID тикета, информацию котрого хочет получить пользователь.
|
||||
database_manager (DatabaseManager): Менеджер базы данных.
|
||||
|
||||
Returns:
|
||||
TicketResponse: Информация о тикете.
|
||||
|
||||
Raises:
|
||||
HTTPException: 404, если тикет не найден.
|
||||
HTTPException: 500, если произошла ошибка на сервере.
|
||||
"""
|
||||
try:
|
||||
# Получаем данные о тикете
|
||||
ticket = await database_manager.get_ticket(ticket_id=ticket_id)
|
||||
if not ticket:
|
||||
raise HTTPException(status_code=404, detail="Тикет не найден")
|
||||
|
||||
# Возвращаем данные через Pydantic-модель
|
||||
return TicketResponse(**ticket)
|
||||
except SQLAlchemyError as e:
|
||||
handle_exception(e, "Ошибка получения тикета")
|
||||
except Exception as e:
|
||||
handle_exception(e, "Неизвестная ошибка при получении тикета")
|
||||
|
||||
|
||||
|
||||
@router.post("/support/tickets", response_model=TicketResponse, summary="Создать тикет")
|
||||
async def create_ticket(
|
||||
request: CreateTicketRequest,
|
||||
@@ -148,38 +208,42 @@ async def list_tickets(
|
||||
HTTPException: 500, если произошла ошибка на сервере.
|
||||
"""
|
||||
try:
|
||||
tickets = await database_manager.list_tickets(user_id=user_id)
|
||||
tickets = await database_manager.get_active_tickets(user_id=user_id)
|
||||
if not tickets:
|
||||
raise HTTPException(status_code=404, detail="Тикеты не найдены")
|
||||
return tickets
|
||||
except Exception as e:
|
||||
handle_exception(e,"Ошибка получения тикетов")
|
||||
|
||||
@router.patch("/support/tickets/{ticket_id}", response_model=TicketResponse, summary="Обновить статус тикета")
|
||||
@router.patch("/support/ticket/{ticket_id}/status", summary="Обновить статус тикета")
|
||||
async def update_ticket_status(
|
||||
ticket_id: int,
|
||||
status: TicketStatus,
|
||||
request: UpdateTicketStatusRequest,
|
||||
database_manager: DatabaseManager = Depends(get_database_manager)
|
||||
):
|
||||
"""
|
||||
Обновляет статус тикета.
|
||||
|
||||
Args:
|
||||
ticket_id (int): ID тикета, статус которого нужно обновить.
|
||||
status (TicketStatus): Новый статус тикета (open, pending, closed).
|
||||
ticket_id (int): ID тикета.
|
||||
request (UpdateTicketStatusRequest): Запрос с новым статусом.
|
||||
database_manager (DatabaseManager): Менеджер базы данных.
|
||||
|
||||
Returns:
|
||||
TicketResponse: Обновлённые данные тикета.
|
||||
dict: Подтверждение обновления статуса.
|
||||
|
||||
Raises:
|
||||
HTTPException: 404, если тикет не найден.
|
||||
HTTPException: 500, если произошла ошибка при обновлении тикета.
|
||||
HTTPException: Если тикет не найден или произошла ошибка.
|
||||
"""
|
||||
try:
|
||||
ticket = await database_manager.update_ticket_status(ticket_id=ticket_id, status=status)
|
||||
if not ticket:
|
||||
raise HTTPException(status_code=404, detail="Тикет не найден")
|
||||
return ticket
|
||||
result = await database_manager.update_ticket_status(ticket_id, request.new_status)
|
||||
if result != "OK":
|
||||
return "ERROR"
|
||||
return "OK"
|
||||
except ValueError as e:
|
||||
logger.error(f"Тикет с ID {ticket_id} не найден: {e}")
|
||||
raise HTTPException(status_code=404, detail="Тикет не найден.")
|
||||
except Exception as e:
|
||||
handle_exception(e,"Ошибка обновления тикета")
|
||||
logger.error(f"Ошибка обновления статуса тикета {ticket_id}: {e}")
|
||||
raise HTTPException(status_code=500, detail="Не удалось обновить статус тикета.")
|
||||
|
||||
|
||||
Reference in New Issue
Block a user