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.

70 lines
2.8 KiB

  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 r2d2;
  8. use std::convert::From;
  9. // impl From<DBError> for DomainError {
  10. // fn from(error: DBError) -> DomainError {
  11. // // We only care about UniqueViolations
  12. // match error {
  13. // DBError::DatabaseError(kind, info) => {
  14. // let message = info.details().unwrap_or_else(|| info.message()).to_string();
  15. // match kind {
  16. // DatabaseErrorKind::UniqueViolation => DomainError::DuplicateValue(message),
  17. // _ => DomainError::GenericError(message),
  18. // }
  19. // }
  20. // _ => DomainError::GenericError(String::from("Some database error occured")),
  21. // }
  22. // }
  23. // }
  24. custom_error! { #[derive(new)] pub DomainError
  25. PwdHashError {source: BcryptError} = "Failed to hash password",
  26. DbError {source: diesel::result::Error} = "Database error",
  27. DbPoolError {source: r2d2::Error} = "Failed to get connection from pool",
  28. PasswordError {cause: String} = "Failed to validate password - {cause}",
  29. GenericError {cause: String} = "Generic Error - Reason: {cause}"
  30. }
  31. impl ResponseError for DomainError {
  32. fn error_response(&self) -> HttpResponse {
  33. let err = self;
  34. match self {
  35. DomainError::PwdHashError { source } => {
  36. HttpResponse::InternalServerError().json(ErrorModel {
  37. error_code: 500,
  38. reason: format!("{} {}", err.to_string(), source).as_str(),
  39. })
  40. }
  41. DomainError::DbError { source } => {
  42. HttpResponse::InternalServerError().json(ErrorModel {
  43. error_code: 500,
  44. reason: format!("{} {}", err.to_string(), source).as_str(),
  45. })
  46. }
  47. DomainError::DbPoolError { source } => {
  48. HttpResponse::InternalServerError().json(ErrorModel {
  49. error_code: 500,
  50. reason: format!("{} {}", err.to_string(), source).as_str(),
  51. })
  52. }
  53. DomainError::PasswordError { cause: _ } => HttpResponse::BadRequest()
  54. .json(ErrorModel {
  55. error_code: 400,
  56. reason: format!("{}", err.to_string())
  57. .as_str(),
  58. }),
  59. DomainError::GenericError { cause } => HttpResponse::BadRequest()
  60. .json(ErrorModel {
  61. error_code: 400,
  62. reason: format!("{} {}, ", err.to_string(), cause.clone())
  63. .as_str(),
  64. }),
  65. }
  66. }
  67. }