]> Untitled Git - lemmy.git/blob - crates/db_queries/src/source/local_user.rs
abfc4e0be87abcf763303aa6ec2fabfdbee3d83a
[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     show_read_posts,
30   );
31
32   impl ToSafeSettings for LocalUser {
33     type SafeSettingsColumns = Columns;
34
35     /// Includes everything but the hashed password
36     fn safe_settings_columns_tuple() -> Self::SafeSettingsColumns {
37       (
38         id,
39         person_id,
40         email,
41         show_nsfw,
42         theme,
43         default_sort_type,
44         default_listing_type,
45         lang,
46         show_avatars,
47         send_notifications_to_email,
48         validator_time,
49         show_bot_accounts,
50         show_scores,
51         show_read_posts,
52       )
53     }
54   }
55 }
56
57 pub trait LocalUser_ {
58   fn register(conn: &PgConnection, form: &LocalUserForm) -> Result<LocalUser, Error>;
59   fn update_password(
60     conn: &PgConnection,
61     local_user_id: LocalUserId,
62     new_password: &str,
63   ) -> Result<LocalUser, Error>;
64 }
65
66 impl LocalUser_ for LocalUser {
67   fn register(conn: &PgConnection, form: &LocalUserForm) -> Result<Self, Error> {
68     let mut edited_user = form.clone();
69     let password_hash =
70       hash(&form.password_encrypted, DEFAULT_COST).expect("Couldn't hash password");
71     edited_user.password_encrypted = password_hash;
72
73     Self::create(conn, &edited_user)
74   }
75
76   fn update_password(
77     conn: &PgConnection,
78     local_user_id: LocalUserId,
79     new_password: &str,
80   ) -> Result<Self, Error> {
81     let password_hash = hash(new_password, DEFAULT_COST).expect("Couldn't hash password");
82
83     diesel::update(local_user.find(local_user_id))
84       .set((
85         password_encrypted.eq(password_hash),
86         validator_time.eq(naive_now()),
87       ))
88       .get_result::<Self>(conn)
89   }
90 }
91
92 impl Crud<LocalUserForm, LocalUserId> for LocalUser {
93   fn read(conn: &PgConnection, local_user_id: LocalUserId) -> Result<Self, Error> {
94     local_user.find(local_user_id).first::<Self>(conn)
95   }
96   fn delete(conn: &PgConnection, local_user_id: LocalUserId) -> Result<usize, Error> {
97     diesel::delete(local_user.find(local_user_id)).execute(conn)
98   }
99   fn create(conn: &PgConnection, form: &LocalUserForm) -> Result<Self, Error> {
100     insert_into(local_user)
101       .values(form)
102       .get_result::<Self>(conn)
103   }
104   fn update(
105     conn: &PgConnection,
106     local_user_id: LocalUserId,
107     form: &LocalUserForm,
108   ) -> Result<Self, Error> {
109     diesel::update(local_user.find(local_user_id))
110       .set(form)
111       .get_result::<Self>(conn)
112   }
113 }