1 use diesel::{result::Error, *};
2 use lemmy_db_queries::{aggregates::person_aggregates::PersonAggregates, ToSafe, ToSafeSettings};
4 schema::{local_user, person, person_aggregates},
6 local_user::{LocalUser, LocalUserSettings},
7 person::{Person, PersonSafe},
12 #[derive(Debug, Serialize, Clone)]
13 pub struct LocalUserView {
14 pub local_user: LocalUser,
16 pub counts: PersonAggregates,
19 type LocalUserViewTuple = (LocalUser, Person, PersonAggregates);
22 pub fn read(conn: &PgConnection, local_user_id: i32) -> Result<Self, Error> {
23 let (local_user, person, counts) = local_user::table
25 .inner_join(person::table)
26 .inner_join(person_aggregates::table.on(person::id.eq(person_aggregates::person_id)))
28 local_user::all_columns,
30 person_aggregates::all_columns,
32 .first::<LocalUserViewTuple>(conn)?;
40 pub fn read_person(conn: &PgConnection, person_id: i32) -> Result<Self, Error> {
41 let (local_user, person, counts) = local_user::table
42 .filter(person::id.eq(person_id))
43 .inner_join(person::table)
44 .inner_join(person_aggregates::table.on(person::id.eq(person_aggregates::person_id)))
46 local_user::all_columns,
48 person_aggregates::all_columns,
50 .first::<LocalUserViewTuple>(conn)?;
58 // TODO check where this is used
59 pub fn read_from_name(conn: &PgConnection, name: &str) -> Result<Self, Error> {
60 let (local_user, person, counts) = local_user::table
61 .filter(person::name.eq(name))
62 .inner_join(person::table)
63 .inner_join(person_aggregates::table.on(person::id.eq(person_aggregates::person_id)))
65 local_user::all_columns,
67 person_aggregates::all_columns,
69 .first::<LocalUserViewTuple>(conn)?;
77 pub fn find_by_email_or_name(conn: &PgConnection, name_or_email: &str) -> Result<Self, Error> {
78 let (local_user, person, counts) = local_user::table
79 .inner_join(person::table)
80 .inner_join(person_aggregates::table.on(person::id.eq(person_aggregates::person_id)))
84 .or(local_user::email.ilike(name_or_email)),
87 local_user::all_columns,
89 person_aggregates::all_columns,
91 .first::<LocalUserViewTuple>(conn)?;
99 pub fn find_by_email(conn: &PgConnection, from_email: &str) -> Result<Self, Error> {
100 let (local_user, person, counts) = local_user::table
101 .inner_join(person::table)
102 .inner_join(person_aggregates::table.on(person::id.eq(person_aggregates::person_id)))
103 .filter(local_user::email.eq(from_email))
105 local_user::all_columns,
107 person_aggregates::all_columns,
109 .first::<LocalUserViewTuple>(conn)?;
118 #[derive(Debug, Serialize, Clone)]
119 pub struct LocalUserSettingsView {
120 pub local_user: LocalUserSettings,
121 pub person: PersonSafe,
122 pub counts: PersonAggregates,
125 type LocalUserSettingsViewTuple = (LocalUserSettings, PersonSafe, PersonAggregates);
127 impl LocalUserSettingsView {
128 pub fn read(conn: &PgConnection, local_user_id: i32) -> Result<Self, Error> {
129 let (local_user, person, counts) = local_user::table
131 .inner_join(person::table)
132 .inner_join(person_aggregates::table.on(person::id.eq(person_aggregates::person_id)))
134 LocalUser::safe_settings_columns_tuple(),
135 Person::safe_columns_tuple(),
136 person_aggregates::all_columns,
138 .first::<LocalUserSettingsViewTuple>(conn)?;