use url::Url; use crate::error::Error; pub const AS_PUBLIC: &str = "https://www.w3.org/ns/activitystreams#Public"; pub const AP_CONTEXT: &str = "https://www.w3.org/ns/activitystreams"; pub const AP_PAGE_SIZE: usize = 20; /// Returns the `@context` array for actor AP JSON. /// Includes the W3C security vocabulary (needed for `publicKey` resolution) /// and common Mastodon/Toot extensions (`discoverable`, `featured`, etc.). /// Activities use `WithContext::new_default` (plain AS context) — only actor /// JSON needs the security vocab. pub fn actor_ap_context() -> serde_json::Value { serde_json::json!([ "https://www.w3.org/ns/activitystreams", "https://w3id.org/security/v1", { "manuallyApprovesFollowers": "as:manuallyApprovesFollowers", "toot": "http://joinmastodon.org/ns#", "discoverable": "toot:discoverable", "featured": {"@id": "toot:featured", "@type": "@id"} } ]) } pub fn extract_user_id_from_url(url: &Url) -> Option { let path = url.path(); path.strip_prefix("/users/") .and_then(|s| s.split('/').next()) .and_then(|s| uuid::Uuid::parse_str(s).ok()) } pub fn activity_url(base_url: &str) -> Result { Url::parse(&format!("{}/activities/{}", base_url, uuid::Uuid::new_v4())) .map_err(|e| Error::bad_request(anyhow::anyhow!(e))) } pub fn actor_url(base_url: &str, user_id: uuid::Uuid) -> Url { Url::parse(&format!("{}/users/{}", base_url, user_id)) .expect("base_url is always a valid URL prefix") } /// Extract the username segment from a /users/:username URL. #[allow(dead_code)] pub fn extract_username_from_url(url: &Url) -> Option { url.path() .strip_prefix("/users/") .and_then(|s| s.split('/').next()) .map(|s| s.to_string()) }