X-Git-Url: http://these/git/?a=blobdiff_plain;f=crates%2Fapub%2Fsrc%2Fhttp%2Fperson.rs;h=2543136348dd185e858be07cbf53932676f3ab48;hb=21a87ebaf2e5c038594eb70ef58bd51826259529;hp=3f18bcc5030d58ffca7bb5e941199a9ee5119854;hpb=03d8ac75efa9badfb476a54d026c5511e028b2b6;p=lemmy.git diff --git a/crates/apub/src/http/person.rs b/crates/apub/src/http/person.rs index 3f18bcc5..25431363 100644 --- a/crates/apub/src/http/person.rs +++ b/crates/apub/src/http/person.rs @@ -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::UserOutbox, + 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, - context: web::Data, -) -> Result, LemmyError> { + context: Data, +) -> Result { 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, - context: web::Data, + body: Bytes, + data: Data, ) -> Result { - let unparsed = payload_to_string(payload).await?; - info!("Received person inbox activity {}", unparsed); - let activity = serde_json::from_str::>(&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 { - receive_activity(request, activity, context).await + receive_activity::, UserOrCommunity, LemmyContext>( + request, body, &data, + ) + .await } +#[tracing::instrument(skip_all)] pub(crate) async fn get_apub_person_outbox( info: web::Path, - context: web::Data, -) -> Result, LemmyError> { - let person = blocking(context.pool(), move |conn| { - Person::find_by_name(conn, &info.user_name) - }) - .await??; - let outbox = UserOutbox::new(person).await?; - Ok(create_apub_response(&outbox)) + context: Data, +) -> Result { + 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) }