]> Untitled Git - lemmy.git/blob - crates/api/src/private_message_report/create.rs
ee78af8046fceb4c917f6a53d3f8672d1c2fb417
[lemmy.git] / crates / api / src / private_message_report / create.rs
1 use crate::{check_report_reason, Perform};
2 use actix_web::web::Data;
3 use lemmy_api_common::{
4   private_message::{CreatePrivateMessageReport, PrivateMessageReportResponse},
5   utils::{blocking, get_local_user_view_from_jwt},
6 };
7 use lemmy_db_schema::{
8   newtypes::CommunityId,
9   source::{
10     private_message::PrivateMessage,
11     private_message_report::{PrivateMessageReport, PrivateMessageReportForm},
12   },
13   traits::{Crud, Reportable},
14 };
15 use lemmy_db_views::structs::PrivateMessageReportView;
16 use lemmy_utils::{error::LemmyError, ConnectionId};
17 use lemmy_websocket::{messages::SendModRoomMessage, LemmyContext, UserOperation};
18
19 #[async_trait::async_trait(?Send)]
20 impl Perform for CreatePrivateMessageReport {
21   type Response = PrivateMessageReportResponse;
22
23   #[tracing::instrument(skip(context, websocket_id))]
24   async fn perform(
25     &self,
26     context: &Data<LemmyContext>,
27     websocket_id: Option<ConnectionId>,
28   ) -> Result<Self::Response, LemmyError> {
29     let local_user_view =
30       get_local_user_view_from_jwt(&self.auth, context.pool(), context.secret()).await?;
31
32     let reason = self.reason.trim();
33     check_report_reason(reason, context)?;
34
35     let person_id = local_user_view.person.id;
36     let private_message_id = self.private_message_id;
37     let private_message = blocking(context.pool(), move |conn| {
38       PrivateMessage::read(conn, private_message_id)
39     })
40     .await??;
41
42     let report_form = PrivateMessageReportForm {
43       creator_id: person_id,
44       private_message_id,
45       original_pm_text: private_message.content,
46       reason: reason.to_owned(),
47     };
48
49     let report = blocking(context.pool(), move |conn| {
50       PrivateMessageReport::report(conn, &report_form)
51     })
52     .await?
53     .map_err(|e| LemmyError::from_error_message(e, "couldnt_create_report"))?;
54
55     let private_message_report_view = blocking(context.pool(), move |conn| {
56       PrivateMessageReportView::read(conn, report.id)
57     })
58     .await??;
59
60     let res = PrivateMessageReportResponse {
61       private_message_report_view,
62     };
63
64     context.chat_server().do_send(SendModRoomMessage {
65       op: UserOperation::CreatePrivateMessageReport,
66       response: res.clone(),
67       community_id: CommunityId(0),
68       websocket_id,
69     });
70
71     // TODO: consider federating this
72
73     Ok(res)
74   }
75 }