diff --git a/src/activity_pub/mod.rs b/src/activity_pub/mod.rs index c93f36c0..7c7aa8c6 100644 --- a/src/activity_pub/mod.rs +++ b/src/activity_pub/mod.rs @@ -2,6 +2,20 @@ use models::instance::Instance; use diesel::PgConnection; use serde_json::Value; +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 { fn get_box_prefix() -> &'static str; @@ -9,8 +23,43 @@ pub trait Actor { fn get_instance(&self, conn: &PgConnection) -> Instance; - fn as_activity_pub (&self) -> Value { - json!({}) + fn get_actor_type() -> ActorType; + + fn as_activity_pub (&self, conn: &PgConnection) -> Value { + json!({ + "@context": [ + "https://www.w3.org/ns/activitystreams", + "https://w3id.org/security/v1", + { + "manuallyApprovesFollowers": "as:manuallyApprovesFollowers", + "sensitive": "as:sensitive", + "movedTo": "as:movedTo", + "Hashtag": "as:Hashtag", + "ostatus":"http://ostatus.org#", + "atomUri":"ostatus:atomUri", + "inReplyToAtomUri":"ostatus:inReplyToAtomUri", + "conversation":"ostatus:conversation", + "toot":"http://joinmastodon.org/ns#", + "Emoji":"toot:Emoji", + "focalPoint": { + "@container":"@list", + "@id":"toot:focalPoint" + }, + "featured":"toot:featured" + } + ], + "id": self.compute_id(conn), + "type": Self::get_actor_type().to_string(), + "inbox": self.compute_inbox(conn), + "outbox": self.compute_outbox(conn), + "preferredUsername": self.get_actor_id(), + "name": "", + "summary": "", + "url": self.compute_id(conn), + "endpoints": { + "sharedInbox": "https://plu.me/inbox" + } + }) } fn compute_outbox(&self, conn: &PgConnection) -> String { @@ -22,12 +71,15 @@ pub trait Actor { } fn compute_box(&self, conn: &PgConnection, box_name: &str) -> String { + format!("{id}/{name}", id = self.compute_id(conn), name = box_name) + } + + fn compute_id(&self, conn: &PgConnection) -> String { format!( - "https://{instance}/{prefix}/{user}/{name}", + "https://{instance}/{prefix}/{user}", instance = self.get_instance(conn).public_domain, prefix = Self::get_box_prefix(), - user = self.get_actor_id(), - name = box_name + user = self.get_actor_id() ) } } diff --git a/src/models/blogs.rs b/src/models/blogs.rs index 7dfe5705..da6dcb09 100644 --- a/src/models/blogs.rs +++ b/src/models/blogs.rs @@ -1,7 +1,7 @@ use diesel; use diesel::{QueryDsl, RunQueryDsl, ExpressionMethods, PgConnection}; use schema::blogs; -use activity_pub::Actor; +use activity_pub::{Actor, ActorType}; use models::instance::Instance; #[derive(Queryable, Identifiable)] @@ -77,6 +77,10 @@ impl Actor for Blog { fn get_instance(&self, conn: &PgConnection) -> Instance { Instance::get(conn, self.instance_id).unwrap() } + + fn get_actor_type () -> ActorType { + ActorType::Blog + } } impl NewBlog { diff --git a/src/models/users.rs b/src/models/users.rs index 681dae36..b74e79dd 100644 --- a/src/models/users.rs +++ b/src/models/users.rs @@ -5,7 +5,7 @@ use diesel; use diesel::{QueryDsl, RunQueryDsl, ExpressionMethods, PgConnection}; use schema::users; use db_conn::DbConn; -use activity_pub::Actor; +use activity_pub::{ActorType, Actor}; use models::instance::Instance; use bcrypt; @@ -121,6 +121,10 @@ impl Actor for User { fn get_instance(&self, conn: &PgConnection) -> Instance { Instance::get(conn, self.instance_id).unwrap() } + + fn get_actor_type() -> ActorType { + ActorType::Person + } } impl NewUser { diff --git a/src/routes/blogs.rs b/src/routes/blogs.rs index 2c8bafa3..f199b7fb 100644 --- a/src/routes/blogs.rs +++ b/src/routes/blogs.rs @@ -19,7 +19,7 @@ fn details(name: String) -> String { #[get("/~/", format = "application/activity+json", rank = 1)] fn activity(name: String, conn: DbConn) -> Json { let blog = Blog::find_by_actor_id(&*conn, name).unwrap(); - Json(blog.as_activity_pub()) + Json(blog.as_activity_pub(&*conn)) } #[get("/blogs/new")] diff --git a/src/routes/user.rs b/src/routes/user.rs index 60a4fbb6..11f1a54f 100644 --- a/src/routes/user.rs +++ b/src/routes/user.rs @@ -21,7 +21,7 @@ fn details(name: String) -> String { #[get("/@/", format = "application/activity+json", rank = 1)] fn activity(name: String, conn: DbConn) -> Json { let user = User::find_by_name(&*conn, name).unwrap(); - Json(user.as_activity_pub()) + Json(user.as_activity_pub(&*conn)) } #[get("/users/new")]