1 use crate::PerformCrud;
2 use actix_web::web::Data;
3 use lemmy_api_common::{
5 site::{CreateSite, GetSite, GetSiteResponse, MyUserInfo},
6 utils::{blocking, build_federated_instances, get_local_user_settings_view_from_jwt_opt},
8 use lemmy_db_schema::source::{actor_language::SiteLanguage, language::Language};
9 use lemmy_db_views::structs::{LocalUserDiscussionLanguageView, SiteView};
10 use lemmy_db_views_actor::structs::{
12 CommunityFollowerView,
13 CommunityModeratorView,
17 use lemmy_utils::{error::LemmyError, version, ConnectionId};
18 use lemmy_websocket::{messages::GetUsersOnline, LemmyContext};
21 #[async_trait::async_trait(?Send)]
22 impl PerformCrud for GetSite {
23 type Response = GetSiteResponse;
25 #[tracing::instrument(skip(context, websocket_id))]
28 context: &Data<LemmyContext>,
29 websocket_id: Option<ConnectionId>,
30 ) -> Result<GetSiteResponse, LemmyError> {
31 let data: &GetSite = self;
33 let site_view = match blocking(context.pool(), SiteView::read_local).await? {
34 Ok(site_view) => Some(site_view),
35 // If the site isn't created yet, check the setup
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.clone().map(|s| s.into()),
41 password: setup.admin_password.clone().into(),
42 password_verify: setup.admin_password.clone().into(),
49 let admin_jwt = register
50 .perform(context, websocket_id)
53 .expect("jwt is returned from registration on newly created site");
54 info!("Admin {} created", setup.admin_username);
56 let create_site = CreateSite {
57 name: setup.site_name.to_owned(),
59 ..CreateSite::default()
61 create_site.perform(context, websocket_id).await?;
62 info!("Site {} created", setup.site_name);
63 Some(blocking(context.pool(), SiteView::read_local).await??)
70 let admins = blocking(context.pool(), PersonViewSafe::admins).await??;
78 // Build the local user
79 let my_user = if let Some(local_user_view) = get_local_user_settings_view_from_jwt_opt(
86 let person_id = local_user_view.person.id;
87 let local_user_id = local_user_view.local_user.id;
89 let follows = blocking(context.pool(), move |conn| {
90 CommunityFollowerView::for_person(conn, person_id)
93 .map_err(|e| LemmyError::from_error_message(e, "system_err_login"))?;
95 let person_id = local_user_view.person.id;
96 let community_blocks = blocking(context.pool(), move |conn| {
97 CommunityBlockView::for_person(conn, person_id)
100 .map_err(|e| LemmyError::from_error_message(e, "system_err_login"))?;
102 let person_id = local_user_view.person.id;
103 let person_blocks = blocking(context.pool(), move |conn| {
104 PersonBlockView::for_person(conn, person_id)
107 .map_err(|e| LemmyError::from_error_message(e, "system_err_login"))?;
109 let moderates = blocking(context.pool(), move |conn| {
110 CommunityModeratorView::for_person(conn, person_id)
113 .map_err(|e| LemmyError::from_error_message(e, "system_err_login"))?;
115 let discussion_languages = blocking(context.pool(), move |conn| {
116 LocalUserDiscussionLanguageView::read_languages(conn, local_user_id)
119 .map_err(|e| LemmyError::from_error_message(e, "system_err_login"))?;
127 discussion_languages,
133 let federated_instances = build_federated_instances(context.pool(), context.settings()).await?;
135 let all_languages = blocking(context.pool(), Language::read_all).await??;
136 let discussion_languages = blocking(context.pool(), SiteLanguage::read_local).await??;
142 version: version::VERSION.to_string(),
146 discussion_languages,