]> 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 1cfd923d74b2f8b87d80c40c777fcbba77cc16be..9a3dab1859949d91c1c3b9f542fd0eb5970df1d8 100644 (file)
@@ -1,4 +1,10 @@
-use lemmy_db_schema::source::language::Language;
+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;
 
@@ -16,6 +22,7 @@ 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 {
@@ -24,21 +31,73 @@ pub(crate) struct LanguageTag {
 }
 
 impl LanguageTag {
-  pub(crate) fn new(lang: Language) -> Option<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.code == "und" {
-      None
+    if lang.id == UNDETERMINED_ID {
+      Ok(None)
     } else {
-      Some(LanguageTag {
+      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,
@@ -80,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]
@@ -116,4 +176,11 @@ mod tests {
     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();
+  }
 }