From 7fe4558beebdf839c10cd543120023a836cc74c6 Mon Sep 17 00:00:00 2001 From: Felix Ableitner Date: Wed, 18 Nov 2020 17:04:35 +0100 Subject: [PATCH] Create empty outbox for user (ref #1220) --- lemmy_apub/src/http/user.rs | 24 +++++++++++++++++++++++- lemmy_apub/src/objects/user.rs | 12 +++++++----- src/routes/federation.rs | 3 ++- 3 files changed, 32 insertions(+), 7 deletions(-) diff --git a/lemmy_apub/src/http/user.rs b/lemmy_apub/src/http/user.rs index 85a5f22cc..f983ab6f9 100644 --- a/lemmy_apub/src/http/user.rs +++ b/lemmy_apub/src/http/user.rs @@ -1,10 +1,15 @@ -use crate::{http::create_apub_response, ToApub}; +use crate::{http::create_apub_response, ActorType, ToApub}; +use activitystreams::{ + base::BaseExt, + collection::{CollectionExt, OrderedCollection}, +}; use actix_web::{body::Body, web, HttpResponse}; use lemmy_db::user::User_; use lemmy_structs::blocking; use lemmy_utils::LemmyError; use lemmy_websocket::LemmyContext; use serde::Deserialize; +use url::Url; #[derive(Deserialize)] pub struct UserQuery { @@ -24,3 +29,20 @@ pub async fn get_apub_user_http( let u = user.to_apub(context.pool()).await?; Ok(create_apub_response(&u)) } + +pub async fn get_apub_user_outbox( + info: web::Path, + context: web::Data, +) -> Result, LemmyError> { + let user = blocking(context.pool(), move |conn| { + User_::read_from_name(&conn, &info.user_name) + }) + .await??; + let mut collection = OrderedCollection::new(); + collection + .set_many_items(Vec::::new()) + .set_context(activitystreams::context()) + .set_id(user.get_outbox_url()?) + .set_total_items(0_u64); + Ok(create_apub_response(&collection)) +} diff --git a/lemmy_apub/src/objects/user.rs b/lemmy_apub/src/objects/user.rs index 3c41b5584..49b7c9e5c 100644 --- a/lemmy_apub/src/objects/user.rs +++ b/lemmy_apub/src/objects/user.rs @@ -55,11 +55,13 @@ impl ToApub for User_ { } let mut ap_actor = ApActor::new(self.get_inbox_url()?, person); - ap_actor.set_preferred_username(self.name.to_owned()); - ap_actor.set_endpoints(Endpoints { - shared_inbox: Some(self.get_shared_inbox_url()?), - ..Default::default() - }); + ap_actor + .set_preferred_username(self.name.to_owned()) + .set_outbox(self.get_outbox_url()?) + .set_endpoints(Endpoints { + shared_inbox: Some(self.get_shared_inbox_url()?), + ..Default::default() + }); Ok(Ext1::new(ap_actor, self.get_public_key_ext()?)) } diff --git a/src/routes/federation.rs b/src/routes/federation.rs index 96b380e61..4d03de770 100644 --- a/src/routes/federation.rs +++ b/src/routes/federation.rs @@ -6,7 +6,7 @@ use lemmy_apub::{ community::{get_apub_community_followers, get_apub_community_http, get_apub_community_outbox}, get_activity, post::get_apub_post, - user::get_apub_user_http, + user::{get_apub_user_http, get_apub_user_outbox}, }, inbox::{community_inbox::community_inbox, shared_inbox::shared_inbox, user_inbox::user_inbox}, APUB_JSON_CONTENT_TYPE, @@ -42,6 +42,7 @@ pub fn config(cfg: &mut web::ServiceConfig) { web::get().to(get_apub_community_outbox), ) .route("/u/{user_name}", web::get().to(get_apub_user_http)) + .route("/u/{user_name}/outbox", web::get().to(get_apub_user_outbox)) .route("/post/{post_id}", web::get().to(get_apub_post)) .route("/comment/{comment_id}", web::get().to(get_apub_comment)) .route("/activities/{type_}/{id}", web::get().to(get_activity)),