Рабочая версия

This commit is contained in:
root
2025-11-23 17:45:29 +03:00
parent 54f04cc355
commit f0f3b96005
6 changed files with 142 additions and 14 deletions

View File

@@ -1,6 +1,6 @@
#from .payment_routes import router as payment_router #from .payment_routes import router as payment_router
from .user_routes import router as user_router from .user_routes import router
from .subscription_routes import router as subscription_router from .subscription_routes import router as subscription_router
from .support_routes import router as sup_router from .support_routes import router as sup_router
# Экспорт всех маршрутов # Экспорт всех маршрутов
__all__ = [ "user_router", "subscription_router","sup_router"] __all__ = [ "router", "subscription_router","sup_router"]

View File

@@ -1,3 +1,4 @@
import sys
from fastapi import APIRouter, Depends, HTTPException from fastapi import APIRouter, Depends, HTTPException
from fastapi.exceptions import HTTPException from fastapi.exceptions import HTTPException
from app.services.db_manager import DatabaseManager from app.services.db_manager import DatabaseManager
@@ -9,8 +10,12 @@ from uuid import UUID
import logging import logging
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
router = APIRouter() if not logger.handlers:
handler = logging.StreamHandler(sys.stdout)
handler.setFormatter(logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'))
logger.addHandler(handler)
logger.setLevel(logging.INFO)
logger.propagate = False
router = APIRouter() router = APIRouter()
# Модели запросов и ответов # Модели запросов и ответов
@@ -27,6 +32,8 @@ class UserResponse(BaseModel):
created_at: str created_at: str
updated_at: str updated_at: str
class AddReferal(BaseModel):
new_user_id: str
@router.post("/user/create", response_model=UserResponse, summary="Создать пользователя") @router.post("/user/create", response_model=UserResponse, summary="Создать пользователя")
async def create_user( async def create_user(
@@ -64,15 +71,14 @@ async def get_user(
Получение информации о пользователе. Получение информации о пользователе.
""" """
try: try:
logger.info(f"Получение пользователя с telegram_id: {telegram_id}") print(f"Получение пользователя с telegram_id: {telegram_id}")
user = await db_manager.get_user_by_telegram_id(telegram_id) user = await db_manager.get_user_by_telegram_id(telegram_id)
if not user: if not user:
logger.warning(f"Пользователь с telegram_id {telegram_id} не найден.") logger.warning(f"Пользователь с telegram_id {telegram_id} не найден.")
raise HTTPException(status_code=404, detail="User not found") raise HTTPException(status_code=404, detail="User not found")
logger.info(f"Пользователь найден: ID={user.id}, Username={user.username}") print(f"Пользователь найден: ID={user.id}, Username={user.username}")
user_response = UserResponse(
return UserResponse(
id=user.id, id=user.id,
telegram_id=user.telegram_id, telegram_id=user.telegram_id,
username=user.username, username=user.username,
@@ -81,7 +87,6 @@ async def get_user(
created_at=user.created_at.isoformat(), created_at=user.created_at.isoformat(),
updated_at=user.updated_at.isoformat() updated_at=user.updated_at.isoformat()
) )
logger.debug(f"Формирование ответа для пользователя: {user_response}")
return user_response return user_response
@@ -167,3 +172,33 @@ async def last_transactions(
except Exception as e: except Exception as e:
logger.exception(f"Неожиданная ошибка для {user_id}: {e}") logger.exception(f"Неожиданная ошибка для {user_id}: {e}")
raise HTTPException(status_code=500, detail=str(e)) raise HTTPException(status_code=500, detail=str(e))
@router.post("/user/{referrer_id}/add_referral", summary="Обновить баланс")
async def add_referal(
referrer_id: str,
request: AddReferal,
db_manager: DatabaseManager = Depends(get_database_manager)
):
"""
Обновляет баланс пользователя.
"""
logger.info(f"Получен запрос на добавление реферала: telegram_id={referrer_id}")
try:
result = await db_manager.add_referal(referrer_id)
if result == "ERROR":
logger.error(f"Ошибка добавления реферала для {referrer_id} c айди {request.new_user_id}")
raise HTTPException(status_code=500, detail="Failed to update balance")
logger.info(f"Добавлен реферал для {referrer_id} c айди {request.new_user_id}")
return {"message": "Balance updated successfully"}
except HTTPException as http_ex:
logger.warning(f"HTTP ошибка: {http_ex.detail}")
raise http_ex
except SQLAlchemyError as db_ex:
logger.error(f"Ошибка базы данных при добавлении рефералу {referrer_id}: {db_ex}")
raise HTTPException(status_code=500, detail="Database error")
except Exception as e:
logger.exception(f"Неожиданная ошибка при добавлении рефералу {referrer_id}: {e}")
raise HTTPException(status_code=500, detail=str(e))

View File

@@ -54,7 +54,11 @@ class DatabaseManager:
transaction_type="default" transaction_type="default"
) )
return await self.postgres_repo.add_record(tran) return await self.postgres_repo.add_record(tran)
async def add_referal(self,referrer_id: str, new_user_id: str):
"""
Добавление рефералу пользователей
"""
return await self.postgres_repo.add_referal(referrer_id,new_user_id)
async def get_transaction(self, user_id: UUID, limit: int = 10): async def get_transaction(self, user_id: UUID, limit: int = 10):
""" """
Возвращает транзакции. Возвращает транзакции.

View File

@@ -4,6 +4,7 @@ from sqlalchemy.future import select
from sqlalchemy.exc import SQLAlchemyError from sqlalchemy.exc import SQLAlchemyError
from decimal import Decimal from decimal import Decimal
from sqlalchemy import asc, desc, update from sqlalchemy import asc, desc, update
from sqlalchemy.orm import joinedload
from instance.model import TicketMessage, User, Subscription, Transaction,SupportTicket from instance.model import TicketMessage, User, Subscription, Transaction,SupportTicket
@@ -219,3 +220,39 @@ class PostgresRepository:
self.logger.error(f"Ошибка обновления статуса тикета {ticket_id}: {e}") self.logger.error(f"Ошибка обновления статуса тикета {ticket_id}: {e}")
await session.rollback() await session.rollback()
return "ERROR" return "ERROR"
async def add_referal(self,referrer_id: str, referral_id:str):
"""
Добавление рефералу пользователей
"""
async for session in self.session_generator():
try:
referrer = await session.execute(
select(User)
.where(User.id == referrer_id)
.options(joinedload(User.referrals)) # Загрузка связанных объектов
)
referrer = referrer.scalars().first()
if not referrer:
raise ValueError("Referrer not found")
# Проверить, существует ли уже такой реферал
existing_referrals = [ref.id for ref in referrer.referrals]
if referrer_id in existing_referrals:
raise ValueError("Referral already exists")
# Найти реферала
referral = await session.execute(
select(User).where(User.id == referral_id)
)
referral = referral.scalars().first()
if not referral:
raise ValueError("Referral user not found")
# Добавить реферала в список
referrer.referrals.append(referral)
await session.commit()
except Exception as e:
self.logger(f"Ошибка при добавлении рефералу пользователей")

View File

@@ -0,0 +1,42 @@
import logging
import sys
def setup_logging():
# Очистка существующих обработчиков
for handler in logging.root.handlers[:]:
logging.root.removeHandler(handler)
# Настройка формата
formatter = logging.Formatter(
'%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
# Обработчик для вывода в консоль
console_handler = logging.StreamHandler(sys.stdout)
console_handler.setFormatter(formatter)
# Установка уровня для корневого логгера
logging.basicConfig(
level=logging.INFO,
handlers=[console_handler],
force=True # Перезаписать существующие настройки
)
# Установка уровня для конкретных логгеров
loggers = [
'app.routes',
'app.services',
'main',
'__main__'
]
for logger_name in loggers:
logger = logging.getLogger(logger_name)
logger.setLevel(logging.INFO)
# Удаляем существующие обработчики
for handler in logger.handlers[:]:
logger.removeHandler(handler)
# Добавляем наш обработчик
logger.addHandler(console_handler)
# Запрещаем передачу родительским логгерам
logger.propagate = False

18
main.py
View File

@@ -1,15 +1,25 @@
import sys
from fastapi import FastAPI from fastapi import FastAPI
from instance.config import setup_logging
import logging
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
handlers=[logging.StreamHandler(sys.stdout)],
force=True
)
from instance.configdb import init_postgresql, init_mongodb, close_connections from instance.configdb import init_postgresql, init_mongodb, close_connections
from apscheduler.schedulers.asyncio import AsyncIOScheduler from apscheduler.schedulers.asyncio import AsyncIOScheduler
from apscheduler.triggers.cron import CronTrigger from apscheduler.triggers.cron import CronTrigger
from app.routes import user_router, subscription_router, sup_router from app.routes import router, subscription_router, sup_router
from app.services.db_manager import DatabaseManager from app.services.db_manager import DatabaseManager
from instance.configdb import get_postgres_session from instance.configdb import get_postgres_session
from app.services.mongo_rep import MongoDBRepository from app.services.mongo_rep import MongoDBRepository
from app.services.xui_rep import PanelInteraction from app.services.xui_rep import PanelInteraction
import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
app = FastAPI() app = FastAPI()
@@ -88,7 +98,7 @@ async def shutdown():
except Exception as e: except Exception as e:
logger.error(f"Ошибка при закрытии соединений: {e}") logger.error(f"Ошибка при закрытии соединений: {e}")
app.include_router(user_router, prefix="/api") app.include_router(router, prefix="/api")
#app.include_router(payment_router, prefix="/api") #app.include_router(payment_router, prefix="/api")
app.include_router(subscription_router, prefix="/api") app.include_router(subscription_router, prefix="/api")
app.include_router(sup_router, prefix="/api") app.include_router(sup_router, prefix="/api")