]> Untitled Git - lemmy.git/blob - crates/api_crud/src/user/read.rs
Split api crate into api_structs and api
[lemmy.git] / crates / api_crud / src / user / read.rs
1 use crate::PerformCrud;
2 use actix_web::web::Data;
3 use lemmy_api_common::{blocking, get_local_user_view_from_jwt_opt, person::*};
4 use lemmy_db_queries::{source::person::Person_, SortType};
5 use lemmy_db_schema::source::person::*;
6 use lemmy_db_views::{comment_view::CommentQueryBuilder, post_view::PostQueryBuilder};
7 use lemmy_db_views_actor::{
8   community_follower_view::CommunityFollowerView,
9   community_moderator_view::CommunityModeratorView,
10   person_view::PersonViewSafe,
11 };
12 use lemmy_utils::{ApiError, ConnectionId, LemmyError};
13 use lemmy_websocket::LemmyContext;
14 use std::str::FromStr;
15
16 #[async_trait::async_trait(?Send)]
17 impl PerformCrud for GetPersonDetails {
18   type Response = GetPersonDetailsResponse;
19
20   async fn perform(
21     &self,
22     context: &Data<LemmyContext>,
23     _websocket_id: Option<ConnectionId>,
24   ) -> Result<GetPersonDetailsResponse, LemmyError> {
25     let data: &GetPersonDetails = &self;
26     let local_user_view = get_local_user_view_from_jwt_opt(&data.auth, context.pool()).await?;
27
28     let show_nsfw = match &local_user_view {
29       Some(uv) => uv.local_user.show_nsfw,
30       None => false,
31     };
32
33     let sort = SortType::from_str(&data.sort)?;
34
35     let username = data
36       .username
37       .to_owned()
38       .unwrap_or_else(|| "admin".to_string());
39     let person_details_id = match data.person_id {
40       Some(id) => id,
41       None => {
42         let person = blocking(context.pool(), move |conn| {
43           Person::find_by_name(conn, &username)
44         })
45         .await?;
46         match person {
47           Ok(p) => p.id,
48           Err(_e) => return Err(ApiError::err("couldnt_find_that_username_or_email").into()),
49         }
50       }
51     };
52
53     let person_id = local_user_view.map(|uv| uv.person.id);
54
55     // You don't need to return settings for the user, since this comes back with GetSite
56     // `my_user`
57     let person_view = blocking(context.pool(), move |conn| {
58       PersonViewSafe::read(conn, person_details_id)
59     })
60     .await??;
61
62     let page = data.page;
63     let limit = data.limit;
64     let saved_only = data.saved_only;
65     let community_id = data.community_id;
66
67     let (posts, comments) = blocking(context.pool(), move |conn| {
68       let mut posts_query = PostQueryBuilder::create(conn)
69         .sort(&sort)
70         .show_nsfw(show_nsfw)
71         .saved_only(saved_only)
72         .community_id(community_id)
73         .my_person_id(person_id)
74         .page(page)
75         .limit(limit);
76
77       let mut comments_query = CommentQueryBuilder::create(conn)
78         .my_person_id(person_id)
79         .sort(&sort)
80         .saved_only(saved_only)
81         .community_id(community_id)
82         .page(page)
83         .limit(limit);
84
85       // If its saved only, you don't care what creator it was
86       // Or, if its not saved, then you only want it for that specific creator
87       if !saved_only {
88         posts_query = posts_query.creator_id(person_details_id);
89         comments_query = comments_query.creator_id(person_details_id);
90       }
91
92       let posts = posts_query.list()?;
93       let comments = comments_query.list()?;
94
95       Ok((posts, comments)) as Result<_, LemmyError>
96     })
97     .await??;
98
99     let mut follows = vec![];
100     if let Some(pid) = person_id {
101       if pid == person_details_id {
102         follows = blocking(context.pool(), move |conn| {
103           CommunityFollowerView::for_person(conn, person_details_id)
104         })
105         .await??;
106       }
107     };
108     let moderates = blocking(context.pool(), move |conn| {
109       CommunityModeratorView::for_person(conn, person_details_id)
110     })
111     .await??;
112
113     // Return the jwt
114     Ok(GetPersonDetailsResponse {
115       person_view,
116       follows,
117       moderates,
118       comments,
119       posts,
120     })
121   }
122 }