]> Untitled Git - lemmy.git/blob - crates/api_crud/src/site/read.rs
4368da99d3788a08974e9a1d2179e063784fd2f5
[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::{
26   claims::Claims,
27   error::{LemmyError, LemmyErrorExt, LemmyErrorType},
28   version,
29 };
30
31 #[async_trait::async_trait(?Send)]
32 impl PerformCrud for GetSite {
33   type Response = GetSiteResponse;
34
35   #[tracing::instrument(skip(context))]
36   async fn perform(&self, context: &Data<LemmyContext>) -> Result<GetSiteResponse, LemmyError> {
37     let data: &GetSite = self;
38
39     let site_view = SiteView::read_local(context.pool()).await?;
40
41     let admins = PersonView::admins(context.pool()).await?;
42
43     // Build the local user
44     let my_user = if let Some(local_user_view) =
45       local_user_settings_view_from_jwt_opt(data.auth.as_ref(), context).await
46     {
47       let person_id = local_user_view.person.id;
48       let local_user_id = local_user_view.local_user.id;
49
50       let follows = CommunityFollowerView::for_person(context.pool(), person_id)
51         .await
52         .with_lemmy_type(LemmyErrorType::SystemErrLogin)?;
53
54       let person_id = local_user_view.person.id;
55       let community_blocks = CommunityBlockView::for_person(context.pool(), person_id)
56         .await
57         .with_lemmy_type(LemmyErrorType::SystemErrLogin)?;
58
59       let person_id = local_user_view.person.id;
60       let person_blocks = PersonBlockView::for_person(context.pool(), person_id)
61         .await
62         .with_lemmy_type(LemmyErrorType::SystemErrLogin)?;
63
64       let moderates = CommunityModeratorView::for_person(context.pool(), person_id)
65         .await
66         .with_lemmy_type(LemmyErrorType::SystemErrLogin)?;
67
68       let discussion_languages = LocalUserLanguage::read(context.pool(), local_user_id)
69         .await
70         .with_lemmy_type(LemmyErrorType::SystemErrLogin)?;
71
72       Some(MyUserInfo {
73         local_user_view,
74         follows,
75         moderates,
76         community_blocks,
77         person_blocks,
78         discussion_languages,
79       })
80     } else {
81       None
82     };
83
84     let all_languages = Language::read_all(context.pool()).await?;
85     let discussion_languages = SiteLanguage::read_local_raw(context.pool()).await?;
86     let taglines = Tagline::get_all(context.pool(), site_view.local_site.id).await?;
87     let custom_emojis = CustomEmojiView::get_all(context.pool(), site_view.local_site.id).await?;
88
89     Ok(GetSiteResponse {
90       site_view,
91       admins,
92       version: version::VERSION.to_string(),
93       my_user,
94       all_languages,
95       discussion_languages,
96       taglines,
97       custom_emojis,
98     })
99   }
100 }
101
102 #[tracing::instrument(skip_all)]
103 async fn local_user_settings_view_from_jwt_opt(
104   jwt: Option<&Sensitive<String>>,
105   context: &LemmyContext,
106 ) -> Option<LocalUserView> {
107   match jwt {
108     Some(jwt) => {
109       let claims = Claims::decode(jwt.as_ref(), &context.secret().jwt_secret)
110         .ok()?
111         .claims;
112       let local_user_id = LocalUserId(claims.sub);
113       let local_user_view = LocalUserView::read(context.pool(), local_user_id)
114         .await
115         .ok()?;
116       check_user_valid(
117         local_user_view.person.banned,
118         local_user_view.person.ban_expires,
119         local_user_view.person.deleted,
120       )
121       .ok()?;
122
123       check_validator_time(&local_user_view.local_user.validator_time, &claims).ok()?;
124
125       Some(local_user_view)
126     }
127     None => None,
128   }
129 }