use chrono::{DateTime, Utc}; use serde::{Deserialize, Serialize}; use serde_json::{json, Value}; use super::constants::AP_CONTEXT; use super::views::get_actor_url; use super::vocabulary::*; #[derive(Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct Attachment { pub name: Option, #[serde(rename = "type")] pub attachment_type: String, pub media_type: Option, pub url: Option, } fn default_tag_type() -> String { HASHTAG.to_string() } #[derive(Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct Tag { pub name: Option, #[serde(rename = "type", default = "default_tag_type")] pub tag_type: String, pub href: Option, } #[derive(Default, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct Object { #[serde(rename = "@context")] pub context: Option, pub id: String, #[serde(rename = "type")] pub object_type: String, #[serde(skip_serializing_if = "Option::is_none")] pub name: Option, #[serde(skip_serializing_if = "Option::is_none")] pub actor: Option, #[serde(skip_serializing_if = "Option::is_none")] pub attachment: Option, #[serde(skip_serializing_if = "Option::is_none")] pub cc: Option, #[serde(skip_serializing_if = "Option::is_none")] pub former_type: Option, #[serde(skip_serializing_if = "Option::is_none")] pub object: Option, #[serde(skip_serializing_if = "Option::is_none")] pub published: Option>, #[serde(skip_serializing_if = "Option::is_none")] pub attributed_to: Option, #[serde(skip_serializing_if = "Option::is_none")] pub in_reply_to: Option, #[serde(skip_serializing_if = "Option::is_none")] pub content: Option, #[serde(skip_serializing_if = "Option::is_none")] pub tag: Option>, #[serde(skip_serializing_if = "Option::is_none")] pub to: Option, #[serde(skip_serializing_if = "Option::is_none")] pub updated: Option>, } #[derive(Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct Activity { #[serde(rename = "@context")] pub context: Value, pub id: String, #[serde(rename = "type")] pub activity_type: String, pub actor: String, pub object: Value, pub to: Option, pub cc: Option, } pub fn create_activity( instance_url: &str, actor_name: &str, activity_type: &str, activity_id: String, object: impl Serialize, primary_audience: Vec, secondary_audience: Vec, ) -> Activity { let actor_id = get_actor_url( instance_url, actor_name, ); Activity { context: json!(AP_CONTEXT), id: activity_id, activity_type: activity_type.to_string(), actor: actor_id, object: serde_json::to_value(object).unwrap(), to: Some(json!(primary_audience)), cc: Some(json!(secondary_audience)), } }