Переделаны часть обработчиков и роутов для работы с тикетами.

This commit is contained in:
Disledg
2025-01-12 06:30:53 +03:00
parent 7c36a0f157
commit 1aabe8f88e
3 changed files with 206 additions and 24 deletions

View File

@@ -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"