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.

66 lines
2.7 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 has 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().json(ErrorModel {
  54. error_code: 400,
  55. reason: format!("{} {}, ", err.to_string(), cause.clone()).as_str(),
  56. }),
  57. DomainError::GenericError { cause } => HttpResponse::BadRequest().json(ErrorModel {
  58. error_code: 400,
  59. reason: format!("{} {}, ", err.to_string(), cause.clone()).as_str(),
  60. }),
  61. }
  62. }
  63. }