95 lines
2.3 KiB
Python
95 lines
2.3 KiB
Python
|
|
"""
|
|||
|
|
MongoDB connection and database utilities
|
|||
|
|
"""
|
|||
|
|
from motor.motor_asyncio import AsyncIOMotorClient
|
|||
|
|
from pymongo.errors import ConnectionFailure
|
|||
|
|
from config import settings
|
|||
|
|
|
|||
|
|
# Global MongoDB client
|
|||
|
|
mongodb_client: AsyncIOMotorClient = None
|
|||
|
|
db = None
|
|||
|
|
|
|||
|
|
|
|||
|
|
async def connect_db():
|
|||
|
|
"""Connect to MongoDB"""
|
|||
|
|
global mongodb_client, db
|
|||
|
|
|
|||
|
|
try:
|
|||
|
|
print(f"🔌 Подключение к MongoDB: {settings.MONGODB_URI.split('@')[-1] if '@' in settings.MONGODB_URI else settings.MONGODB_URI}")
|
|||
|
|
|
|||
|
|
mongodb_client = AsyncIOMotorClient(
|
|||
|
|
settings.MONGODB_URI,
|
|||
|
|
maxPoolSize=10,
|
|||
|
|
minPoolSize=1,
|
|||
|
|
serverSelectionTimeoutMS=5000
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
# Test connection
|
|||
|
|
await mongodb_client.admin.command('ping')
|
|||
|
|
|
|||
|
|
# Get database name from URI or use default
|
|||
|
|
db_name = settings.MONGODB_URI.split('/')[-1].split('?')[0] or 'nakama'
|
|||
|
|
db = mongodb_client[db_name]
|
|||
|
|
|
|||
|
|
print(f"✅ MongoDB подключена (база: {db_name})")
|
|||
|
|
|
|||
|
|
# Print collections count
|
|||
|
|
collections = await db.list_collection_names()
|
|||
|
|
print(f" 📚 Коллекций в базе: {len(collections)}")
|
|||
|
|
|
|||
|
|
except ConnectionFailure as e:
|
|||
|
|
print(f"❌ Не удалось подключиться к MongoDB: {e}")
|
|||
|
|
raise
|
|||
|
|
except Exception as e:
|
|||
|
|
print(f"❌ Ошибка подключения к MongoDB: {e}")
|
|||
|
|
raise
|
|||
|
|
|
|||
|
|
|
|||
|
|
async def close_db():
|
|||
|
|
"""Close MongoDB connection"""
|
|||
|
|
global mongodb_client
|
|||
|
|
|
|||
|
|
if mongodb_client:
|
|||
|
|
mongodb_client.close()
|
|||
|
|
print("✅ MongoDB отключена")
|
|||
|
|
|
|||
|
|
|
|||
|
|
def get_db():
|
|||
|
|
"""Get database instance"""
|
|||
|
|
return db
|
|||
|
|
|
|||
|
|
|
|||
|
|
def get_collection(collection_name: str):
|
|||
|
|
"""Get collection by name"""
|
|||
|
|
return db[collection_name]
|
|||
|
|
|
|||
|
|
|
|||
|
|
# Collection shortcuts
|
|||
|
|
def users_collection():
|
|||
|
|
return get_collection('users')
|
|||
|
|
|
|||
|
|
|
|||
|
|
def posts_collection():
|
|||
|
|
return get_collection('posts')
|
|||
|
|
|
|||
|
|
|
|||
|
|
def reports_collection():
|
|||
|
|
return get_collection('reports')
|
|||
|
|
|
|||
|
|
|
|||
|
|
def moderation_admins_collection():
|
|||
|
|
return get_collection('moderationadmins')
|
|||
|
|
|
|||
|
|
|
|||
|
|
def email_verification_codes_collection():
|
|||
|
|
return get_collection('emailverificationcodes')
|
|||
|
|
|
|||
|
|
|
|||
|
|
def admin_confirmations_collection():
|
|||
|
|
return get_collection('adminconfirmations')
|
|||
|
|
|
|||
|
|
|
|||
|
|
def notifications_collection():
|
|||
|
|
return get_collection('notifications')
|
|||
|
|
|