]> Untitled Git - lemmy.git/blob - crates/db_queries/src/source/local_user.rs
43a5c7727565fd60a66833a116569c777915f159
[lemmy.git] / crates / db_queries / src / source / local_user.rs
1 use crate::Crud;
2 use bcrypt::{hash, DEFAULT_COST};
3 use diesel::{dsl::*, result::Error, *};
4 use lemmy_db_schema::{
5   naive_now,
6   schema::local_user::dsl::*,
7   source::local_user::{LocalUser, LocalUserForm},
8   LocalUserId,
9 };
10
11 mod safe_settings_type {
12   use crate::ToSafeSettings;
13   use lemmy_db_schema::{schema::local_user::columns::*, source::local_user::LocalUser};
14
15   type Columns = (
16     id,
17     person_id,
18     email,
19     show_nsfw,
20     theme,
21     default_sort_type,
22     default_listing_type,
23     lang,
24     show_avatars,
25     send_notifications_to_email,
26     validator_time,
27     show_bot_accounts,
28     show_scores,
29   );
30
31   impl ToSafeSettings for LocalUser {
32     type SafeSettingsColumns = Columns;
33
34     /// Includes everything but the hashed password
35     fn safe_settings_columns_tuple() -> Self::SafeSettingsColumns {
36       (
37         id,
38         person_id,
39         email,
40         show_nsfw,
41         theme,
42         default_sort_type,
43         default_listing_type,
44         lang,
45         show_avatars,
46         send_notifications_to_email,
47         validator_time,
48         show_bot_accounts,
49         show_scores,
50       )
51     }
52   }
53 }
54
55 pub trait LocalUser_ {
56   fn register(conn: &PgConnection, form: &LocalUserForm) -> Result<LocalUser, Error>;
57   fn update_password(
58     conn: &PgConnection,
59     local_user_id: LocalUserId,
60     new_password: &str,
61   ) -> Result<LocalUser, Error>;
62 }
63
64 impl LocalUser_ for LocalUser {
65   fn register(conn: &PgConnection, form: &LocalUserForm) -> Result<Self, Error> {
66     let mut edited_user = form.clone();
67     let password_hash =
68       hash(&form.password_encrypted, DEFAULT_COST).expect("Couldn't hash password");
69     edited_user.password_encrypted = password_hash;
70
71     Self::create(&conn, &edited_user)
72   }
73
74   fn update_password(
75     conn: &PgConnection,
76     local_user_id: LocalUserId,
77     new_password: &str,
78   ) -> Result<Self, Error> {
79     let password_hash = hash(new_password, DEFAULT_COST).expect("Couldn't hash password");
80
81     diesel::update(local_user.find(local_user_id))
82       .set((
83         password_encrypted.eq(password_hash),
84         validator_time.eq(naive_now()),
85       ))
86       .get_result::<Self>(conn)
87   }
88 }
89
90 impl Crud<LocalUserForm, LocalUserId> for LocalUser {
91   fn read(conn: &PgConnection, local_user_id: LocalUserId) -> Result<Self, Error> {
92     local_user.find(local_user_id).first::<Self>(conn)
93   }
94   fn delete(conn: &PgConnection, local_user_id: LocalUserId) -> Result<usize, Error> {
95     diesel::delete(local_user.find(local_user_id)).execute(conn)
96   }
97   fn create(conn: &PgConnection, form: &LocalUserForm) -> Result<Self, Error> {
98     insert_into(local_user)
99       .values(form)
100       .get_result::<Self>(conn)
101   }
102   fn update(
103     conn: &PgConnection,
104     local_user_id: LocalUserId,
105     form: &LocalUserForm,
106   ) -> Result<Self, Error> {
107     diesel::update(local_user.find(local_user_id))
108       .set(form)
109       .get_result::<Self>(conn)
110   }
111 }