use crate::events::{TenantEventMessage, TenantEventPublisher};
use docbox_database::{
DbErr, DbPool,
models::{
document_box::{DocumentBoxScopeRaw, WithScope},
link::Link,
},
};
use docbox_search::{SearchError, TenantSearchIndex};
use thiserror::Error;
#[derive(Debug, Error)]
pub enum DeleteLinkError {
#[error(transparent)]
Database(#[from] DbErr),
#[error(transparent)]
Search(SearchError),
}
#[tracing::instrument(skip_all, fields(%scope, link_id = %link.id))]
pub async fn delete_link(
db: &DbPool,
search: &TenantSearchIndex,
events: &TenantEventPublisher,
link: Link,
scope: DocumentBoxScopeRaw,
) -> Result<(), DeleteLinkError> {
search
.delete_data(link.id)
.await
.map_err(DeleteLinkError::Search)?;
let result = link
.delete(db)
.await
.inspect_err(|error| tracing::error!(?error, "failed to delete link"))?;
if result.rows_affected() < 1 {
return Ok(());
}
events.publish_event(TenantEventMessage::LinkDeleted(WithScope::new(link, scope)));
Ok(())
}