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::{
|
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(())
|
||||||
|
}
|
||||||
|
|
@ -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(),
|
||||||
|
|
|
||||||
|
|
@ -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(())
|
||||||
|
}
|
||||||
Loading…
Reference in a new issue