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.

93 lines
3.6 KiB

3 years ago
3 years ago
  1. use actix_web::{HttpResponse, ResponseError};
  2. use bcrypt::BcryptError;
  3. use custom_error::custom_error;
  4. // use derive_more::Display;
  5. // use diesel::result::DatabaseErrorKind;
  6. use crate::models::errors::*;
  7. use std::convert::From;
  8. // impl From<DBError> for DomainError {
  9. // fn from(error: DBError) -> DomainError {
  10. // // We only care about UniqueViolations
  11. // match error {
  12. // DBError::DatabaseError(kind, info) => {
  13. // let message = info.details().unwrap_or_else(|| info.message()).to_string();
  14. // match kind {
  15. // DatabaseErrorKind::UniqueViolation => DomainError::DuplicateValue(message),
  16. // _ => DomainError::GenericError(message),
  17. // }
  18. // }
  19. // _ => DomainError::GenericError(String::from("Some database error occured")),
  20. // }
  21. // }
  22. // }
  23. custom_error! { #[derive(new)] pub DomainError
  24. PwdHashError {source: BcryptError} = "Failed to hash password",
  25. DbError {source: diesel::result::Error} = "Database error",
  26. DbPoolError {source: r2d2::Error} = "Failed to get connection from pool",
  27. PasswordError {cause: String} = "Failed to validate password - {cause}",
  28. EntityDoesNotExistError {message: String} = "Entity does not exist - {message}",
  29. ThreadPoolError {message: String} = "Thread pool error - {message}",
  30. AuthError {message: String} = "Authentication Error - {message}"
  31. }
  32. impl ResponseError for DomainError {
  33. fn error_response(&self) -> HttpResponse {
  34. let err = self;
  35. match self {
  36. DomainError::PwdHashError { source: _ } => {
  37. HttpResponse::InternalServerError().json(ErrorModel {
  38. // error_code: 500,
  39. success: false,
  40. reason: err.to_string().as_str(),
  41. })
  42. }
  43. DomainError::DbError { source: _ } => {
  44. error!("{}", err);
  45. HttpResponse::InternalServerError().json(ErrorModel {
  46. // error_code: 500,
  47. success: false,
  48. reason: "Error in database",
  49. })
  50. }
  51. DomainError::DbPoolError { source: _ } => {
  52. error!("{}", err);
  53. HttpResponse::InternalServerError().json(ErrorModel {
  54. // error_code: 500,
  55. success: false,
  56. reason: "Error getting database pool",
  57. })
  58. }
  59. DomainError::PasswordError { cause: _ } => {
  60. HttpResponse::BadRequest().json(ErrorModel {
  61. // error_code: 400,
  62. success: false,
  63. reason: err.to_string().as_str(),
  64. })
  65. }
  66. DomainError::EntityDoesNotExistError { message: _ } => {
  67. HttpResponse::Accepted().json(ErrorModel {
  68. // error_code: 400,
  69. success: false,
  70. reason: err.to_string().as_str(),
  71. })
  72. }
  73. DomainError::ThreadPoolError { message: _ } => {
  74. error!("{}", err);
  75. HttpResponse::InternalServerError().json(ErrorModel {
  76. // error_code: 400,
  77. success: false,
  78. reason: "Thread pool error occurred",
  79. })
  80. }
  81. DomainError::AuthError { message: _ } => {
  82. HttpResponse::Accepted().json(ErrorModel {
  83. // error_code: 400,
  84. success: false,
  85. reason: err.to_string().as_str(),
  86. })
  87. }
  88. }
  89. }
  90. }