Use the activitypub crate
This commit is contained in:
parent
40d87e746d
commit
78362feffb
|
@ -1,3 +1,16 @@
|
||||||
|
[[package]]
|
||||||
|
name = "activitypub"
|
||||||
|
version = "0.1.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"activitystreams-derive 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"activitystreams-traits 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"activitystreams-types 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"serde 1.0.42 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"serde_derive 1.0.43 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"serde_json 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "activitystreams"
|
name = "activitystreams"
|
||||||
version = "0.1.1"
|
version = "0.1.1"
|
||||||
|
@ -41,6 +54,20 @@ dependencies = [
|
||||||
"serde_json 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)",
|
"serde_json 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "activitystreams-types"
|
||||||
|
version = "0.2.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"activitystreams-derive 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"activitystreams-traits 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"chrono 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"mime 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"serde 1.0.42 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"serde_derive 1.0.43 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"serde_json 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "adler32"
|
name = "adler32"
|
||||||
version = "1.0.2"
|
version = "1.0.2"
|
||||||
|
@ -936,6 +963,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
name = "plume"
|
name = "plume"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"activitypub 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"activitystreams 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"activitystreams 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"activitystreams-derive 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"activitystreams-derive 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"activitystreams-traits 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"activitystreams-traits 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
@ -1811,10 +1839,12 @@ version = "0.4.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
[metadata]
|
[metadata]
|
||||||
|
"checksum activitypub 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c87040997a45d9da90327a11191bda4f2b1812d8c3e2062ea8d539eb8e2bfde7"
|
||||||
"checksum activitystreams 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "638541e5169c839f6581302c50e38876312389475cd911ecc7c446c7491004cc"
|
"checksum activitystreams 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "638541e5169c839f6581302c50e38876312389475cd911ecc7c446c7491004cc"
|
||||||
"checksum activitystreams-derive 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "48db826c588a009960d74530e7c215e21fae130f585362504dc6b6357e5ce86b"
|
"checksum activitystreams-derive 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "48db826c588a009960d74530e7c215e21fae130f585362504dc6b6357e5ce86b"
|
||||||
"checksum activitystreams-traits 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "670ef03168e704b0cae242e7a5d8b40506772b339687e01a3496fc4afe2e8542"
|
"checksum activitystreams-traits 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "670ef03168e704b0cae242e7a5d8b40506772b339687e01a3496fc4afe2e8542"
|
||||||
"checksum activitystreams-types 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "aff9aa0c3412fe4da72a1f6e4b1c2e9792bfdf1308b709389192f17aa8e2b3cd"
|
"checksum activitystreams-types 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "aff9aa0c3412fe4da72a1f6e4b1c2e9792bfdf1308b709389192f17aa8e2b3cd"
|
||||||
|
"checksum activitystreams-types 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "14806b3c88c439e1670fdc99d9b18bf1a47d4fa7152fe8a3bd7da08b6ced3e95"
|
||||||
"checksum adler32 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6cbd0b9af8587c72beadc9f72d35b9fbb070982c9e6203e46e93f10df25f8f45"
|
"checksum adler32 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6cbd0b9af8587c72beadc9f72d35b9fbb070982c9e6203e46e93f10df25f8f45"
|
||||||
"checksum aho-corasick 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "d6531d44de723825aa81398a6415283229725a00fa30713812ab9323faa82fc4"
|
"checksum aho-corasick 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "d6531d44de723825aa81398a6415283229725a00fa30713812ab9323faa82fc4"
|
||||||
"checksum ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b"
|
"checksum ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b"
|
||||||
|
|
|
@ -3,6 +3,7 @@ authors = ["Bat' <baptiste@gelez.xyz>"]
|
||||||
name = "plume"
|
name = "plume"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
[dependencies]
|
[dependencies]
|
||||||
|
activitypub = "0.1"
|
||||||
activitystreams = "0.1"
|
activitystreams = "0.1"
|
||||||
activitystreams-derive = "0.1"
|
activitystreams-derive = "0.1"
|
||||||
activitystreams-traits = "0.1"
|
activitystreams-traits = "0.1"
|
||||||
|
|
|
@ -1,9 +1,10 @@
|
||||||
use activitystreams_traits::Actor;
|
use activitypub::{
|
||||||
use activitystreams_types::{
|
Actor,
|
||||||
actor::Person,
|
actor::Person,
|
||||||
activity::{Accept, Announce, Create, Follow, Like, Undo},
|
activity::{Accept, Announce, Create, Follow, Like, Undo},
|
||||||
object::{Article, Note}
|
object::Note
|
||||||
};
|
};
|
||||||
|
use activitystreams_types::object::Article;
|
||||||
use diesel::PgConnection;
|
use diesel::PgConnection;
|
||||||
use failure::Error;
|
use failure::Error;
|
||||||
use serde_json;
|
use serde_json;
|
||||||
|
@ -67,11 +68,11 @@ pub trait Inbox {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn follow(&self, conn: &PgConnection, follow: Follow) -> Result<(), Error> {
|
fn follow(&self, conn: &PgConnection, follow: Follow) -> Result<(), Error> {
|
||||||
let from = User::from_url(conn, follow.actor.as_str().unwrap().to_string()).unwrap();
|
let from = User::from_url(conn, follow.follow_props.actor.as_str().unwrap().to_string()).unwrap();
|
||||||
match User::from_url(conn, follow.object.as_str().unwrap().to_string()) {
|
match User::from_url(conn, follow.follow_props.object.as_str().unwrap().to_string()) {
|
||||||
Some(u) => self.accept_follow(conn, &from, &u, follow, from.id, u.id),
|
Some(u) => self.accept_follow(conn, &from, &u, follow, from.id, u.id),
|
||||||
None => {
|
None => {
|
||||||
let blog = Blog::from_url(conn, follow.object.as_str().unwrap().to_string()).unwrap();
|
let blog = Blog::from_url(conn, follow.follow_props.object.as_str().unwrap().to_string()).unwrap();
|
||||||
self.accept_follow(conn, &from, &blog, follow, from.id, blog.id)
|
self.accept_follow(conn, &from, &blog, follow, from.id, blog.id)
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -79,8 +80,8 @@ pub trait Inbox {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn like(&self, conn: &PgConnection, like: Like) -> Result<(), Error> {
|
fn like(&self, conn: &PgConnection, like: Like) -> Result<(), Error> {
|
||||||
let liker = User::from_url(conn, like.actor.as_str().unwrap().to_string());
|
let liker = User::from_url(conn, like.like_props.actor.as_str().unwrap().to_string());
|
||||||
let post = Post::find_by_ap_url(conn, like.object.as_str().unwrap().to_string());
|
let post = Post::find_by_ap_url(conn, like.like_props.object.as_str().unwrap().to_string());
|
||||||
likes::Like::insert(conn, likes::NewLike {
|
likes::Like::insert(conn, likes::NewLike {
|
||||||
post_id: post.unwrap().id,
|
post_id: post.unwrap().id,
|
||||||
user_id: liker.unwrap().id,
|
user_id: liker.unwrap().id,
|
||||||
|
@ -90,14 +91,14 @@ pub trait Inbox {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn unlike(&self, conn: &PgConnection, undo: Undo) -> Result<(), Error> {
|
fn unlike(&self, conn: &PgConnection, undo: Undo) -> Result<(), Error> {
|
||||||
let like = likes::Like::find_by_ap_url(conn, undo.object_object::<Like>()?.object_props.id_string()?).unwrap();
|
let like = likes::Like::find_by_ap_url(conn, undo.undo_props.object_object::<Like>()?.object_props.id_string()?).unwrap();
|
||||||
like.delete(conn);
|
like.delete(conn);
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn announce(&self, conn: &PgConnection, announce: Announce) -> Result<(), Error> {
|
fn announce(&self, conn: &PgConnection, announce: Announce) -> Result<(), Error> {
|
||||||
let user = User::from_url(conn, announce.actor.as_str().unwrap().to_string());
|
let user = User::from_url(conn, announce.announce_props.actor.as_str().unwrap().to_string());
|
||||||
let post = Post::find_by_ap_url(conn, announce.object.as_str().unwrap().to_string());
|
let post = Post::find_by_ap_url(conn, announce.announce_props.object.as_str().unwrap().to_string());
|
||||||
Reshare::insert(conn, NewReshare {
|
Reshare::insert(conn, NewReshare {
|
||||||
post_id: post.unwrap().id,
|
post_id: post.unwrap().id,
|
||||||
user_id: user.unwrap().id,
|
user_id: user.unwrap().id,
|
||||||
|
@ -113,9 +114,9 @@ pub trait Inbox {
|
||||||
"Announce" => self.announce(conn, serde_json::from_value(act.clone())?),
|
"Announce" => self.announce(conn, serde_json::from_value(act.clone())?),
|
||||||
"Create" => {
|
"Create" => {
|
||||||
let act: Create = serde_json::from_value(act.clone())?;
|
let act: Create = serde_json::from_value(act.clone())?;
|
||||||
match act.object["type"].as_str().unwrap() {
|
match act.create_props.object["type"].as_str().unwrap() {
|
||||||
"Article" => self.new_article(conn, act.object_object()?),
|
"Article" => self.new_article(conn, act.create_props.object_object()?),
|
||||||
"Note" => self.new_comment(conn, act.object_object()?, act.actor_object::<Person>()?.object_props.id_string()?),
|
"Note" => self.new_comment(conn, act.create_props.object_object()?, act.create_props.actor_object::<Person>()?.object_props.id_string()?),
|
||||||
_ => Err(InboxError::InvalidType)?
|
_ => Err(InboxError::InvalidType)?
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -123,7 +124,7 @@ pub trait Inbox {
|
||||||
"Like" => self.like(conn, serde_json::from_value(act.clone())?),
|
"Like" => self.like(conn, serde_json::from_value(act.clone())?),
|
||||||
"Undo" => {
|
"Undo" => {
|
||||||
let act: Undo = serde_json::from_value(act.clone())?;
|
let act: Undo = serde_json::from_value(act.clone())?;
|
||||||
match act.object["type"].as_str().unwrap() {
|
match act.undo_props.object["type"].as_str().unwrap() {
|
||||||
"Like" => self.unlike(conn, act),
|
"Like" => self.unlike(conn, act),
|
||||||
_ => Err(InboxError::CantUndo)?
|
_ => Err(InboxError::CantUndo)?
|
||||||
}
|
}
|
||||||
|
@ -150,8 +151,8 @@ pub trait Inbox {
|
||||||
});
|
});
|
||||||
|
|
||||||
let mut accept = Accept::default();
|
let mut accept = Accept::default();
|
||||||
accept.set_actor_link::<Id>(from.clone().into_id()).unwrap();
|
accept.accept_props.set_actor_link::<Id>(from.clone().into_id()).unwrap();
|
||||||
accept.set_object_object(follow).unwrap();
|
accept.accept_props.set_object_object(follow).unwrap();
|
||||||
broadcast(conn, &*from, accept, vec![target.clone()]);
|
broadcast(conn, &*from, accept, vec![target.clone()]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
use activitystreams_traits::{Activity, Actor, Object, Link};
|
use activitypub::{Activity, Actor, Object, Link};
|
||||||
use array_tool::vec::Uniq;
|
use array_tool::vec::Uniq;
|
||||||
use diesel::PgConnection;
|
use diesel::PgConnection;
|
||||||
use reqwest::Client;
|
use reqwest::Client;
|
||||||
|
|
|
@ -1,10 +1,7 @@
|
||||||
#![feature(plugin, custom_derive, iterator_find_map)]
|
#![feature(plugin, custom_derive, iterator_find_map)]
|
||||||
#![plugin(rocket_codegen)]
|
#![plugin(rocket_codegen)]
|
||||||
|
|
||||||
extern crate activitystreams;
|
extern crate activitypub;
|
||||||
#[macro_use]
|
|
||||||
extern crate activitystreams_derive;
|
|
||||||
extern crate activitystreams_traits;
|
|
||||||
extern crate activitystreams_types;
|
extern crate activitystreams_types;
|
||||||
extern crate array_tool;
|
extern crate array_tool;
|
||||||
extern crate base64;
|
extern crate base64;
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
use activitystreams_traits::{Actor, Object};
|
use activitypub::{Actor, Object, collection::OrderedCollection};
|
||||||
use activitystreams_types::collection::OrderedCollection;
|
|
||||||
use reqwest::{
|
use reqwest::{
|
||||||
Client,
|
Client,
|
||||||
header::{Accept, qitem},
|
header::{Accept, qitem},
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
use activitystreams_types::{
|
use activitypub::{
|
||||||
activity::Create,
|
activity::Create,
|
||||||
object::{Note, properties::ObjectProperties}
|
object::{Note, properties::ObjectProperties}
|
||||||
};
|
};
|
||||||
|
@ -105,8 +105,8 @@ impl Comment {
|
||||||
|
|
||||||
pub fn create_activity(&self, conn: &PgConnection) -> Create {
|
pub fn create_activity(&self, conn: &PgConnection) -> Create {
|
||||||
let mut act = Create::default();
|
let mut act = Create::default();
|
||||||
act.set_actor_link(self.get_author(conn).into_id()).unwrap();
|
act.create_props.set_actor_link(self.get_author(conn).into_id()).unwrap();
|
||||||
act.set_object_object(self.into_activity(conn)).unwrap();
|
act.create_props.set_object_object(self.into_activity(conn)).unwrap();
|
||||||
act.object_props.set_id_string(format!("{}/activity", self.ap_url.clone().unwrap())).unwrap();
|
act.object_props.set_id_string(format!("{}/activity", self.ap_url.clone().unwrap())).unwrap();
|
||||||
act
|
act
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
use activitystreams_types::activity;
|
use activitypub::activity;
|
||||||
use chrono;
|
use chrono;
|
||||||
use diesel::{self, PgConnection, QueryDsl, RunQueryDsl, ExpressionMethods};
|
use diesel::{self, PgConnection, QueryDsl, RunQueryDsl, ExpressionMethods};
|
||||||
use serde_json;
|
use serde_json;
|
||||||
|
@ -76,15 +76,15 @@ impl Like {
|
||||||
diesel::delete(self).execute(conn).unwrap();
|
diesel::delete(self).execute(conn).unwrap();
|
||||||
|
|
||||||
let mut act = activity::Undo::default();
|
let mut act = activity::Undo::default();
|
||||||
act.set_actor_link(User::get(conn, self.user_id).unwrap().into_id()).unwrap();
|
act.undo_props.set_actor_link(User::get(conn, self.user_id).unwrap().into_id()).unwrap();
|
||||||
act.set_object_object(self.into_activity(conn)).unwrap();
|
act.undo_props.set_object_object(self.into_activity(conn)).unwrap();
|
||||||
act
|
act
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn into_activity(&self, conn: &PgConnection) -> activity::Like {
|
pub fn into_activity(&self, conn: &PgConnection) -> activity::Like {
|
||||||
let mut act = activity::Like::default();
|
let mut act = activity::Like::default();
|
||||||
act.set_actor_link(User::get(conn, self.user_id).unwrap().into_id()).unwrap();
|
act.like_props.set_actor_link(User::get(conn, self.user_id).unwrap().into_id()).unwrap();
|
||||||
act.set_object_link(Post::get(conn, self.post_id).unwrap().into_id()).unwrap();
|
act.like_props.set_object_link(Post::get(conn, self.post_id).unwrap().into_id()).unwrap();
|
||||||
act.object_props.set_id_string(format!("{}/like/{}",
|
act.object_props.set_id_string(format!("{}/like/{}",
|
||||||
User::get(conn, self.user_id).unwrap().ap_url,
|
User::get(conn, self.user_id).unwrap().ap_url,
|
||||||
Post::get(conn, self.post_id).unwrap().ap_url
|
Post::get(conn, self.post_id).unwrap().ap_url
|
||||||
|
|
|
@ -1,7 +1,5 @@
|
||||||
use activitystreams_types::{
|
use activitypub::activity::Create;
|
||||||
activity::Create,
|
use activitystreams_types::object::{Article, properties::ObjectProperties};
|
||||||
object::{Article, properties::ObjectProperties}
|
|
||||||
};
|
|
||||||
use chrono::NaiveDateTime;
|
use chrono::NaiveDateTime;
|
||||||
use diesel::{self, PgConnection, RunQueryDsl, QueryDsl, ExpressionMethods, BelongingToDsl};
|
use diesel::{self, PgConnection, RunQueryDsl, QueryDsl, ExpressionMethods, BelongingToDsl};
|
||||||
use diesel::dsl::any;
|
use diesel::dsl::any;
|
||||||
|
@ -177,8 +175,8 @@ impl Post {
|
||||||
pub fn create_activity(&self, conn: &PgConnection) -> Create {
|
pub fn create_activity(&self, conn: &PgConnection) -> Create {
|
||||||
let mut act = Create::default();
|
let mut act = Create::default();
|
||||||
act.object_props.set_id_string(format!("{}/activity", self.ap_url)).unwrap();
|
act.object_props.set_id_string(format!("{}/activity", self.ap_url)).unwrap();
|
||||||
act.set_actor_link(Id::new(self.get_authors(conn)[0].clone().ap_url)).unwrap();
|
act.create_props.set_actor_link(Id::new(self.get_authors(conn)[0].clone().ap_url)).unwrap();
|
||||||
act.set_object_object(self.into_activity(conn)).unwrap();
|
act.create_props.set_object_object(self.into_activity(conn)).unwrap();
|
||||||
act
|
act
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
use activitystreams_types::activity;
|
use activitypub::activity;
|
||||||
use chrono::NaiveDateTime;
|
use chrono::NaiveDateTime;
|
||||||
use diesel::{self, PgConnection, QueryDsl, RunQueryDsl, ExpressionMethods};
|
use diesel::{self, PgConnection, QueryDsl, RunQueryDsl, ExpressionMethods};
|
||||||
|
|
||||||
|
@ -84,15 +84,15 @@ impl Reshare {
|
||||||
diesel::delete(self).execute(conn).unwrap();
|
diesel::delete(self).execute(conn).unwrap();
|
||||||
|
|
||||||
let mut act = activity::Undo::default();
|
let mut act = activity::Undo::default();
|
||||||
act.set_actor_link(User::get(conn, self.user_id).unwrap().into_id()).unwrap();
|
act.undo_props.set_actor_link(User::get(conn, self.user_id).unwrap().into_id()).unwrap();
|
||||||
act.set_object_object(self.into_activity(conn)).unwrap();
|
act.undo_props.set_object_object(self.into_activity(conn)).unwrap();
|
||||||
act
|
act
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn into_activity(&self, conn: &PgConnection) -> activity::Announce {
|
pub fn into_activity(&self, conn: &PgConnection) -> activity::Announce {
|
||||||
let mut act = activity::Announce::default();
|
let mut act = activity::Announce::default();
|
||||||
act.set_actor_link(User::get(conn, self.user_id).unwrap().into_id()).unwrap();
|
act.announce_props.set_actor_link(User::get(conn, self.user_id).unwrap().into_id()).unwrap();
|
||||||
act.set_object_link(Post::get(conn, self.post_id).unwrap().into_id()).unwrap();
|
act.announce_props.set_object_link(Post::get(conn, self.post_id).unwrap().into_id()).unwrap();
|
||||||
act.object_props.set_id_string(self.ap_url.clone()).unwrap();
|
act.object_props.set_id_string(self.ap_url.clone()).unwrap();
|
||||||
|
|
||||||
act
|
act
|
||||||
|
|
|
@ -1,9 +1,8 @@
|
||||||
use activitystreams_traits::{Actor, Object, Link};
|
use activitypub::{
|
||||||
use activitystreams_types::{
|
Actor, Object,
|
||||||
actor::Person,
|
actor::{Person, properties::ApActorProperties},
|
||||||
collection::OrderedCollection,
|
collection::OrderedCollection,
|
||||||
object::properties::ObjectProperties,
|
object::properties::ObjectProperties
|
||||||
CustomObject
|
|
||||||
};
|
};
|
||||||
use bcrypt;
|
use bcrypt;
|
||||||
use chrono::NaiveDateTime;
|
use chrono::NaiveDateTime;
|
||||||
|
@ -302,7 +301,7 @@ impl User {
|
||||||
PKey::from_rsa(Rsa::private_key_from_pem(self.private_key.clone().unwrap().as_ref()).unwrap()).unwrap()
|
PKey::from_rsa(Rsa::private_key_from_pem(self.private_key.clone().unwrap().as_ref()).unwrap()).unwrap()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn into_activity(&self, conn: &PgConnection) -> CustomObject<ApProps, Person> {
|
pub fn into_activity(&self, conn: &PgConnection) -> Person {
|
||||||
let mut actor = Person::default();
|
let mut actor = Person::default();
|
||||||
actor.object_props = ObjectProperties {
|
actor.object_props = ObjectProperties {
|
||||||
id: Some(serde_json::to_value(self.compute_id(conn)).unwrap()),
|
id: Some(serde_json::to_value(self.compute_id(conn)).unwrap()),
|
||||||
|
@ -311,34 +310,22 @@ impl User {
|
||||||
url: Some(serde_json::to_value(self.compute_id(conn)).unwrap()),
|
url: Some(serde_json::to_value(self.compute_id(conn)).unwrap()),
|
||||||
..ObjectProperties::default()
|
..ObjectProperties::default()
|
||||||
};
|
};
|
||||||
|
actor.ap_actor_props = ApActorProperties {
|
||||||
CustomObject::new(actor, ApProps {
|
inbox: serde_json::to_value(self.compute_inbox(conn)).unwrap(),
|
||||||
inbox: Some(serde_json::to_value(self.compute_inbox(conn)).unwrap()),
|
outbox: serde_json::to_value(self.compute_outbox(conn)).unwrap(),
|
||||||
outbox: Some(serde_json::to_value(self.compute_outbox(conn)).unwrap()),
|
|
||||||
preferred_username: Some(serde_json::to_value(self.get_actor_id()).unwrap()),
|
preferred_username: Some(serde_json::to_value(self.get_actor_id()).unwrap()),
|
||||||
endpoints: Some(json!({
|
endpoints: Some(json!({
|
||||||
"sharedInbox": ap_url(format!("{}/inbox", BASE_URL.as_str()))
|
"sharedInbox": ap_url(format!("{}/inbox", BASE_URL.as_str()))
|
||||||
}))
|
})),
|
||||||
})
|
followers: None,
|
||||||
|
following: None,
|
||||||
|
liked: None,
|
||||||
|
streams: None
|
||||||
|
};
|
||||||
|
actor
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Serialize, Deserialize, Default, Properties)]
|
|
||||||
#[serde(rename_all = "camelCase")]
|
|
||||||
pub struct ApProps {
|
|
||||||
#[activitystreams(ab(Object, Link))]
|
|
||||||
inbox: Option<serde_json::Value>,
|
|
||||||
|
|
||||||
#[activitystreams(ab(Object, Link))]
|
|
||||||
outbox: Option<serde_json::Value>,
|
|
||||||
|
|
||||||
#[activitystreams(ab(Object, Link))]
|
|
||||||
preferred_username: Option<serde_json::Value>,
|
|
||||||
|
|
||||||
#[activitystreams(ab(Object))]
|
|
||||||
endpoints: Option<serde_json::Value>
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'a, 'r> FromRequest<'a, 'r> for User {
|
impl<'a, 'r> FromRequest<'a, 'r> for User {
|
||||||
type Error = ();
|
type Error = ();
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
use activitystreams_types::collection::OrderedCollection;
|
use activitypub::collection::OrderedCollection;
|
||||||
use rocket::{
|
use rocket::{
|
||||||
request::Form,
|
request::Form,
|
||||||
response::{Redirect, Flash}
|
response::{Redirect, Flash}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
use activitystreams_types::{
|
use activitypub::{
|
||||||
activity::Follow,
|
activity::Follow,
|
||||||
collection::OrderedCollection
|
collection::OrderedCollection
|
||||||
};
|
};
|
||||||
|
@ -82,8 +82,8 @@ fn follow(name: String, conn: DbConn, user: User) -> Redirect {
|
||||||
following_id: target.id
|
following_id: target.id
|
||||||
});
|
});
|
||||||
let mut act = Follow::default();
|
let mut act = Follow::default();
|
||||||
act.set_actor_link::<Id>(user.clone().into_id()).unwrap();
|
act.follow_props.set_actor_link::<Id>(user.clone().into_id()).unwrap();
|
||||||
act.set_object_object(user.into_activity(&*conn)).unwrap();
|
act.follow_props.set_object_object(user.into_activity(&*conn)).unwrap();
|
||||||
act.object_props.set_id_string(format!("{}/follow/{}", user.ap_url, target.ap_url)).unwrap();
|
act.object_props.set_id_string(format!("{}/follow/{}", user.ap_url, target.ap_url)).unwrap();
|
||||||
broadcast(&*conn, &user, act, vec![target]);
|
broadcast(&*conn, &user, act, vec![target]);
|
||||||
Redirect::to(format!("/@/{}/", name).as_ref())
|
Redirect::to(format!("/@/{}/", name).as_ref())
|
||||||
|
|
Loading…
Reference in New Issue