]> Untitled Git - lemmy.git/blob - crates/api/src/local_user/block.rs
da21dcdd8872042f3a9d75ad3bf31457e8f52546
[lemmy.git] / crates / api / src / local_user / block.rs
1 use crate::Perform;
2 use actix_web::web::Data;
3 use lemmy_api_common::{
4   person::{BlockPerson, BlockPersonResponse},
5   utils::{blocking, get_local_user_view_from_jwt},
6 };
7 use lemmy_db_schema::{
8   source::person_block::{PersonBlock, PersonBlockForm},
9   traits::Blockable,
10 };
11 use lemmy_db_views_actor::structs::PersonViewSafe;
12 use lemmy_utils::{error::LemmyError, ConnectionId};
13 use lemmy_websocket::LemmyContext;
14
15 #[async_trait::async_trait(?Send)]
16 impl Perform for BlockPerson {
17   type Response = BlockPersonResponse;
18
19   #[tracing::instrument(skip(context, _websocket_id))]
20   async fn perform(
21     &self,
22     context: &Data<LemmyContext>,
23     _websocket_id: Option<ConnectionId>,
24   ) -> Result<BlockPersonResponse, LemmyError> {
25     let data: &BlockPerson = self;
26     let local_user_view =
27       get_local_user_view_from_jwt(&data.auth, context.pool(), context.secret()).await?;
28
29     let target_id = data.person_id;
30     let person_id = local_user_view.person.id;
31
32     // Don't let a person block themselves
33     if target_id == person_id {
34       return Err(LemmyError::from_message("cant_block_yourself"));
35     }
36
37     let person_block_form = PersonBlockForm {
38       person_id,
39       target_id,
40     };
41
42     let target_person_view = blocking(context.pool(), move |conn| {
43       PersonViewSafe::read(conn, target_id)
44     })
45     .await??;
46
47     if target_person_view.person.admin {
48       return Err(LemmyError::from_message("cant_block_admin"));
49     }
50
51     if data.block {
52       let block = move |conn: &'_ _| PersonBlock::block(conn, &person_block_form);
53       blocking(context.pool(), block)
54         .await?
55         .map_err(|e| LemmyError::from_error_message(e, "person_block_already_exists"))?;
56     } else {
57       let unblock = move |conn: &'_ _| PersonBlock::unblock(conn, &person_block_form);
58       blocking(context.pool(), unblock)
59         .await?
60         .map_err(|e| LemmyError::from_error_message(e, "person_block_already_exists"))?;
61     }
62
63     let res = BlockPersonResponse {
64       person_view: target_person_view,
65       blocked: data.block,
66     };
67
68     Ok(res)
69   }
70 }