diff --git a/crates/api_common/src/comment.rs b/crates/api_common/src/comment.rs index eadbceb2b..afe76a995 100644 --- a/crates/api_common/src/comment.rs +++ b/crates/api_common/src/comment.rs @@ -11,6 +11,12 @@ pub struct CreateComment { pub auth: String, } +#[derive(Serialize, Deserialize)] +pub struct GetComment { + pub id: CommentId, + pub auth: Option, +} + #[derive(Serialize, Deserialize)] pub struct EditComment { pub content: String, diff --git a/crates/api_crud/src/comment/read.rs b/crates/api_crud/src/comment/read.rs index 4cd42bb9b..4789b84fe 100644 --- a/crates/api_crud/src/comment/read.rs +++ b/crates/api_crud/src/comment/read.rs @@ -12,10 +12,39 @@ use lemmy_db_schema::{ ListingType, SortType, }; -use lemmy_db_views::comment_view::CommentQueryBuilder; +use lemmy_db_views::comment_view::{CommentQueryBuilder, CommentView}; use lemmy_utils::{ApiError, ConnectionId, LemmyError}; use lemmy_websocket::LemmyContext; +#[async_trait::async_trait(?Send)] +impl PerformCrud for GetComment { + type Response = CommentResponse; + + async fn perform( + &self, + context: &Data, + _websocket_id: Option, + ) -> Result { + let data = self; + let local_user_view = + get_local_user_view_from_jwt_opt(&data.auth, context.pool(), context.secret()).await?; + + let person_id = local_user_view.map(|u| u.person.id); + let id = data.id; + let comment_view = blocking(context.pool(), move |conn| { + CommentView::read(conn, id, person_id) + }) + .await? + .map_err(|e| ApiError::err("couldnt_find_comment", e))?; + + Ok(Self::Response { + comment_view, + form_id: None, + recipient_ids: Vec::new(), + }) + } +} + #[async_trait::async_trait(?Send)] impl PerformCrud for GetComments { type Response = GetCommentsResponse; diff --git a/crates/api_crud/src/lib.rs b/crates/api_crud/src/lib.rs index f77632f90..9f1553ee1 100644 --- a/crates/api_crud/src/lib.rs +++ b/crates/api_crud/src/lib.rs @@ -108,6 +108,9 @@ pub async fn match_websocket_operation_crud( UserOperationCrud::RemoveComment => { do_websocket_operation::(context, id, op, data).await } + UserOperationCrud::GetComment => { + do_websocket_operation::(context, id, op, data).await + } UserOperationCrud::GetComments => { do_websocket_operation::(context, id, op, data).await } diff --git a/crates/websocket/src/lib.rs b/crates/websocket/src/lib.rs index 251c7072a..f422ac51e 100644 --- a/crates/websocket/src/lib.rs +++ b/crates/websocket/src/lib.rs @@ -169,6 +169,7 @@ pub enum UserOperationCrud { RemovePost, // Comment CreateComment, + GetComment, GetComments, EditComment, DeleteComment, diff --git a/src/api_routes.rs b/src/api_routes.rs index a6a840395..9f06c5bef 100644 --- a/src/api_routes.rs +++ b/src/api_routes.rs @@ -115,6 +115,7 @@ pub fn config(cfg: &mut web::ServiceConfig, rate_limit: &RateLimit) { .service( web::scope("/comment") .wrap(rate_limit.message()) + .route("", web::get().to(route_get_crud::)) .route("", web::put().to(route_post_crud::)) .route("/delete", web::post().to(route_post_crud::)) .route("/remove", web::post().to(route_post_crud::))