]> Untitled Git - lemmy.git/blob - server/src/db/private_message.rs
Merge branch 'dev' into federation
[lemmy.git] / server / src / db / private_message.rs
1 use super::*;
2 use crate::schema::private_message;
3
4 #[derive(Queryable, Identifiable, PartialEq, Debug, Serialize, Deserialize)]
5 #[table_name = "private_message"]
6 pub struct PrivateMessage {
7   pub id: i32,
8   pub creator_id: i32,
9   pub recipient_id: i32,
10   pub content: String,
11   pub deleted: bool,
12   pub read: bool,
13   pub published: chrono::NaiveDateTime,
14   pub updated: Option<chrono::NaiveDateTime>,
15 }
16
17 #[derive(Insertable, AsChangeset, Clone)]
18 #[table_name = "private_message"]
19 pub struct PrivateMessageForm {
20   pub creator_id: i32,
21   pub recipient_id: i32,
22   pub content: Option<String>,
23   pub deleted: Option<bool>,
24   pub read: Option<bool>,
25   pub updated: Option<chrono::NaiveDateTime>,
26 }
27
28 impl Crud<PrivateMessageForm> for PrivateMessage {
29   fn read(conn: &PgConnection, private_message_id: i32) -> Result<Self, Error> {
30     use crate::schema::private_message::dsl::*;
31     private_message.find(private_message_id).first::<Self>(conn)
32   }
33
34   fn delete(conn: &PgConnection, private_message_id: i32) -> Result<usize, Error> {
35     use crate::schema::private_message::dsl::*;
36     diesel::delete(private_message.find(private_message_id)).execute(conn)
37   }
38
39   fn create(conn: &PgConnection, private_message_form: &PrivateMessageForm) -> Result<Self, Error> {
40     use crate::schema::private_message::dsl::*;
41     insert_into(private_message)
42       .values(private_message_form)
43       .get_result::<Self>(conn)
44   }
45
46   fn update(
47     conn: &PgConnection,
48     private_message_id: i32,
49     private_message_form: &PrivateMessageForm,
50   ) -> Result<Self, Error> {
51     use crate::schema::private_message::dsl::*;
52     diesel::update(private_message.find(private_message_id))
53       .set(private_message_form)
54       .get_result::<Self>(conn)
55   }
56 }
57
58 #[cfg(test)]
59 mod tests {
60   use super::super::user::*;
61   use super::*;
62   #[test]
63   fn test_crud() {
64     let conn = establish_unpooled_connection();
65
66     let creator_form = UserForm {
67       name: "creator_pm".into(),
68       preferred_username: None,
69       password_encrypted: "nope".into(),
70       email: None,
71       matrix_user_id: None,
72       avatar: None,
73       admin: false,
74       banned: false,
75       updated: None,
76       show_nsfw: false,
77       theme: "darkly".into(),
78       default_sort_type: SortType::Hot as i16,
79       default_listing_type: ListingType::Subscribed as i16,
80       lang: "browser".into(),
81       show_avatars: true,
82       send_notifications_to_email: false,
83       actor_id: "changeme".into(),
84       bio: None,
85       local: true,
86       private_key: None,
87       public_key: None,
88       last_refreshed_at: None,
89     };
90
91     let inserted_creator = User_::create(&conn, &creator_form).unwrap();
92
93     let recipient_form = UserForm {
94       name: "recipient_pm".into(),
95       preferred_username: None,
96       password_encrypted: "nope".into(),
97       email: None,
98       matrix_user_id: None,
99       avatar: None,
100       admin: false,
101       banned: false,
102       updated: None,
103       show_nsfw: false,
104       theme: "darkly".into(),
105       default_sort_type: SortType::Hot as i16,
106       default_listing_type: ListingType::Subscribed as i16,
107       lang: "browser".into(),
108       show_avatars: true,
109       send_notifications_to_email: false,
110       actor_id: "changeme".into(),
111       bio: None,
112       local: true,
113       private_key: None,
114       public_key: None,
115       last_refreshed_at: None,
116     };
117
118     let inserted_recipient = User_::create(&conn, &recipient_form).unwrap();
119
120     let private_message_form = PrivateMessageForm {
121       content: Some("A test private message".into()),
122       creator_id: inserted_creator.id,
123       recipient_id: inserted_recipient.id,
124       deleted: None,
125       read: None,
126       updated: None,
127     };
128
129     let inserted_private_message = PrivateMessage::create(&conn, &private_message_form).unwrap();
130
131     let expected_private_message = PrivateMessage {
132       id: inserted_private_message.id,
133       content: "A test private message".into(),
134       creator_id: inserted_creator.id,
135       recipient_id: inserted_recipient.id,
136       deleted: false,
137       read: false,
138       updated: None,
139       published: inserted_private_message.published,
140     };
141
142     let read_private_message = PrivateMessage::read(&conn, inserted_private_message.id).unwrap();
143     let updated_private_message =
144       PrivateMessage::update(&conn, inserted_private_message.id, &private_message_form).unwrap();
145     let num_deleted = PrivateMessage::delete(&conn, inserted_private_message.id).unwrap();
146     User_::delete(&conn, inserted_creator.id).unwrap();
147     User_::delete(&conn, inserted_recipient.id).unwrap();
148
149     assert_eq!(expected_private_message, read_private_message);
150     assert_eq!(expected_private_message, updated_private_message);
151     assert_eq!(expected_private_message, inserted_private_message);
152     assert_eq!(1, num_deleted);
153   }
154 }