]> Untitled Git - lemmy.git/blobdiff - crates/api_crud/src/site/read.rs
Make functions work with both connection and pool (#3420)
[lemmy.git] / crates / api_crud / src / site / read.rs
index db386921e961a7b81276f7e67300fb2c3df4eb53..e74eeefbdf2d8cfd4cd8da743c7e9216a3b53842 100644 (file)
@@ -2,74 +2,72 @@ use crate::PerformCrud;
 use actix_web::web::Data;
 use lemmy_api_common::{
   context::LemmyContext,
+  sensitive::Sensitive,
   site::{GetSite, GetSiteResponse, MyUserInfo},
-  utils::{build_federated_instances, get_local_user_settings_view_from_jwt_opt},
+  utils::{check_user_valid, check_validator_time},
 };
-use lemmy_db_schema::source::{
-  actor_language::{LocalUserLanguage, SiteLanguage},
-  language::Language,
-  tagline::Tagline,
+use lemmy_db_schema::{
+  newtypes::LocalUserId,
+  source::{
+    actor_language::{LocalUserLanguage, SiteLanguage},
+    language::Language,
+    tagline::Tagline,
+  },
 };
-use lemmy_db_views::structs::SiteView;
+use lemmy_db_views::structs::{CustomEmojiView, LocalUserView, SiteView};
 use lemmy_db_views_actor::structs::{
   CommunityBlockView,
   CommunityFollowerView,
   CommunityModeratorView,
   PersonBlockView,
-  PersonViewSafe,
+  PersonView,
+};
+use lemmy_utils::{
+  claims::Claims,
+  error::{LemmyError, LemmyErrorExt, LemmyErrorType},
+  version,
 };
-use lemmy_utils::{error::LemmyError, version, ConnectionId};
 
 #[async_trait::async_trait(?Send)]
 impl PerformCrud for GetSite {
   type Response = GetSiteResponse;
 
-  #[tracing::instrument(skip(context, _websocket_id))]
-  async fn perform(
-    &self,
-    context: &Data<LemmyContext>,
-    _websocket_id: Option<ConnectionId>,
-  ) -> Result<GetSiteResponse, LemmyError> {
+  #[tracing::instrument(skip(context))]
+  async fn perform(&self, context: &Data<LemmyContext>) -> Result<GetSiteResponse, LemmyError> {
     let data: &GetSite = self;
 
-    let site_view = SiteView::read_local(context.pool()).await?;
-
-    let admins = PersonViewSafe::admins(context.pool()).await?;
+    let site_view = SiteView::read_local(&mut context.pool()).await?;
 
-    let online = context.chat_server().get_users_online()?;
+    let admins = PersonView::admins(&mut context.pool()).await?;
 
     // Build the local user
-    let my_user = if let Some(local_user_view) = get_local_user_settings_view_from_jwt_opt(
-      data.auth.as_ref(),
-      context.pool(),
-      context.secret(),
-    )
-    .await?
+    let my_user = if let Some(local_user_view) =
+      local_user_settings_view_from_jwt_opt(data.auth.as_ref(), context).await
     {
       let person_id = local_user_view.person.id;
       let local_user_id = local_user_view.local_user.id;
 
-      let follows = CommunityFollowerView::for_person(context.pool(), person_id)
+      let follows = CommunityFollowerView::for_person(&mut context.pool(), person_id)
         .await
-        .map_err(|e| LemmyError::from_error_message(e, "system_err_login"))?;
+        .with_lemmy_type(LemmyErrorType::SystemErrLogin)?;
 
       let person_id = local_user_view.person.id;
-      let community_blocks = CommunityBlockView::for_person(context.pool(), person_id)
+      let community_blocks = CommunityBlockView::for_person(&mut context.pool(), person_id)
         .await
-        .map_err(|e| LemmyError::from_error_message(e, "system_err_login"))?;
+        .with_lemmy_type(LemmyErrorType::SystemErrLogin)?;
 
       let person_id = local_user_view.person.id;
-      let person_blocks = PersonBlockView::for_person(context.pool(), person_id)
+      let person_blocks = PersonBlockView::for_person(&mut context.pool(), person_id)
         .await
-        .map_err(|e| LemmyError::from_error_message(e, "system_err_login"))?;
+        .with_lemmy_type(LemmyErrorType::SystemErrLogin)?;
 
-      let moderates = CommunityModeratorView::for_person(context.pool(), person_id)
+      let moderates = CommunityModeratorView::for_person(&mut context.pool(), person_id)
         .await
-        .map_err(|e| LemmyError::from_error_message(e, "system_err_login"))?;
+        .with_lemmy_type(LemmyErrorType::SystemErrLogin)?;
 
-      let discussion_languages = LocalUserLanguage::read(context.pool(), local_user_id)
+      let discussion_languages = LocalUserLanguage::read(&mut context.pool(), local_user_id)
         .await
-        .map_err(|e| LemmyError::from_error_message(e, "system_err_login"))?;
+        .with_lemmy_type(LemmyErrorType::SystemErrLogin)?;
 
       Some(MyUserInfo {
         local_user_view,
@@ -83,24 +81,50 @@ impl PerformCrud for GetSite {
       None
     };
 
-    let federated_instances =
-      build_federated_instances(&site_view.local_site, context.pool()).await?;
-
-    let all_languages = Language::read_all(context.pool()).await?;
-    let discussion_languages = SiteLanguage::read_local(context.pool()).await?;
-    let taglines_res = Tagline::get_all(context.pool(), site_view.local_site.id).await?;
-    let taglines = (!taglines_res.is_empty()).then_some(taglines_res);
+    let all_languages = Language::read_all(&mut context.pool()).await?;
+    let discussion_languages = SiteLanguage::read_local_raw(&mut context.pool()).await?;
+    let taglines = Tagline::get_all(&mut context.pool(), site_view.local_site.id).await?;
+    let custom_emojis =
+      CustomEmojiView::get_all(&mut context.pool(), site_view.local_site.id).await?;
 
     Ok(GetSiteResponse {
       site_view,
       admins,
-      online,
       version: version::VERSION.to_string(),
       my_user,
-      federated_instances,
       all_languages,
       discussion_languages,
       taglines,
+      custom_emojis,
     })
   }
 }
+
+#[tracing::instrument(skip_all)]
+async fn local_user_settings_view_from_jwt_opt(
+  jwt: Option<&Sensitive<String>>,
+  context: &LemmyContext,
+) -> Option<LocalUserView> {
+  match jwt {
+    Some(jwt) => {
+      let claims = Claims::decode(jwt.as_ref(), &context.secret().jwt_secret)
+        .ok()?
+        .claims;
+      let local_user_id = LocalUserId(claims.sub);
+      let local_user_view = LocalUserView::read(&mut context.pool(), local_user_id)
+        .await
+        .ok()?;
+      check_user_valid(
+        local_user_view.person.banned,
+        local_user_view.person.ban_expires,
+        local_user_view.person.deleted,
+      )
+      .ok()?;
+
+      check_validator_time(&local_user_view.local_user.validator_time, &claims).ok()?;
+
+      Some(local_user_view)
+    }
+    None => None,
+  }
+}