1 use crate::structs::{LocalUserSettingsView, LocalUserView};
2 use diesel::{result::Error, BoolExpressionMethods, ExpressionMethods, JoinOnDsl, QueryDsl};
3 use diesel_async::RunQueryDsl;
5 aggregates::structs::PersonAggregates,
6 newtypes::{LocalUserId, PersonId},
7 schema::{local_user, person, person_aggregates},
9 local_user::{LocalUser, LocalUserSettings},
10 person::{Person, PersonSafe},
12 traits::{ToSafe, ToSafeSettings, ViewToVec},
13 utils::{functions::lower, get_conn, DbPool},
16 type LocalUserViewTuple = (LocalUser, Person, PersonAggregates);
19 pub async fn read(pool: &DbPool, local_user_id: LocalUserId) -> Result<Self, Error> {
20 let conn = &mut get_conn(pool).await?;
22 let (local_user, person, counts) = local_user::table
24 .inner_join(person::table)
25 .inner_join(person_aggregates::table.on(person::id.eq(person_aggregates::person_id)))
27 local_user::all_columns,
29 person_aggregates::all_columns,
31 .first::<LocalUserViewTuple>(conn)
40 pub async fn read_person(pool: &DbPool, person_id: PersonId) -> Result<Self, Error> {
41 let conn = &mut get_conn(pool).await?;
42 let (local_user, person, counts) = local_user::table
43 .filter(person::id.eq(person_id))
44 .inner_join(person::table)
45 .inner_join(person_aggregates::table.on(person::id.eq(person_aggregates::person_id)))
47 local_user::all_columns,
49 person_aggregates::all_columns,
51 .first::<LocalUserViewTuple>(conn)
60 // TODO check where this is used
61 pub async fn read_from_name(pool: &DbPool, name: &str) -> Result<Self, Error> {
62 let conn = &mut get_conn(pool).await?;
63 let (local_user, person, counts) = local_user::table
64 .filter(person::name.eq(name))
65 .inner_join(person::table)
66 .inner_join(person_aggregates::table.on(person::id.eq(person_aggregates::person_id)))
68 local_user::all_columns,
70 person_aggregates::all_columns,
72 .first::<LocalUserViewTuple>(conn)
81 pub async fn find_by_email_or_name(pool: &DbPool, name_or_email: &str) -> Result<Self, Error> {
82 let conn = &mut get_conn(pool).await?;
83 let (local_user, person, counts) = local_user::table
84 .inner_join(person::table)
85 .inner_join(person_aggregates::table.on(person::id.eq(person_aggregates::person_id)))
88 .eq(lower(name_or_email))
89 .or(local_user::email.eq(name_or_email)),
92 local_user::all_columns,
94 person_aggregates::all_columns,
96 .first::<LocalUserViewTuple>(conn)
105 pub async fn find_by_email(pool: &DbPool, from_email: &str) -> Result<Self, Error> {
106 let conn = &mut get_conn(pool).await?;
107 let (local_user, person, counts) = local_user::table
108 .inner_join(person::table)
109 .inner_join(person_aggregates::table.on(person::id.eq(person_aggregates::person_id)))
110 .filter(local_user::email.eq(from_email))
112 local_user::all_columns,
114 person_aggregates::all_columns,
116 .first::<LocalUserViewTuple>(conn)
126 type LocalUserSettingsViewTuple = (LocalUserSettings, PersonSafe, PersonAggregates);
128 impl LocalUserSettingsView {
129 pub async fn read(pool: &DbPool, local_user_id: LocalUserId) -> Result<Self, Error> {
130 let conn = &mut get_conn(pool).await?;
131 let (local_user, person, counts) = local_user::table
133 .inner_join(person::table)
134 .inner_join(person_aggregates::table.on(person::id.eq(person_aggregates::person_id)))
136 LocalUser::safe_settings_columns_tuple(),
137 Person::safe_columns_tuple(),
138 person_aggregates::all_columns,
140 .first::<LocalUserSettingsViewTuple>(conn)
149 pub async fn list_admins_with_emails(pool: &DbPool) -> Result<Vec<Self>, Error> {
150 let conn = &mut get_conn(pool).await?;
151 let res = local_user::table
152 .filter(person::admin.eq(true))
153 .filter(local_user::email.is_not_null())
154 .inner_join(person::table)
155 .inner_join(person_aggregates::table.on(person::id.eq(person_aggregates::person_id)))
157 LocalUser::safe_settings_columns_tuple(),
158 Person::safe_columns_tuple(),
159 person_aggregates::all_columns,
161 .load::<LocalUserSettingsViewTuple>(conn)
164 Ok(LocalUserSettingsView::from_tuple_to_vec(res))
168 impl ViewToVec for LocalUserSettingsView {
169 type DbTuple = LocalUserSettingsViewTuple;
170 fn from_tuple_to_vec(items: Vec<Self::DbTuple>) -> Vec<Self> {
178 .collect::<Vec<Self>>()