]> Untitled Git - lemmy.git/blob - crates/api_crud/src/site/read.rs
Add Custom Emojis Support (#2616)
[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 };
8 use lemmy_db_schema::source::{
9   actor_language::{LocalUserLanguage, SiteLanguage},
10   language::Language,
11   tagline::Tagline,
12 };
13 use lemmy_db_views::structs::{CustomEmojiView, SiteView};
14 use lemmy_db_views_actor::structs::{
15   CommunityBlockView,
16   CommunityFollowerView,
17   CommunityModeratorView,
18   PersonBlockView,
19   PersonView,
20 };
21 use lemmy_utils::{error::LemmyError, version, ConnectionId};
22
23 #[async_trait::async_trait(?Send)]
24 impl PerformCrud for GetSite {
25   type Response = GetSiteResponse;
26
27   #[tracing::instrument(skip(context, _websocket_id))]
28   async fn perform(
29     &self,
30     context: &Data<LemmyContext>,
31     _websocket_id: Option<ConnectionId>,
32   ) -> 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     let online = context.chat_server().get_users_online()?;
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 = CommunityFollowerView::for_person(context.pool(), person_id)
53         .await
54         .map_err(|e| LemmyError::from_error_message(e, "system_err_login"))?;
55
56       let person_id = local_user_view.person.id;
57       let community_blocks = CommunityBlockView::for_person(context.pool(), person_id)
58         .await
59         .map_err(|e| LemmyError::from_error_message(e, "system_err_login"))?;
60
61       let person_id = local_user_view.person.id;
62       let person_blocks = PersonBlockView::for_person(context.pool(), person_id)
63         .await
64         .map_err(|e| LemmyError::from_error_message(e, "system_err_login"))?;
65
66       let moderates = CommunityModeratorView::for_person(context.pool(), person_id)
67         .await
68         .map_err(|e| LemmyError::from_error_message(e, "system_err_login"))?;
69
70       let discussion_languages = LocalUserLanguage::read(context.pool(), local_user_id)
71         .await
72         .map_err(|e| LemmyError::from_error_message(e, "system_err_login"))?;
73
74       Some(MyUserInfo {
75         local_user_view,
76         follows,
77         moderates,
78         community_blocks,
79         person_blocks,
80         discussion_languages,
81       })
82     } else {
83       None
84     };
85
86     let federated_instances =
87       build_federated_instances(&site_view.local_site, context.pool()).await?;
88
89     let all_languages = Language::read_all(context.pool()).await?;
90     let discussion_languages = SiteLanguage::read_local(context.pool()).await?;
91     let taglines = Tagline::get_all(context.pool(), site_view.local_site.id).await?;
92     let custom_emojis = CustomEmojiView::get_all(context.pool(), site_view.local_site.id).await?;
93
94     Ok(GetSiteResponse {
95       site_view,
96       admins,
97       online,
98       version: version::VERSION.to_string(),
99       my_user,
100       federated_instances,
101       all_languages,
102       discussion_languages,
103       taglines,
104       custom_emojis,
105     })
106   }
107 }