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