+use crate::structs::PrivateMessageView;
use diesel::{pg::Pg, result::Error, *};
-use lemmy_db_queries::{limit_and_offset, MaybeOptional, ToSafe, ViewToVec};
use lemmy_db_schema::{
- schema::{private_message, user_, user_alias_1},
+ newtypes::{PersonId, PrivateMessageId},
+ schema::{person, private_message},
source::{
+ person::{Person, PersonSafe},
private_message::PrivateMessage,
- user::{UserAlias1, UserSafe, UserSafeAlias1, User_},
},
+ traits::{ToSafe, ViewToVec},
+ utils::limit_and_offset,
};
-use log::debug;
-use serde::Serialize;
+use tracing::debug;
+use typed_builder::TypedBuilder;
-#[derive(Debug, PartialEq, Serialize, Clone)]
-pub struct PrivateMessageView {
- pub private_message: PrivateMessage,
- pub creator: UserSafe,
- pub recipient: UserSafeAlias1,
-}
-
-type PrivateMessageViewTuple = (PrivateMessage, UserSafe, UserSafeAlias1);
+type PrivateMessageViewTuple = (PrivateMessage, PersonSafe, PersonSafe);
impl PrivateMessageView {
- pub fn read(conn: &PgConnection, private_message_id: i32) -> Result<Self, Error> {
+ pub fn read(
+ conn: &mut PgConnection,
+ private_message_id: PrivateMessageId,
+ ) -> Result<Self, Error> {
+ let person_alias_1 = diesel::alias!(person as person1);
+
let (private_message, creator, recipient) = private_message::table
.find(private_message_id)
- .inner_join(user_::table.on(private_message::creator_id.eq(user_::id)))
- .inner_join(user_alias_1::table.on(private_message::recipient_id.eq(user_alias_1::id)))
+ .inner_join(person::table.on(private_message::creator_id.eq(person::id)))
+ .inner_join(
+ person_alias_1.on(private_message::recipient_id.eq(person_alias_1.field(person::id))),
+ )
.order_by(private_message::published.desc())
.select((
private_message::all_columns,
- User_::safe_columns_tuple(),
- UserAlias1::safe_columns_tuple(),
+ Person::safe_columns_tuple(),
+ person_alias_1.fields(Person::safe_columns_tuple()),
))
.first::<PrivateMessageViewTuple>(conn)?;
recipient,
})
}
+
+ /// Gets the number of unread messages
+ pub fn get_unread_messages(
+ conn: &mut PgConnection,
+ my_person_id: PersonId,
+ ) -> Result<i64, Error> {
+ use diesel::dsl::*;
+ private_message::table
+ .filter(private_message::read.eq(false))
+ .filter(private_message::recipient_id.eq(my_person_id))
+ .filter(private_message::deleted.eq(false))
+ .select(count(private_message::id))
+ .first::<i64>(conn)
+ }
}
-pub struct PrivateMessageQueryBuilder<'a> {
- conn: &'a PgConnection,
- recipient_id: i32,
- unread_only: bool,
+#[derive(TypedBuilder)]
+#[builder(field_defaults(default))]
+pub struct PrivateMessageQuery<'a> {
+ #[builder(!default)]
+ conn: &'a mut PgConnection,
+ #[builder(!default)]
+ recipient_id: PersonId,
+ unread_only: Option<bool>,
page: Option<i64>,
limit: Option<i64>,
}
-impl<'a> PrivateMessageQueryBuilder<'a> {
- pub fn create(conn: &'a PgConnection, recipient_id: i32) -> Self {
- PrivateMessageQueryBuilder {
- conn,
- recipient_id,
- unread_only: false,
- page: None,
- limit: None,
- }
- }
-
- pub fn unread_only(mut self, unread_only: bool) -> Self {
- self.unread_only = unread_only;
- self
- }
-
- pub fn page<T: MaybeOptional<i64>>(mut self, page: T) -> Self {
- self.page = page.get_optional();
- self
- }
-
- pub fn limit<T: MaybeOptional<i64>>(mut self, limit: T) -> Self {
- self.limit = limit.get_optional();
- self
- }
-
+impl<'a> PrivateMessageQuery<'a> {
pub fn list(self) -> Result<Vec<PrivateMessageView>, Error> {
+ let person_alias_1 = diesel::alias!(person as person1);
+
let mut query = private_message::table
- .inner_join(user_::table.on(private_message::creator_id.eq(user_::id)))
- .inner_join(user_alias_1::table.on(private_message::recipient_id.eq(user_alias_1::id)))
+ .inner_join(person::table.on(private_message::creator_id.eq(person::id)))
+ .inner_join(
+ person_alias_1.on(private_message::recipient_id.eq(person_alias_1.field(person::id))),
+ )
.select((
private_message::all_columns,
- User_::safe_columns_tuple(),
- UserAlias1::safe_columns_tuple(),
+ Person::safe_columns_tuple(),
+ person_alias_1.fields(Person::safe_columns_tuple()),
))
.into_boxed();
// If its unread, I only want the ones to me
- if self.unread_only {
+ if self.unread_only.unwrap_or(false) {
query = query
.filter(private_message::read.eq(false))
.filter(private_message::recipient_id.eq(self.recipient_id));
)
}
- let (limit, offset) = limit_and_offset(self.page, self.limit);
+ let (limit, offset) = limit_and_offset(self.page, self.limit)?;
query = query
.filter(private_message::deleted.eq(false))
type DbTuple = PrivateMessageViewTuple;
fn from_tuple_to_vec(items: Vec<Self::DbTuple>) -> Vec<Self> {
items
- .iter()
+ .into_iter()
.map(|a| Self {
- private_message: a.0.to_owned(),
- creator: a.1.to_owned(),
- recipient: a.2.to_owned(),
+ private_message: a.0,
+ creator: a.1,
+ recipient: a.2,
})
.collect::<Vec<Self>>()
}