]> Untitled Git - lemmy.git/blob - crates/apub/src/objects/mod.rs
Make Note.context optional for pleroma compat (hack)
[lemmy.git] / crates / apub / src / objects / mod.rs
1 use activitystreams::object::kind::ImageType;
2 use html2md::parse_html;
3 use lemmy_apub_lib::values::MediaTypeMarkdown;
4 use serde::{Deserialize, Serialize};
5 use url::Url;
6
7 pub mod comment;
8 pub mod community;
9 pub mod person;
10 pub mod post;
11 pub mod private_message;
12 pub mod tombstone;
13
14 #[derive(Clone, Debug, Deserialize, Serialize)]
15 #[serde(rename_all = "camelCase")]
16 pub struct Source {
17   content: String,
18   media_type: MediaTypeMarkdown,
19 }
20
21 #[derive(Clone, Debug, Deserialize, Serialize)]
22 #[serde(rename_all = "camelCase")]
23 pub struct ImageObject {
24   #[serde(rename = "type")]
25   kind: ImageType,
26   url: Url,
27 }
28
29 fn get_summary_from_string_or_source(
30   raw: &Option<String>,
31   source: &Option<Source>,
32 ) -> Option<String> {
33   if let Some(source) = &source {
34     Some(source.content.clone())
35   } else {
36     raw.as_ref().map(|s| parse_html(s))
37   }
38 }
39
40 #[cfg(test)]
41 pub(crate) mod tests {
42   use actix::Actor;
43   use diesel::{
44     r2d2::{ConnectionManager, Pool},
45     PgConnection,
46   };
47   use lemmy_apub_lib::activity_queue::create_activity_queue;
48   use lemmy_db_schema::{
49     establish_unpooled_connection,
50     get_database_url_from_env,
51     source::secret::Secret,
52   };
53   use lemmy_utils::{
54     rate_limit::{rate_limiter::RateLimiter, RateLimit},
55     request::build_user_agent,
56     settings::structs::Settings,
57     LemmyError,
58   };
59   use lemmy_websocket::{chat_server::ChatServer, LemmyContext};
60   use reqwest::Client;
61   use serde::de::DeserializeOwned;
62   use std::{fs::File, io::BufReader, sync::Arc};
63   use tokio::sync::Mutex;
64
65   // TODO: would be nice if we didnt have to use a full context for tests.
66   //       or at least write a helper function so this code is shared with main.rs
67   pub(crate) fn init_context() -> LemmyContext {
68     // call this to run migrations
69     establish_unpooled_connection();
70     let settings = Settings::init().unwrap();
71     let rate_limiter = RateLimit {
72       rate_limiter: Arc::new(Mutex::new(RateLimiter::default())),
73       rate_limit_config: settings.rate_limit.to_owned().unwrap_or_default(),
74     };
75     let client = Client::builder()
76       .user_agent(build_user_agent(&settings))
77       .build()
78       .unwrap();
79     let activity_queue = create_activity_queue();
80     let secret = Secret {
81       id: 0,
82       jwt_secret: "".to_string(),
83     };
84     let db_url = match get_database_url_from_env() {
85       Ok(url) => url,
86       Err(_) => settings.get_database_url(),
87     };
88     let manager = ConnectionManager::<PgConnection>::new(&db_url);
89     let pool = Pool::builder()
90       .max_size(settings.database.pool_size)
91       .build(manager)
92       .unwrap_or_else(|_| panic!("Error connecting to {}", db_url));
93     async fn x() -> Result<String, LemmyError> {
94       Ok("".to_string())
95     }
96     let chat_server = ChatServer::startup(
97       pool.clone(),
98       rate_limiter,
99       |_, _, _, _| Box::pin(x()),
100       |_, _, _, _| Box::pin(x()),
101       client.clone(),
102       activity_queue.clone(),
103       settings.clone(),
104       secret.clone(),
105     )
106     .start();
107     LemmyContext::create(pool, chat_server, client, activity_queue, settings, secret)
108   }
109
110   pub(crate) fn file_to_json_object<T: DeserializeOwned>(path: &str) -> T {
111     let file = File::open(path).unwrap();
112     let reader = BufReader::new(file);
113     serde_json::from_reader(reader).unwrap()
114   }
115 }