Add some ActivityPub function to Mention

This commit is contained in:
Bat 2018-06-20 20:06:34 +01:00
parent 356cc20e34
commit 215b577573
3 changed files with 49 additions and 19 deletions

View File

@ -40,7 +40,7 @@ pub trait FromActivity<T: Object>: Sized {
} }
} }
pub trait Notify<T: Object> { pub trait Notify<T> {
fn notify(conn: &PgConnection, act: T, actor: Id); fn notify(conn: &PgConnection, act: T, actor: Id);
} }

View File

@ -1,8 +1,11 @@
use activitypub::link;
use diesel::{self, PgConnection, QueryDsl, RunQueryDsl, ExpressionMethods}; use diesel::{self, PgConnection, QueryDsl, RunQueryDsl, ExpressionMethods};
use activity_pub::Id;
use models::{ use models::{
comments::Comment, comments::Comment,
posts::Post posts::Post,
users::User
}; };
use schema::mentions; use schema::mentions;
@ -27,6 +30,10 @@ impl Mention {
get!(mentions); get!(mentions);
list_by!(mentions, list_for_user, mentioned_id as i32); list_by!(mentions, list_for_user, mentioned_id as i32);
pub fn get_mentioned(&self, conn: &PgConnection) -> Option<User> {
User::get(conn, self.mentioned_id)
}
pub fn get_post(&self, conn: &PgConnection) -> Option<Post> { pub fn get_post(&self, conn: &PgConnection) -> Option<Post> {
self.post_id.and_then(|id| Post::get(conn, id)) self.post_id.and_then(|id| Post::get(conn, id))
} }
@ -34,4 +41,35 @@ impl Mention {
pub fn get_comment(&self, conn: &PgConnection) -> Option<Comment> { pub fn get_comment(&self, conn: &PgConnection) -> Option<Comment> {
self.post_id.and_then(|id| Comment::get(conn, id)) self.post_id.and_then(|id| Comment::get(conn, id))
} }
pub fn to_activity(&self, conn: &PgConnection) -> link::Mention {
let user = self.get_mentioned(conn);
let mut mention = link::Mention::default();
mention.link_props.set_href_string(user.clone().map(|u| u.ap_url).unwrap_or(String::new())).expect("Error setting mention's href");
mention.link_props.set_name_string(user.map(|u| format!("@{}", u.get_fqn(conn))).unwrap_or(String::new())).expect("Error setting mention's name");
mention
}
pub fn from_activity(conn: &PgConnection, ment: link::Mention, inside: Id) -> Option<Self> {
let mentioned = User::find_by_ap_url(conn, ment.link_props.href_string().unwrap()).unwrap();
if let Some(post) = Post::find_by_ap_url(conn, inside.clone().into()) {
Some(Mention::insert(conn, NewMention {
mentioned_id: mentioned.id,
post_id: Some(post.id),
comment_id: None
}))
} else {
if let Some(comment) = Comment::find_by_ap_url(conn, inside.into()) {
Some(Mention::insert(conn, NewMention {
mentioned_id: mentioned.id,
post_id: None,
comment_id: Some(comment.id)
}))
} else {
None
}
}
}
} }

View File

@ -89,7 +89,7 @@ impl User {
get!(users); get!(users);
find_by!(users, find_by_email, email as String); find_by!(users, find_by_email, email as String);
find_by!(users, find_by_name, username as String, instance_id as i32); find_by!(users, find_by_name, username as String, instance_id as i32);
find_by!(users, find_by_ap_url, ap_url as String);
pub fn grant_admin_rights(&self, conn: &PgConnection) { pub fn grant_admin_rights(&self, conn: &PgConnection) {
diesel::update(self) diesel::update(self)
@ -419,23 +419,15 @@ impl APActor for User {
} }
fn from_url(conn: &PgConnection, url: String) -> Option<User> { fn from_url(conn: &PgConnection, url: String) -> Option<User> {
let in_db = users::table.filter(users::ap_url.eq(url.clone())) User::find_by_ap_url(conn, url.clone()).or_else(|| {
.limit(1) // The requested user was not in the DB
.load::<User>(conn) // We try to fetch it if it is remote
.expect("Error loading user by AP url") if Url::parse(url.as_ref()).unwrap().host_str().unwrap() != BASE_URL.as_str() {
.into_iter().nth(0); Some(User::fetch_from_url(conn, url).unwrap())
match in_db { } else {
Some(u) => Some(u), None
None => {
// The requested user was not in the DB
// We try to fetch it if it is remote
if Url::parse(url.as_ref()).unwrap().host_str().unwrap() != BASE_URL.as_str() {
Some(User::fetch_from_url(conn, url).unwrap())
} else {
None
}
} }
} })
} }
} }