2 activity_lists::PersonInboxActivitiesWithAnnouncable,
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,
8 use activitypub_federation::{
9 actix_web::inbox::receive_activity,
11 protocol::context::WithContext,
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;
20 #[derive(Deserialize)]
21 pub struct PersonQuery {
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(context.pool(), &user_name, true)
38 let apub = person.into_json(&context).await?;
40 create_apub_response(&apub)
42 create_apub_tombstone_response(person.actor_id.clone())
46 #[tracing::instrument(skip_all)]
47 pub async fn person_inbox(
50 data: Data<LemmyContext>,
51 ) -> Result<HttpResponse, LemmyError> {
52 receive_activity::<WithContext<PersonInboxActivitiesWithAnnouncable>, UserOrCommunity, LemmyContext>(
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(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)