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.

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