Skip to main content

docbox_core/links/
get_link_metadata.rs

1use crate::links::resolve_website::ResolveWebsiteService;
2use docbox_database::{DbPool, models::link::Link};
3use docbox_web_scraper::ResolvedWebsiteMetadata;
4use thiserror::Error;
5use url::Url;
6
7#[derive(Debug, Error)]
8pub enum GetLinkMetadataError {
9    #[error("failed to parse link url")]
10    ParseUrl(#[from] url::ParseError),
11
12    #[error("failed to resolve website metadata")]
13    FailedResolve,
14}
15
16/// Resolve the metadata for the provided link
17#[tracing::instrument(skip_all, fields(link))]
18pub async fn get_link_metadata(
19    db: &DbPool,
20    website_service: &ResolveWebsiteService,
21    link: &Link,
22) -> Result<(Url, ResolvedWebsiteMetadata), GetLinkMetadataError> {
23    let url = Url::parse(&link.value)
24        .inspect_err(|error| tracing::warn!(?error, "failed to parse link website"))?;
25
26    let resolved = website_service
27        .resolve_website(db, &url)
28        .await
29        .ok_or_else(|| {
30            tracing::warn!("failed to resolve link site metadata");
31            GetLinkMetadataError::FailedResolve
32        })?;
33
34    Ok((url, resolved))
35}