X-Git-Url: http://these/git/?a=blobdiff_plain;f=crates%2Fapub%2Fsrc%2Fhttp%2Fperson.rs;h=2543136348dd185e858be07cbf53932676f3ab48;hb=21a87ebaf2e5c038594eb70ef58bd51826259529;hp=a7e94020e25cd80c5c8dbf380b8a7dc172bf8607;hpb=61189efe7206add1cdf3bcf8649736b0bbb5a757;p=lemmy.git diff --git a/crates/apub/src/http/person.rs b/crates/apub/src/http/person.rs index a7e94020..25431363 100644 --- a/crates/apub/src/http/person.rs +++ b/crates/apub/src/http/person.rs @@ -1,36 +1,21 @@ use crate::{ - activities::{ - community::announce::{AnnouncableActivities, AnnounceActivity}, - following::accept::AcceptFollowCommunity, - private_message::{ - create_or_update::CreateOrUpdatePrivateMessage, - delete::DeletePrivateMessage, - undo_delete::UndoDeletePrivateMessage, - }, - }, - context::lemmy_context, - generate_outbox_url, - http::{ - create_apub_response, - create_apub_tombstone_response, - payload_to_string, - receive_activity, - }, + 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_apub_lib::traits::{ActivityFields, ActivityHandler, ApubObject}; -use lemmy_db_schema::source::person::Person; -use lemmy_utils::LemmyError; -use lemmy_websocket::LemmyContext; -use log::trace; -use serde::{Deserialize, Serialize}; -use url::Url; +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)] pub struct PersonQuery { @@ -38,74 +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()) } } -#[derive(Clone, Debug, Deserialize, Serialize, ActivityHandler, ActivityFields)] -#[serde(untagged)] -#[activity_handler(LemmyContext)] -pub enum PersonInboxActivities { - AcceptFollowCommunity(AcceptFollowCommunity), - /// Some activities can also be sent from user to user, eg a comment with mentions - AnnouncableActivities(AnnouncableActivities), - CreateOrUpdatePrivateMessage(CreateOrUpdatePrivateMessage), - DeletePrivateMessage(DeletePrivateMessage), - UndoDeletePrivateMessage(UndoDeletePrivateMessage), - AnnounceActivity(Box), -} - +#[tracing::instrument(skip_all)] pub async fn person_inbox( request: HttpRequest, - payload: Payload, - _path: web::Path, - context: web::Data, -) -> Result { - let unparsed = payload_to_string(payload).await?; - trace!("Received person inbox activity {}", unparsed); - let activity = serde_json::from_str::(&unparsed)?; - receive_person_inbox(activity, request, &context).await -} - -pub(in crate::http) async fn receive_person_inbox( - activity: PersonInboxActivities, - request: HttpRequest, - context: &LemmyContext, + body: Bytes, + data: Data, ) -> 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??; - // TODO: populate the person outbox - let mut collection = OrderedCollection::new(); - collection - .set_many_items(Vec::::new()) - .set_many_contexts(lemmy_context()) - .set_id(generate_outbox_url(&person.actor_id)?.into()) - .set_total_items(0_u64); - Ok(create_apub_response(&collection)) + 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) }