use crate::protocol::Source; use activitypub_federation::{ config::Data, fetch::object_id::ObjectId, protocol::values::MediaTypeMarkdownOrHtml, traits::Object, }; use anyhow::anyhow; use html2md::parse_html; use lemmy_api_common::context::LemmyContext; use lemmy_utils::error::LemmyResult; use serde::Deserialize; use std::fmt::Debug; pub mod comment; pub mod community; pub mod instance; pub mod person; pub mod post; pub mod private_message; pub(crate) fn read_from_string_or_source( content: &str, media_type: &Option, source: &Option, ) -> String { if let Some(s) = source { // markdown sent by lemmy in source field s.content.clone() } else if media_type == &Some(MediaTypeMarkdownOrHtml::Markdown) { // markdown sent by peertube in content field content.to_string() } else { // otherwise, convert content html to markdown parse_html(content) } } pub(crate) fn read_from_string_or_source_opt( content: &Option, media_type: &Option, source: &Option, ) -> Option { content .as_ref() .map(|content| read_from_string_or_source(content, media_type, source)) } /// When for example a Post is made in a remote community, the community will send it back, /// wrapped in Announce. If we simply receive this like any other federated object, overwrite the /// existing, local Post. In particular, it will set the field local = false, so that the object /// can't be fetched from the Activitypub HTTP endpoint anymore (which only serves local objects). pub(crate) fn verify_is_remote_object( id: &ObjectId, context: &Data, ) -> LemmyResult<()> where T: Object + Debug + Send + 'static, for<'de2> ::Kind: Deserialize<'de2>, { if id.is_local(context) { Err(anyhow!("cant accept local object from remote instance").into()) } else { Ok(()) } }