from motor.motor_asyncio import AsyncIOMotorClient from app.core.config import settings import redis.asyncio as redis from typing import Optional class Database: client: Optional[AsyncIOMotorClient] = None database = None redis_client: Optional[redis.Redis] = None db = Database() async def init_db(): db.client = AsyncIOMotorClient(settings.MONGODB_URL) db.database = db.client[settings.DATABASE_NAME] db.redis_client = await redis.from_url(settings.REDIS_URL, decode_responses=True) await create_indexes() async def close_db(): if db.client: db.client.close() if db.redis_client: await db.redis_client.close() async def create_indexes(): await db.database.users.create_index("email", unique=True) await db.database.users.create_index("username", unique=True) await db.database.applications.create_index("client_id", unique=True) await db.database.applications.create_index("app_name", unique=True) await db.database.auth_history.create_index([("user_id", 1), ("created_at", -1)]) await db.database.auth_history.create_index("created_at") def get_database(): return db.database def get_redis(): return db.redis_client