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