feat(db): Added database setup and basic types (#5)
Co-authored-by: Sharang Parnerkar <parnerkarsharang@gmail.com> Reviewed-on: #5
This commit was merged in pull request #5.
This commit is contained in:
@@ -0,0 +1,52 @@
|
||||
//! MongoDB connection wrapper with typed collection accessors.
|
||||
|
||||
use mongodb::{bson::doc, Client, Collection};
|
||||
|
||||
use super::Error;
|
||||
use crate::models::{OrgBillingRecord, OrgSettings, UserPreferences};
|
||||
|
||||
/// Thin wrapper around [`mongodb::Database`] that provides typed
|
||||
/// collection accessors for the application's domain models.
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct Database {
|
||||
inner: mongodb::Database,
|
||||
}
|
||||
|
||||
impl Database {
|
||||
/// Connect to MongoDB, select the given database, and verify
|
||||
/// connectivity with a `ping` command.
|
||||
///
|
||||
/// # Arguments
|
||||
///
|
||||
/// * `uri` - MongoDB connection string (e.g. `mongodb://localhost:27017`)
|
||||
/// * `db_name` - Database name to use
|
||||
///
|
||||
/// # Errors
|
||||
///
|
||||
/// Returns `Error::DatabaseError` if the client cannot be created
|
||||
/// or the ping fails.
|
||||
pub async fn connect(uri: &str, db_name: &str) -> Result<Self, Error> {
|
||||
let client = Client::with_uri_str(uri).await?;
|
||||
let db = client.database(db_name);
|
||||
|
||||
// Verify the connection is alive.
|
||||
db.run_command(doc! { "ping": 1 }).await?;
|
||||
|
||||
Ok(Self { inner: db })
|
||||
}
|
||||
|
||||
/// Collection for per-user preferences (theme, custom topics, etc.).
|
||||
pub fn user_preferences(&self) -> Collection<UserPreferences> {
|
||||
self.inner.collection("user_preferences")
|
||||
}
|
||||
|
||||
/// Collection for organisation-level settings.
|
||||
pub fn org_settings(&self) -> Collection<OrgSettings> {
|
||||
self.inner.collection("org_settings")
|
||||
}
|
||||
|
||||
/// Collection for per-cycle billing records.
|
||||
pub fn org_billing(&self) -> Collection<OrgBillingRecord> {
|
||||
self.inner.collection("org_billing")
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user