]> Untitled Git - lemmy.git/blob - crates/apub/src/http/person.rs
Federation tests replication round1 - demonstrate absent replication of comment delet...
[lemmy.git] / crates / apub / src / http / person.rs
1 use crate::{
2   activity_lists::PersonInboxActivities,
3   fetcher::user_or_community::UserOrCommunity,
4   http::{create_apub_response, create_apub_tombstone_response},
5   objects::person::ApubPerson,
6   protocol::collections::empty_outbox::EmptyOutbox,
7 };
8 use activitypub_federation::{
9   actix_web::inbox::receive_activity,
10   config::Data,
11   protocol::context::WithContext,
12   traits::Object,
13 };
14 use actix_web::{web, web::Bytes, HttpRequest, HttpResponse};
15 use lemmy_api_common::{context::LemmyContext, utils::generate_outbox_url};
16 use lemmy_db_schema::{source::person::Person, traits::ApubActor};
17 use lemmy_utils::error::LemmyError;
18 use serde::Deserialize;
19
20 #[derive(Deserialize)]
21 pub struct PersonQuery {
22   user_name: String,
23 }
24
25 /// Return the ActivityPub json representation of a local person over HTTP.
26 #[tracing::instrument(skip_all)]
27 pub(crate) async fn get_apub_person_http(
28   info: web::Path<PersonQuery>,
29   context: Data<LemmyContext>,
30 ) -> Result<HttpResponse, LemmyError> {
31   let user_name = info.into_inner().user_name;
32   // TODO: this needs to be able to read deleted persons, so that it can send tombstones
33   let person: ApubPerson = Person::read_from_name(&mut context.pool(), &user_name, true)
34     .await?
35     .into();
36
37   if !person.deleted {
38     let apub = person.into_json(&context).await?;
39
40     create_apub_response(&apub)
41   } else {
42     create_apub_tombstone_response(person.actor_id.clone())
43   }
44 }
45
46 #[tracing::instrument(skip_all)]
47 pub async fn person_inbox(
48   request: HttpRequest,
49   body: Bytes,
50   data: Data<LemmyContext>,
51 ) -> Result<HttpResponse, LemmyError> {
52   receive_activity::<WithContext<PersonInboxActivities>, UserOrCommunity, LemmyContext>(
53     request, body, &data,
54   )
55   .await
56 }
57
58 #[tracing::instrument(skip_all)]
59 pub(crate) async fn get_apub_person_outbox(
60   info: web::Path<PersonQuery>,
61   context: Data<LemmyContext>,
62 ) -> Result<HttpResponse, LemmyError> {
63   let person = Person::read_from_name(&mut context.pool(), &info.user_name, false).await?;
64   let outbox_id = generate_outbox_url(&person.actor_id)?.into();
65   let outbox = EmptyOutbox::new(outbox_id)?;
66   create_apub_response(&outbox)
67 }