AP -> Versia note fed

This commit is contained in:
April John 2024-11-22 22:08:25 +01:00
parent 012079cd9b
commit d275165b97
3 changed files with 67 additions and 8 deletions

View file

@ -1,12 +1,12 @@
use crate::{ use crate::{
database::StateHandle, database::StateHandle,
entities::{post, user}, entities::{self, post, user},
error::Error, error::Error,
objects::{ objects::{
person::DbUser, person::DbUser,
post::{DbPost, Note}, 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::{ use activitypub_federation::{
activity_sending::SendActivityTask, activity_sending::SendActivityTask,
@ -16,6 +16,7 @@ use activitypub_federation::{
protocol::{context::WithContext, helpers::deserialize_one_or_many}, protocol::{context::WithContext, helpers::deserialize_one_or_many},
traits::{ActivityHandler, Object}, traits::{ActivityHandler, Object},
}; };
use sea_orm::{ColumnTrait, EntityTrait, QueryFilter};
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use url::Url; use url::Url;
@ -81,7 +82,46 @@ impl ActivityHandler for CreatePost {
} }
async fn receive(self, data: &Data<Self::DataType>) -> Result<(), Self::Error> { async fn receive(self, data: &Data<Self::DataType>) -> 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(()) 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(())
}

View file

@ -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 activitystreams_kinds::public;
use anyhow::{anyhow, Ok}; use anyhow::{anyhow, Ok};
use async_recursion::async_recursion; use async_recursion::async_recursion;
@ -51,10 +51,22 @@ pub async fn versia_post_from_db(
//"unlisted" => super::objects::VisibilityType::Unlisted, //"unlisted" => super::objects::VisibilityType::Unlisted,
_ => Some("public".to_string()), _ => Some("public".to_string()),
}; };
//let mut mentions = Vec::new();
//for obj in post.tag.clone() { let mut mentions = Vec::new();
// mentions.push(obj.href.clone()); let ap_obj = serde_json::from_str::<crate::objects::post::Note>(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(); let mut content = ContentFormat::default();
content.x.insert( content.x.insert(
"text/html".to_string(), "text/html".to_string(),

View file

@ -33,6 +33,7 @@ pub async fn inbox_entry(json: &str) -> Result<()> {
match json_type.as_str() { match json_type.as_str() {
Some("Note") => { Some("Note") => {
let note: super::objects::Note = serde_json::from_str(json)?; let note: super::objects::Note = serde_json::from_str(json)?;
federate_inbox(note).await?;
} }
Some("Follow") => { Some("Follow") => {
let follow_req: super::objects::Follow = serde_json::from_str(json)?; 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(()) Ok(())
} }
async fn federate_inbox(note: super::objects::Note) -> Result<()> {
Ok(())
}