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.

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