]> Untitled Git - lemmy.git/blobdiff - crates/apub/src/protocol/objects/mod.rs
Cache & Optimize Woodpecker CI (#3450)
[lemmy.git] / crates / apub / src / protocol / objects / mod.rs
index 864c13d9ef104ac490c242378cdf855441dbbba3..9a3dab1859949d91c1c3b9f542fd0eb5970df1d8 100644 (file)
@@ -1,3 +1,10 @@
+use lemmy_db_schema::{
+  impls::actor_language::UNDETERMINED_ID,
+  newtypes::LanguageId,
+  source::language::Language,
+  utils::DbPool,
+};
+use lemmy_utils::error::LemmyError;
 use serde::{Deserialize, Serialize};
 use url::Url;
 
@@ -15,8 +22,82 @@ pub struct Endpoints {
   pub shared_inbox: Url,
 }
 
+/// As specified in https://schema.org/Language
+#[derive(Clone, Debug, Deserialize, Serialize)]
+#[serde(rename_all = "camelCase")]
+pub(crate) struct LanguageTag {
+  pub(crate) identifier: String,
+  pub(crate) name: String,
+}
+
+impl LanguageTag {
+  pub(crate) async fn new_single(
+    lang: LanguageId,
+    pool: &mut DbPool<'_>,
+  ) -> Result<Option<LanguageTag>, LemmyError> {
+    let lang = Language::read_from_id(pool, lang).await?;
+
+    // undetermined
+    if lang.id == UNDETERMINED_ID {
+      Ok(None)
+    } else {
+      Ok(Some(LanguageTag {
+        identifier: lang.code,
+        name: lang.name,
+      }))
+    }
+  }
+
+  pub(crate) async fn new_multiple(
+    lang_ids: Vec<LanguageId>,
+    pool: &mut DbPool<'_>,
+  ) -> Result<Vec<LanguageTag>, LemmyError> {
+    let mut langs = Vec::<Language>::new();
+
+    for l in lang_ids {
+      langs.push(Language::read_from_id(pool, l).await?);
+    }
+
+    let langs = langs
+      .into_iter()
+      .map(|l| LanguageTag {
+        identifier: l.code,
+        name: l.name,
+      })
+      .collect();
+    Ok(langs)
+  }
+
+  pub(crate) async fn to_language_id_single(
+    lang: Option<Self>,
+    pool: &mut DbPool<'_>,
+  ) -> Result<Option<LanguageId>, LemmyError> {
+    let identifier = lang.map(|l| l.identifier);
+    let language = Language::read_id_from_code(pool, identifier.as_deref()).await?;
+
+    Ok(language)
+  }
+
+  pub(crate) async fn to_language_id_multiple(
+    langs: Vec<Self>,
+    pool: &mut DbPool<'_>,
+  ) -> Result<Vec<LanguageId>, LemmyError> {
+    let mut language_ids = Vec::new();
+
+    for l in langs {
+      let id = l.identifier;
+      language_ids.push(Language::read_id_from_code(pool, Some(&id)).await?);
+    }
+
+    Ok(language_ids.into_iter().flatten().collect())
+  }
+}
+
 #[cfg(test)]
 mod tests {
+  #![allow(clippy::unwrap_used)]
+  #![allow(clippy::indexing_slicing)]
+
   use crate::protocol::{
     objects::{
       chat_message::ChatMessage,
@@ -58,6 +139,7 @@ mod tests {
   fn test_parse_objects_mastodon() {
     test_json::<Person>("assets/mastodon/objects/person.json").unwrap();
     test_json::<Note>("assets/mastodon/objects/note.json").unwrap();
+    test_json::<Page>("assets/mastodon/objects/page.json").unwrap();
   }
 
   #[test]
@@ -86,4 +168,19 @@ mod tests {
     test_json::<Page>("assets/gnusocial/objects/page.json").unwrap();
     test_json::<Note>("assets/gnusocial/objects/note.json").unwrap();
   }
+
+  #[test]
+  fn test_parse_object_peertube() {
+    test_json::<Person>("assets/peertube/objects/person.json").unwrap();
+    test_json::<Group>("assets/peertube/objects/group.json").unwrap();
+    test_json::<Page>("assets/peertube/objects/video.json").unwrap();
+    test_json::<Note>("assets/peertube/objects/note.json").unwrap();
+  }
+
+  #[test]
+  fn test_parse_object_mobilizon() {
+    test_json::<Group>("assets/mobilizon/objects/group.json").unwrap();
+    test_json::<Page>("assets/mobilizon/objects/event.json").unwrap();
+    test_json::<Person>("assets/mobilizon/objects/person.json").unwrap();
+  }
 }