]> Untitled Git - lemmy.git/blob - crates/api_crud/src/site/read.rs
Merge branch 'main' into feature/mark_post_as_read
[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   blocking,
5   build_federated_instances,
6   get_local_user_settings_view_from_jwt_opt,
7   person::Register,
8   site::*,
9 };
10 use lemmy_db_views::site_view::SiteView;
11 use lemmy_db_views_actor::person_view::PersonViewSafe;
12 use lemmy_utils::{settings::structs::Settings, version, ConnectionId, LemmyError};
13 use lemmy_websocket::{messages::GetUsersOnline, LemmyContext};
14 use log::info;
15
16 #[async_trait::async_trait(?Send)]
17 impl PerformCrud for GetSite {
18   type Response = GetSiteResponse;
19
20   async fn perform(
21     &self,
22     context: &Data<LemmyContext>,
23     websocket_id: Option<ConnectionId>,
24   ) -> Result<GetSiteResponse, LemmyError> {
25     let data: &GetSite = &self;
26
27     let site_view = match blocking(context.pool(), move |conn| SiteView::read(conn)).await? {
28       Ok(site_view) => Some(site_view),
29       // If the site isn't created yet, check the setup
30       Err(_) => {
31         if let Some(setup) = Settings::get().setup().as_ref() {
32           let register = Register {
33             username: setup.admin_username.to_owned(),
34             email: setup.admin_email.to_owned(),
35             password: setup.admin_password.to_owned(),
36             password_verify: setup.admin_password.to_owned(),
37             show_nsfw: true,
38             captcha_uuid: None,
39             captcha_answer: None,
40           };
41           let login_response = register.perform(context, websocket_id).await?;
42           info!("Admin {} created", setup.admin_username);
43
44           let create_site = CreateSite {
45             name: setup.site_name.to_owned(),
46             sidebar: None,
47             description: None,
48             icon: None,
49             banner: None,
50             enable_downvotes: None,
51             open_registration: None,
52             enable_nsfw: None,
53             auth: login_response.jwt,
54             community_creation_admin_only: None,
55           };
56           create_site.perform(context, websocket_id).await?;
57           info!("Site {} created", setup.site_name);
58           Some(blocking(context.pool(), move |conn| SiteView::read(conn)).await??)
59         } else {
60           None
61         }
62       }
63     };
64
65     let mut admins = blocking(context.pool(), move |conn| PersonViewSafe::admins(conn)).await??;
66
67     // Make sure the site creator is the top admin
68     if let Some(site_view) = site_view.to_owned() {
69       let site_creator_id = site_view.creator.id;
70       // TODO investigate why this is sometimes coming back null
71       // Maybe user_.admin isn't being set to true?
72       if let Some(creator_index) = admins.iter().position(|r| r.person.id == site_creator_id) {
73         let creator_person = admins.remove(creator_index);
74         admins.insert(0, creator_person);
75       }
76     }
77
78     let banned = blocking(context.pool(), move |conn| PersonViewSafe::banned(conn)).await??;
79
80     let online = context
81       .chat_server()
82       .send(GetUsersOnline)
83       .await
84       .unwrap_or(1);
85
86     let my_user = get_local_user_settings_view_from_jwt_opt(&data.auth, context.pool()).await?;
87     let federated_instances = build_federated_instances(context.pool()).await?;
88
89     Ok(GetSiteResponse {
90       site_view,
91       admins,
92       banned,
93       online,
94       version: version::VERSION.to_string(),
95       my_user,
96       federated_instances,
97     })
98   }
99 }