]> Untitled Git - lemmy.git/blob - crates/api_crud/src/site/read.rs
Moving settings to Database. (#2492)
[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   site::{GetSite, GetSiteResponse, MyUserInfo},
5   utils::{blocking, build_federated_instances, get_local_user_settings_view_from_jwt_opt},
6 };
7 use lemmy_db_schema::source::{actor_language::SiteLanguage, language::Language};
8 use lemmy_db_views::structs::{LocalUserDiscussionLanguageView, SiteView};
9 use lemmy_db_views_actor::structs::{
10   CommunityBlockView,
11   CommunityFollowerView,
12   CommunityModeratorView,
13   PersonBlockView,
14   PersonViewSafe,
15 };
16 use lemmy_utils::{error::LemmyError, version, ConnectionId};
17 use lemmy_websocket::{messages::GetUsersOnline, LemmyContext};
18
19 #[async_trait::async_trait(?Send)]
20 impl PerformCrud for GetSite {
21   type Response = GetSiteResponse;
22
23   #[tracing::instrument(skip(context, _websocket_id))]
24   async fn perform(
25     &self,
26     context: &Data<LemmyContext>,
27     _websocket_id: Option<ConnectionId>,
28   ) -> Result<GetSiteResponse, LemmyError> {
29     let data: &GetSite = self;
30
31     let site_view = blocking(context.pool(), SiteView::read_local).await??;
32
33     let admins = blocking(context.pool(), PersonViewSafe::admins).await??;
34
35     let online = context
36       .chat_server()
37       .send(GetUsersOnline)
38       .await
39       .unwrap_or(1);
40
41     // Build the local user
42     let my_user = if let Some(local_user_view) = get_local_user_settings_view_from_jwt_opt(
43       data.auth.as_ref(),
44       context.pool(),
45       context.secret(),
46     )
47     .await?
48     {
49       let person_id = local_user_view.person.id;
50       let local_user_id = local_user_view.local_user.id;
51
52       let follows = blocking(context.pool(), move |conn| {
53         CommunityFollowerView::for_person(conn, person_id)
54       })
55       .await?
56       .map_err(|e| LemmyError::from_error_message(e, "system_err_login"))?;
57
58       let person_id = local_user_view.person.id;
59       let community_blocks = blocking(context.pool(), move |conn| {
60         CommunityBlockView::for_person(conn, person_id)
61       })
62       .await?
63       .map_err(|e| LemmyError::from_error_message(e, "system_err_login"))?;
64
65       let person_id = local_user_view.person.id;
66       let person_blocks = blocking(context.pool(), move |conn| {
67         PersonBlockView::for_person(conn, person_id)
68       })
69       .await?
70       .map_err(|e| LemmyError::from_error_message(e, "system_err_login"))?;
71
72       let moderates = blocking(context.pool(), move |conn| {
73         CommunityModeratorView::for_person(conn, person_id)
74       })
75       .await?
76       .map_err(|e| LemmyError::from_error_message(e, "system_err_login"))?;
77
78       let discussion_languages = blocking(context.pool(), move |conn| {
79         LocalUserDiscussionLanguageView::read_languages(conn, local_user_id)
80       })
81       .await?
82       .map_err(|e| LemmyError::from_error_message(e, "system_err_login"))?;
83
84       Some(MyUserInfo {
85         local_user_view,
86         follows,
87         moderates,
88         community_blocks,
89         person_blocks,
90         discussion_languages,
91       })
92     } else {
93       None
94     };
95
96     let federated_instances =
97       build_federated_instances(&site_view.local_site, context.pool()).await?;
98
99     let all_languages = blocking(context.pool(), Language::read_all).await??;
100     let discussion_languages = blocking(context.pool(), SiteLanguage::read_local).await??;
101
102     Ok(GetSiteResponse {
103       site_view,
104       admins,
105       online,
106       version: version::VERSION.to_string(),
107       my_user,
108       federated_instances,
109       all_languages,
110       discussion_languages,
111     })
112   }
113 }