]> 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 2c96aafd8fca32a71648178dc69f4110ed28c7bb..2543136348dd185e858be07cbf53932676f3ab48 100644 (file)
@@ -1,27 +1,21 @@
 use crate::{
-  extensions::context::lemmy_context,
-  http::{
-    create_apub_response,
-    create_apub_tombstone_response,
-    inbox_enums::PersonInboxActivities,
-    payload_to_string,
-    receive_activity,
-  },
-  objects::ToApub,
-  ActorType,
+  activity_lists::PersonInboxActivities,
+  fetcher::user_or_community::UserOrCommunity,
+  http::{create_apub_response, create_apub_tombstone_response},
+  objects::person::ApubPerson,
+  protocol::collections::empty_outbox::EmptyOutbox,
 };
-use activitystreams::{
-  base::BaseExt,
-  collection::{CollectionExt, OrderedCollection},
+use activitypub_federation::{
+  actix_web::inbox::receive_activity,
+  config::Data,
+  protocol::context::WithContext,
+  traits::Object,
 };
-use actix_web::{body::Body, web, web::Payload, HttpRequest, HttpResponse};
-use lemmy_api_common::blocking;
-use lemmy_db_queries::source::person::Person_;
-use lemmy_db_schema::source::person::Person;
-use lemmy_utils::LemmyError;
-use lemmy_websocket::LemmyContext;
+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;
-use url::Url;
 
 #[derive(Deserialize)]
 pub struct PersonQuery {
@@ -29,66 +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 = blocking(context.pool(), move |conn| {
-    Person::find_by_name(conn, &user_name)
-  })
-  .await??;
+  let person: ApubPerson = Person::read_from_name(&mut context.pool(), &user_name, true)
+    .await?
+    .into();
 
   if !person.deleted {
-    let apub = person.to_apub(context.pool()).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?;
-  receive_activity::<PersonInboxActivities>(request, &unparsed, 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??;
-  // TODO: populate the person outbox
-  let mut collection = OrderedCollection::new();
-  collection
-    .set_many_items(Vec::<Url>::new())
-    .set_many_contexts(lemmy_context()?)
-    .set_id(person.get_outbox_url()?)
-    .set_total_items(0_u64);
-  Ok(create_apub_response(&collection))
-}
-
-pub(crate) async fn get_apub_person_inbox(
-  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 mut collection = OrderedCollection::new();
-  collection
-    .set_id(person.inbox_url.into())
-    .set_many_contexts(lemmy_context()?);
-  Ok(create_apub_response(&collection))
+  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)
 }