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.7 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
  1. use actix_web::{web, HttpResponse};
  2. use crate::{
  3. actions,
  4. models::{self, ApiResponse, Pagination, SearchQuery, UserId},
  5. };
  6. use crate::{errors::DomainError, AppData};
  7. /// Finds user by UID.
  8. #[tracing::instrument(
  9. level = "debug",
  10. skip(app_data),
  11. fields(
  12. user_id = %user_id.0
  13. )
  14. )]
  15. pub async fn get_user(
  16. app_data: web::Data<AppData>,
  17. user_id: web::Path<UserId>,
  18. ) -> Result<HttpResponse, DomainError> {
  19. let u_id = user_id.into_inner();
  20. let u_id2 = u_id.clone();
  21. let _ = tracing::info!("Getting user with id {}", u_id);
  22. // use web::block to offload blocking Diesel code without blocking server thread
  23. let res = web::block(move || {
  24. let pool = &app_data.pool;
  25. let conn = pool.get()?;
  26. actions::find_user_by_uid(&u_id2, &conn)
  27. })
  28. .await
  29. .map_err(|err| DomainError::new_thread_pool_error(err.to_string()))?;
  30. let _ = tracing::trace!("{:?}", res);
  31. if let Some(user) = res {
  32. Ok(HttpResponse::Ok().json(ApiResponse::successful(user)))
  33. } else {
  34. let err = DomainError::new_entity_does_not_exist_error(format!(
  35. "No user found with uid: {}",
  36. u_id
  37. ));
  38. Err(err)
  39. }
  40. }
  41. // #[get("/get/users/{user_id}")]
  42. // pub async fn get_user2(
  43. // user_service: web::Data<dyn UserService>,
  44. // user_id: web::Path<i32>,
  45. // ) -> Result<HttpResponse, DomainError> {
  46. // let u_id = user_id.into_inner();
  47. // let user = user_service.find_user_by_uid(u_id)?;
  48. // if let Some(user) = user {
  49. // Ok(HttpResponse::Ok().json(user))
  50. // } else {
  51. // let err = DomainError::new_entity_does_not_exist_error(format!(
  52. // "No user found with uid: {}",
  53. // u_id
  54. // ));
  55. // Err(err)
  56. // }
  57. // }
  58. #[tracing::instrument(level = "debug", skip(app_data))]
  59. pub async fn get_users(
  60. app_data: web::Data<AppData>,
  61. pagination: web::Query<Pagination>,
  62. ) -> Result<HttpResponse, DomainError> {
  63. let _ = tracing::info!("Paginated users request");
  64. let users = web::block(move || {
  65. let pool = &app_data.pool;
  66. let conn = pool.get()?;
  67. let p: Pagination = pagination.into_inner();
  68. actions::get_all_users(&p, &conn)
  69. })
  70. .await
  71. .map_err(|err| DomainError::new_thread_pool_error(err.to_string()))?;
  72. let _ = tracing::trace!("{:?}", users);
  73. Ok(HttpResponse::Ok().json(ApiResponse::successful(users)))
  74. }
  75. #[tracing::instrument(level = "debug", skip(app_data))]
  76. pub async fn search_users(
  77. app_data: web::Data<AppData>,
  78. query: web::Query<SearchQuery>,
  79. pagination: web::Query<Pagination>,
  80. ) -> Result<HttpResponse, DomainError> {
  81. let _ = tracing::info!("Search users request");
  82. let users = web::block(move || {
  83. let pool = &app_data.pool;
  84. let conn = pool.get()?;
  85. let p: Pagination = pagination.into_inner();
  86. actions::search_users(query.q.as_str(), &p, &conn)
  87. })
  88. .await
  89. .map_err(|err| DomainError::new_thread_pool_error(err.to_string()))?;
  90. let _ = tracing::trace!("{:?}", users);
  91. Ok(HttpResponse::Ok().json(ApiResponse::successful(users)))
  92. }
  93. /// Inserts a new user
  94. #[tracing::instrument(level = "debug", skip(app_data))]
  95. pub async fn add_user(
  96. app_data: web::Data<AppData>,
  97. form: web::Json<models::NewUser>,
  98. ) -> Result<HttpResponse, DomainError> {
  99. let user = web::block(move || {
  100. let pool = &app_data.pool;
  101. let conn = pool.get()?;
  102. actions::insert_new_user(form.0, &conn, Some(app_data.config.hash_cost))
  103. })
  104. .await
  105. .map_err(|err| DomainError::new_thread_pool_error(err.to_string()))?;
  106. let _ = tracing::trace!("{:?}", user);
  107. Ok(HttpResponse::Created().json(ApiResponse::successful(user)))
  108. }