make plume-models async (again)
This commit is contained in:
parent
6fe16c9f84
commit
097d0ea9ce
@ -17,6 +17,7 @@ use activitypub::{
|
|||||||
};
|
};
|
||||||
use chrono::{self, NaiveDateTime};
|
use chrono::{self, NaiveDateTime};
|
||||||
use diesel::{self, ExpressionMethods, QueryDsl, RunQueryDsl, SaveChangesDsl};
|
use diesel::{self, ExpressionMethods, QueryDsl, RunQueryDsl, SaveChangesDsl};
|
||||||
|
use futures::stream::{self, StreamExt};
|
||||||
use plume_common::{
|
use plume_common::{
|
||||||
activity_pub::{
|
activity_pub::{
|
||||||
inbox::{AsActor, AsObject, FromId},
|
inbox::{AsActor, AsObject, FromId},
|
||||||
@ -105,7 +106,7 @@ impl Comment {
|
|||||||
.unwrap_or(false)
|
.unwrap_or(false)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn to_activity(&self, c: &PlumeRocket) -> Result<Note> {
|
pub async fn to_activity(&self, c: &PlumeRocket) -> Result<Note> {
|
||||||
let author = User::get(&c.conn, self.author_id)?;
|
let author = User::get(&c.conn, self.author_id)?;
|
||||||
let (html, mentions, _hashtags) = utils::md_to_html(
|
let (html, mentions, _hashtags) = utils::md_to_html(
|
||||||
self.content.get().as_ref(),
|
self.content.get().as_ref(),
|
||||||
@ -132,18 +133,18 @@ impl Comment {
|
|||||||
note.object_props.set_attributed_to_link(author.into_id())?;
|
note.object_props.set_attributed_to_link(author.into_id())?;
|
||||||
note.object_props.set_to_link_vec(to)?;
|
note.object_props.set_to_link_vec(to)?;
|
||||||
note.object_props.set_tag_link_vec(
|
note.object_props.set_tag_link_vec(
|
||||||
mentions
|
stream::iter(mentions)
|
||||||
.into_iter()
|
.filter_map(|m| async move { Mention::build_activity(c, &m).await.ok() })
|
||||||
.filter_map(|m| Mention::build_activity(c, &m).ok())
|
.collect::<Vec<link::Mention>>()
|
||||||
.collect::<Vec<link::Mention>>(),
|
.await,
|
||||||
)?;
|
)?;
|
||||||
Ok(note)
|
Ok(note)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn create_activity(&self, c: &PlumeRocket) -> Result<Create> {
|
pub async fn create_activity(&self, c: &PlumeRocket) -> Result<Create> {
|
||||||
let author = User::get(&c.conn, self.author_id)?;
|
let author = User::get(&c.conn, self.author_id)?;
|
||||||
|
|
||||||
let note = self.to_activity(c)?;
|
let note = self.to_activity(c).await?;
|
||||||
let mut act = Create::default();
|
let mut act = Create::default();
|
||||||
act.create_props.set_actor_link(author.into_id())?;
|
act.create_props.set_actor_link(author.into_id())?;
|
||||||
act.create_props.set_object_object(note.clone())?;
|
act.create_props.set_object_object(note.clone())?;
|
||||||
|
@ -52,8 +52,8 @@ impl Mention {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn build_activity(c: &PlumeRocket, ment: &str) -> Result<link::Mention> {
|
pub async fn build_activity(c: &PlumeRocket, ment: &str) -> Result<link::Mention> {
|
||||||
let user = User::find_by_fqn(c, ment)?;
|
let user = User::find_by_fqn(c, ment).await?;
|
||||||
let mut mention = link::Mention::default();
|
let mut mention = link::Mention::default();
|
||||||
mention.link_props.set_href_string(user.ap_url)?;
|
mention.link_props.set_href_string(user.ap_url)?;
|
||||||
mention.link_props.set_name_string(format!("@{}", ment))?;
|
mention.link_props.set_name_string(format!("@{}", ment))?;
|
||||||
|
@ -311,10 +311,19 @@ impl WithList {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
WithList::Author { boosts, likes } => match kind {
|
WithList::Author { boosts, likes } => match kind {
|
||||||
Kind::Original => Ok(list
|
Kind::Original => {
|
||||||
.iter()
|
let mut rt = Runtime::new().unwrap();
|
||||||
.filter_map(|a| User::find_by_fqn(rocket, a).ok())
|
rt.block_on(async move {
|
||||||
.any(|a| post.is_author(&rocket.conn, a.id).unwrap_or(false))),
|
Ok(stream::iter(list)
|
||||||
|
.filter_map(|a| async move {
|
||||||
|
Some(User::find_by_fqn(rocket, a).await.ok().unwrap())
|
||||||
|
})
|
||||||
|
.collect::<Vec<_>>()
|
||||||
|
.await
|
||||||
|
.into_iter()
|
||||||
|
.any(|a| post.is_author(&rocket.conn, a.id).unwrap_or(false)))
|
||||||
|
})
|
||||||
|
}
|
||||||
Kind::Reshare(u) => {
|
Kind::Reshare(u) => {
|
||||||
if *boosts {
|
if *boosts {
|
||||||
Ok(list.iter().any(|user| &u.fqn == user))
|
Ok(list.iter().any(|user| &u.fqn == user))
|
||||||
|
@ -191,7 +191,7 @@ impl User {
|
|||||||
.map_err(Error::from)
|
.map_err(Error::from)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn find_by_fqn(c: &PlumeRocket, fqn: &str) -> Result<User> {
|
pub async fn find_by_fqn(c: &PlumeRocket, fqn: &str) -> Result<User> {
|
||||||
let from_db = users::table
|
let from_db = users::table
|
||||||
.filter(users::fqn.eq(fqn))
|
.filter(users::fqn.eq(fqn))
|
||||||
.first(&*c.conn)
|
.first(&*c.conn)
|
||||||
@ -199,12 +199,13 @@ impl User {
|
|||||||
if let Some(from_db) = from_db {
|
if let Some(from_db) = from_db {
|
||||||
Ok(from_db)
|
Ok(from_db)
|
||||||
} else {
|
} else {
|
||||||
User::fetch_from_webfinger(c, fqn)
|
User::fetch_from_webfinger(c, fqn).await
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn fetch_from_webfinger(c: &PlumeRocket, acct: &str) -> Result<User> {
|
async fn fetch_from_webfinger(c: &PlumeRocket, acct: &str) -> Result<User> {
|
||||||
let link = resolve(acct.to_owned(), true)?
|
let link = resolve(acct.to_owned(), true)
|
||||||
|
.await?
|
||||||
.links
|
.links
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.find(|l| l.mime_type == Some(String::from("application/activity+json")))
|
.find(|l| l.mime_type == Some(String::from("application/activity+json")))
|
||||||
@ -212,8 +213,9 @@ impl User {
|
|||||||
User::from_id(c, link.href.as_ref()?, None).map_err(|(_, e)| e)
|
User::from_id(c, link.href.as_ref()?, None).map_err(|(_, e)| e)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn fetch_remote_interact_uri(acct: &str) -> Result<String> {
|
pub async fn fetch_remote_interact_uri(acct: &str) -> Result<String> {
|
||||||
resolve(acct.to_owned(), true)?
|
resolve(acct.to_owned(), true)
|
||||||
|
.await?
|
||||||
.links
|
.links
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.find(|l| l.rel == "http://ostatus.org/schema/1.0/subscribe")
|
.find(|l| l.rel == "http://ostatus.org/schema/1.0/subscribe")
|
||||||
|
Loading…
Reference in New Issue
Block a user