]> Untitled Git - lemmy.git/blobdiff - crates/api_crud/src/comment/list.rs
Moving settings to Database. (#2492)
[lemmy.git] / crates / api_crud / src / comment / list.rs
index ab9e25f1575c635130a5be1e069931da32e78467..9ab7d6d0247d373abf2d2a664387d1e40c9554ca 100644 (file)
@@ -2,16 +2,20 @@ use crate::PerformCrud;
 use actix_web::web::Data;
 use lemmy_api_common::{
   comment::{GetComments, GetCommentsResponse},
-  utils::{blocking, check_private_instance, get_local_user_view_from_jwt_opt},
+  utils::{
+    blocking,
+    check_private_instance,
+    get_local_user_view_from_jwt_opt,
+    listing_type_with_site_default,
+  },
 };
 use lemmy_apub::{fetcher::resolve_actor_identifier, objects::community::ApubCommunity};
 use lemmy_db_schema::{
-  source::community::Community,
-  traits::DeleteableOrRemoveable,
-  utils::{from_opt_str_to_opt_enum, ListingType, SortType},
+  source::{comment::Comment, community::Community, local_site::LocalSite},
+  traits::{Crud, DeleteableOrRemoveable},
 };
-use lemmy_db_views::comment_view::CommentQueryBuilder;
-use lemmy_utils::{ConnectionId, LemmyError};
+use lemmy_db_views::comment_view::CommentQuery;
+use lemmy_utils::{error::LemmyError, ConnectionId};
 use lemmy_websocket::LemmyContext;
 
 #[async_trait::async_trait(?Send)]
@@ -28,40 +32,56 @@ impl PerformCrud for GetComments {
     let local_user_view =
       get_local_user_view_from_jwt_opt(data.auth.as_ref(), context.pool(), context.secret())
         .await?;
-
-    check_private_instance(&local_user_view, context.pool()).await?;
-
-    let show_bot_accounts = local_user_view
-      .as_ref()
-      .map(|t| t.local_user.show_bot_accounts);
-    let person_id = local_user_view.map(|u| u.person.id);
-
-    let sort: Option<SortType> = from_opt_str_to_opt_enum(&data.sort);
-    let listing_type: Option<ListingType> = from_opt_str_to_opt_enum(&data.type_);
+    let local_site = blocking(context.pool(), LocalSite::read).await??;
+    check_private_instance(&local_user_view, &local_site)?;
 
     let community_id = data.community_id;
+    let listing_type = listing_type_with_site_default(data.type_, &local_site)?;
+
     let community_actor_id = if let Some(name) = &data.community_name {
-      resolve_actor_identifier::<ApubCommunity, Community>(name, context)
+      resolve_actor_identifier::<ApubCommunity, Community>(name, context, true)
         .await
         .ok()
         .map(|c| c.actor_id)
     } else {
       None
     };
+    let sort = data.sort;
+    let max_depth = data.max_depth;
     let saved_only = data.saved_only;
     let page = data.page;
     let limit = data.limit;
+    let parent_id = data.parent_id;
+
+    // If a parent_id is given, fetch the comment to get the path
+    let parent_path = if let Some(parent_id) = parent_id {
+      Some(
+        blocking(context.pool(), move |conn| Comment::read(conn, parent_id))
+          .await??
+          .path,
+      )
+    } else {
+      None
+    };
+
+    let parent_path_cloned = parent_path.to_owned();
+    let post_id = data.post_id;
+    let local_user = local_user_view.map(|l| l.local_user);
     let mut comments = blocking(context.pool(), move |conn| {
-      CommentQueryBuilder::create(conn)
-        .listing_type(listing_type)
+      CommentQuery::builder()
+        .conn(conn)
+        .listing_type(Some(listing_type))
         .sort(sort)
+        .max_depth(max_depth)
         .saved_only(saved_only)
         .community_id(community_id)
         .community_actor_id(community_actor_id)
-        .my_person_id(person_id)
-        .show_bot_accounts(show_bot_accounts)
+        .parent_path(parent_path_cloned)
+        .post_id(post_id)
+        .local_user(local_user.as_ref())
         .page(page)
         .limit(limit)
+        .build()
         .list()
     })
     .await?