]> Untitled Git - lemmy.git/blob - crates/db_schema/src/impls/private_message.rs
b2407bdfab5759bfbf7fb4e2df1b359c853e2828
[lemmy.git] / crates / db_schema / src / impls / private_message.rs
1 use crate::{
2   newtypes::{DbUrl, PersonId, PrivateMessageId},
3   source::private_message::*,
4   traits::{Crud, DeleteableOrRemoveable},
5   utils::naive_now,
6 };
7 use diesel::{dsl::*, result::Error, *};
8 use lemmy_utils::error::LemmyError;
9 use url::Url;
10
11 impl Crud for PrivateMessage {
12   type Form = PrivateMessageForm;
13   type IdType = PrivateMessageId;
14   fn read(conn: &PgConnection, private_message_id: PrivateMessageId) -> Result<Self, Error> {
15     use crate::schema::private_message::dsl::*;
16     private_message.find(private_message_id).first::<Self>(conn)
17   }
18
19   fn create(conn: &PgConnection, private_message_form: &PrivateMessageForm) -> Result<Self, Error> {
20     use crate::schema::private_message::dsl::*;
21     insert_into(private_message)
22       .values(private_message_form)
23       .get_result::<Self>(conn)
24   }
25
26   fn update(
27     conn: &PgConnection,
28     private_message_id: PrivateMessageId,
29     private_message_form: &PrivateMessageForm,
30   ) -> Result<Self, Error> {
31     use crate::schema::private_message::dsl::*;
32     diesel::update(private_message.find(private_message_id))
33       .set(private_message_form)
34       .get_result::<Self>(conn)
35   }
36   fn delete(conn: &PgConnection, pm_id: Self::IdType) -> Result<usize, Error> {
37     use crate::schema::private_message::dsl::*;
38     diesel::delete(private_message.find(pm_id)).execute(conn)
39   }
40 }
41
42 impl PrivateMessage {
43   pub fn update_ap_id(
44     conn: &PgConnection,
45     private_message_id: PrivateMessageId,
46     apub_id: DbUrl,
47   ) -> Result<PrivateMessage, Error> {
48     use crate::schema::private_message::dsl::*;
49
50     diesel::update(private_message.find(private_message_id))
51       .set(ap_id.eq(apub_id))
52       .get_result::<Self>(conn)
53   }
54
55   pub fn update_content(
56     conn: &PgConnection,
57     private_message_id: PrivateMessageId,
58     new_content: &str,
59   ) -> Result<PrivateMessage, Error> {
60     use crate::schema::private_message::dsl::*;
61     diesel::update(private_message.find(private_message_id))
62       .set((content.eq(new_content), updated.eq(naive_now())))
63       .get_result::<Self>(conn)
64   }
65
66   pub fn update_deleted(
67     conn: &PgConnection,
68     private_message_id: PrivateMessageId,
69     new_deleted: bool,
70   ) -> Result<PrivateMessage, Error> {
71     use crate::schema::private_message::dsl::*;
72     diesel::update(private_message.find(private_message_id))
73       .set(deleted.eq(new_deleted))
74       .get_result::<Self>(conn)
75   }
76
77   pub fn update_read(
78     conn: &PgConnection,
79     private_message_id: PrivateMessageId,
80     new_read: bool,
81   ) -> Result<PrivateMessage, Error> {
82     use crate::schema::private_message::dsl::*;
83     diesel::update(private_message.find(private_message_id))
84       .set(read.eq(new_read))
85       .get_result::<Self>(conn)
86   }
87
88   pub fn mark_all_as_read(
89     conn: &PgConnection,
90     for_recipient_id: PersonId,
91   ) -> Result<Vec<PrivateMessage>, Error> {
92     use crate::schema::private_message::dsl::*;
93     diesel::update(
94       private_message
95         .filter(recipient_id.eq(for_recipient_id))
96         .filter(read.eq(false)),
97     )
98     .set(read.eq(true))
99     .get_results::<Self>(conn)
100   }
101
102   pub fn upsert(
103     conn: &PgConnection,
104     private_message_form: &PrivateMessageForm,
105   ) -> Result<PrivateMessage, Error> {
106     use crate::schema::private_message::dsl::*;
107     insert_into(private_message)
108       .values(private_message_form)
109       .on_conflict(ap_id)
110       .do_update()
111       .set(private_message_form)
112       .get_result::<Self>(conn)
113   }
114
115   pub fn read_from_apub_id(
116     conn: &PgConnection,
117     object_id: Url,
118   ) -> Result<Option<Self>, LemmyError> {
119     use crate::schema::private_message::dsl::*;
120     let object_id: DbUrl = object_id.into();
121     Ok(
122       private_message
123         .filter(ap_id.eq(object_id))
124         .first::<PrivateMessage>(conn)
125         .ok()
126         .map(Into::into),
127     )
128   }
129 }
130
131 impl DeleteableOrRemoveable for PrivateMessage {
132   fn blank_out_deleted_or_removed_info(mut self) -> Self {
133     self.content = "".into();
134     self
135   }
136 }
137
138 #[cfg(test)]
139 mod tests {
140   use crate::{
141     source::{person::*, private_message::*},
142     traits::Crud,
143     utils::establish_unpooled_connection,
144   };
145   use serial_test::serial;
146
147   #[test]
148   #[serial]
149   fn test_crud() {
150     let conn = establish_unpooled_connection();
151
152     let creator_form = PersonForm {
153       name: "creator_pm".into(),
154       public_key: Some("pubkey".to_string()),
155       ..PersonForm::default()
156     };
157
158     let inserted_creator = Person::create(&conn, &creator_form).unwrap();
159
160     let recipient_form = PersonForm {
161       name: "recipient_pm".into(),
162       public_key: Some("pubkey".to_string()),
163       ..PersonForm::default()
164     };
165
166     let inserted_recipient = Person::create(&conn, &recipient_form).unwrap();
167
168     let private_message_form = PrivateMessageForm {
169       content: "A test private message".into(),
170       creator_id: inserted_creator.id,
171       recipient_id: inserted_recipient.id,
172       ..PrivateMessageForm::default()
173     };
174
175     let inserted_private_message = PrivateMessage::create(&conn, &private_message_form).unwrap();
176
177     let expected_private_message = PrivateMessage {
178       id: inserted_private_message.id,
179       content: "A test private message".into(),
180       creator_id: inserted_creator.id,
181       recipient_id: inserted_recipient.id,
182       deleted: false,
183       read: false,
184       updated: None,
185       published: inserted_private_message.published,
186       ap_id: inserted_private_message.ap_id.to_owned(),
187       local: true,
188     };
189
190     let read_private_message = PrivateMessage::read(&conn, inserted_private_message.id).unwrap();
191     let updated_private_message =
192       PrivateMessage::update(&conn, inserted_private_message.id, &private_message_form).unwrap();
193     let deleted_private_message =
194       PrivateMessage::update_deleted(&conn, inserted_private_message.id, true).unwrap();
195     let marked_read_private_message =
196       PrivateMessage::update_read(&conn, inserted_private_message.id, true).unwrap();
197     Person::delete(&conn, inserted_creator.id).unwrap();
198     Person::delete(&conn, inserted_recipient.id).unwrap();
199
200     assert_eq!(expected_private_message, read_private_message);
201     assert_eq!(expected_private_message, updated_private_message);
202     assert_eq!(expected_private_message, inserted_private_message);
203     assert!(deleted_private_message.deleted);
204     assert!(marked_read_private_message.read);
205   }
206 }