1 use diesel::{result::Error, *};
3 aggregates::person_aggregates::PersonAggregates,
4 newtypes::{LocalUserId, PersonId},
5 schema::{local_user, person, person_aggregates},
7 local_user::{LocalUser, LocalUserSettings},
8 person::{Person, PersonSafe},
10 traits::{ToSafe, ToSafeSettings},
12 use serde::{Deserialize, Serialize};
14 #[derive(Debug, Serialize, Deserialize, Clone)]
15 pub struct LocalUserView {
16 pub local_user: LocalUser,
18 pub counts: PersonAggregates,
21 type LocalUserViewTuple = (LocalUser, Person, PersonAggregates);
24 pub fn read(conn: &PgConnection, local_user_id: LocalUserId) -> Result<Self, Error> {
25 let (local_user, person, counts) = local_user::table
27 .inner_join(person::table)
28 .inner_join(person_aggregates::table.on(person::id.eq(person_aggregates::person_id)))
30 local_user::all_columns,
32 person_aggregates::all_columns,
34 .first::<LocalUserViewTuple>(conn)?;
42 pub fn read_person(conn: &PgConnection, person_id: PersonId) -> Result<Self, Error> {
43 let (local_user, person, counts) = local_user::table
44 .filter(person::id.eq(person_id))
45 .inner_join(person::table)
46 .inner_join(person_aggregates::table.on(person::id.eq(person_aggregates::person_id)))
48 local_user::all_columns,
50 person_aggregates::all_columns,
52 .first::<LocalUserViewTuple>(conn)?;
60 // TODO check where this is used
61 pub fn read_from_name(conn: &PgConnection, name: &str) -> Result<Self, Error> {
62 let (local_user, person, counts) = local_user::table
63 .filter(person::name.eq(name))
64 .inner_join(person::table)
65 .inner_join(person_aggregates::table.on(person::id.eq(person_aggregates::person_id)))
67 local_user::all_columns,
69 person_aggregates::all_columns,
71 .first::<LocalUserViewTuple>(conn)?;
79 pub fn find_by_email_or_name(conn: &PgConnection, name_or_email: &str) -> Result<Self, Error> {
80 let (local_user, person, counts) = local_user::table
81 .inner_join(person::table)
82 .inner_join(person_aggregates::table.on(person::id.eq(person_aggregates::person_id)))
86 .or(local_user::email.eq(name_or_email)),
89 local_user::all_columns,
91 person_aggregates::all_columns,
93 .first::<LocalUserViewTuple>(conn)?;
101 pub fn find_by_email(conn: &PgConnection, from_email: &str) -> Result<Self, Error> {
102 let (local_user, person, counts) = local_user::table
103 .inner_join(person::table)
104 .inner_join(person_aggregates::table.on(person::id.eq(person_aggregates::person_id)))
105 .filter(local_user::email.eq(from_email))
107 local_user::all_columns,
109 person_aggregates::all_columns,
111 .first::<LocalUserViewTuple>(conn)?;
120 #[derive(Debug, Serialize, Deserialize, Clone)]
121 pub struct LocalUserSettingsView {
122 pub local_user: LocalUserSettings,
123 pub person: PersonSafe,
124 pub counts: PersonAggregates,
127 type LocalUserSettingsViewTuple = (LocalUserSettings, PersonSafe, PersonAggregates);
129 impl LocalUserSettingsView {
130 pub fn read(conn: &PgConnection, local_user_id: LocalUserId) -> Result<Self, Error> {
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)?;