]> Untitled Git - lemmy.git/blob - crates/api/src/local_user/block.rs
Extract Activitypub logic into separate library (#2288)
[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     if data.block {
43       let block = move |conn: &'_ _| PersonBlock::block(conn, &person_block_form);
44       blocking(context.pool(), block)
45         .await?
46         .map_err(|e| LemmyError::from_error_message(e, "person_block_already_exists"))?;
47     } else {
48       let unblock = move |conn: &'_ _| PersonBlock::unblock(conn, &person_block_form);
49       blocking(context.pool(), unblock)
50         .await?
51         .map_err(|e| LemmyError::from_error_message(e, "person_block_already_exists"))?;
52     }
53
54     let person_view = blocking(context.pool(), move |conn| {
55       PersonViewSafe::read(conn, target_id)
56     })
57     .await??;
58
59     let res = BlockPersonResponse {
60       person_view,
61       blocked: data.block,
62     };
63
64     Ok(res)
65   }
66 }