use nodedb_types::{CloneStatus, DatabaseId};
use crate::control::catalog_entry::entry::CatalogEntry;
use crate::control::metadata_proposer::propose_catalog_entry;
use crate::control::security::catalog::SystemCatalog;
use crate::control::state::SharedState;
pub struct ReapParams<'a> {
pub target_collection_qualified: &'a str,
pub db_id: DatabaseId,
pub tenant_id: u64,
pub name: &'a str,
pub state: &'a SharedState,
pub catalog: &'a SystemCatalog,
}
pub fn reap_materialized_collection(params: ReapParams<'_>) -> crate::Result<()> {
let ReapParams {
target_collection_qualified,
db_id,
tenant_id,
name,
state,
catalog,
} = params;
catalog.delete_all_clone_copyups_for_collection(target_collection_qualified)?;
catalog.delete_all_clone_tombstones_for_collection(target_collection_qualified)?;
let Some(mut desc) = catalog.get_collection(db_id, tenant_id, name)? else {
return Ok(());
};
if desc.clone_status == CloneStatus::Materialized {
return Ok(());
}
desc.clone_status = CloneStatus::Materialized;
desc.cloned_from = None;
let proposed =
propose_catalog_entry(state, &CatalogEntry::PutCollection(Box::new(desc.clone())))?;
if proposed == 0 {
catalog.put_collection(db_id, &desc)?;
}
Ok(())
}