Plume/src/inbox.rs

81 lines
3.4 KiB
Rust
Raw Normal View History

2018-09-06 21:39:22 +00:00
use activitypub::{activity::{Announce, Create, Delete, Like, Undo, Update}, object::Tombstone};
2018-05-16 18:20:44 +00:00
use failure::Error;
2018-05-01 14:00:29 +00:00
use serde_json;
use plume_common::activity_pub::{Id, inbox::{Deletable, FromActivity, InboxError}};
use plume_models::{
2018-09-27 21:06:40 +00:00
Connection,
comments::Comment,
follows::Follow,
instance::Instance,
2018-05-19 07:39:59 +00:00
likes,
reshares::Reshare,
posts::Post,
users::User
2018-05-19 07:39:59 +00:00
};
2018-05-01 14:00:29 +00:00
pub trait Inbox {
2018-09-27 21:06:40 +00:00
fn received(&self, conn: &Connection, act: serde_json::Value) -> Result<(), Error> {
2018-07-18 14:03:52 +00:00
let actor_id = Id::new(act["actor"].as_str().unwrap_or_else(|| act["actor"]["id"].as_str().expect("No actor ID for incoming activity")));
2018-05-16 18:20:44 +00:00
match act["type"].as_str() {
Some(t) => {
match t {
"Announce" => {
Reshare::from_activity(conn, serde_json::from_value(act.clone())?, actor_id);
Ok(())
},
2018-05-16 18:20:44 +00:00
"Create" => {
let act: Create = serde_json::from_value(act.clone())?;
if Post::try_from_activity(conn, act.clone()) || Comment::try_from_activity(conn, act) {
Ok(())
} else {
Err(InboxError::InvalidType)?
2018-05-16 18:20:44 +00:00
}
},
"Delete" => {
let act: Delete = serde_json::from_value(act.clone())?;
Post::delete_id(act.delete_props.object_object::<Tombstone>()?.object_props.id_string()?, conn);
Ok(())
},
"Follow" => {
Follow::from_activity(conn, serde_json::from_value(act.clone())?, actor_id);
Ok(())
},
"Like" => {
likes::Like::from_activity(conn, serde_json::from_value(act.clone())?, actor_id);
Ok(())
},
2018-05-16 18:20:44 +00:00
"Undo" => {
let act: Undo = serde_json::from_value(act.clone())?;
2018-06-10 11:13:07 +00:00
match act.undo_props.object["type"].as_str().unwrap() {
"Like" => {
likes::Like::delete_id(act.undo_props.object_object::<Like>()?.object_props.id_string()?, conn);
Ok(())
},
"Announce" => {
Reshare::delete_id(act.undo_props.object_object::<Announce>()?.object_props.id_string()?, conn);
Ok(())
2018-09-04 10:39:24 +00:00
},
"Follow" => {
Follow::delete_id(act.undo_props.object_object::<Like>()?.object_props.id_string()?, conn);
Ok(())
}
2018-05-16 18:20:44 +00:00
_ => Err(InboxError::CantUndo)?
}
2018-05-13 10:44:05 +00:00
}
2018-09-06 21:39:22 +00:00
"Update" => {
let act: Update = serde_json::from_value(act.clone())?;
Post::handle_update(conn, act.update_props.object_object()?);
Ok(())
}
2018-05-16 18:20:44 +00:00
_ => Err(InboxError::InvalidType)?
2018-05-13 10:44:05 +00:00
}
},
2018-05-16 18:20:44 +00:00
None => Err(InboxError::NoType)?
2018-05-01 14:00:29 +00:00
}
}
}
2018-05-18 08:04:40 +00:00
impl Inbox for Instance {}
impl Inbox for User {}