]> Untitled Git - lemmy.git/blob - crates/api_crud/src/site/read.rs
add enable_federated_downvotes site option
[lemmy.git] / crates / api_crud / src / site / read.rs
1 use actix_web::web::{Data, Json, Query};
2 use lemmy_api_common::{
3   context::LemmyContext,
4   sensitive::Sensitive,
5   site::{GetSite, GetSiteResponse, MyUserInfo},
6   utils::{check_user_valid, check_validator_time},
7 };
8 use lemmy_db_schema::{
9   newtypes::LocalUserId,
10   source::{
11     actor_language::{LocalUserLanguage, SiteLanguage},
12     language::Language,
13     tagline::Tagline,
14   },
15 };
16 use lemmy_db_views::structs::{CustomEmojiView, LocalUserView, SiteView};
17 use lemmy_db_views_actor::structs::{
18   CommunityBlockView,
19   CommunityFollowerView,
20   CommunityModeratorView,
21   PersonBlockView,
22   PersonView,
23 };
24 use lemmy_utils::{
25   claims::Claims,
26   error::{LemmyError, LemmyErrorExt, LemmyErrorType},
27   version,
28 };
29
30 #[tracing::instrument(skip(context))]
31 pub async fn get_site(
32   data: Query<GetSite>,
33   context: Data<LemmyContext>,
34 ) -> Result<Json<GetSiteResponse>, LemmyError> {
35   let site_view = SiteView::read_local(&mut context.pool()).await?;
36
37   let admins = PersonView::admins(&mut 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(&mut context.pool(), person_id)
47       .await
48       .with_lemmy_type(LemmyErrorType::SystemErrLogin)?;
49
50     let person_id = local_user_view.person.id;
51     let community_blocks = CommunityBlockView::for_person(&mut context.pool(), person_id)
52       .await
53       .with_lemmy_type(LemmyErrorType::SystemErrLogin)?;
54
55     let person_id = local_user_view.person.id;
56     let person_blocks = PersonBlockView::for_person(&mut context.pool(), person_id)
57       .await
58       .with_lemmy_type(LemmyErrorType::SystemErrLogin)?;
59
60     let moderates = CommunityModeratorView::for_person(&mut context.pool(), person_id)
61       .await
62       .with_lemmy_type(LemmyErrorType::SystemErrLogin)?;
63
64     let discussion_languages = LocalUserLanguage::read(&mut context.pool(), local_user_id)
65       .await
66       .with_lemmy_type(LemmyErrorType::SystemErrLogin)?;
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(&mut context.pool()).await?;
81   let discussion_languages = SiteLanguage::read_local_raw(&mut context.pool()).await?;
82   let taglines = Tagline::get_all(&mut context.pool(), site_view.local_site.id).await?;
83   let custom_emojis =
84     CustomEmojiView::get_all(&mut context.pool(), site_view.local_site.id).await?;
85
86   Ok(Json(GetSiteResponse {
87     site_view,
88     admins,
89     version: version::VERSION.to_string(),
90     my_user,
91     all_languages,
92     discussion_languages,
93     taglines,
94     custom_emojis,
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(&mut 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 }