activitypub/src/versia/funcs.rs

63 lines
1.8 KiB
Rust

use sea_orm::{ColumnTrait, EntityTrait, QueryFilter};
use time::OffsetDateTime;
use url::Url;
use crate::{
entities::{follow_relation, prelude, user},
utils::generate_follow_accept_id,
API_DOMAIN, DB,
};
use super::{
conversion::{fetch_user_from_url, versia_user_from_db},
objects::FollowResult,
superx::request_client,
};
pub async fn send_follow_accept_to_versia(model: follow_relation::Model) -> anyhow::Result<()> {
let request_client = request_client();
let db = DB.get().unwrap();
let id_raw = model.accept_id.unwrap();
let id = uuid::Uuid::parse_str(&id_raw)?;
let uri = generate_follow_accept_id(API_DOMAIN.as_str(), &id_raw)?;
let follower_model = prelude::User::find()
.filter(user::Column::Id.eq(model.follower_id))
.one(db)
.await?
.unwrap();
let versia_follower = fetch_user_from_url(Url::parse(&follower_model.url)?).await?;
let followee_model = prelude::User::find()
.filter(user::Column::Id.eq(model.followee_id))
.one(db)
.await?
.unwrap();
let versia_followee = versia_user_from_db(followee_model).await?;
let entity = FollowResult {
rtype: "FollowAccept".to_string(),
id,
uri,
created_at: OffsetDateTime::now_utc(),
author: versia_followee.uri,
follower: versia_follower.uri,
};
let request = request_client
.post(versia_follower.inbox.as_str())
.header("Content-Type", "application/json; charset=utf-8")
.header("Accept", "application/json")
.header("Date", entity.created_at.clone().to_string())
.json(&entity);
let response = request.send().await?;
if response.status().is_success() {
Ok(())
} else {
Err(anyhow::anyhow!("Failed to send follow accept to Versia"))
}
}