]> Untitled Git - lemmy.git/blob - crates/apub/src/protocol/objects/mod.rs
Cache & Optimize Woodpecker CI (#3450)
[lemmy.git] / crates / apub / src / protocol / objects / mod.rs
1 use lemmy_db_schema::{
2   impls::actor_language::UNDETERMINED_ID,
3   newtypes::LanguageId,
4   source::language::Language,
5   utils::DbPool,
6 };
7 use lemmy_utils::error::LemmyError;
8 use serde::{Deserialize, Serialize};
9 use url::Url;
10
11 pub(crate) mod chat_message;
12 pub(crate) mod group;
13 pub(crate) mod instance;
14 pub(crate) mod note;
15 pub(crate) mod page;
16 pub(crate) mod person;
17 pub(crate) mod tombstone;
18
19 #[derive(Clone, Debug, Deserialize, Serialize)]
20 #[serde(rename_all = "camelCase")]
21 pub struct Endpoints {
22   pub shared_inbox: Url,
23 }
24
25 /// As specified in https://schema.org/Language
26 #[derive(Clone, Debug, Deserialize, Serialize)]
27 #[serde(rename_all = "camelCase")]
28 pub(crate) struct LanguageTag {
29   pub(crate) identifier: String,
30   pub(crate) name: String,
31 }
32
33 impl LanguageTag {
34   pub(crate) async fn new_single(
35     lang: LanguageId,
36     pool: &mut DbPool<'_>,
37   ) -> Result<Option<LanguageTag>, LemmyError> {
38     let lang = Language::read_from_id(pool, lang).await?;
39
40     // undetermined
41     if lang.id == UNDETERMINED_ID {
42       Ok(None)
43     } else {
44       Ok(Some(LanguageTag {
45         identifier: lang.code,
46         name: lang.name,
47       }))
48     }
49   }
50
51   pub(crate) async fn new_multiple(
52     lang_ids: Vec<LanguageId>,
53     pool: &mut DbPool<'_>,
54   ) -> Result<Vec<LanguageTag>, LemmyError> {
55     let mut langs = Vec::<Language>::new();
56
57     for l in lang_ids {
58       langs.push(Language::read_from_id(pool, l).await?);
59     }
60
61     let langs = langs
62       .into_iter()
63       .map(|l| LanguageTag {
64         identifier: l.code,
65         name: l.name,
66       })
67       .collect();
68     Ok(langs)
69   }
70
71   pub(crate) async fn to_language_id_single(
72     lang: Option<Self>,
73     pool: &mut DbPool<'_>,
74   ) -> Result<Option<LanguageId>, LemmyError> {
75     let identifier = lang.map(|l| l.identifier);
76     let language = Language::read_id_from_code(pool, identifier.as_deref()).await?;
77
78     Ok(language)
79   }
80
81   pub(crate) async fn to_language_id_multiple(
82     langs: Vec<Self>,
83     pool: &mut DbPool<'_>,
84   ) -> Result<Vec<LanguageId>, LemmyError> {
85     let mut language_ids = Vec::new();
86
87     for l in langs {
88       let id = l.identifier;
89       language_ids.push(Language::read_id_from_code(pool, Some(&id)).await?);
90     }
91
92     Ok(language_ids.into_iter().flatten().collect())
93   }
94 }
95
96 #[cfg(test)]
97 mod tests {
98   #![allow(clippy::unwrap_used)]
99   #![allow(clippy::indexing_slicing)]
100
101   use crate::protocol::{
102     objects::{
103       chat_message::ChatMessage,
104       group::Group,
105       instance::Instance,
106       note::Note,
107       page::Page,
108       person::Person,
109       tombstone::Tombstone,
110     },
111     tests::{test_json, test_parse_lemmy_item},
112   };
113
114   #[test]
115   fn test_parse_objects_lemmy() {
116     test_parse_lemmy_item::<Instance>("assets/lemmy/objects/instance.json").unwrap();
117     test_parse_lemmy_item::<Group>("assets/lemmy/objects/group.json").unwrap();
118     test_parse_lemmy_item::<Person>("assets/lemmy/objects/person.json").unwrap();
119     test_parse_lemmy_item::<Page>("assets/lemmy/objects/page.json").unwrap();
120     test_parse_lemmy_item::<Note>("assets/lemmy/objects/note.json").unwrap();
121     test_parse_lemmy_item::<ChatMessage>("assets/lemmy/objects/chat_message.json").unwrap();
122     test_parse_lemmy_item::<Tombstone>("assets/lemmy/objects/tombstone.json").unwrap();
123   }
124
125   #[test]
126   fn test_parse_objects_pleroma() {
127     test_json::<Person>("assets/pleroma/objects/person.json").unwrap();
128     test_json::<Note>("assets/pleroma/objects/note.json").unwrap();
129     test_json::<ChatMessage>("assets/pleroma/objects/chat_message.json").unwrap();
130   }
131
132   #[test]
133   fn test_parse_objects_smithereen() {
134     test_json::<Person>("assets/smithereen/objects/person.json").unwrap();
135     test_json::<Note>("assets/smithereen/objects/note.json").unwrap();
136   }
137
138   #[test]
139   fn test_parse_objects_mastodon() {
140     test_json::<Person>("assets/mastodon/objects/person.json").unwrap();
141     test_json::<Note>("assets/mastodon/objects/note.json").unwrap();
142     test_json::<Page>("assets/mastodon/objects/page.json").unwrap();
143   }
144
145   #[test]
146   fn test_parse_objects_lotide() {
147     test_json::<Group>("assets/lotide/objects/group.json").unwrap();
148     test_json::<Person>("assets/lotide/objects/person.json").unwrap();
149     test_json::<Note>("assets/lotide/objects/note.json").unwrap();
150     test_json::<Page>("assets/lotide/objects/page.json").unwrap();
151     test_json::<Tombstone>("assets/lotide/objects/tombstone.json").unwrap();
152   }
153
154   #[test]
155   fn test_parse_object_friendica() {
156     test_json::<Person>("assets/friendica/objects/person_1.json").unwrap();
157     test_json::<Person>("assets/friendica/objects/person_2.json").unwrap();
158     test_json::<Page>("assets/friendica/objects/page_1.json").unwrap();
159     test_json::<Page>("assets/friendica/objects/page_2.json").unwrap();
160     test_json::<Note>("assets/friendica/objects/note_1.json").unwrap();
161     test_json::<Note>("assets/friendica/objects/note_2.json").unwrap();
162   }
163
164   #[test]
165   fn test_parse_object_gnusocial() {
166     test_json::<Person>("assets/gnusocial/objects/person.json").unwrap();
167     test_json::<Group>("assets/gnusocial/objects/group.json").unwrap();
168     test_json::<Page>("assets/gnusocial/objects/page.json").unwrap();
169     test_json::<Note>("assets/gnusocial/objects/note.json").unwrap();
170   }
171
172   #[test]
173   fn test_parse_object_peertube() {
174     test_json::<Person>("assets/peertube/objects/person.json").unwrap();
175     test_json::<Group>("assets/peertube/objects/group.json").unwrap();
176     test_json::<Page>("assets/peertube/objects/video.json").unwrap();
177     test_json::<Note>("assets/peertube/objects/note.json").unwrap();
178   }
179
180   #[test]
181   fn test_parse_object_mobilizon() {
182     test_json::<Group>("assets/mobilizon/objects/group.json").unwrap();
183     test_json::<Page>("assets/mobilizon/objects/event.json").unwrap();
184     test_json::<Person>("assets/mobilizon/objects/person.json").unwrap();
185   }
186 }