]> 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 48ff239c7f2647704c2118009e52792486437366..0d3ba8620eb5fe6b3afa02818ba342294d7d437d 100644 (file)
@@ -1,55 +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_schema::traits::DeleteableOrRemoveable;
-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;
 
-  #[tracing::instrument(skip(self, context, _websocket_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.as_ref(), context.pool(), context.secret()).await?;
-    let person_id = local_user_view.person.id;
-
-    let page = data.page;
-    let limit = data.limit;
-    let unread_only = data.unread_only;
-    let mut messages = blocking(context.pool(), move |conn| {
-      PrivateMessageQueryBuilder::create(conn, person_id)
-        .page(page)
-        .limit(limit)
-        .unread_only(unread_only)
-        .list()
-    })
-    .await??;
+  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?;
 
-    // Blank out deleted or removed info
-    for pmv in messages
-      .iter_mut()
-      .filter(|pmv| pmv.private_message.deleted)
-    {
-      pmv.private_message = pmv
-        .to_owned()
-        .private_message
-        .blank_out_deleted_or_removed_info();
+  // 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,
+  }))
 }