docbox_core/links/
get_link_metadata.rs1use 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#[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}