use crate::control::security::identity::AuthenticatedIdentity;
use crate::control::state::SharedState;
use super::super::super::result::{DdlError, DdlResult};
use super::super::auth_support::{require_tenant_admin, status};
pub fn drop_topic(
state: &SharedState,
identity: &AuthenticatedIdentity,
parts: &[&str],
) -> Result<Vec<DdlResult>, DdlError> {
require_tenant_admin(identity, "drop topics")?;
if parts.len() < 3 {
return Err(DdlError {
sqlstate: "42601".to_string(),
message: "expected DROP TOPIC <name>".to_string(),
});
}
let name = parts[2].to_lowercase();
let tenant_id = identity.tenant_id.as_u64();
let catalog = state.credentials.catalog();
let existed = catalog
.delete_ep_topic(tenant_id, &name)
.map_err(|e| DdlError {
sqlstate: "XX000".to_string(),
message: format!("catalog delete: {e}"),
})?;
if !existed {
return Err(DdlError {
sqlstate: "42704".to_string(),
message: format!("topic '{name}' does not exist"),
});
}
state.ep_topic_registry.unregister(tenant_id, &name);
let buffer_key = format!("topic:{name}");
state.cdc_router.remove_buffer(tenant_id, &buffer_key);
state.audit_record(
crate::control::security::audit::AuditEvent::AdminAction,
Some(identity.tenant_id),
&identity.username,
&format!("DROP TOPIC {name}"),
);
Ok(status("DROP TOPIC"))
}