docbox_core/document_box/
delete_document_box.rs1use crate::{
2 events::{TenantEventMessage, TenantEventPublisher},
3 folders::delete_folder::{DeleteFolderError, delete_folder},
4};
5use docbox_database::{
6 DbErr, DbPool,
7 models::{
8 document_box::{DocumentBox, DocumentBoxScopeRawRef},
9 folder::Folder,
10 },
11};
12use docbox_search::{SearchError, TenantSearchIndex};
13use docbox_storage::TenantStorageLayer;
14use thiserror::Error;
15
16#[derive(Debug, Error)]
17pub enum DeleteDocumentBoxError {
18 #[error(transparent)]
20 Database(#[from] DbErr),
21
22 #[error("unknown document box scope")]
23 UnknownScope,
24
25 #[error(transparent)]
26 DeleteSearchData(SearchError),
27
28 #[error("failed to delete root folder")]
29 FailedToDeleteRoot(DeleteFolderError),
30}
31
32#[tracing::instrument(skip_all, fields(scope))]
33pub async fn delete_document_box(
34 db: &DbPool,
35 search: &TenantSearchIndex,
36 storage: &TenantStorageLayer,
37 events: &TenantEventPublisher,
38 scope: DocumentBoxScopeRawRef<'_>,
39) -> Result<(), DeleteDocumentBoxError> {
40 let document_box = DocumentBox::find_by_scope(db, &scope.to_string())
41 .await?
42 .ok_or(DeleteDocumentBoxError::UnknownScope)?;
43
44 let root = Folder::find_root(db, &scope.to_string()).await?;
45
46 if let Some(root) = root {
47 delete_folder(db, storage, search, events, root)
49 .await
50 .inspect_err(|error| tracing::error!(?error, "failed to delete bucket root folder"))
51 .map_err(DeleteDocumentBoxError::FailedToDeleteRoot)?;
52 } else {
53 tracing::warn!("document box root folder did not exist");
54 }
55
56 let result = document_box.delete(db).await?;
58
59 if result.rows_affected() < 1 {
61 return Ok(());
62 }
63
64 search
65 .delete_by_scope(scope)
66 .await
67 .map_err(DeleteDocumentBoxError::DeleteSearchData)?;
68
69 events.publish_event(TenantEventMessage::DocumentBoxDeleted(document_box));
71
72 Ok(())
73}