]> Untitled Git - lemmy.git/blob - crates/api_crud/src/site/read.rs
2668939ef7f0ad2a83f526835e207266210e1801
[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::{
12   community_block_view::CommunityBlockView,
13   community_follower_view::CommunityFollowerView,
14   community_moderator_view::CommunityModeratorView,
15   person_block_view::PersonBlockView,
16   person_view::PersonViewSafe,
17 };
18 use lemmy_utils::{version, ApiError, ConnectionId, LemmyError};
19 use lemmy_websocket::{messages::GetUsersOnline, LemmyContext};
20 use log::info;
21
22 #[async_trait::async_trait(?Send)]
23 impl PerformCrud for GetSite {
24   type Response = GetSiteResponse;
25
26   async fn perform(
27     &self,
28     context: &Data<LemmyContext>,
29     websocket_id: Option<ConnectionId>,
30   ) -> Result<GetSiteResponse, LemmyError> {
31     let data: &GetSite = self;
32
33     let site_view = match blocking(context.pool(), move |conn| SiteView::read(conn)).await? {
34       Ok(site_view) => Some(site_view),
35       // If the site isn't created yet, check the setup
36       Err(_) => {
37         if let Some(setup) = context.settings().setup.as_ref() {
38           let register = Register {
39             username: setup.admin_username.to_owned(),
40             email: setup.admin_email.to_owned(),
41             password: setup.admin_password.to_owned(),
42             password_verify: setup.admin_password.to_owned(),
43             show_nsfw: true,
44             captcha_uuid: None,
45             captcha_answer: None,
46             honeypot: None,
47           };
48           let login_response = register.perform(context, websocket_id).await?;
49           info!("Admin {} created", setup.admin_username);
50
51           let create_site = CreateSite {
52             name: setup.site_name.to_owned(),
53             sidebar: setup.sidebar.to_owned(),
54             description: setup.description.to_owned(),
55             icon: setup.icon.to_owned(),
56             banner: setup.banner.to_owned(),
57             enable_downvotes: setup.enable_downvotes,
58             open_registration: setup.open_registration,
59             enable_nsfw: setup.enable_nsfw,
60             community_creation_admin_only: setup.community_creation_admin_only,
61             auth: login_response.jwt,
62           };
63           create_site.perform(context, websocket_id).await?;
64           info!("Site {} created", setup.site_name);
65           Some(blocking(context.pool(), move |conn| SiteView::read(conn)).await??)
66         } else {
67           None
68         }
69       }
70     };
71
72     let mut admins = blocking(context.pool(), move |conn| PersonViewSafe::admins(conn)).await??;
73
74     // Make sure the site creator is the top admin
75     if let Some(site_view) = site_view.to_owned() {
76       let site_creator_id = site_view.creator.id;
77       // TODO investigate why this is sometimes coming back null
78       // Maybe user_.admin isn't being set to true?
79       if let Some(creator_index) = admins.iter().position(|r| r.person.id == site_creator_id) {
80         let creator_person = admins.remove(creator_index);
81         admins.insert(0, creator_person);
82       }
83     }
84
85     let banned = blocking(context.pool(), move |conn| PersonViewSafe::banned(conn)).await??;
86
87     let online = context
88       .chat_server()
89       .send(GetUsersOnline)
90       .await
91       .unwrap_or(1);
92
93     // Build the local user
94     let my_user = if let Some(local_user_view) =
95       get_local_user_settings_view_from_jwt_opt(&data.auth, context.pool(), context.secret())
96         .await?
97     {
98       let person_id = local_user_view.person.id;
99       let follows = blocking(context.pool(), move |conn| {
100         CommunityFollowerView::for_person(conn, person_id)
101       })
102       .await?
103       .map_err(|_| ApiError::err("system_err_login"))?;
104
105       let person_id = local_user_view.person.id;
106       let community_blocks = blocking(context.pool(), move |conn| {
107         CommunityBlockView::for_person(conn, person_id)
108       })
109       .await?
110       .map_err(|_| ApiError::err("system_err_login"))?;
111
112       let person_id = local_user_view.person.id;
113       let person_blocks = blocking(context.pool(), move |conn| {
114         PersonBlockView::for_person(conn, person_id)
115       })
116       .await?
117       .map_err(|_| ApiError::err("system_err_login"))?;
118
119       let moderates = blocking(context.pool(), move |conn| {
120         CommunityModeratorView::for_person(conn, person_id)
121       })
122       .await?
123       .map_err(|_| ApiError::err("system_err_login"))?;
124
125       Some(MyUserInfo {
126         local_user_view,
127         follows,
128         moderates,
129         community_blocks,
130         person_blocks,
131       })
132     } else {
133       None
134     };
135
136     let federated_instances = build_federated_instances(
137       context.pool(),
138       &context.settings().federation,
139       &context.settings().hostname,
140     )
141     .await?;
142
143     Ok(GetSiteResponse {
144       site_view,
145       admins,
146       banned,
147       online,
148       version: version::VERSION.to_string(),
149       my_user,
150       federated_instances,
151     })
152   }
153 }