]> Untitled Git - lemmy.git/blobdiff - crates/api_crud/src/private_message/read.rs
Replace Option<bool> with bool for PostQuery and CommentQuery (#3819) (#3857)
[lemmy.git] / crates / api_crud / src / private_message / read.rs
index 79bc85f45bd391078e97694aca6e68946b2f13ae..0d3ba8620eb5fe6b3afa02818ba342294d7d437d 100644 (file)
@@ -1,41 +1,42 @@
-use crate::PerformCrud;
-use actix_web::web::Data;
+use actix_web::web::{Data, Json, Query};
 use lemmy_api_common::{
-  blocking,
-  get_local_user_view_from_jwt,
-  person::{GetPrivateMessages, PrivateMessagesResponse},
+  context::LemmyContext,
+  private_message::{GetPrivateMessages, PrivateMessagesResponse},
+  utils::local_user_view_from_jwt,
 };
-use lemmy_db_views::private_message_view::PrivateMessageQueryBuilder;
-use lemmy_utils::{ConnectionId, LemmyError};
-use lemmy_websocket::LemmyContext;
+use lemmy_db_views::private_message_view::PrivateMessageQuery;
+use lemmy_utils::error::LemmyError;
 
-#[async_trait::async_trait(?Send)]
-impl PerformCrud for GetPrivateMessages {
-  type Response = PrivateMessagesResponse;
+#[tracing::instrument(skip(context))]
+pub async fn get_private_message(
+  data: Query<GetPrivateMessages>,
+  context: Data<LemmyContext>,
+) -> Result<Json<PrivateMessagesResponse>, LemmyError> {
+  let local_user_view = local_user_view_from_jwt(data.auth.as_ref(), &context).await?;
+  let person_id = local_user_view.person.id;
 
-  async fn perform(
-    &self,
-    context: &Data<LemmyContext>,
-    _websocket_id: Option<ConnectionId>,
-  ) -> Result<PrivateMessagesResponse, LemmyError> {
-    let data: &GetPrivateMessages = &self;
-    let local_user_view = get_local_user_view_from_jwt(&data.auth, context.pool()).await?;
-    let person_id = local_user_view.person.id;
+  let page = data.page;
+  let limit = data.limit;
+  let unread_only = data.unread_only.unwrap_or_default();
+  let creator_id = data.creator_id;
+  let mut messages = PrivateMessageQuery {
+    page,
+    limit,
+    unread_only,
+    creator_id,
+  }
+  .list(&mut context.pool(), person_id)
+  .await?;
 
-    let page = data.page;
-    let limit = data.limit;
-    let unread_only = data.unread_only;
-    let messages = blocking(context.pool(), move |conn| {
-      PrivateMessageQueryBuilder::create(&conn, person_id)
-        .page(page)
-        .limit(limit)
-        .unread_only(unread_only)
-        .list()
-    })
-    .await??;
+  // Messages sent by ourselves should be marked as read. The `read` column in database is only
+  // for the recipient, and shouldnt be exposed to sender.
+  messages.iter_mut().for_each(|pmv| {
+    if pmv.creator.id == person_id {
+      pmv.private_message.read = true
+    }
+  });
 
-    Ok(PrivateMessagesResponse {
-      private_messages: messages,
-    })
-  }
+  Ok(Json(PrivateMessagesResponse {
+    private_messages: messages,
+  }))
 }