From d2e28e5f3836bf1bee1dabc09d14ec79b2e40858 Mon Sep 17 00:00:00 2001
From: Dessalines <dessalines@users.noreply.github.com>
Date: Tue, 23 Nov 2021 10:53:48 -0500
Subject: [PATCH] Adding a GetComment endpoint. Fixes #1919 (#1944)

---
 crates/api_common/src/comment.rs    |  6 ++++++
 crates/api_crud/src/comment/read.rs | 31 ++++++++++++++++++++++++++++-
 crates/api_crud/src/lib.rs          |  3 +++
 crates/websocket/src/lib.rs         |  1 +
 src/api_routes.rs                   |  1 +
 5 files changed, 41 insertions(+), 1 deletion(-)

diff --git a/crates/api_common/src/comment.rs b/crates/api_common/src/comment.rs
index eadbceb2..afe76a99 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<String>,
+}
+
 #[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 4cd42bb9..4789b84f 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<LemmyContext>,
+    _websocket_id: Option<ConnectionId>,
+  ) -> Result<Self::Response, LemmyError> {
+    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 f77632f9..9f1553ee 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::<RemoveComment>(context, id, op, data).await
     }
+    UserOperationCrud::GetComment => {
+      do_websocket_operation::<GetComment>(context, id, op, data).await
+    }
     UserOperationCrud::GetComments => {
       do_websocket_operation::<GetComments>(context, id, op, data).await
     }
diff --git a/crates/websocket/src/lib.rs b/crates/websocket/src/lib.rs
index 251c7072..f422ac51 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 a6a84039..9f06c5be 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::<GetComment>))
           .route("", web::put().to(route_post_crud::<EditComment>))
           .route("/delete", web::post().to(route_post_crud::<DeleteComment>))
           .route("/remove", web::post().to(route_post_crud::<RemoveComment>))
-- 
2.44.1