]> Untitled Git - lemmy.git/blob - crates/api/src/local_user/block.rs
Get rid of Safe Views, use serde_skip (#2767)
[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   context::LemmyContext,
5   person::{BlockPerson, BlockPersonResponse},
6   utils::get_local_user_view_from_jwt,
7 };
8 use lemmy_db_schema::{
9   source::person_block::{PersonBlock, PersonBlockForm},
10   traits::Blockable,
11 };
12 use lemmy_db_views_actor::structs::PersonView;
13 use lemmy_utils::{error::LemmyError, ConnectionId};
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 = PersonView::read(context.pool(), target_id).await?;
43
44     if target_person_view.person.admin {
45       return Err(LemmyError::from_message("cant_block_admin"));
46     }
47
48     if data.block {
49       PersonBlock::block(context.pool(), &person_block_form)
50         .await
51         .map_err(|e| LemmyError::from_error_message(e, "person_block_already_exists"))?;
52     } else {
53       PersonBlock::unblock(context.pool(), &person_block_form)
54         .await
55         .map_err(|e| LemmyError::from_error_message(e, "person_block_already_exists"))?;
56     }
57
58     let res = BlockPersonResponse {
59       person_view: target_person_view,
60       blocked: data.block,
61     };
62
63     Ok(res)
64   }
65 }