diff --git a/plume-models/src/medias.rs b/plume-models/src/medias.rs index 26e1c6b9..369df668 100644 --- a/plume-models/src/medias.rs +++ b/plume-models/src/medias.rs @@ -11,7 +11,7 @@ use plume_common::{ utils::MediaProcessor, }; use std::{ - fs, + fs::{self, DirBuilder}, path::{Path, PathBuf}, }; use tracing::warn; @@ -206,6 +206,10 @@ impl Media { pub fn from_activity(conn: &DbConn, image: &Image) -> Result { let remote_url = image.object_props.url_string().ok()?; let path = determine_mirror_file_path(&remote_url); + let parent = path.parent()?; + if !parent.is_dir() { + DirBuilder::new().recursive(true).create(parent)?; + } let mut dest = fs::File::create(path.clone()).ok()?; if let Some(proxy) = CONFIG.proxy() { diff --git a/plume-models/src/posts.rs b/plume-models/src/posts.rs index 27eadcdb..8f1df2fe 100644 --- a/plume-models/src/posts.rs +++ b/plume-models/src/posts.rs @@ -637,37 +637,33 @@ impl FromId for Post { } }); - let post = Self::from_db(conn, &article.object_props.id_string()?).or_else(|_| { - let cover = article - .object_props - .icon_object::() - .ok() - .and_then(|img| Media::from_activity(conn, &img).ok().map(|m| m.id)); - - let title = article.object_props.name_string()?; - Self::insert( - conn, - NewPost { - blog_id: blog?.id, - slug: title.to_kebab_case(), - title, - content: SafeString::new(&article.object_props.content_string()?), - published: true, - license, - // FIXME: This is wrong: with this logic, we may use the display URL as the AP ID. We need two different fields - ap_url: article - .object_props - .url_string() - .or_else(|_| article.object_props.id_string())?, - creation_date: Some(article.object_props.published_utctime()?.naive_utc()), - subtitle: article.object_props.summary_string()?, - source: article.ap_object_props.source_object::()?.content, - cover_id: cover, - }, - ) - })?; - - // TODO: Update cover image if post's cover changes + let cover = article + .object_props + .icon_object::() + .ok() + .and_then(|img| Media::from_activity(conn, &img).ok().map(|m| m.id)); + + let title = article.object_props.name_string()?; + let post = Post::insert( + conn, + NewPost { + blog_id: blog?.id, + slug: title.to_kebab_case(), + title, + content: SafeString::new(&article.object_props.content_string()?), + published: true, + license, + // FIXME: This is wrong: with this logic, we may use the display URL as the AP ID. We need two different fields + ap_url: article + .object_props + .url_string() + .or_else(|_| article.object_props.id_string())?, + creation_date: Some(article.object_props.published_utctime()?.naive_utc()), + subtitle: article.object_props.summary_string()?, + source: article.ap_object_props.source_object::()?.content, + cover_id: cover, + }, + )?; for author in authors { PostAuthor::insert(