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