]> Untitled Git - lemmy.git/blob - crates/api_crud/src/site/read.rs
Add SendActivity trait so that api crates compile in parallel with lemmy_apub
[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::messages::GetUsersOnline,
8 };
9 use lemmy_db_schema::source::{actor_language::SiteLanguage, language::Language, tagline::Tagline};
10 use lemmy_db_views::structs::{LocalUserDiscussionLanguageView, SiteView};
11 use lemmy_db_views_actor::structs::{
12   CommunityBlockView,
13   CommunityFollowerView,
14   CommunityModeratorView,
15   PersonBlockView,
16   PersonViewSafe,
17 };
18 use lemmy_utils::{error::LemmyError, version, ConnectionId};
19
20 #[async_trait::async_trait(?Send)]
21 impl PerformCrud for GetSite {
22   type Response = GetSiteResponse;
23
24   #[tracing::instrument(skip(context, _websocket_id))]
25   async fn perform(
26     &self,
27     context: &Data<LemmyContext>,
28     _websocket_id: Option<ConnectionId>,
29   ) -> Result<GetSiteResponse, LemmyError> {
30     let data: &GetSite = self;
31
32     let site_view = SiteView::read_local(context.pool()).await?;
33
34     let admins = PersonViewSafe::admins(context.pool()).await?;
35
36     let online = context
37       .chat_server()
38       .send(GetUsersOnline)
39       .await
40       .unwrap_or(1);
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 =
72         LocalUserDiscussionLanguageView::read_languages(context.pool(), local_user_id)
73           .await
74           .map_err(|e| LemmyError::from_error_message(e, "system_err_login"))?;
75
76       Some(MyUserInfo {
77         local_user_view,
78         follows,
79         moderates,
80         community_blocks,
81         person_blocks,
82         discussion_languages,
83       })
84     } else {
85       None
86     };
87
88     let federated_instances =
89       build_federated_instances(&site_view.local_site, context.pool()).await?;
90
91     let all_languages = Language::read_all(context.pool()).await?;
92     let discussion_languages = SiteLanguage::read_local(context.pool()).await?;
93     let taglines_res = Tagline::get_all(context.pool(), site_view.local_site.id).await?;
94     let taglines = (!taglines_res.is_empty()).then_some(taglines_res);
95
96     Ok(GetSiteResponse {
97       site_view,
98       admins,
99       online,
100       version: version::VERSION.to_string(),
101       my_user,
102       federated_instances,
103       all_languages,
104       discussion_languages,
105       taglines,
106     })
107   }
108 }