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.

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