X-Git-Url: http://these/git/?a=blobdiff_plain;f=crates%2Fapub%2Fsrc%2Fprotocol%2Fobjects%2Fmod.rs;h=31b8eb32bcba5f573e42c11ec39d5bb5c7f6c0f3;hb=2ef0f8f5f8c60d8c7632779ca16bac69daab1266;hp=1cfd923d74b2f8b87d80c40c777fcbba77cc16be;hpb=7bb941e5461f68b810a18ea40cb7a405ded69cc9;p=lemmy.git diff --git a/crates/apub/src/protocol/objects/mod.rs b/crates/apub/src/protocol/objects/mod.rs index 1cfd923d..31b8eb32 100644 --- a/crates/apub/src/protocol/objects/mod.rs +++ b/crates/apub/src/protocol/objects/mod.rs @@ -1,4 +1,6 @@ -use lemmy_db_schema::source::language::Language; +use lemmy_api_common::utils::blocking; +use lemmy_db_schema::{newtypes::LanguageId, source::language::Language, utils::DbPool}; +use lemmy_utils::error::LemmyError; use serde::{Deserialize, Serialize}; use url::Url; @@ -16,6 +18,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,17 +27,72 @@ pub(crate) struct LanguageTag { } impl LanguageTag { - pub(crate) fn new(lang: Language) -> Option { + pub(crate) async fn new_single( + lang: LanguageId, + pool: &DbPool, + ) -> Result, LemmyError> { + let lang = blocking(pool, move |conn| Language::read_from_id(conn, lang)).await??; + // undetermined if lang.code == "und" { - None + Ok(None) } else { - Some(LanguageTag { + Ok(Some(LanguageTag { identifier: lang.code, name: lang.name, - }) + })) } } + + pub(crate) async fn new_multiple( + langs: Vec, + pool: &DbPool, + ) -> Result, LemmyError> { + let langs = blocking(pool, move |conn| { + langs + .into_iter() + .map(|l| Language::read_from_id(conn, l)) + .collect::, diesel::result::Error>>() + }) + .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, + pool: &DbPool, + ) -> Result, LemmyError> { + let identifier = lang.map(|l| l.identifier); + let language = blocking(pool, move |conn| { + Language::read_id_from_code_opt(conn, identifier.as_deref()) + }) + .await??; + + Ok(language) + } + + pub(crate) async fn to_language_id_multiple( + langs: Vec, + pool: &DbPool, + ) -> Result, LemmyError> { + let languages = blocking(pool, move |conn| { + langs + .into_iter() + .map(|l| l.identifier) + .map(|l| Language::read_id_from_code(conn, &l)) + .collect::, diesel::result::Error>>() + }) + .await??; + Ok(languages) + } } #[cfg(test)]