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