Implement Post::to_activity07()
This commit is contained in:
parent
216855d3a7
commit
7cf7700ef7
@ -9,6 +9,13 @@ use activitypub::{
|
|||||||
object::{Article, Image, Tombstone},
|
object::{Article, Image, Tombstone},
|
||||||
CustomObject,
|
CustomObject,
|
||||||
};
|
};
|
||||||
|
use activitystreams::{
|
||||||
|
base::AnyBase,
|
||||||
|
iri_string::types::IriString,
|
||||||
|
object::{ApObject, Article as Article07, Image as Image07},
|
||||||
|
prelude::*,
|
||||||
|
time::OffsetDateTime,
|
||||||
|
};
|
||||||
use chrono::{NaiveDateTime, TimeZone, Utc};
|
use chrono::{NaiveDateTime, TimeZone, Utc};
|
||||||
use diesel::{self, BelongingToDsl, ExpressionMethods, QueryDsl, RunQueryDsl};
|
use diesel::{self, BelongingToDsl, ExpressionMethods, QueryDsl, RunQueryDsl};
|
||||||
use once_cell::sync::Lazy;
|
use once_cell::sync::Lazy;
|
||||||
@ -16,7 +23,8 @@ use plume_common::{
|
|||||||
activity_pub::{
|
activity_pub::{
|
||||||
inbox::{AsActor, AsObject, FromId},
|
inbox::{AsActor, AsObject, FromId},
|
||||||
sign::Signer,
|
sign::Signer,
|
||||||
Hashtag, Id, IntoId, Licensed, Source, PUBLIC_VISIBILITY,
|
Hashtag, Id, IntoId, Licensed, Licensed07, LicensedArticle as LicensedArticle07, Source,
|
||||||
|
SourceProperty, PUBLIC_VISIBILITY,
|
||||||
},
|
},
|
||||||
utils::{iri_percent_encode_seg, md_to_html},
|
utils::{iri_percent_encode_seg, md_to_html},
|
||||||
};
|
};
|
||||||
@ -409,6 +417,74 @@ impl Post {
|
|||||||
Ok(LicensedArticle::new(article, license))
|
Ok(LicensedArticle::new(article, license))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn to_activity07(&self, conn: &Connection) -> Result<LicensedArticle07> {
|
||||||
|
let cc = self.get_receivers_urls(conn)?;
|
||||||
|
let to = vec![PUBLIC_VISIBILITY.to_string()];
|
||||||
|
|
||||||
|
let mut mentions_json = Mention::list_for_post(conn, self.id)?
|
||||||
|
.into_iter()
|
||||||
|
.map(|m| json!(m.to_activity07(conn).ok()))
|
||||||
|
.collect::<Vec<serde_json::Value>>();
|
||||||
|
let mut tags_json = Tag::for_post(conn, self.id)?
|
||||||
|
.into_iter()
|
||||||
|
.map(|t| json!(t.to_activity07().ok()))
|
||||||
|
.collect::<Vec<serde_json::Value>>();
|
||||||
|
mentions_json.append(&mut tags_json);
|
||||||
|
|
||||||
|
let mut article = ApObject::new(Article07::new());
|
||||||
|
article.set_name(self.title.clone());
|
||||||
|
article.set_id(self.ap_url.parse::<IriString>()?);
|
||||||
|
|
||||||
|
let mut authors = self
|
||||||
|
.get_authors(conn)?
|
||||||
|
.into_iter()
|
||||||
|
.filter_map(|x| x.ap_url.parse::<IriString>().ok())
|
||||||
|
.collect::<Vec<IriString>>();
|
||||||
|
authors.push(self.get_blog(conn)?.ap_url.parse::<IriString>()?); // add the blog URL here too
|
||||||
|
article.set_many_attributed_tos(authors);
|
||||||
|
article.set_content(self.content.get().clone());
|
||||||
|
let source = SourceProperty {
|
||||||
|
content: self.source.clone(),
|
||||||
|
media_type: String::from("text/markdown"),
|
||||||
|
};
|
||||||
|
article.set_published(
|
||||||
|
OffsetDateTime::from_unix_timestamp_nanos(self.creation_date.timestamp_nanos().into())
|
||||||
|
.expect("OffsetDateTime"),
|
||||||
|
);
|
||||||
|
article.set_summary(&*self.subtitle);
|
||||||
|
article.set_tag(AnyBase::from_arbitrary_json(json!(mentions_json))?);
|
||||||
|
|
||||||
|
if let Some(media_id) = self.cover_id {
|
||||||
|
let media = Media::get(conn, media_id)?;
|
||||||
|
let mut cover = Image07::new();
|
||||||
|
cover.set_url(media.url()?);
|
||||||
|
if media.sensitive {
|
||||||
|
cover.set_summary(media.content_warning.unwrap_or_default());
|
||||||
|
}
|
||||||
|
cover.set_content(media.alt_text);
|
||||||
|
cover.set_many_attributed_tos(vec![User::get(conn, media.owner_id)?
|
||||||
|
.ap_url
|
||||||
|
.parse::<IriString>()?]);
|
||||||
|
article.set_icon(cover.into_any_base()?);
|
||||||
|
}
|
||||||
|
|
||||||
|
article.set_url(self.ap_url.parse::<IriString>()?);
|
||||||
|
article.set_many_tos(
|
||||||
|
to.into_iter()
|
||||||
|
.filter_map(|to| to.parse::<IriString>().ok())
|
||||||
|
.collect::<Vec<IriString>>(),
|
||||||
|
);
|
||||||
|
article.set_many_ccs(
|
||||||
|
cc.into_iter()
|
||||||
|
.filter_map(|cc| cc.parse::<IriString>().ok())
|
||||||
|
.collect::<Vec<IriString>>(),
|
||||||
|
);
|
||||||
|
let license = Licensed07 {
|
||||||
|
license: self.license.clone(),
|
||||||
|
};
|
||||||
|
Ok(LicensedArticle07::new(article, license, source))
|
||||||
|
}
|
||||||
|
|
||||||
pub fn create_activity(&self, conn: &Connection) -> Result<Create> {
|
pub fn create_activity(&self, conn: &Connection) -> Result<Create> {
|
||||||
let article = self.to_activity(conn)?;
|
let article = self.to_activity(conn)?;
|
||||||
let mut act = Create::default();
|
let mut act = Create::default();
|
||||||
|
Loading…
Reference in New Issue
Block a user