diff --git a/src/activity_pub/actor.rs b/src/activity_pub/actor.rs index 25ea3d27..e5001286 100644 --- a/src/activity_pub/actor.rs +++ b/src/activity_pub/actor.rs @@ -1,44 +1,15 @@ use diesel::PgConnection; -use serde_json; use activity_pub::ap_url; use models::instance::Instance; -pub enum ActorType { - Person, - Blog -} - -impl ToString for ActorType { - fn to_string(&self) -> String { - String::from(match self { - ActorType::Person => "Person", - ActorType::Blog => "Blog" - }) - } -} - pub trait Actor: Sized { fn get_box_prefix() -> &'static str; fn get_actor_id(&self) -> String; - fn get_display_name(&self) -> String; - - fn get_summary(&self) -> String; - fn get_instance(&self, conn: &PgConnection) -> Instance; - fn get_actor_type() -> ActorType; - - fn get_inbox_url(&self) -> String; - - fn get_shared_inbox_url(&self) -> Option; - - fn custom_props(&self, _conn: &PgConnection) -> serde_json::Map { - serde_json::Map::new() - } - fn compute_outbox(&self, conn: &PgConnection) -> String { self.compute_box(conn, "outbox") } @@ -59,6 +30,4 @@ pub trait Actor: Sized { user = self.get_actor_id() )) } - - fn from_url(conn: &PgConnection, url: String) -> Option; } diff --git a/src/models/blogs.rs b/src/models/blogs.rs index 12cd9c93..e62fa08c 100644 --- a/src/models/blogs.rs +++ b/src/models/blogs.rs @@ -18,7 +18,7 @@ use webfinger::*; use activity_pub::{ ActivityStream, Id, IntoId, - actor::{Actor as APActor, ActorType}, + actor::{Actor as APActor}, inbox::WithInbox, sign }; @@ -199,6 +199,15 @@ impl Blog { ] } } + + // FIXME: see User::from_url for correct behavior + pub fn from_url(conn: &PgConnection, url: String) -> Option { + blogs::table.filter(blogs::ap_url.eq(url)) + .limit(1) + .load::(conn) + .expect("Error loading blog from url") + .into_iter().nth(0) + } } impl IntoId for Blog { @@ -229,37 +238,9 @@ impl APActor for Blog { self.actor_id.to_string() } - fn get_display_name(&self) -> String { - self.title.clone() - } - - fn get_summary(&self) -> String { - self.summary.clone() - } - fn get_instance(&self, conn: &PgConnection) -> Instance { Instance::get(conn, self.instance_id).unwrap() } - - fn get_actor_type () -> ActorType { - ActorType::Blog - } - - fn get_inbox_url(&self) -> String { - self.inbox_url.clone() - } - - fn get_shared_inbox_url(&self) -> Option { - None - } - - fn from_url(conn: &PgConnection, url: String) -> Option { - blogs::table.filter(blogs::ap_url.eq(url)) - .limit(1) - .load::(conn) - .expect("Error loading blog from url") - .into_iter().nth(0) - } } impl sign::Signer for Blog { diff --git a/src/models/comments.rs b/src/models/comments.rs index 9deaa1ae..a6578f22 100644 --- a/src/models/comments.rs +++ b/src/models/comments.rs @@ -9,7 +9,6 @@ use serde_json; use activity_pub::{ ap_url, Id, IntoId, PUBLIC_VISIBILTY, - actor::Actor, inbox::{FromActivity, Notify} }; use models::{ diff --git a/src/models/follows.rs b/src/models/follows.rs index 638a2578..c7bffb5e 100644 --- a/src/models/follows.rs +++ b/src/models/follows.rs @@ -1,7 +1,7 @@ use activitypub::{Actor, activity::{Accept, Follow as FollowAct}}; use diesel::{self, PgConnection, ExpressionMethods, QueryDsl, RunQueryDsl}; -use activity_pub::{broadcast, Id, IntoId, actor::Actor as ApActor, inbox::{FromActivity, Notify, WithInbox}, sign::Signer}; +use activity_pub::{broadcast, Id, IntoId, inbox::{FromActivity, Notify, WithInbox}, sign::Signer}; use models::{ blogs::Blog, notifications::*, diff --git a/src/models/likes.rs b/src/models/likes.rs index 0f18b102..f7c6fb96 100644 --- a/src/models/likes.rs +++ b/src/models/likes.rs @@ -5,7 +5,6 @@ use diesel::{self, PgConnection, QueryDsl, RunQueryDsl, ExpressionMethods}; use activity_pub::{ Id, IntoId, - actor::Actor, inbox::{FromActivity, Deletable, Notify} }; use models::{ diff --git a/src/models/reshares.rs b/src/models/reshares.rs index bc29f4f8..69e41916 100644 --- a/src/models/reshares.rs +++ b/src/models/reshares.rs @@ -2,7 +2,7 @@ use activitypub::activity::{Announce, Undo}; use chrono::NaiveDateTime; use diesel::{self, PgConnection, QueryDsl, RunQueryDsl, ExpressionMethods}; -use activity_pub::{Id, IntoId, actor::Actor, inbox::{FromActivity, Notify, Deletable}}; +use activity_pub::{Id, IntoId, inbox::{FromActivity, Notify, Deletable}}; use models::{notifications::*, posts::Post, users::User}; use schema::reshares; diff --git a/src/models/users.rs b/src/models/users.rs index 300c5fa9..8ddf5a3b 100644 --- a/src/models/users.rs +++ b/src/models/users.rs @@ -28,7 +28,7 @@ use webfinger::*; use BASE_URL; use activity_pub::{ ap_url, ActivityStream, Id, IntoId, - actor::{ActorType, Actor as APActor}, + actor::{Actor as APActor}, inbox::{Inbox, WithInbox}, sign::{Signer, gen_keypair} }; @@ -308,8 +308,8 @@ impl User { pub fn into_activity(&self, _conn: &PgConnection) -> Person { let mut actor = Person::default(); actor.object_props.set_id_string(self.ap_url.clone()).expect("User::into_activity: id error"); - actor.object_props.set_name_string(self.get_display_name()).expect("User::into_activity: name error"); - actor.object_props.set_summary_string(self.get_summary()).expect("User::into_activity: summary error"); + actor.object_props.set_name_string(self.display_name.clone()).expect("User::into_activity: name error"); + actor.object_props.set_summary_string(self.summary.get().clone()).expect("User::into_activity: summary error"); actor.object_props.set_url_string(self.ap_url.clone()).expect("User::into_activity: url error"); actor.ap_actor_props.set_inbox_string(self.inbox_url.clone()).expect("User::into_activity: inbox error"); actor.ap_actor_props.set_outbox_string(self.outbox_url.clone()).expect("User::into_activity: outbox error"); @@ -350,6 +350,18 @@ impl User { ] } } + + pub fn from_url(conn: &PgConnection, url: String) -> Option { + User::find_by_ap_url(conn, url.clone()).or_else(|| { + // 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 + } + }) + } } impl<'a, 'r> FromRequest<'a, 'r> for User { @@ -374,52 +386,9 @@ impl APActor for User { self.username.to_string() } - fn get_display_name(&self) -> String { - self.display_name.clone() - } - - fn get_summary(&self) -> String { - self.summary.get().clone() - } - fn get_instance(&self, conn: &PgConnection) -> Instance { Instance::get(conn, self.instance_id).unwrap() } - - fn get_actor_type() -> ActorType { - ActorType::Person - } - - fn get_inbox_url(&self) -> String { - self.inbox_url.clone() - } - - fn get_shared_inbox_url(&self) -> Option { - self.shared_inbox_url.clone() - } - - fn custom_props(&self, conn: &PgConnection) -> serde_json::Map { - let mut res = serde_json::Map::new(); - res.insert("publicKey".to_string(), json!({ - "id": self.get_key_id(), - "owner": self.ap_url, - "publicKeyPem": self.public_key - })); - res.insert("followers".to_string(), serde_json::Value::String(self.compute_box(conn, "followers"))); - res - } - - fn from_url(conn: &PgConnection, url: String) -> Option { - User::find_by_ap_url(conn, url.clone()).or_else(|| { - // 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 - } - }) - } } impl IntoId for User {