File size: 1,461 Bytes
b26b1fd
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
25e337e
 
 
 
 
 
8a81353
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
from __future__ import annotations

from typing import Optional

from motor.motor_asyncio import AsyncIOMotorClient, AsyncIOMotorCollection, AsyncIOMotorDatabase

from app.core.config import settings

_mongo_client: Optional[AsyncIOMotorClient] = None


async def connect_to_mongo() -> None:
    """Initialize the MongoDB client once during application startup."""
    global _mongo_client
    if _mongo_client is not None:
        return

    client = AsyncIOMotorClient(settings.mongo_uri, serverSelectionTimeoutMS=5000)
    # Trigger a server selection to fail fast if the URI/config is invalid.
    await client.server_info()
    _mongo_client = client


async def close_mongo_connection() -> None:
    global _mongo_client
    if _mongo_client is None:
        return
    _mongo_client.close()
    _mongo_client = None


def get_client() -> AsyncIOMotorClient:
    if _mongo_client is None:
        raise RuntimeError("MongoDB client is not initialized. Wait for startup to finish.")
    return _mongo_client


def get_database() -> AsyncIOMotorDatabase:
    return get_client()[settings.mongo_db]


def get_autocategory_collection() -> AsyncIOMotorCollection:
    return get_database()[settings.mongo_collection]


def get_api_logs_collection() -> AsyncIOMotorCollection:
    return get_database()[settings.api_logs_collection]


def get_subcategory_collection() -> AsyncIOMotorCollection:
    return get_database()[settings.mongo_subcategory_collection]