Add Actor ActivityPub representation
This commit is contained in:
		
							parent
							
								
									656b201244
								
							
						
					
					
						commit
						e9bcaf4dd9
					
				@ -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()
 | 
			
		||||
        )
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -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 {
 | 
			
		||||
 | 
			
		||||
@ -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 {
 | 
			
		||||
 | 
			
		||||
@ -19,7 +19,7 @@ fn details(name: String) -> String {
 | 
			
		||||
#[get("/~/<name>", 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")]
 | 
			
		||||
 | 
			
		||||
@ -21,7 +21,7 @@ fn details(name: String) -> String {
 | 
			
		||||
#[get("/@/<name>", 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")]
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user