1 use crate::structs::{LocalUserSettingsView, LocalUserView};
2 use diesel::{result::Error, *};
4 aggregates::structs::PersonAggregates,
5 newtypes::{LocalUserId, PersonId},
6 schema::{local_user, person, person_aggregates},
8 local_user::{LocalUser, LocalUserSettings},
9 person::{Person, PersonSafe},
11 traits::{ToSafe, ToSafeSettings, ViewToVec},
12 utils::functions::lower,
15 type LocalUserViewTuple = (LocalUser, Person, PersonAggregates);
18 pub fn read(conn: &mut PgConnection, local_user_id: LocalUserId) -> Result<Self, Error> {
19 let (local_user, person, counts) = local_user::table
21 .inner_join(person::table)
22 .inner_join(person_aggregates::table.on(person::id.eq(person_aggregates::person_id)))
24 local_user::all_columns,
26 person_aggregates::all_columns,
28 .first::<LocalUserViewTuple>(conn)?;
36 pub fn read_person(conn: &mut PgConnection, person_id: PersonId) -> Result<Self, Error> {
37 let (local_user, person, counts) = local_user::table
38 .filter(person::id.eq(person_id))
39 .inner_join(person::table)
40 .inner_join(person_aggregates::table.on(person::id.eq(person_aggregates::person_id)))
42 local_user::all_columns,
44 person_aggregates::all_columns,
46 .first::<LocalUserViewTuple>(conn)?;
54 // TODO check where this is used
55 pub fn read_from_name(conn: &mut PgConnection, name: &str) -> Result<Self, Error> {
56 let (local_user, person, counts) = local_user::table
57 .filter(person::name.eq(name))
58 .inner_join(person::table)
59 .inner_join(person_aggregates::table.on(person::id.eq(person_aggregates::person_id)))
61 local_user::all_columns,
63 person_aggregates::all_columns,
65 .first::<LocalUserViewTuple>(conn)?;
73 pub fn find_by_email_or_name(
74 conn: &mut PgConnection,
76 ) -> Result<Self, Error> {
77 let (local_user, person, counts) = local_user::table
78 .inner_join(person::table)
79 .inner_join(person_aggregates::table.on(person::id.eq(person_aggregates::person_id)))
82 .eq(lower(name_or_email))
83 .or(local_user::email.eq(name_or_email)),
86 local_user::all_columns,
88 person_aggregates::all_columns,
90 .first::<LocalUserViewTuple>(conn)?;
98 pub fn find_by_email(conn: &mut PgConnection, from_email: &str) -> Result<Self, Error> {
99 let (local_user, person, counts) = local_user::table
100 .inner_join(person::table)
101 .inner_join(person_aggregates::table.on(person::id.eq(person_aggregates::person_id)))
102 .filter(local_user::email.eq(from_email))
104 local_user::all_columns,
106 person_aggregates::all_columns,
108 .first::<LocalUserViewTuple>(conn)?;
117 type LocalUserSettingsViewTuple = (LocalUserSettings, PersonSafe, PersonAggregates);
119 impl LocalUserSettingsView {
120 pub fn read(conn: &mut PgConnection, local_user_id: LocalUserId) -> Result<Self, Error> {
121 let (local_user, person, counts) = local_user::table
123 .inner_join(person::table)
124 .inner_join(person_aggregates::table.on(person::id.eq(person_aggregates::person_id)))
126 LocalUser::safe_settings_columns_tuple(),
127 Person::safe_columns_tuple(),
128 person_aggregates::all_columns,
130 .first::<LocalUserSettingsViewTuple>(conn)?;
138 pub fn list_admins_with_emails(conn: &mut PgConnection) -> Result<Vec<Self>, Error> {
139 let res = local_user::table
140 .filter(person::admin.eq(true))
141 .filter(local_user::email.is_not_null())
142 .inner_join(person::table)
143 .inner_join(person_aggregates::table.on(person::id.eq(person_aggregates::person_id)))
145 LocalUser::safe_settings_columns_tuple(),
146 Person::safe_columns_tuple(),
147 person_aggregates::all_columns,
149 .load::<LocalUserSettingsViewTuple>(conn)?;
151 Ok(LocalUserSettingsView::from_tuple_to_vec(res))
155 impl ViewToVec for LocalUserSettingsView {
156 type DbTuple = LocalUserSettingsViewTuple;
157 fn from_tuple_to_vec(items: Vec<Self::DbTuple>) -> Vec<Self> {
165 .collect::<Vec<Self>>()