use sea_orm::DatabaseConnection;
use std::sync::Arc;
#[derive(Clone, Debug)]
pub struct TenantInfo {
pub name: String,
pub droplet_id: Option<i64>,
pub db_version: i32,
}
impl TenantInfo {
pub fn new(name: impl Into<String>, droplet_id: Option<i64>, db_version: i32) -> Self {
Self {
name: name.into(),
droplet_id,
db_version,
}
}
}
pub struct ContextData {
pub db: DatabaseConnection,
pub user: Option<String>,
pub tenant: Option<Arc<TenantInfo>>,
}
impl ContextData {
pub fn new(db: DatabaseConnection, user: Option<String>, tenant: Option<TenantInfo>) -> Self {
Self {
db,
user,
tenant: tenant.map(Arc::new),
}
}
pub fn single_tenant(db: DatabaseConnection, user: Option<String>) -> Self {
Self {
db,
user,
tenant: None,
}
}
pub fn multi_tenant(
db: DatabaseConnection,
user: Option<String>,
tenant: TenantInfo,
) -> Self {
Self {
db,
user,
tenant: Some(Arc::new(tenant)),
}
}
pub fn is_authenticated(&self) -> bool {
self.user.is_some()
}
pub fn user_id(&self) -> Option<&str> {
self.user.as_deref()
}
pub fn tenant_name(&self) -> Option<&str> {
self.tenant.as_ref().map(|t| t.name.as_str())
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_tenant_info() {
let info = TenantInfo::new("acme", Some(1), 2);
assert_eq!(info.name, "acme");
assert_eq!(info.droplet_id, Some(1));
assert_eq!(info.db_version, 2);
}
}