]> Untitled Git - lemmy.git/blob - crates/api_crud/src/site/read.rs
Remove chatserver (#2919)
[lemmy.git] / crates / api_crud / src / site / read.rs
1 use crate::PerformCrud;
2 use actix_web::web::Data;
3 use lemmy_api_common::{
4   context::LemmyContext,
5   sensitive::Sensitive,
6   site::{GetSite, GetSiteResponse, MyUserInfo},
7   utils::{check_user_valid, check_validator_time},
8 };
9 use lemmy_db_schema::{
10   newtypes::LocalUserId,
11   source::{
12     actor_language::{LocalUserLanguage, SiteLanguage},
13     language::Language,
14     tagline::Tagline,
15   },
16 };
17 use lemmy_db_views::structs::{CustomEmojiView, LocalUserView, SiteView};
18 use lemmy_db_views_actor::structs::{
19   CommunityBlockView,
20   CommunityFollowerView,
21   CommunityModeratorView,
22   PersonBlockView,
23   PersonView,
24 };
25 use lemmy_utils::{claims::Claims, error::LemmyError, version};
26
27 #[async_trait::async_trait(?Send)]
28 impl PerformCrud for GetSite {
29   type Response = GetSiteResponse;
30
31   #[tracing::instrument(skip(context))]
32   async fn perform(&self, context: &Data<LemmyContext>) -> Result<GetSiteResponse, LemmyError> {
33     let data: &GetSite = self;
34
35     let site_view = SiteView::read_local(context.pool()).await?;
36
37     let admins = PersonView::admins(context.pool()).await?;
38
39     // Build the local user
40     let my_user = if let Some(local_user_view) =
41       local_user_settings_view_from_jwt_opt(data.auth.as_ref(), context).await
42     {
43       let person_id = local_user_view.person.id;
44       let local_user_id = local_user_view.local_user.id;
45
46       let follows = CommunityFollowerView::for_person(context.pool(), person_id)
47         .await
48         .map_err(|e| LemmyError::from_error_message(e, "system_err_login"))?;
49
50       let person_id = local_user_view.person.id;
51       let community_blocks = CommunityBlockView::for_person(context.pool(), person_id)
52         .await
53         .map_err(|e| LemmyError::from_error_message(e, "system_err_login"))?;
54
55       let person_id = local_user_view.person.id;
56       let person_blocks = PersonBlockView::for_person(context.pool(), person_id)
57         .await
58         .map_err(|e| LemmyError::from_error_message(e, "system_err_login"))?;
59
60       let moderates = CommunityModeratorView::for_person(context.pool(), person_id)
61         .await
62         .map_err(|e| LemmyError::from_error_message(e, "system_err_login"))?;
63
64       let discussion_languages = LocalUserLanguage::read(context.pool(), local_user_id)
65         .await
66         .map_err(|e| LemmyError::from_error_message(e, "system_err_login"))?;
67
68       Some(MyUserInfo {
69         local_user_view,
70         follows,
71         moderates,
72         community_blocks,
73         person_blocks,
74         discussion_languages,
75       })
76     } else {
77       None
78     };
79
80     let all_languages = Language::read_all(context.pool()).await?;
81     let discussion_languages = SiteLanguage::read_local_raw(context.pool()).await?;
82     let taglines = Tagline::get_all(context.pool(), site_view.local_site.id).await?;
83     let custom_emojis = CustomEmojiView::get_all(context.pool(), site_view.local_site.id).await?;
84
85     Ok(GetSiteResponse {
86       site_view,
87       admins,
88       version: version::VERSION.to_string(),
89       my_user,
90       all_languages,
91       discussion_languages,
92       taglines,
93       custom_emojis,
94     })
95   }
96 }
97
98 #[tracing::instrument(skip_all)]
99 async fn local_user_settings_view_from_jwt_opt(
100   jwt: Option<&Sensitive<String>>,
101   context: &LemmyContext,
102 ) -> Option<LocalUserView> {
103   match jwt {
104     Some(jwt) => {
105       let claims = Claims::decode(jwt.as_ref(), &context.secret().jwt_secret)
106         .ok()?
107         .claims;
108       let local_user_id = LocalUserId(claims.sub);
109       let local_user_view = LocalUserView::read(context.pool(), local_user_id)
110         .await
111         .ok()?;
112       check_user_valid(
113         local_user_view.person.banned,
114         local_user_view.person.ban_expires,
115         local_user_view.person.deleted,
116       )
117       .ok()?;
118
119       check_validator_time(&local_user_view.local_user.validator_time, &claims).ok()?;
120
121       Some(local_user_view)
122     }
123     None => None,
124   }
125 }