docbox_core/links/
delete_link.rs

1use crate::events::{TenantEventMessage, TenantEventPublisher};
2use docbox_database::{
3    DbErr, DbPool,
4    models::{
5        document_box::{DocumentBoxScopeRaw, WithScope},
6        link::Link,
7    },
8};
9use docbox_search::TenantSearchIndex;
10use thiserror::Error;
11
12#[derive(Debug, Error)]
13pub enum DeleteLinkError {
14    #[error(transparent)]
15    Database(#[from] DbErr),
16    #[error(transparent)]
17    Search(anyhow::Error),
18}
19
20#[tracing::instrument(skip_all, fields(%scope, link_id = %link.id))]
21pub async fn delete_link(
22    db: &DbPool,
23    search: &TenantSearchIndex,
24    events: &TenantEventPublisher,
25    link: Link,
26    scope: DocumentBoxScopeRaw,
27) -> Result<(), DeleteLinkError> {
28    // Delete the indexed file contents
29    search
30        .delete_data(link.id)
31        .await
32        .map_err(DeleteLinkError::Search)?;
33
34    // Delete the link itself from the db
35    let result = link
36        .delete(db)
37        .await
38        .inspect_err(|error| tracing::error!(?error, "failed to delete link"))?;
39
40    // Check we actually removed something before emitting an event
41    if result.rows_affected() < 1 {
42        return Ok(());
43    }
44
45    // Publish an event
46    events.publish_event(TenantEventMessage::LinkDeleted(WithScope::new(link, scope)));
47
48    Ok(())
49}