diff options
Diffstat (limited to 'server/src/apub/user_inbox.rs')
-rw-r--r-- | server/src/apub/user_inbox.rs | 261 |
1 files changed, 257 insertions, 4 deletions
diff --git a/server/src/apub/user_inbox.rs b/server/src/apub/user_inbox.rs index 4dd40161..9c25d805 100644 --- a/server/src/apub/user_inbox.rs +++ b/server/src/apub/user_inbox.rs @@ -3,7 +3,11 @@ use super::*; #[serde(untagged)] #[derive(Deserialize, Debug)] pub enum UserAcceptedObjects { - Accept(Accept), + Accept(Box<Accept>), + Create(Box<Create>), + Update(Box<Update>), + Delete(Box<Delete>), + Undo(Box<Undo>), } /// Handler for all incoming activities to user inboxes. @@ -12,7 +16,7 @@ pub async fn user_inbox( input: web::Json<UserAcceptedObjects>, path: web::Path<String>, db: DbPoolParam, - _chat_server: ChatServerParam, + chat_server: ChatServerParam, ) -> Result<HttpResponse, Error> { // TODO: would be nice if we could do the signature check here, but we cant access the actor property let input = input.into_inner(); @@ -21,12 +25,24 @@ pub async fn user_inbox( debug!("User {} received activity: {:?}", &username, &input); match input { - UserAcceptedObjects::Accept(a) => handle_accept(&a, &request, &username, &conn), + UserAcceptedObjects::Accept(a) => receive_accept(&a, &request, &username, &conn), + UserAcceptedObjects::Create(c) => { + receive_create_private_message(&c, &request, &conn, chat_server) + } + UserAcceptedObjects::Update(u) => { + receive_update_private_message(&u, &request, &conn, chat_server) + } + UserAcceptedObjects::Delete(d) => { + receive_delete_private_message(&d, &request, &conn, chat_server) + } + UserAcceptedObjects::Undo(u) => { + receive_undo_delete_private_message(&u, &request, &conn, chat_server) + } } } /// Handle accepted follows. -fn handle_accept( +fn receive_accept( accept: &Accept, request: &HttpRequest, username: &str, @@ -65,3 +81,240 @@ fn handle_accept( // TODO: at this point, indicate to the user that they are following the community Ok(HttpResponse::Ok().finish()) } + +fn receive_create_private_message( + create: &Create, + request: &HttpRequest, + conn: &PgConnection, + chat_server: ChatServerParam, +) -> Result<HttpResponse, Error> { + let note = create + .create_props + .get_object_base_box() + .to_owned() + .unwrap() + .to_owned() + .into_concrete::<Note>()?; + + let user_uri = create + .create_props + .get_actor_xsd_any_uri() + .unwrap() + .to_string(); + + let user = get_or_fetch_and_upsert_remote_user(&user_uri, &conn)?; + verify(request, &user.public_key.unwrap())?; + + // Insert the received activity into the activity table + let activity_form = activity::ActivityForm { + user_id: user.id, + data: serde_json::to_value(&create)?, + local: false, + updated: None, + }; + activity::Activity::create(&conn, &activity_form)?; + + let private_message = PrivateMessageForm::from_apub(¬e, &conn)?; + let inserted_private_message = PrivateMessage::create(&conn, &private_message)?; + + let message = PrivateMessageView::read(&conn, inserted_private_message.id)?; + + let res = PrivateMessageResponse { + message: message.to_owned(), + }; + + chat_server.do_send(SendUserRoomMessage { + op: UserOperation::CreatePrivateMessage, + response: res, + recipient_id: message.recipient_id, + my_id: None, + }); + + Ok(HttpResponse::Ok().finish()) +} + +fn receive_update_private_message( + update: &Update, + request: &HttpRequest, + conn: &PgConnection, + chat_server: ChatServerParam, +) -> Result<HttpResponse, Error> { + let note = update + .update_props + .get_object_base_box() + .to_owned() + .unwrap() + .to_owned() + .into_concrete::<Note>()?; + + let user_uri = update + .update_props + .get_actor_xsd_any_uri() + .unwrap() + .to_string(); + + let user = get_or_fetch_and_upsert_remote_user(&user_uri, &conn)?; + verify(request, &user.public_key.unwrap())?; + + // Insert the received activity into the activity table + let activity_form = activity::ActivityForm { + user_id: user.id, + data: serde_json::to_value(&update)?, + local: false, + updated: None, + }; + activity::Activity::create(&conn, &activity_form)?; + + let private_message = PrivateMessageForm::from_apub(¬e, &conn)?; + let private_message_id = PrivateMessage::read_from_apub_id(&conn, &private_message.ap_id)?.id; + PrivateMessage::update(conn, private_message_id, &private_message)?; + + let message = PrivateMessageView::read(&conn, private_message_id)?; + + let res = PrivateMessageResponse { + message: message.to_owned(), + }; + + chat_server.do_send(SendUserRoomMessage { + op: UserOperation::EditPrivateMessage, + response: res, + recipient_id: message.recipient_id, + my_id: None, + }); + + Ok(HttpResponse::Ok().finish()) +} + +fn receive_delete_private_message( + delete: &Delete, + request: &HttpRequest, + conn: &PgConnection, + chat_server: ChatServerParam, +) -> Result<HttpResponse, Error> { + let note = delete + .delete_props + .get_object_base_box() + .to_owned() + .unwrap() + .to_owned() + .into_concrete::<Note>()?; + + let user_uri = delete + .delete_props + .get_actor_xsd_any_uri() + .unwrap() + .to_string(); + + let user = get_or_fetch_and_upsert_remote_user(&user_uri, &conn)?; + verify(request, &user.public_key.unwrap())?; + + // Insert the received activity into the activity table + let activity_form = activity::ActivityForm { + user_id: user.id, + data: serde_json::to_value(&delete)?, + local: false, + updated: None, + }; + activity::Activity::create(&conn, &activity_form)?; + + let private_message = PrivateMessageForm::from_apub(¬e, &conn)?; + let private_message_id = PrivateMessage::read_from_apub_id(&conn, &private_message.ap_id)?.id; + let private_message_form = PrivateMessageForm { + content: private_message.content, + recipient_id: private_message.recipient_id, + creator_id: private_message.creator_id, + deleted: Some(true), + read: None, + ap_id: private_message.ap_id, + local: private_message.local, + published: None, + updated: Some(naive_now()), + }; + PrivateMessage::update(conn, private_message_id, &private_message_form)?; + + let message = PrivateMessageView::read(&conn, private_message_id)?; + + let res = PrivateMessageResponse { + message: message.to_owned(), + }; + + chat_server.do_send(SendUserRoomMessage { + op: UserOperation::EditPrivateMessage, + response: res, + recipient_id: message.recipient_id, + my_id: None, + }); + + Ok(HttpResponse::Ok().finish()) +} + +fn receive_undo_delete_private_message( + undo: &Undo, + request: &HttpRequest, + conn: &PgConnection, + chat_server: ChatServerParam, +) -> Result<HttpResponse, Error> { + let delete = undo + .undo_props + .get_object_base_box() + .to_owned() + .unwrap() + .to_owned() + .into_concrete::<Delete>()?; + + let note = delete + .delete_props + .get_object_base_box() + .to_owned() + .unwrap() + .to_owned() + .into_concrete::<Note>()?; + + let user_uri = delete + .delete_props + .get_actor_xsd_any_uri() + .unwrap() + .to_string(); + + let user = get_or_fetch_and_upsert_remote_user(&user_uri, &conn)?; + verify(request, &user.public_key.unwrap())?; + + // Insert the received activity into the activity table + let activity_form = activity::ActivityForm { + user_id: user.id, + data: serde_json::to_value(&delete)?, + local: false, + updated: None, + }; + activity::Activity::create(&conn, &activity_form)?; + + let private_message = PrivateMessageForm::from_apub(¬e, &conn)?; + let private_message_id = PrivateMessage::read_from_apub_id(&conn, &private_message.ap_id)?.id; + let private_message_form = PrivateMessageForm { + content: private_message.content, + recipient_id: private_message.recipient_id, + creator_id: private_message.creator_id, + deleted: Some(false), + read: None, + ap_id: private_message.ap_id, + local: private_message.local, + published: None, + updated: Some(naive_now()), + }; + PrivateMessage::update(conn, private_message_id, &private_message_form)?; + + let message = PrivateMessageView::read(&conn, private_message_id)?; + + let res = PrivateMessageResponse { + message: message.to_owned(), + }; + + chat_server.do_send(SendUserRoomMessage { + op: UserOperation::EditPrivateMessage, + response: res, + recipient_id: message.recipient_id, + my_id: None, + }); + + Ok(HttpResponse::Ok().finish()) +} |