ferrox-database-mongo 0.8.0

Document database repository implementation and BSON utilities powered by MongoDB Rust Driver.
Documentation
//! # Ferrox Database Mongo (`ferrox-database-mongo`)
//!
//! `ferrox-database-mongo` provides document storage capabilities for Ferrox applications, wrapping the official MongoDB Rust driver
//! with strongly-typed `MongoRepository` traits and BSON conversion utilities.
//!
//! ## Key Features
//! - 🍃 **MongoDB Async Client**: Managed database connection pooling.
//! - 📦 **Document Repository**: Generic CRUD methods for BSON-serializable domain models.
//! - 🔍 **Aggregation Builders**: Helpers for building MongoDB pipeline queries.

use mongodb::{Client, options::ClientOptions};
use ferrox_errors::AppError;
use std::time::Duration;

#[derive(Clone)]
pub struct MongoClient {
    pub client: Client,
    pub db_name: String,
}

impl MongoClient {
    pub async fn connect(connection_string: &str, db_name: &str) -> Result<Self, AppError> {
        let mut client_options = ClientOptions::parse(connection_string)
            .await
            .map_err(|e| AppError::DatabaseError(format!("Mongo URL Parse Error: {}", e)))?;

        // Optional: configure pooling explicitly if needed, but defaults are usually fine
        client_options.connect_timeout = Some(Duration::from_secs(10));
        client_options.max_pool_size = Some(100);
        client_options.min_pool_size = Some(5);

        let client = Client::with_options(client_options)
            .map_err(|e| AppError::DatabaseError(format!("Mongo Client Init Error: {}", e)))?;

        // Test connection
        client
            .database(db_name)
            .run_command(mongodb::bson::doc! {"ping": 1})
            .await
            .map_err(|e| AppError::DatabaseError(format!("Mongo Ping Failed: {}", e)))?;

        tracing::info!("Connected to MongoDB: {}", db_name);

        Ok(Self {
            client,
            db_name: db_name.to_string(),
        })
    }
}