1 use crate::PerformCrud;
2 use actix_web::web::Data;
3 use lemmy_api_common::{
5 get_local_user_view_from_jwt_opt,
8 user_show_bot_accounts,
12 use lemmy_db_queries::{ListingType, SortType};
14 comment_view::CommentQueryBuilder,
15 post_view::{PostQueryBuilder, PostView},
17 use lemmy_db_views_actor::{
18 community_moderator_view::CommunityModeratorView,
19 community_view::CommunityView,
21 use lemmy_utils::{ApiError, ConnectionId, LemmyError};
22 use lemmy_websocket::{messages::GetPostUsersOnline, LemmyContext};
23 use std::str::FromStr;
25 #[async_trait::async_trait(?Send)]
26 impl PerformCrud for GetPost {
27 type Response = GetPostResponse;
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?;
37 let show_bot_accounts = user_show_bot_accounts(&local_user_view);
39 let person_id = local_user_view.map(|u| u.person.id);
42 let post_view = blocking(context.pool(), move |conn| {
43 PostView::read(conn, id, person_id)
46 .map_err(|_| ApiError::err("couldnt_find_post"))?;
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?;
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)
64 let community_id = post_view.community.id;
65 let moderators = blocking(context.pool(), move |conn| {
66 CommunityModeratorView::for_community(conn, community_id)
70 // Necessary for the sidebar
71 let community_view = blocking(context.pool(), move |conn| {
72 CommunityView::read(conn, community_id, person_id)
75 .map_err(|_| ApiError::err("couldnt_find_community"))?;
79 .send(GetPostUsersOnline { post_id: data.id })
94 #[async_trait::async_trait(?Send)]
95 impl PerformCrud for GetPosts {
96 type Response = GetPostsResponse;
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?;
106 let person_id = local_user_view.to_owned().map(|l| l.person.id);
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);
112 let type_ = ListingType::from_str(&data.type_)?;
113 let sort = SortType::from_str(&data.sort)?;
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;
121 let posts = blocking(context.pool(), move |conn| {
122 PostQueryBuilder::create(conn)
123 .listing_type(&type_)
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)
137 .map_err(|_| ApiError::err("couldnt_get_posts"))?;
139 Ok(GetPostsResponse { posts })