1 use crate::{limit_and_offset, MaybeOptional};
2 use diesel::{pg::Pg, result::Error, *};
5 // The faked schema since diesel doesn't do views
7 private_message_view (id) {
14 published -> Timestamp,
15 updated -> Nullable<Timestamp>,
18 creator_name -> Varchar,
19 creator_preferred_username -> Nullable<Varchar>,
20 creator_avatar -> Nullable<Text>,
21 creator_actor_id -> Text,
22 creator_local -> Bool,
23 recipient_name -> Varchar,
24 recipient_preferred_username -> Nullable<Varchar>,
25 recipient_avatar -> Nullable<Text>,
26 recipient_actor_id -> Text,
27 recipient_local -> Bool,
31 #[derive(Queryable, Identifiable, PartialEq, Debug, Serialize, QueryableByName, Clone)]
32 #[table_name = "private_message_view"]
33 pub struct PrivateMessageView {
36 pub recipient_id: i32,
40 pub published: chrono::NaiveDateTime,
41 pub updated: Option<chrono::NaiveDateTime>,
44 pub creator_name: String,
45 pub creator_preferred_username: Option<String>,
46 pub creator_avatar: Option<String>,
47 pub creator_actor_id: String,
48 pub creator_local: bool,
49 pub recipient_name: String,
50 pub recipient_preferred_username: Option<String>,
51 pub recipient_avatar: Option<String>,
52 pub recipient_actor_id: String,
53 pub recipient_local: bool,
56 pub struct PrivateMessageQueryBuilder<'a> {
57 conn: &'a PgConnection,
58 query: super::private_message_view::private_message_view::BoxedQuery<'a, Pg>,
59 for_recipient_id: i32,
65 impl<'a> PrivateMessageQueryBuilder<'a> {
66 pub fn create(conn: &'a PgConnection, for_recipient_id: i32) -> Self {
67 use super::private_message_view::private_message_view::dsl::*;
69 let query = private_message_view.into_boxed();
71 PrivateMessageQueryBuilder {
81 pub fn unread_only(mut self, unread_only: bool) -> Self {
82 self.unread_only = unread_only;
86 pub fn page<T: MaybeOptional<i64>>(mut self, page: T) -> Self {
87 self.page = page.get_optional();
91 pub fn limit<T: MaybeOptional<i64>>(mut self, limit: T) -> Self {
92 self.limit = limit.get_optional();
96 pub fn list(self) -> Result<Vec<PrivateMessageView>, Error> {
97 use super::private_message_view::private_message_view::dsl::*;
99 let mut query = self.query.filter(deleted.eq(false));
101 // If its unread, I only want the ones to me
102 if self.unread_only {
104 .filter(read.eq(false))
105 .filter(recipient_id.eq(self.for_recipient_id));
107 // Otherwise, I want the ALL view to show both sent and received
109 query = query.filter(
111 .eq(self.for_recipient_id)
112 .or(creator_id.eq(self.for_recipient_id)),
116 let (limit, offset) = limit_and_offset(self.page, self.limit);
121 .order_by(published.desc())
122 .load::<PrivateMessageView>(self.conn)
126 impl PrivateMessageView {
127 pub fn read(conn: &PgConnection, from_private_message_id: i32) -> Result<Self, Error> {
128 use super::private_message_view::private_message_view::dsl::*;
130 let mut query = private_message_view.into_boxed();
133 .filter(id.eq(from_private_message_id))
134 .order_by(published.desc());
136 query.first::<Self>(conn)