You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

108 lines
3.0 KiB

  1. use diesel::prelude::*;
  2. use diesel::RunQueryDsl;
  3. use diesel::pg::PgConnection;
  4. use diesel::r2d2;
  5. use serde::Serialize;
  6. use crate::db::db::establish_connection;
  7. use crate::schema::users;
  8. use crate::schema::users::dsl::*;
  9. #[derive(Insertable)]
  10. #[diesel(table_name = users)]
  11. pub struct NewUserInsert {
  12. pub username: String,
  13. pub password_hash: String,
  14. pub stellar_address: String,
  15. pub email: Option<String>,
  16. }
  17. #[derive(Serialize)]
  18. pub struct RegisteredUser {
  19. pub id: i32,
  20. pub username: String,
  21. pub stellar_address: String,
  22. pub email: Option<String>,
  23. }
  24. #[derive(Queryable)]
  25. pub struct UserAuth {
  26. pub id: i32,
  27. pub username: String,
  28. pub full_name: Option<String>,
  29. pub password_hash: String,
  30. pub stellar_address: String,
  31. pub email: Option<String>,
  32. pub is_active: bool,
  33. }
  34. #[derive(Queryable, Serialize)]
  35. pub struct UserForAuth {
  36. pub id: i32,
  37. pub full_name: Option<String>,
  38. pub username: String,
  39. pub stellar_address: String,
  40. pub email: Option<String>,
  41. pub is_active: bool,
  42. }
  43. fn get_conn() -> Result<r2d2::PooledConnection<diesel::r2d2::ConnectionManager<PgConnection>>, diesel::result::Error> {
  44. let pool = establish_connection().map_err(|_| {
  45. diesel::result::Error::DatabaseError(
  46. diesel::result::DatabaseErrorKind::Unknown,
  47. Box::new("Failed to establish database connection".to_string()),
  48. )
  49. })?;
  50. pool.get().map_err(|_| {
  51. diesel::result::Error::DatabaseError(
  52. diesel::result::DatabaseErrorKind::Unknown,
  53. Box::new("Failed to get database connection from pool".to_string()),
  54. )
  55. })
  56. }
  57. pub(crate) fn create_user(
  58. new_user: NewUserInsert,
  59. ) -> Result<RegisteredUser, diesel::result::Error> {
  60. let mut conn = get_conn()?;
  61. diesel::insert_into(users::table)
  62. .values(&new_user)
  63. .returning((id, username, stellar_address, email))
  64. .get_result::<(i32, String, String, Option<String>)>(&mut conn)
  65. .map(|(uid, uname, saddr, mail)| RegisteredUser {
  66. id: uid,
  67. username: uname,
  68. stellar_address: saddr,
  69. email: mail,
  70. })
  71. }
  72. pub(crate) fn find_user_by_username(uname: &str) -> Result<UserAuth, diesel::result::Error> {
  73. let mut conn = get_conn()?;
  74. users
  75. .filter(username.eq(uname))
  76. .select((id, username, full_name, password_hash, stellar_address, email, is_active))
  77. .first::<UserAuth>(&mut conn)
  78. }
  79. pub(crate) fn get_user_for_auth_by_stellar(addr: &str) -> Result<UserForAuth, diesel::result::Error> {
  80. let mut conn = get_conn()?;
  81. users
  82. .filter(stellar_address.eq(addr))
  83. .select((id, full_name, username, stellar_address, email, is_active))
  84. .first::<UserForAuth>(&mut conn)
  85. }
  86. pub(crate) fn get_user_for_auth_by_email(mail: &str) -> Result<UserForAuth, diesel::result::Error> {
  87. let mut conn = get_conn()?;
  88. users
  89. .filter(email.eq(mail))
  90. .select((id, full_name, username, stellar_address, email, is_active))
  91. .first::<UserForAuth>(&mut conn)
  92. }