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.

110 lines
3.3 KiB

4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
  1. use actix_web::{get, post, web, HttpResponse};
  2. use crate::actions;
  3. use crate::models;
  4. use crate::AppConfig;
  5. use actix_web::error::ResponseError;
  6. use std::rc::Rc;
  7. use validator::Validate;
  8. /// Finds user by UID.
  9. #[get("/get/users/{user_id}")]
  10. pub async fn get_user(
  11. config: web::Data<AppConfig>,
  12. user_id: web::Path<i32>,
  13. ) -> Result<HttpResponse, impl ResponseError> {
  14. let u_id = user_id.into_inner();
  15. // use web::block to offload blocking Diesel code without blocking server thread
  16. let res = web::block(move || {
  17. let pool = &config.pool;
  18. let conn = pool.get()?;
  19. actions::find_user_by_uid(u_id, &conn)
  20. })
  21. .await
  22. .and_then(|maybe_user| {
  23. if let Some(user) = maybe_user {
  24. Ok(HttpResponse::Ok().json(user))
  25. } else {
  26. let res = HttpResponse::NotFound()
  27. .body(format!("No user found with uid: {}", u_id));
  28. Ok(res)
  29. }
  30. });
  31. res
  32. }
  33. #[get("/get/users")]
  34. pub async fn get_all_users(
  35. config: web::Data<AppConfig>,
  36. ) -> Result<HttpResponse, impl ResponseError> {
  37. // use web::block to offload blocking Diesel code without blocking server thread
  38. let res = web::block(move || {
  39. let pool = &config.pool;
  40. let conn = pool.get()?;
  41. actions::get_all(&conn)
  42. })
  43. .await
  44. .and_then(|maybe_users| {
  45. debug!("{:?}", maybe_users);
  46. if let Some(users) = maybe_users {
  47. if users.is_empty() {
  48. let res = HttpResponse::NotFound()
  49. .json(models::ErrorModel::new(40, "No users available"));
  50. // let res = crate::errors::DomainError::new_generic_error("".to_owned());
  51. Ok(res)
  52. } else {
  53. Ok(HttpResponse::Ok().json(users))
  54. }
  55. } else {
  56. let res = HttpResponse::NotFound()
  57. .json(models::ErrorModel::new(40, "No users available"));
  58. Ok(res)
  59. }
  60. });
  61. res
  62. }
  63. /// Inserts new user with name defined in form.
  64. #[post("/do_registration")]
  65. pub async fn add_user(
  66. config: web::Data<AppConfig>,
  67. form: web::Json<models::NewUser>,
  68. ) -> Result<HttpResponse, impl ResponseError> {
  69. // use web::block to offload blocking Diesel code without blocking server thread
  70. let res = match form.0.validate() {
  71. Ok(_) => web::block(move || {
  72. let pool = &config.pool;
  73. let conn = pool.get()?;
  74. actions::insert_new_user(Rc::new(form.0), &conn)
  75. })
  76. .await
  77. .and_then(|user| {
  78. debug!("{:?}", user);
  79. Ok(HttpResponse::Created().json(user))
  80. }),
  81. Err(e) => {
  82. // let err = e.to_string();
  83. // web::block(move || {
  84. // Err(crate::errors::DomainError::new_generic_error(err))
  85. // })
  86. // .await
  87. // let res2 =
  88. // crate::errors::DomainError::new_generic_error(e.to_string());
  89. // Err(res2)
  90. // let res2 = crate::errors::DomainError::GenericError {
  91. // cause: e.to_string(),
  92. // };
  93. // Err(res2)
  94. let res = HttpResponse::BadRequest().body(e.to_string());
  95. // .json(models::ErrorModel::new(
  96. // 40,
  97. // "Error registering user due to validation errors",
  98. // ));
  99. Ok(res)
  100. }
  101. };
  102. res
  103. }