]> Untitled Git - lemmy.git/blob - crates/db_views/src/local_user_view.rs
~80% done
[lemmy.git] / crates / db_views / src / local_user_view.rs
1 use diesel::{result::Error, *};
2 use lemmy_db_queries::{
3   aggregates::person_aggregates::PersonAggregates,
4   ToSafe,
5   ToSafeSettings,
6 };
7 use lemmy_db_schema::{
8   schema::{person, person_aggregates, local_user},
9   source::person::{PersonSafe, Person},
10   source::local_user::{LocalUser, LocalUserSettings},
11 };
12 use serde::Serialize;
13
14 #[derive(Debug, Serialize, Clone)]
15 pub struct LocalUserView {
16   pub person: Person,
17   pub counts: PersonAggregates,
18   pub local_user: LocalUser,
19 }
20
21 type LocalUserViewTuple = (Person, PersonAggregates, LocalUser);
22
23 impl LocalUserView {
24   pub fn read(conn: &PgConnection, person_id: i32) -> Result<Self, Error> {
25     let (person, counts, local_user) = person::table
26       .find(person_id)
27       .inner_join(person_aggregates::table)
28       .inner_join(local_user::table)
29       .select((person::all_columns, person_aggregates::all_columns, local_user::all_columns))
30       .first::<LocalUserViewTuple>(conn)?;
31     Ok(Self { person, counts, local_user })
32   }
33
34   // TODO check where this is used
35   pub fn read_from_name(conn: &PgConnection, name: &str) -> Result<Self, Error> {
36     let (person, counts, local_user) = person::table
37       .filter(person::name.eq(name))
38       .inner_join(person_aggregates::table)
39       .inner_join(local_user::table)
40       .select((person::all_columns, person_aggregates::all_columns, local_user::all_columns))
41       .first::<LocalUserViewTuple>(conn)?;
42     Ok(Self { person, counts, local_user })
43   }
44
45   pub fn find_by_email_or_name(
46     conn: &PgConnection,
47     name_or_email: &str,
48   ) -> Result<Self, Error> {
49     let (person, counts, local_user) = person::table
50       .inner_join(person_aggregates::table)
51       .inner_join(local_user::table)
52       .filter(person::name.ilike(name_or_email).or(local_user::email.ilike(name_or_email)))
53       .select((person::all_columns, person_aggregates::all_columns, local_user::all_columns))
54       .first::<LocalUserViewTuple>(conn)?;
55     Ok(Self { person, counts, local_user })
56   }
57 }
58
59 #[derive(Debug, Serialize, Clone)]
60 pub struct LocalUserSettingsView {
61   pub person: PersonSafe,
62   pub counts: PersonAggregates,
63   pub local_user: LocalUserSettings,
64 }
65
66 type LocalUserSettingsViewTuple = (PersonSafe, PersonAggregates, LocalUserSettings);
67
68 impl LocalUserSettingsView {
69   pub fn read(conn: &PgConnection, person_id: i32) -> Result<Self, Error> {
70     let (person, counts, local_user) = person::table
71       .find(person_id)
72       .inner_join(person_aggregates::table)
73       .inner_join(local_user::table)
74       .select((Person::safe_columns_tuple(), person_aggregates::all_columns, LocalUser::safe_settings_columns_tuple()))
75       .first::<LocalUserSettingsViewTuple>(conn)?;
76     Ok(Self { person, counts, local_user })
77   }
78 }