1 use lemmy_api_common::utils::blocking;
2 use lemmy_db_schema::{newtypes::LanguageId, source::language::Language, utils::DbPool};
3 use lemmy_utils::error::LemmyError;
4 use serde::{Deserialize, Serialize};
7 pub(crate) mod chat_message;
9 pub(crate) mod instance;
12 pub(crate) mod person;
13 pub(crate) mod tombstone;
15 #[derive(Clone, Debug, Deserialize, Serialize)]
16 #[serde(rename_all = "camelCase")]
17 pub struct Endpoints {
18 pub shared_inbox: Url,
21 /// As specified in https://schema.org/Language
22 #[derive(Clone, Debug, Deserialize, Serialize)]
23 #[serde(rename_all = "camelCase")]
24 pub(crate) struct LanguageTag {
25 pub(crate) identifier: String,
26 pub(crate) name: String,
30 pub(crate) async fn new_single(
33 ) -> Result<Option<LanguageTag>, LemmyError> {
34 let lang = blocking(pool, move |conn| Language::read_from_id(conn, lang)).await??;
37 if lang.code == "und" {
41 identifier: lang.code,
47 pub(crate) async fn new_multiple(
48 langs: Vec<LanguageId>,
50 ) -> Result<Vec<LanguageTag>, LemmyError> {
51 let langs = blocking(pool, move |conn| {
54 .map(|l| Language::read_from_id(conn, l))
55 .collect::<Result<Vec<Language>, diesel::result::Error>>()
61 .map(|l| LanguageTag {
69 pub(crate) async fn to_language_id_single(
72 ) -> Result<Option<LanguageId>, LemmyError> {
73 let identifier = lang.map(|l| l.identifier);
74 let language = blocking(pool, move |conn| {
75 Language::read_id_from_code_opt(conn, identifier.as_deref())
82 pub(crate) async fn to_language_id_multiple(
85 ) -> Result<Vec<LanguageId>, LemmyError> {
86 let languages = blocking(pool, move |conn| {
89 .map(|l| l.identifier)
90 .map(|l| Language::read_id_from_code(conn, &l))
91 .collect::<Result<Vec<LanguageId>, diesel::result::Error>>()
100 use crate::protocol::{
102 chat_message::ChatMessage,
108 tombstone::Tombstone,
110 tests::{test_json, test_parse_lemmy_item},
114 fn test_parse_objects_lemmy() {
115 test_parse_lemmy_item::<Instance>("assets/lemmy/objects/instance.json").unwrap();
116 test_parse_lemmy_item::<Group>("assets/lemmy/objects/group.json").unwrap();
117 test_parse_lemmy_item::<Person>("assets/lemmy/objects/person.json").unwrap();
118 test_parse_lemmy_item::<Page>("assets/lemmy/objects/page.json").unwrap();
119 test_parse_lemmy_item::<Note>("assets/lemmy/objects/note.json").unwrap();
120 test_parse_lemmy_item::<ChatMessage>("assets/lemmy/objects/chat_message.json").unwrap();
121 test_parse_lemmy_item::<Tombstone>("assets/lemmy/objects/tombstone.json").unwrap();
125 fn test_parse_objects_pleroma() {
126 test_json::<Person>("assets/pleroma/objects/person.json").unwrap();
127 test_json::<Note>("assets/pleroma/objects/note.json").unwrap();
128 test_json::<ChatMessage>("assets/pleroma/objects/chat_message.json").unwrap();
132 fn test_parse_objects_smithereen() {
133 test_json::<Person>("assets/smithereen/objects/person.json").unwrap();
134 test_json::<Note>("assets/smithereen/objects/note.json").unwrap();
138 fn test_parse_objects_mastodon() {
139 test_json::<Person>("assets/mastodon/objects/person.json").unwrap();
140 test_json::<Note>("assets/mastodon/objects/note.json").unwrap();
144 fn test_parse_objects_lotide() {
145 test_json::<Group>("assets/lotide/objects/group.json").unwrap();
146 test_json::<Person>("assets/lotide/objects/person.json").unwrap();
147 test_json::<Note>("assets/lotide/objects/note.json").unwrap();
148 test_json::<Page>("assets/lotide/objects/page.json").unwrap();
149 test_json::<Tombstone>("assets/lotide/objects/tombstone.json").unwrap();
153 fn test_parse_object_friendica() {
154 test_json::<Person>("assets/friendica/objects/person_1.json").unwrap();
155 test_json::<Person>("assets/friendica/objects/person_2.json").unwrap();
156 test_json::<Page>("assets/friendica/objects/page_1.json").unwrap();
157 test_json::<Page>("assets/friendica/objects/page_2.json").unwrap();
158 test_json::<Note>("assets/friendica/objects/note_1.json").unwrap();
159 test_json::<Note>("assets/friendica/objects/note_2.json").unwrap();
163 fn test_parse_object_gnusocial() {
164 test_json::<Person>("assets/gnusocial/objects/person.json").unwrap();
165 test_json::<Group>("assets/gnusocial/objects/group.json").unwrap();
166 test_json::<Page>("assets/gnusocial/objects/page.json").unwrap();
167 test_json::<Note>("assets/gnusocial/objects/note.json").unwrap();
171 fn test_parse_object_peertube() {
172 test_json::<Person>("assets/peertube/objects/person.json").unwrap();
173 test_json::<Group>("assets/peertube/objects/group.json").unwrap();
174 test_json::<Page>("assets/peertube/objects/video.json").unwrap();
175 test_json::<Note>("assets/peertube/objects/note.json").unwrap();