]> Untitled Git - lemmy.git/blob - server/lemmy_db/src/activity.rs
Translated using Weblate (Italian)
[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       admin: false,
111       banned: false,
112       updated: None,
113       show_nsfw: false,
114       theme: "darkly".into(),
115       default_sort_type: SortType::Hot as i16,
116       default_listing_type: ListingType::Subscribed as i16,
117       lang: "browser".into(),
118       show_avatars: true,
119       send_notifications_to_email: false,
120       actor_id: "changeme_862362".into(),
121       bio: None,
122       local: true,
123       private_key: None,
124       public_key: None,
125       last_refreshed_at: None,
126     };
127
128     let inserted_creator = User_::create(&conn, &creator_form).unwrap();
129
130     let test_json: Value = serde_json::from_str(
131       r#"{
132     "street": "Article Circle Expressway 1",
133     "city": "North Pole",
134     "postcode": "99705",
135     "state": "Alaska"
136 }"#,
137     )
138     .unwrap();
139     let activity_form = ActivityForm {
140       user_id: inserted_creator.id,
141       data: test_json.to_owned(),
142       local: true,
143       updated: None,
144     };
145
146     let inserted_activity = Activity::create(&conn, &activity_form).unwrap();
147
148     let expected_activity = Activity {
149       id: inserted_activity.id,
150       user_id: inserted_creator.id,
151       data: test_json,
152       local: true,
153       published: inserted_activity.published,
154       updated: None,
155     };
156
157     let read_activity = Activity::read(&conn, inserted_activity.id).unwrap();
158     let num_deleted = Activity::delete(&conn, inserted_activity.id).unwrap();
159     User_::delete(&conn, inserted_creator.id).unwrap();
160
161     assert_eq!(expected_activity, read_activity);
162     assert_eq!(expected_activity, inserted_activity);
163     assert_eq!(1, num_deleted);
164   }
165 }