3 schema::local_user::dsl::*,
5 actor_language::{LocalUserLanguage, SiteLanguage},
6 local_user::{LocalUser, LocalUserForm},
11 use bcrypt::{hash, DEFAULT_COST};
12 use diesel::{dsl::*, result::Error, *};
14 mod safe_settings_type {
16 schema::local_user::columns::*,
17 source::local_user::LocalUser,
18 traits::ToSafeSettings,
31 send_notifications_to_email,
41 impl ToSafeSettings for LocalUser {
42 type SafeSettingsColumns = Columns;
44 /// Includes everything but the hashed password
45 fn safe_settings_columns_tuple() -> Self::SafeSettingsColumns {
56 send_notifications_to_email,
70 pub fn register(conn: &mut PgConnection, form: &LocalUserForm) -> Result<Self, Error> {
71 let mut edited_user = form.clone();
72 let password_hash = form
75 .map(|p| hash(p, DEFAULT_COST).expect("Couldn't hash password"));
76 edited_user.password_encrypted = password_hash;
78 Self::create(conn, &edited_user)
81 pub fn update_password(
82 conn: &mut PgConnection,
83 local_user_id: LocalUserId,
85 ) -> Result<Self, Error> {
86 let password_hash = hash(new_password, DEFAULT_COST).expect("Couldn't hash password");
88 diesel::update(local_user.find(local_user_id))
90 password_encrypted.eq(password_hash),
91 validator_time.eq(naive_now()),
93 .get_result::<Self>(conn)
96 pub fn set_all_users_email_verified(conn: &mut PgConnection) -> Result<Vec<Self>, Error> {
97 diesel::update(local_user)
98 .set(email_verified.eq(true))
99 .get_results::<Self>(conn)
102 pub fn set_all_users_registration_applications_accepted(
103 conn: &mut PgConnection,
104 ) -> Result<Vec<Self>, Error> {
105 diesel::update(local_user)
106 .set(accepted_application.eq(true))
107 .get_results::<Self>(conn)
111 impl Crud for LocalUser {
112 type Form = LocalUserForm;
113 type IdType = LocalUserId;
114 fn read(conn: &mut PgConnection, local_user_id: LocalUserId) -> Result<Self, Error> {
115 local_user.find(local_user_id).first::<Self>(conn)
117 fn delete(conn: &mut PgConnection, local_user_id: LocalUserId) -> Result<usize, Error> {
118 diesel::delete(local_user.find(local_user_id)).execute(conn)
120 fn create(conn: &mut PgConnection, form: &LocalUserForm) -> Result<Self, Error> {
121 let local_user_ = insert_into(local_user)
123 .get_result::<Self>(conn)?;
125 let site_languages = SiteLanguage::read_local(conn);
126 if let Ok(langs) = site_languages {
127 // if site exists, init user with site languages
128 LocalUserLanguage::update(conn, langs, local_user_.id)?;
130 // otherwise, init with all languages (this only happens during tests and
131 // for first admin user, which is created before site)
132 LocalUserLanguage::update(conn, vec![], local_user_.id)?;
138 conn: &mut PgConnection,
139 local_user_id: LocalUserId,
140 form: &LocalUserForm,
141 ) -> Result<Self, Error> {
142 diesel::update(local_user.find(local_user_id))
144 .get_result::<Self>(conn)