]> Untitled Git - lemmy.git/commitdiff
Adding a GetComment endpoint. Fixes #1919 (#1944)
authorDessalines <dessalines@users.noreply.github.com>
Tue, 23 Nov 2021 15:53:48 +0000 (10:53 -0500)
committerGitHub <noreply@github.com>
Tue, 23 Nov 2021 15:53:48 +0000 (15:53 +0000)
crates/api_common/src/comment.rs
crates/api_crud/src/comment/read.rs
crates/api_crud/src/lib.rs
crates/websocket/src/lib.rs
src/api_routes.rs

index eadbceb2bb0d9234e9e8d26df2e1e89d7b166076..afe76a9950dca74f14622da116636d4af7b7554a 100644 (file)
@@ -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,
index 4cd42bb9b5720cd4c5da4741e1925d61c6fd2084..4789b84fe096a9a83381490273e06f957bbe52d0 100644 (file)
@@ -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;
index f77632f908e97ee43406e95eae368ec4d10b1ec8..9f1553ee16b0edc4d006545de30eea8664dcce11 100644 (file)
@@ -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
     }
index 251c7072a89d3b9b72dbe5c64350609cb886d46e..f422ac51ef3819f20cdb1e717918778993d00eab 100644 (file)
@@ -169,6 +169,7 @@ pub enum UserOperationCrud {
   RemovePost,
   // Comment
   CreateComment,
+  GetComment,
   GetComments,
   EditComment,
   DeleteComment,
index a6a840395a6e7feca791386272969918b8a050ea..9f06c5bef6f8665159afc57dd5941fb94886c4ec 100644 (file)
@@ -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>))