]> Untitled Git - lemmy.git/blobdiff - crates/apub/src/http/person.rs
Federation tests replication round1 - demonstrate absent replication of comment delet...
[lemmy.git] / crates / apub / src / http / person.rs
index a5ea4ad17124f47f07eadd4da919fdbe0c8d1afb..2543136348dd185e858be07cbf53932676f3ab48 100644 (file)
@@ -1,22 +1,20 @@
 use crate::{
   activity_lists::PersonInboxActivities,
-  context::WithContext,
-  http::{
-    create_apub_response,
-    create_apub_tombstone_response,
-    payload_to_string,
-    receive_activity,
-  },
+  fetcher::user_or_community::UserOrCommunity,
+  http::{create_apub_response, create_apub_tombstone_response},
   objects::person::ApubPerson,
-  protocol::collections::person_outbox::PersonOutbox,
+  protocol::collections::empty_outbox::EmptyOutbox,
 };
-use actix_web::{body::Body, web, web::Payload, HttpRequest, HttpResponse};
-use lemmy_api_common::blocking;
-use lemmy_apub_lib::traits::ApubObject;
-use lemmy_db_schema::source::person::Person;
-use lemmy_utils::LemmyError;
-use lemmy_websocket::LemmyContext;
-use log::info;
+use activitypub_federation::{
+  actix_web::inbox::receive_activity,
+  config::Data,
+  protocol::context::WithContext,
+  traits::Object,
+};
+use actix_web::{web, web::Bytes, HttpRequest, HttpResponse};
+use lemmy_api_common::{context::LemmyContext, utils::generate_outbox_url};
+use lemmy_db_schema::{source::person::Person, traits::ApubActor};
+use lemmy_utils::error::LemmyError;
 use serde::Deserialize;
 
 #[derive(Deserialize)]
@@ -25,55 +23,45 @@ pub struct PersonQuery {
 }
 
 /// Return the ActivityPub json representation of a local person over HTTP.
+#[tracing::instrument(skip_all)]
 pub(crate) async fn get_apub_person_http(
   info: web::Path<PersonQuery>,
-  context: web::Data<LemmyContext>,
-) -> Result<HttpResponse<Body>, LemmyError> {
+  context: Data<LemmyContext>,
+) -> Result<HttpResponse, LemmyError> {
   let user_name = info.into_inner().user_name;
   // TODO: this needs to be able to read deleted persons, so that it can send tombstones
-  let person: ApubPerson = blocking(context.pool(), move |conn| {
-    Person::find_by_name(conn, &user_name)
-  })
-  .await??
-  .into();
+  let person: ApubPerson = Person::read_from_name(&mut context.pool(), &user_name, true)
+    .await?
+    .into();
 
   if !person.deleted {
-    let apub = person.to_apub(&context).await?;
+    let apub = person.into_json(&context).await?;
 
-    Ok(create_apub_response(&apub))
+    create_apub_response(&apub)
   } else {
-    Ok(create_apub_tombstone_response(&person.to_tombstone()?))
+    create_apub_tombstone_response(person.actor_id.clone())
   }
 }
 
+#[tracing::instrument(skip_all)]
 pub async fn person_inbox(
   request: HttpRequest,
-  payload: Payload,
-  _path: web::Path<String>,
-  context: web::Data<LemmyContext>,
+  body: Bytes,
+  data: Data<LemmyContext>,
 ) -> Result<HttpResponse, LemmyError> {
-  let unparsed = payload_to_string(payload).await?;
-  info!("Received person inbox activity {}", unparsed);
-  let activity = serde_json::from_str::<WithContext<PersonInboxActivities>>(&unparsed)?;
-  receive_person_inbox(activity.inner(), request, &context).await
-}
-
-pub(in crate::http) async fn receive_person_inbox(
-  activity: PersonInboxActivities,
-  request: HttpRequest,
-  context: &LemmyContext,
-) -> Result<HttpResponse, LemmyError> {
-  receive_activity(request, activity, context).await
+  receive_activity::<WithContext<PersonInboxActivities>, UserOrCommunity, LemmyContext>(
+    request, body, &data,
+  )
+  .await
 }
 
+#[tracing::instrument(skip_all)]
 pub(crate) async fn get_apub_person_outbox(
   info: web::Path<PersonQuery>,
-  context: web::Data<LemmyContext>,
-) -> Result<HttpResponse<Body>, LemmyError> {
-  let person = blocking(context.pool(), move |conn| {
-    Person::find_by_name(conn, &info.user_name)
-  })
-  .await??;
-  let outbox = PersonOutbox::new(person).await?;
-  Ok(create_apub_response(&outbox))
+  context: Data<LemmyContext>,
+) -> Result<HttpResponse, LemmyError> {
+  let person = Person::read_from_name(&mut context.pool(), &info.user_name, false).await?;
+  let outbox_id = generate_outbox_url(&person.actor_id)?.into();
+  let outbox = EmptyOutbox::new(outbox_id)?;
+  create_apub_response(&outbox)
 }