Переделаны часть обработчиков и роутов для работы с тикетами.
This commit is contained in:
@@ -3,8 +3,8 @@ from uuid import UUID
|
||||
from sqlalchemy.future import select
|
||||
from sqlalchemy.exc import SQLAlchemyError
|
||||
from decimal import Decimal
|
||||
from sqlalchemy import desc
|
||||
from instance.model import TicketMessage, User, Subscription, Transaction
|
||||
from sqlalchemy import asc, desc, update
|
||||
from instance.model import TicketMessage, User, Subscription, Transaction,SupportTicket
|
||||
|
||||
|
||||
class PostgresRepository:
|
||||
@@ -26,6 +26,7 @@ class PostgresRepository:
|
||||
self.logger.error(f"Ошибка при создании пользователя {telegram_id}: {e}")
|
||||
await session.rollback()
|
||||
return None
|
||||
|
||||
async def get_active_subscription(self, telegram_id: int):
|
||||
"""
|
||||
Проверяет наличие активной подписки у пользователя.
|
||||
@@ -139,5 +140,82 @@ class PostgresRepository:
|
||||
self.logger.error(f"Ошибка при добавлении записи: {record}: {e}")
|
||||
await session.rollback()
|
||||
return None
|
||||
|
||||
async def list_active_tickets(self, user_id: UUID):
|
||||
async for session in self.session_generator():
|
||||
try:
|
||||
tickets = await session.execute(
|
||||
select(SupportTicket)
|
||||
.where(
|
||||
SupportTicket.user_id == user_id,
|
||||
SupportTicket.status.in_([status.upper() for status in ["pending", "open"]])
|
||||
)
|
||||
)
|
||||
result = list(tickets.scalars().all())
|
||||
self.logger.info(f"Получены активные тикеты: {result}")
|
||||
return result
|
||||
except SQLAlchemyError as e:
|
||||
self.logger.error(f"Произошла ошибка при поиске активных тикетов: {e}")
|
||||
return None
|
||||
|
||||
async def get_ticket(self, ticket_id):
|
||||
async for session in self.session_generator():
|
||||
try:
|
||||
ticket = await session.execute(
|
||||
select(SupportTicket)
|
||||
.where(SupportTicket.id == ticket_id)
|
||||
)
|
||||
result = ticket.scalars().first()
|
||||
self.logger.info(f"Получен тикет {ticket_id}.")
|
||||
if result:
|
||||
serialized_result = {
|
||||
"id": result.id,
|
||||
"user_id": result.user_id,
|
||||
"subject": result.subject,
|
||||
"message": result.message,
|
||||
"status": result.status,
|
||||
"created_at": result.created_at.isoformat(),
|
||||
"updated_at": result.updated_at.isoformat(),
|
||||
}
|
||||
return serialized_result
|
||||
except SQLAlchemyError as e:
|
||||
self.logger.error(f"Произошла ошибка при поиске тикета {ticket_id}.")
|
||||
return None
|
||||
|
||||
async def get_ticket_messages(self, ticket_id: int):
|
||||
async for session in self.session_generator():
|
||||
try:
|
||||
# Выполняем запрос для получения сообщений, сортированных по дате
|
||||
result = await session.execute(
|
||||
select(TicketMessage)
|
||||
.where(TicketMessage.ticket_id == ticket_id)
|
||||
.order_by(asc(TicketMessage.created_at))
|
||||
)
|
||||
messages = result.scalars().all()
|
||||
self.logger.info(f"Получены сообщения для тикета {ticket_id}, {messages}")
|
||||
self.logger.info(messages)
|
||||
return messages
|
||||
except SQLAlchemyError as e:
|
||||
self.logger.error(f"Ошибка при получении сообщений для тикета {ticket_id}: {e}")
|
||||
return []
|
||||
|
||||
async def set_new_status(self,ticket_id: int, new_status: str):
|
||||
async for session in self.session_generator():
|
||||
try:
|
||||
# Выполняем обновление тикета
|
||||
result = await session.execute(
|
||||
update(SupportTicket)
|
||||
.where(SupportTicket.id == ticket_id)
|
||||
.values(status=new_status)
|
||||
.execution_options(synchronize_session="fetch")
|
||||
)
|
||||
if result.rowcount == 0:
|
||||
raise ValueError(f"Тикет с ID {ticket_id} не найден.")
|
||||
|
||||
await session.commit()
|
||||
self.logger.info(f"Статус тикета {ticket_id} обновлён на '{new_status}'.")
|
||||
return "OK"
|
||||
except SQLAlchemyError as e:
|
||||
self.logger.error(f"Ошибка обновления статуса тикета {ticket_id}: {e}")
|
||||
await session.rollback()
|
||||
return "ERROR"
|
||||
|
||||
Reference in New Issue
Block a user