mirror of
https://github.com/versia-pub/activitypub.git
synced 2025-12-06 14:48:19 +01:00
AP -> Versia note fed
This commit is contained in:
parent
012079cd9b
commit
d275165b97
|
|
@ -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<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(())
|
||||
}
|
||||
}
|
||||
|
||||
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(())
|
||||
}
|
||||
|
|
@ -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::<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();
|
||||
content.x.insert(
|
||||
"text/html".to_string(),
|
||||
|
|
|
|||
|
|
@ -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(())
|
||||
}
|
||||
Loading…
Reference in a new issue