]> Untitled Git - lemmy.git/blob - crates/api_crud/src/post/read.rs
Add show_read_posts filter. Fixes #1561
[lemmy.git] / crates / api_crud / src / post / read.rs
1 use crate::PerformCrud;
2 use actix_web::web::Data;
3 use lemmy_api_common::{
4   blocking,
5   get_local_user_view_from_jwt_opt,
6   mark_post_as_read,
7   post::*,
8   user_show_bot_accounts,
9   user_show_nsfw,
10   user_show_read_posts,
11 };
12 use lemmy_db_queries::{ListingType, SortType};
13 use lemmy_db_views::{
14   comment_view::CommentQueryBuilder,
15   post_view::{PostQueryBuilder, PostView},
16 };
17 use lemmy_db_views_actor::{
18   community_moderator_view::CommunityModeratorView,
19   community_view::CommunityView,
20 };
21 use lemmy_utils::{ApiError, ConnectionId, LemmyError};
22 use lemmy_websocket::{messages::GetPostUsersOnline, LemmyContext};
23 use std::str::FromStr;
24
25 #[async_trait::async_trait(?Send)]
26 impl PerformCrud for GetPost {
27   type Response = GetPostResponse;
28
29   async fn perform(
30     &self,
31     context: &Data<LemmyContext>,
32     _websocket_id: Option<ConnectionId>,
33   ) -> Result<GetPostResponse, LemmyError> {
34     let data: &GetPost = &self;
35     let local_user_view = get_local_user_view_from_jwt_opt(&data.auth, context.pool()).await?;
36
37     let show_bot_accounts = user_show_bot_accounts(&local_user_view);
38
39     let person_id = local_user_view.map(|u| u.person.id);
40
41     let id = data.id;
42     let post_view = blocking(context.pool(), move |conn| {
43       PostView::read(conn, id, person_id)
44     })
45     .await?
46     .map_err(|_| ApiError::err("couldnt_find_post"))?;
47
48     // Mark the post as read
49     if let Some(person_id) = person_id {
50       mark_post_as_read(person_id, id, context.pool()).await?;
51     }
52
53     let id = data.id;
54     let comments = blocking(context.pool(), move |conn| {
55       CommentQueryBuilder::create(conn)
56         .my_person_id(person_id)
57         .show_bot_accounts(show_bot_accounts)
58         .post_id(id)
59         .limit(9999)
60         .list()
61     })
62     .await??;
63
64     let community_id = post_view.community.id;
65     let moderators = blocking(context.pool(), move |conn| {
66       CommunityModeratorView::for_community(conn, community_id)
67     })
68     .await??;
69
70     // Necessary for the sidebar
71     let community_view = blocking(context.pool(), move |conn| {
72       CommunityView::read(conn, community_id, person_id)
73     })
74     .await?
75     .map_err(|_| ApiError::err("couldnt_find_community"))?;
76
77     let online = context
78       .chat_server()
79       .send(GetPostUsersOnline { post_id: data.id })
80       .await
81       .unwrap_or(1);
82
83     // Return the jwt
84     Ok(GetPostResponse {
85       post_view,
86       community_view,
87       comments,
88       moderators,
89       online,
90     })
91   }
92 }
93
94 #[async_trait::async_trait(?Send)]
95 impl PerformCrud for GetPosts {
96   type Response = GetPostsResponse;
97
98   async fn perform(
99     &self,
100     context: &Data<LemmyContext>,
101     _websocket_id: Option<ConnectionId>,
102   ) -> Result<GetPostsResponse, LemmyError> {
103     let data: &GetPosts = &self;
104     let local_user_view = get_local_user_view_from_jwt_opt(&data.auth, context.pool()).await?;
105
106     let person_id = local_user_view.to_owned().map(|l| l.person.id);
107
108     let show_nsfw = user_show_nsfw(&local_user_view);
109     let show_bot_accounts = user_show_bot_accounts(&local_user_view);
110     let show_read_posts = user_show_read_posts(&local_user_view);
111
112     let type_ = ListingType::from_str(&data.type_)?;
113     let sort = SortType::from_str(&data.sort)?;
114
115     let page = data.page;
116     let limit = data.limit;
117     let community_id = data.community_id;
118     let community_name = data.community_name.to_owned();
119     let saved_only = data.saved_only;
120
121     let posts = blocking(context.pool(), move |conn| {
122       PostQueryBuilder::create(conn)
123         .listing_type(&type_)
124         .sort(&sort)
125         .show_nsfw(show_nsfw)
126         .show_bot_accounts(show_bot_accounts)
127         .show_read_posts(show_read_posts)
128         .community_id(community_id)
129         .community_name(community_name)
130         .saved_only(saved_only)
131         .my_person_id(person_id)
132         .page(page)
133         .limit(limit)
134         .list()
135     })
136     .await?
137     .map_err(|_| ApiError::err("couldnt_get_posts"))?;
138
139     Ok(GetPostsResponse { posts })
140   }
141 }