(store: &Store, name: &str)
| 282 | } |
| 283 | |
| 284 | pub(super) async fn delete_provider_record(store: &Store, name: &str) -> Result<bool, Status> { |
| 285 | if name.is_empty() { |
| 286 | return Err(Status::invalid_argument("name is required")); |
| 287 | } |
| 288 | |
| 289 | let Some(provider) = store |
| 290 | .get_message_by_name::<Provider>(name) |
| 291 | .await |
| 292 | .map_err(|e| Status::internal(format!("fetch provider failed: {e}")))? |
| 293 | else { |
| 294 | return Ok(false); |
| 295 | }; |
| 296 | |
| 297 | let blocking_sandboxes = sandboxes_using_provider(store, name).await?; |
| 298 | if !blocking_sandboxes.is_empty() { |
| 299 | return Err(Status::failed_precondition(format!( |
| 300 | "provider '{name}' is attached to sandbox(es): {}", |
| 301 | blocking_sandboxes.join(", ") |
| 302 | ))); |
| 303 | } |
| 304 | |
| 305 | crate::provider_refresh::delete_refresh_states_for_provider(store, provider.object_id()) |
| 306 | .await?; |
| 307 | |
| 308 | store |
| 309 | .delete_by_name(Provider::object_type(), name) |
| 310 | .await |
| 311 | .map_err(|e| Status::internal(format!("delete provider failed: {e}"))) |
| 312 | } |
| 313 | |
| 314 | /// Iterate over every `Sandbox` in the store and collect items produced by |
| 315 | /// `f`. `f` receives each decoded sandbox; returning `Some(T)` includes the |
no test coverage detected