]> Untitled Git - lemmy.git/blob - crates/db_schema/src/impls/private_message_report.rs
Automatically resolve report when post/comment is removed (#3850)
[lemmy.git] / crates / db_schema / src / impls / private_message_report.rs
1 use crate::{
2   newtypes::{PersonId, PrivateMessageId, PrivateMessageReportId},
3   schema::private_message_report::dsl::{private_message_report, resolved, resolver_id, updated},
4   source::private_message_report::{PrivateMessageReport, PrivateMessageReportForm},
5   traits::Reportable,
6   utils::{get_conn, naive_now, DbPool},
7 };
8 use diesel::{
9   dsl::{insert_into, update},
10   result::Error,
11   ExpressionMethods,
12   QueryDsl,
13 };
14 use diesel_async::RunQueryDsl;
15
16 #[async_trait]
17 impl Reportable for PrivateMessageReport {
18   type Form = PrivateMessageReportForm;
19   type IdType = PrivateMessageReportId;
20   type ObjectIdType = PrivateMessageId;
21
22   async fn report(
23     pool: &mut DbPool<'_>,
24     pm_report_form: &PrivateMessageReportForm,
25   ) -> Result<Self, Error> {
26     let conn = &mut get_conn(pool).await?;
27     insert_into(private_message_report)
28       .values(pm_report_form)
29       .get_result::<Self>(conn)
30       .await
31   }
32
33   async fn resolve(
34     pool: &mut DbPool<'_>,
35     report_id: Self::IdType,
36     by_resolver_id: PersonId,
37   ) -> Result<usize, Error> {
38     let conn = &mut get_conn(pool).await?;
39     update(private_message_report.find(report_id))
40       .set((
41         resolved.eq(true),
42         resolver_id.eq(by_resolver_id),
43         updated.eq(naive_now()),
44       ))
45       .execute(conn)
46       .await
47   }
48
49   // TODO: this is unused because private message doesnt have remove handler
50   async fn resolve_all_for_object(
51     _pool: &mut DbPool<'_>,
52     _pm_id_: PrivateMessageId,
53     _by_resolver_id: PersonId,
54   ) -> Result<usize, Error> {
55     unimplemented!()
56   }
57
58   async fn unresolve(
59     pool: &mut DbPool<'_>,
60     report_id: Self::IdType,
61     by_resolver_id: PersonId,
62   ) -> Result<usize, Error> {
63     let conn = &mut get_conn(pool).await?;
64     update(private_message_report.find(report_id))
65       .set((
66         resolved.eq(false),
67         resolver_id.eq(by_resolver_id),
68         updated.eq(naive_now()),
69       ))
70       .execute(conn)
71       .await
72   }
73 }