error.cpp 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. #include "common/error.hpp"
  2. #include <sstream>
  3. namespace smartbotic::common {
  4. int errorCodeToHttpStatus(ErrorCode code) {
  5. switch (code) {
  6. case ErrorCode::InvalidArgument:
  7. case ErrorCode::ValidationError:
  8. case ErrorCode::QueryError:
  9. return 400;
  10. case ErrorCode::Unauthenticated:
  11. case ErrorCode::InvalidCredentials:
  12. case ErrorCode::TokenExpired:
  13. case ErrorCode::TokenInvalid:
  14. case ErrorCode::SessionExpired:
  15. return 401;
  16. case ErrorCode::PermissionDenied:
  17. case ErrorCode::InsufficientPermissions:
  18. return 403;
  19. case ErrorCode::NotFound:
  20. case ErrorCode::DocumentNotFound:
  21. case ErrorCode::CollectionNotFound:
  22. case ErrorCode::WorkflowNotFound:
  23. case ErrorCode::NodeNotFound:
  24. return 404;
  25. case ErrorCode::AlreadyExists:
  26. case ErrorCode::VersionConflict:
  27. return 409;
  28. case ErrorCode::FailedPrecondition:
  29. case ErrorCode::WorkflowInactive:
  30. return 412;
  31. case ErrorCode::ResourceExhausted:
  32. return 429;
  33. case ErrorCode::Timeout:
  34. case ErrorCode::ExecutionTimeout:
  35. case ErrorCode::ScriptTimeout:
  36. return 408;
  37. case ErrorCode::Unavailable:
  38. case ErrorCode::RunnerUnavailable:
  39. case ErrorCode::NoRunnersAvailable:
  40. case ErrorCode::CircuitBreakerOpen:
  41. return 503;
  42. case ErrorCode::Aborted:
  43. case ErrorCode::ExecutionCancelled:
  44. return 499;
  45. default:
  46. return 500;
  47. }
  48. }
  49. Error::Error(ErrorCode code, std::string message)
  50. : code_(code), message_(std::move(message)), details_(nlohmann::json::object()) {}
  51. Error::Error(ErrorCode code, std::string message, nlohmann::json details)
  52. : code_(code), message_(std::move(message)), details_(std::move(details)) {}
  53. nlohmann::json Error::toJson() const {
  54. nlohmann::json j;
  55. j["code"] = static_cast<int>(code_);
  56. j["message"] = message_;
  57. if (!details_.empty()) {
  58. j["details"] = details_;
  59. }
  60. return j;
  61. }
  62. std::string Error::toString() const {
  63. std::ostringstream ss;
  64. ss << "Error[" << static_cast<int>(code_) << "]: " << message_;
  65. if (!details_.empty()) {
  66. ss << " (" << details_.dump() << ")";
  67. }
  68. return ss.str();
  69. }
  70. Error Error::fromException(const std::exception& e) {
  71. return Error(ErrorCode::Internal, e.what());
  72. }
  73. SmartBoticException::SmartBoticException(Error error)
  74. : std::runtime_error(error.toString()), error_(std::move(error)) {}
  75. } // namespace smartbotic::common