]> Untitled Git - lemmy.git/blob - server/lemmy_db/src/activity.rs
Merge remote-tracking branch 'weblate/main' into main
[lemmy.git] / server / lemmy_db / src / activity.rs
1 use crate::{schema::activity, Crud};
2 use diesel::{dsl::*, result::Error, *};
3 use log::debug;
4 use serde::{Deserialize, Serialize};
5 use serde_json::Value;
6 use std::{
7   fmt::Debug,
8   io::{Error as IoError, ErrorKind},
9 };
10
11 #[derive(Queryable, Identifiable, PartialEq, Debug, Serialize, Deserialize)]
12 #[table_name = "activity"]
13 pub struct Activity {
14   pub id: i32,
15   pub user_id: i32,
16   pub data: Value,
17   pub local: bool,
18   pub published: chrono::NaiveDateTime,
19   pub updated: Option<chrono::NaiveDateTime>,
20 }
21
22 #[derive(Insertable, AsChangeset, Clone, Serialize, Deserialize)]
23 #[table_name = "activity"]
24 pub struct ActivityForm {
25   pub user_id: i32,
26   pub data: Value,
27   pub local: bool,
28   pub updated: Option<chrono::NaiveDateTime>,
29 }
30
31 impl Crud<ActivityForm> for Activity {
32   fn read(conn: &PgConnection, activity_id: i32) -> Result<Self, Error> {
33     use crate::schema::activity::dsl::*;
34     activity.find(activity_id).first::<Self>(conn)
35   }
36
37   fn delete(conn: &PgConnection, activity_id: i32) -> Result<usize, Error> {
38     use crate::schema::activity::dsl::*;
39     diesel::delete(activity.find(activity_id)).execute(conn)
40   }
41
42   fn create(conn: &PgConnection, new_activity: &ActivityForm) -> Result<Self, Error> {
43     use crate::schema::activity::dsl::*;
44     insert_into(activity)
45       .values(new_activity)
46       .get_result::<Self>(conn)
47   }
48
49   fn update(
50     conn: &PgConnection,
51     activity_id: i32,
52     new_activity: &ActivityForm,
53   ) -> Result<Self, Error> {
54     use crate::schema::activity::dsl::*;
55     diesel::update(activity.find(activity_id))
56       .set(new_activity)
57       .get_result::<Self>(conn)
58   }
59 }
60
61 pub fn do_insert_activity<T>(
62   conn: &PgConnection,
63   user_id: i32,
64   data: &T,
65   local: bool,
66 ) -> Result<Activity, IoError>
67 where
68   T: Serialize + Debug,
69 {
70   debug!("inserting activity for user {}, data {:?}", user_id, &data);
71   let activity_form = ActivityForm {
72     user_id,
73     data: serde_json::to_value(&data)?,
74     local,
75     updated: None,
76   };
77   let result = Activity::create(&conn, &activity_form);
78   match result {
79     Ok(s) => Ok(s),
80     Err(e) => Err(IoError::new(
81       ErrorKind::Other,
82       format!("Failed to insert activity into database: {}", e),
83     )),
84   }
85 }
86
87 #[cfg(test)]
88 mod tests {
89   use crate::{
90     activity::{Activity, ActivityForm},
91     tests::establish_unpooled_connection,
92     user::{UserForm, User_},
93     Crud,
94     ListingType,
95     SortType,
96   };
97   use serde_json::Value;
98
99   #[test]
100   fn test_crud() {
101     let conn = establish_unpooled_connection();
102
103     let creator_form = UserForm {
104       name: "activity_creator_pm".into(),
105       preferred_username: None,
106       password_encrypted: "nope".into(),
107       email: None,
108       matrix_user_id: None,
109       avatar: None,
110       banner: None,
111       admin: false,
112       banned: false,
113       updated: None,
114       show_nsfw: false,
115       theme: "darkly".into(),
116       default_sort_type: SortType::Hot as i16,
117       default_listing_type: ListingType::Subscribed as i16,
118       lang: "browser".into(),
119       show_avatars: true,
120       send_notifications_to_email: false,
121       actor_id: "changeme_862362".into(),
122       bio: None,
123       local: true,
124       private_key: None,
125       public_key: None,
126       last_refreshed_at: None,
127     };
128
129     let inserted_creator = User_::create(&conn, &creator_form).unwrap();
130
131     let test_json: Value = serde_json::from_str(
132       r#"{
133     "street": "Article Circle Expressway 1",
134     "city": "North Pole",
135     "postcode": "99705",
136     "state": "Alaska"
137 }"#,
138     )
139     .unwrap();
140     let activity_form = ActivityForm {
141       user_id: inserted_creator.id,
142       data: test_json.to_owned(),
143       local: true,
144       updated: None,
145     };
146
147     let inserted_activity = Activity::create(&conn, &activity_form).unwrap();
148
149     let expected_activity = Activity {
150       id: inserted_activity.id,
151       user_id: inserted_creator.id,
152       data: test_json,
153       local: true,
154       published: inserted_activity.published,
155       updated: None,
156     };
157
158     let read_activity = Activity::read(&conn, inserted_activity.id).unwrap();
159     let num_deleted = Activity::delete(&conn, inserted_activity.id).unwrap();
160     User_::delete(&conn, inserted_creator.id).unwrap();
161
162     assert_eq!(expected_activity, read_activity);
163     assert_eq!(expected_activity, inserted_activity);
164     assert_eq!(1, num_deleted);
165   }
166 }