from typing import Optional from mongomock_motor import AsyncMongoMockClient from app.config.db import db_config from loguru import logger from app.db.client import DatabaseClient class EmbeddedMongoClient(DatabaseClient): """ Mock MongoDB client implementation for local machine and development environment. This client is used to connect to a mock MongoDB instance that is running in the local machine. It is used to test/dev/local the application without the need to have a real MongoDB instance running. """ def __init__(self): logger.info("Initializing EmbeddedMongoClient") self._client: Optional[AsyncMongoMockClient] = None self._db = None self._is_connected: bool = False logger.info("EmbeddedMongoClient initialized") @property def client(self) -> AsyncMongoMockClient: logger.info("Getting EmbeddedMongoClient") if not self._client: logger.info("Generating EmbeddedMongoClient") self._client = AsyncMongoMockClient() self._db = self._client[db_config.DATABASE_NAME] logger.info(f"Returning EmbeddedMongoClient. Host: {self._client.host}") return self._client @property def db(self): logger.info("Getting EmbeddedMongoClient.db") if not self._db: logger.info("Generating EmbeddedMongoClient.db") self._db = self.client[db_config.DATABASE_NAME] logger.info(f"Returning EmbeddedMongoClient.db. Host: {self._db.host}") return self._db async def connect(self) -> None: try: if not self._is_connected: logger.info("Connecting to EmbeddedMongoClient") self._is_connected = True logger.info("Connected to EmbeddedMongoClient") except Exception as e: self._is_connected = False logger.error(f"Failed to connect to EmbeddedMongoClient: {e}") raise async def close(self) -> None: try: if self._is_connected and self._client is not None: logger.info("Closing EmbeddedMongoClient connection") self._client = None self._db = None self._is_connected = False logger.info("Disconnected from EmbeddedMongoClient") except Exception as e: logger.warning(f"Error while closing EmbeddedMongoClient connection: {e}") self._client = None self._db = None self._is_connected = False