diff --git a/src/activities/create_post.rs b/src/activities/create_post.rs index cf8e825..9306a61 100644 --- a/src/activities/create_post.rs +++ b/src/activities/create_post.rs @@ -1,12 +1,12 @@ use crate::{ database::StateHandle, - entities::{post, user}, + entities::{self, post, user}, error::Error, objects::{ person::DbUser, post::{DbPost, Note}, }, - utils::{base_url_encode, generate_create_id, generate_random_object_id}, + utils::{base_url_encode, generate_create_id, generate_random_object_id}, versia::{conversion::versia_post_from_db, objects::SortAlphabetically, superx::request_client}, DB, }; use activitypub_federation::{ activity_sending::SendActivityTask, @@ -16,6 +16,7 @@ use activitypub_federation::{ protocol::{context::WithContext, helpers::deserialize_one_or_many}, traits::{ActivityHandler, Object}, }; +use sea_orm::{ColumnTrait, EntityTrait, QueryFilter}; use serde::{Deserialize, Serialize}; use url::Url; @@ -81,7 +82,46 @@ impl ActivityHandler for CreatePost { } async fn receive(self, data: &Data) -> Result<(), Self::Error> { - post::Model::from_json(self.object, data).await?; + let note = post::Model::from_json(self.object, data).await?; + federate_inbox(note).await?; Ok(()) } } + +async fn federate_inbox(note: crate::entities::post::Model) -> anyhow::Result<()> { + let versia_post = versia_post_from_db(note.clone()).await?; + let json = serde_json::to_string_pretty(&SortAlphabetically(&versia_post))?; + + let mut array; + if versia_post.mentions.is_some() { + array = versia_post.mentions.clone().unwrap(); + } else { + array = Vec::new(); + } + + let db = DB.get().unwrap(); + + let list_model = entities::prelude::FollowRelation::find() + .filter(entities::follow_relation::Column::FolloweeId.eq(note.creator.to_string())) + .all(db) + .await?; + + let mut list_url = Vec::new(); + + for model in list_model { + let url = Url::parse(&model.follower_inbox.unwrap())?; + list_url.push(url); + } + + array.append(&mut list_url); + + let req_client = request_client(); + for inbox in array { + let push = req_client.post(inbox) + .json(&json) + .send(); + tokio::spawn(push); + } + + Ok(()) +} \ No newline at end of file diff --git a/src/versia/conversion.rs b/src/versia/conversion.rs index ca77b6a..ae9d25b 100644 --- a/src/versia/conversion.rs +++ b/src/versia/conversion.rs @@ -1,4 +1,4 @@ -use activitypub_federation::{fetch::object_id::ObjectId, http_signatures::generate_actor_keypair}; +use activitypub_federation::{fetch::object_id::ObjectId, http_signatures::generate_actor_keypair, traits::Object}; use activitystreams_kinds::public; use anyhow::{anyhow, Ok}; use async_recursion::async_recursion; @@ -51,10 +51,22 @@ pub async fn versia_post_from_db( //"unlisted" => super::objects::VisibilityType::Unlisted, _ => Some("public".to_string()), }; - //let mut mentions = Vec::new(); - //for obj in post.tag.clone() { - // mentions.push(obj.href.clone()); - //} + + let mut mentions = Vec::new(); + let ap_obj = serde_json::from_str::(post.ap_json.unwrap().as_str())?; + let req_data = data.to_request_data(); + for obj in ap_obj.tag.clone() { + let option = user::Model::read_from_id(obj.href, &req_data).await.unwrap(); + if let Some(model) = option { + let user = versia_user_from_db(model).await?; + let domain = user.inbox.domain(); + if domain.is_none() || domain.is_some_and(|domain| LYSAND_DOMAIN.as_str() != domain) { + continue; + } + mentions.push(user.inbox); + } + } + let mut content = ContentFormat::default(); content.x.insert( "text/html".to_string(), diff --git a/src/versia/inbox.rs b/src/versia/inbox.rs index 7d656cb..88b33ff 100644 --- a/src/versia/inbox.rs +++ b/src/versia/inbox.rs @@ -33,6 +33,7 @@ pub async fn inbox_entry(json: &str) -> Result<()> { match json_type.as_str() { Some("Note") => { let note: super::objects::Note = serde_json::from_str(json)?; + federate_inbox(note).await?; } Some("Follow") => { let follow_req: super::objects::Follow = serde_json::from_str(json)?; @@ -130,3 +131,9 @@ async fn follow_request(follow: super::objects::Follow) -> Result<()> { Ok(()) } + +async fn federate_inbox(note: super::objects::Note) -> Result<()> { + + + Ok(()) +} \ No newline at end of file