use crate::control::security::catalog::{StoredOwner, SystemCatalog};
use crate::types::TenantId;
use super::store::PermissionStore;
use super::types::owner_key;
impl PermissionStore {
pub fn set_owner(
&self,
object_type: &str,
tenant_id: TenantId,
object_name: &str,
owner_username: &str,
catalog: Option<&SystemCatalog>,
) -> crate::Result<()> {
let key = owner_key(object_type, tenant_id.as_u64(), object_name);
if let Some(catalog) = catalog {
catalog.put_owner(&StoredOwner {
object_type: object_type.to_string(),
object_name: object_name.to_string(),
tenant_id: tenant_id.as_u64(),
owner_username: owner_username.to_string(),
})?;
}
let mut owners = match self.owners.write() {
Ok(o) => o,
Err(p) => {
tracing::error!("owner store lock poisoned — recovering data");
p.into_inner()
}
};
owners.insert(key, owner_username.to_string());
Ok(())
}
pub fn remove_owner(
&self,
object_type: &str,
tenant_id: TenantId,
object_name: &str,
catalog: Option<&SystemCatalog>,
) -> crate::Result<()> {
let key = owner_key(object_type, tenant_id.as_u64(), object_name);
if let Some(catalog) = catalog {
catalog.delete_owner(object_type, tenant_id.as_u64(), object_name)?;
}
let mut owners = match self.owners.write() {
Ok(o) => o,
Err(p) => {
tracing::error!("owner store lock poisoned — recovering data");
p.into_inner()
}
};
owners.remove(&key);
Ok(())
}
pub fn get_owner(
&self,
object_type: &str,
tenant_id: TenantId,
object_name: &str,
) -> Option<String> {
let key = owner_key(object_type, tenant_id.as_u64(), object_name);
let owners = match self.owners.read() {
Ok(o) => o,
Err(p) => {
tracing::error!("owner store lock poisoned — recovering data");
p.into_inner()
}
};
owners.get(&key).cloned()
}
pub fn list_owners(&self, object_type: &str, tenant_id: TenantId) -> Vec<(String, String)> {
let prefix = format!("{object_type}:{}:", tenant_id.as_u64());
let owners = match self.owners.read() {
Ok(o) => o,
Err(p) => p.into_inner(),
};
owners
.iter()
.filter_map(|(key, owner)| {
key.strip_prefix(&prefix)
.map(|name| (name.to_string(), owner.clone()))
})
.collect()
}
}