fedimovies/src/activitypub/builders/move_person.rs

123 lines
3.2 KiB
Rust

use serde::Serialize;
use uuid::Uuid;
use crate::activitypub::{
actors::types::Actor,
deliverer::OutgoingActivity,
identifiers::{local_actor_id, local_object_id},
types::{build_default_context, Context},
vocabulary::MOVE,
};
use crate::config::Instance;
use crate::models::users::types::User;
use crate::utils::id::new_uuid;
#[derive(Serialize)]
pub struct MovePerson {
#[serde(rename = "@context")]
context: Context,
#[serde(rename = "type")]
activity_type: String,
id: String,
actor: String,
object: String,
target: String,
to: Vec<String>,
}
pub fn build_move_person(
instance_url: &str,
sender: &User,
from_actor_id: &str,
followers: &[String],
maybe_internal_activity_id: Option<&Uuid>,
) -> MovePerson {
let internal_activity_id = maybe_internal_activity_id.copied()
.unwrap_or(new_uuid());
let activity_id = local_object_id(instance_url, &internal_activity_id);
let actor_id = local_actor_id(instance_url, &sender.profile.username);
MovePerson {
context: build_default_context(),
activity_type: MOVE.to_string(),
id: activity_id,
actor: actor_id.clone(),
object: from_actor_id.to_string(),
target: actor_id,
to: followers.to_vec(),
}
}
pub fn prepare_move_person(
instance: &Instance,
sender: &User,
from_actor_id: &str,
followers: Vec<Actor>,
maybe_internal_activity_id: Option<&Uuid>,
) -> OutgoingActivity {
let followers_ids: Vec<String> = followers.iter()
.map(|actor| actor.id.clone())
.collect();
let activity = build_move_person(
&instance.url(),
sender,
from_actor_id,
&followers_ids,
maybe_internal_activity_id,
);
OutgoingActivity::new(
instance,
sender,
activity,
followers,
)
}
#[cfg(test)]
mod tests {
use crate::models::profiles::types::DbActorProfile;
use crate::utils::id::new_uuid;
use super::*;
const INSTANCE_URL: &str = "https://example.com";
#[test]
fn test_build_move_person() {
let sender = User {
profile: DbActorProfile {
username: "testuser".to_string(),
..Default::default()
},
..Default::default()
};
let from_actor_id = "https://server0.org/users/test";
let followers = vec![
"https://server1.org/users/1".to_string(),
"https://server2.org/users/2".to_string(),
];
let internal_activity_id = new_uuid();
let activity = build_move_person(
INSTANCE_URL,
&sender,
from_actor_id,
&followers,
Some(&internal_activity_id),
);
assert_eq!(
activity.id,
format!("{}/objects/{}", INSTANCE_URL, internal_activity_id),
);
assert_eq!(activity.activity_type, "Move");
assert_eq!(
activity.actor,
format!("{}/users/{}", INSTANCE_URL, sender.profile.username),
);
assert_eq!(activity.object, from_actor_id);
assert_eq!(activity.target, activity.actor);
assert_eq!(activity.to, followers);
}
}