]> Untitled Git - lemmy.git/blobdiff - crates/db_schema/src/impls/local_user.rs
Make functions work with both connection and pool (#3420)
[lemmy.git] / crates / db_schema / src / impls / local_user.rs
index eb36fce6f19e0b76f51f199a3d26c0bf7884b0f8..0a72811ae37e4b7d203818ed6e9b31f83b16fb6c 100644 (file)
@@ -1,6 +1,13 @@
 use crate::{
   newtypes::LocalUserId,
-  schema::local_user::dsl::*,
+  schema::local_user::dsl::{
+    accepted_application,
+    email,
+    email_verified,
+    local_user,
+    password_encrypted,
+    validator_time,
+  },
   source::{
     actor_language::{LocalUserLanguage, SiteLanguage},
     local_user::{LocalUser, LocalUserInsertForm, LocalUserUpdateForm},
@@ -9,67 +16,12 @@ use crate::{
   utils::{get_conn, naive_now, DbPool},
 };
 use bcrypt::{hash, DEFAULT_COST};
-use diesel::{dsl::*, result::Error, ExpressionMethods, QueryDsl};
+use diesel::{dsl::insert_into, result::Error, ExpressionMethods, QueryDsl};
 use diesel_async::RunQueryDsl;
 
-mod safe_settings_type {
-  use crate::{
-    schema::local_user::columns::*,
-    source::local_user::LocalUser,
-    traits::ToSafeSettings,
-  };
-
-  type Columns = (
-    id,
-    person_id,
-    email,
-    show_nsfw,
-    theme,
-    default_sort_type,
-    default_listing_type,
-    interface_language,
-    show_avatars,
-    send_notifications_to_email,
-    validator_time,
-    show_bot_accounts,
-    show_scores,
-    show_read_posts,
-    show_new_post_notifs,
-    email_verified,
-    accepted_application,
-  );
-
-  impl ToSafeSettings for LocalUser {
-    type SafeSettingsColumns = Columns;
-
-    /// Includes everything but the hashed password
-    fn safe_settings_columns_tuple() -> Self::SafeSettingsColumns {
-      (
-        id,
-        person_id,
-        email,
-        show_nsfw,
-        theme,
-        default_sort_type,
-        default_listing_type,
-        interface_language,
-        show_avatars,
-        send_notifications_to_email,
-        validator_time,
-        show_bot_accounts,
-        show_scores,
-        show_read_posts,
-        show_new_post_notifs,
-        email_verified,
-        accepted_application,
-      )
-    }
-  }
-}
-
 impl LocalUser {
   pub async fn update_password(
-    pool: &DbPool,
+    pool: &mut DbPool<'_>,
     local_user_id: LocalUserId,
     new_password: &str,
   ) -> Result<Self, Error> {
@@ -85,7 +37,7 @@ impl LocalUser {
       .await
   }
 
-  pub async fn set_all_users_email_verified(pool: &DbPool) -> Result<Vec<Self>, Error> {
+  pub async fn set_all_users_email_verified(pool: &mut DbPool<'_>) -> Result<Vec<Self>, Error> {
     let conn = &mut get_conn(pool).await?;
     diesel::update(local_user)
       .set(email_verified.eq(true))
@@ -94,7 +46,7 @@ impl LocalUser {
   }
 
   pub async fn set_all_users_registration_applications_accepted(
-    pool: &DbPool,
+    pool: &mut DbPool<'_>,
   ) -> Result<Vec<Self>, Error> {
     let conn = &mut get_conn(pool).await?;
     diesel::update(local_user)
@@ -102,6 +54,14 @@ impl LocalUser {
       .get_results::<Self>(conn)
       .await
   }
+
+  pub async fn is_email_taken(pool: &mut DbPool<'_>, email_: &str) -> Result<bool, Error> {
+    use diesel::dsl::{exists, select};
+    let conn = &mut get_conn(pool).await?;
+    select(exists(local_user.filter(email.eq(email_))))
+      .get_result(conn)
+      .await
+  }
 }
 
 #[async_trait]
@@ -109,17 +69,17 @@ impl Crud for LocalUser {
   type InsertForm = LocalUserInsertForm;
   type UpdateForm = LocalUserUpdateForm;
   type IdType = LocalUserId;
-  async fn read(pool: &DbPool, local_user_id: LocalUserId) -> Result<Self, Error> {
+  async fn read(pool: &mut DbPool<'_>, local_user_id: LocalUserId) -> Result<Self, Error> {
     let conn = &mut get_conn(pool).await?;
     local_user.find(local_user_id).first::<Self>(conn).await
   }
-  async fn delete(pool: &DbPool, local_user_id: LocalUserId) -> Result<usize, Error> {
+  async fn delete(pool: &mut DbPool<'_>, local_user_id: LocalUserId) -> Result<usize, Error> {
     let conn = &mut get_conn(pool).await?;
     diesel::delete(local_user.find(local_user_id))
       .execute(conn)
       .await
   }
-  async fn create(pool: &DbPool, form: &Self::InsertForm) -> Result<Self, Error> {
+  async fn create(pool: &mut DbPool<'_>, form: &Self::InsertForm) -> Result<Self, Error> {
     let conn = &mut get_conn(pool).await?;
     let mut form_with_encrypted_password = form.clone();
     let password_hash =
@@ -129,10 +89,9 @@ impl Crud for LocalUser {
     let local_user_ = insert_into(local_user)
       .values(form_with_encrypted_password)
       .get_result::<Self>(conn)
-      .await
-      .expect("couldnt create local user");
+      .await?;
 
-    let site_languages = SiteLanguage::read_local(pool).await;
+    let site_languages = SiteLanguage::read_local_raw(pool).await;
     if let Ok(langs) = site_languages {
       // if site exists, init user with site languages
       LocalUserLanguage::update(pool, langs, local_user_.id).await?;
@@ -145,7 +104,7 @@ impl Crud for LocalUser {
     Ok(local_user_)
   }
   async fn update(
-    pool: &DbPool,
+    pool: &mut DbPool<'_>,
     local_user_id: LocalUserId,
     form: &Self::UpdateForm,
   ) -> Result<Self, Error> {