docbox_core/links/
delete_link.rs1use 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 search
30 .delete_data(link.id)
31 .await
32 .map_err(DeleteLinkError::Search)?;
33
34 let result = link
36 .delete(db)
37 .await
38 .inspect_err(|error| tracing::error!(?error, "failed to delete link"))?;
39
40 if result.rows_affected() < 1 {
42 return Ok(());
43 }
44
45 events.publish_event(TenantEventMessage::LinkDeleted(WithScope::new(link, scope)));
47
48 Ok(())
49}