docbox_core/document_box/
delete_document_box.rs

1use 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    /// Database error occurred
19    #[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 root folder
48        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    // Delete document box
57    let result = document_box.delete(db).await?;
58
59    // Check we actually removed something before emitting an event
60    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    // Publish an event
70    events.publish_event(TenantEventMessage::DocumentBoxDeleted(document_box));
71
72    Ok(())
73}