]> Untitled Git - lemmy.git/blob - crates/api/src/post/save.rs
Replace Option<bool> with bool for PostQuery and CommentQuery (#3819) (#3857)
[lemmy.git] / crates / api / src / post / save.rs
1 use crate::Perform;
2 use actix_web::web::Data;
3 use lemmy_api_common::{
4   context::LemmyContext,
5   post::{PostResponse, SavePost},
6   utils::{local_user_view_from_jwt, mark_post_as_read},
7 };
8 use lemmy_db_schema::{
9   source::post::{PostSaved, PostSavedForm},
10   traits::Saveable,
11 };
12 use lemmy_db_views::structs::PostView;
13 use lemmy_utils::error::{LemmyError, LemmyErrorExt, LemmyErrorType};
14
15 #[async_trait::async_trait(?Send)]
16 impl Perform for SavePost {
17   type Response = PostResponse;
18
19   #[tracing::instrument(skip(context))]
20   async fn perform(&self, context: &Data<LemmyContext>) -> Result<PostResponse, LemmyError> {
21     let data: &SavePost = self;
22     let local_user_view = local_user_view_from_jwt(&data.auth, context).await?;
23
24     let post_saved_form = PostSavedForm {
25       post_id: data.post_id,
26       person_id: local_user_view.person.id,
27     };
28
29     if data.save {
30       PostSaved::save(&mut context.pool(), &post_saved_form)
31         .await
32         .with_lemmy_type(LemmyErrorType::CouldntSavePost)?;
33     } else {
34       PostSaved::unsave(&mut context.pool(), &post_saved_form)
35         .await
36         .with_lemmy_type(LemmyErrorType::CouldntSavePost)?;
37     }
38
39     let post_id = data.post_id;
40     let person_id = local_user_view.person.id;
41     let post_view = PostView::read(&mut context.pool(), post_id, Some(person_id), false).await?;
42
43     // Mark the post as read
44     mark_post_as_read(person_id, post_id, &mut context.pool()).await?;
45
46     Ok(PostResponse { post_view })
47   }
48 }