X-Git-Url: http://these/git/?a=blobdiff_plain;f=crates%2Fapub%2Fsrc%2Fapi%2Flist_comments.rs;h=5d7aa387bbab8b0fb1741b0a79ea26f39719ee37;hb=c8063f3267cf2b3622f1fdc69128c6b55feefbbc;hp=c4af6900aa3c7d1102326706c96bb24077488429;hpb=f02892b23b865e4e29b04c441754f87b4522077d;p=lemmy.git diff --git a/crates/apub/src/api/list_comments.rs b/crates/apub/src/api/list_comments.rs index c4af6900..5d7aa387 100644 --- a/crates/apub/src/api/list_comments.rs +++ b/crates/apub/src/api/list_comments.rs @@ -1,96 +1,84 @@ use crate::{ - api::PerformApub, + api::listing_type_with_default, fetcher::resolve_actor_identifier, objects::community::ApubCommunity, }; -use actix_web::web::Data; +use activitypub_federation::config::Data; +use actix_web::web::{Json, Query}; use lemmy_api_common::{ comment::{GetComments, GetCommentsResponse}, context::LemmyContext, - utils::{ - check_private_instance, - get_local_user_view_from_jwt_opt, - listing_type_with_site_default, - }, + utils::{check_private_instance, local_user_view_from_jwt_opt}, }; use lemmy_db_schema::{ source::{comment::Comment, community::Community, local_site::LocalSite}, - traits::{Crud, DeleteableOrRemoveable}, + traits::Crud, }; use lemmy_db_views::comment_view::CommentQuery; -use lemmy_utils::{error::LemmyError, ConnectionId}; +use lemmy_utils::error::{LemmyError, LemmyErrorExt, LemmyErrorType}; -#[async_trait::async_trait(?Send)] -impl PerformApub for GetComments { - type Response = GetCommentsResponse; +#[tracing::instrument(skip(context))] +pub async fn list_comments( + data: Query, + context: Data, +) -> Result, LemmyError> { + let local_user_view = local_user_view_from_jwt_opt(data.auth.as_ref(), &context).await; + let local_site = LocalSite::read(&mut context.pool()).await?; + check_private_instance(&local_user_view, &local_site)?; - #[tracing::instrument(skip(context, _websocket_id))] - async fn perform( - &self, - context: &Data, - _websocket_id: Option, - ) -> Result { - let data: &GetComments = self; - let local_user_view = - get_local_user_view_from_jwt_opt(data.auth.as_ref(), context.pool(), context.secret()) - .await?; - let local_site = LocalSite::read(context.pool()).await?; - check_private_instance(&local_user_view, &local_site)?; + let community_id = if let Some(name) = &data.community_name { + Some(resolve_actor_identifier::(name, &context, &None, true).await?) + .map(|c| c.id) + } else { + data.community_id + }; + let sort = data.sort; + let max_depth = data.max_depth; + let saved_only = data.saved_only.unwrap_or_default(); - 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::(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; + let liked_only = data.liked_only.unwrap_or_default(); + let disliked_only = data.disliked_only.unwrap_or_default(); + if liked_only && disliked_only { + return Err(LemmyError::from(LemmyErrorType::ContradictingFilters)); + } - // If a parent_id is given, fetch the comment to get the path - let parent_path = if let Some(parent_id) = parent_id { - Some(Comment::read(context.pool(), parent_id).await?.path) - } else { - None - }; + let page = data.page; + let limit = data.limit; + let parent_id = data.parent_id; - let parent_path_cloned = parent_path.clone(); - let post_id = data.post_id; - let local_user = local_user_view.map(|l| l.local_user); - let mut comments = CommentQuery::builder() - .pool(context.pool()) - .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) - .parent_path(parent_path_cloned) - .post_id(post_id) - .local_user(local_user.as_ref()) - .page(page) - .limit(limit) - .build() - .list() - .await - .map_err(|e| LemmyError::from_error_message(e, "couldnt_get_comments"))?; + let listing_type = Some(listing_type_with_default( + data.type_, + &local_site, + community_id, + )?); - // Blank out deleted or removed info - for cv in comments - .iter_mut() - .filter(|cv| cv.comment.deleted || cv.comment.removed) - { - cv.comment = cv.clone().comment.blank_out_deleted_or_removed_info(); - } + // If a parent_id is given, fetch the comment to get the path + let parent_path = if let Some(parent_id) = parent_id { + Some(Comment::read(&mut context.pool(), parent_id).await?.path) + } else { + None + }; - Ok(GetCommentsResponse { comments }) + let parent_path_cloned = parent_path.clone(); + let post_id = data.post_id; + let comments = CommentQuery { + listing_type, + sort, + max_depth, + saved_only, + liked_only, + disliked_only, + community_id, + parent_path: parent_path_cloned, + post_id, + local_user: local_user_view.as_ref(), + page, + limit, + ..Default::default() } + .list(&mut context.pool()) + .await + .with_lemmy_type(LemmyErrorType::CouldntGetComments)?; + + Ok(Json(GetCommentsResponse { comments })) }