Skip to content

Commit

Permalink
Fixes to the new error code (#8)
Browse files Browse the repository at this point in the history
  • Loading branch information
deanpcmad authored Aug 1, 2024
2 parents 56c482b + 342513e commit b1a2fdd
Show file tree
Hide file tree
Showing 6 changed files with 144 additions and 137 deletions.
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ product = Paddle::Product.retrieve(id: "pro_abc123")
# Update a product
# https://developer.paddle.com/api-reference/products/update-product
product.update(description: "This is a plan")
# or
# or
Paddle::Product.update(id: "pro_abc123", description: "This is a plan")
```

Expand Down Expand Up @@ -181,7 +181,7 @@ Paddle::Customer.list(email: "[email protected]")

# Create a customer
# https://developer.paddle.com/api-reference/customers/create-customer
# Returns a Paddle::ConflictError if the email is already used on Paddle
# Returns a Paddle::Errors::ConflictError if the email is already used on Paddle
Paddle::Customer.create(email: "[email protected]", name: "Customer Name")

# Retrieve a customer
Expand Down
4 changes: 3 additions & 1 deletion lib/paddle.rb
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@ module Paddle
autoload :Client, "paddle/client"
autoload :Collection, "paddle/collection"
autoload :Error, "paddle/error"
autoload :ErrorFactory, "paddle/error"
autoload :ErrorGenerator, "paddle/error_generator"
autoload :ErrorFactory, "paddle/error_generator"

autoload :Object, "paddle/object"

Expand Down Expand Up @@ -50,6 +51,7 @@ module Classic
autoload :Client, "paddle/classic/client"
autoload :Collection, "paddle/classic/collection"
autoload :Resource, "paddle/classic/resource"
autoload :Error, "paddle/classic/error"

autoload :PlansResource, "paddle/classic/resources/plans"
autoload :CouponsResource, "paddle/classic/resources/coupons"
Expand Down
6 changes: 6 additions & 0 deletions lib/paddle/classic/error.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
module Paddle
module Classic
class Error < StandardError
end
end
end
123 changes: 0 additions & 123 deletions lib/paddle/error.rb
Original file line number Diff line number Diff line change
@@ -1,127 +1,4 @@
module Paddle
class Error < StandardError
attr_reader :http_status_code
attr_reader :paddle_error_code
attr_reader :paddle_error_message

def initialize(response_body, http_status_code)
@response_body = response_body
@http_status_code = http_status_code
set_paddle_error_values
super(build_message)
end

private

def set_paddle_error_values
@paddle_error_code = @response_body.dig("error", "code")
@paddle_error_message = @response_body.dig("error", "detail")
end

def error_message
@paddle_error_message || @response_body.dig("error", "code")
rescue NoMethodError
"An unknown error occurred."
end

def build_message
if paddle_error_code.nil?
return "Error #{@http_status_code}: #{error_message}"
end
"Error #{@http_status_code}: #{error_message} '#{paddle_error_code}'"
end
end

class BadRequestError < Error
private

def error_message
"Your request was malformed."
end
end

class AuthenticationMissingError < Error
private

def error_message
"You did not supply valid authentication credentials."
end
end

class ForbiddenError < Error
private

def error_message
"You are not allowed to perform that action."
end
end

class EntityNotFoundError < Error
private

def error_message
"No results were found for your request."
end
end

class ConflictError < Error
private

def error_message
"Your request was a conflict."
end
end

class TooManyRequestsError < Error
private

def error_message
"Your request exceeded the API rate limit."
end
end

class InternalError < Error
private

def error_message
"We were unable to perform the request due to server-side problems."
end
end

class ServiceUnavailableError < Error
private

def error_message
"You have been rate limited for sending more than 20 requests per second."
end
end

class NotImplementedError < Error
private

def error_message
"This resource has not been implemented."
end
end


class ErrorFactory
HTTP_ERROR_MAP = {
400 => BadRequestError,
401 => AuthenticationMissingError,
403 => ForbiddenError,
404 => EntityNotFoundError,
409 => ConflictError,
429 => TooManyRequestsError,
500 => InternalError,
503 => ServiceUnavailableError,
501 => NotImplementedError
}.freeze

def self.create(response_body, http_status_code)
status = http_status_code
error_class = HTTP_ERROR_MAP[status] || Error
error_class.new(response_body, http_status_code) if error_class
end
end
end
128 changes: 128 additions & 0 deletions lib/paddle/error_generator.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
module Paddle
class ErrorGenerator < StandardError
attr_reader :http_status_code
attr_reader :paddle_error_code
attr_reader :paddle_error_message

def initialize(response_body, http_status_code)
@response_body = response_body
@http_status_code = http_status_code
set_paddle_error_values
super(build_message)
end

private

def set_paddle_error_values
@paddle_error_code = @response_body.dig("error", "code")
@paddle_error_message = @response_body.dig("error", "detail")
end

def error_message
@paddle_error_message || @response_body.dig("error", "code")
rescue NoMethodError
"An unknown error occurred."
end

def build_message
if paddle_error_code.nil?
return "Error #{@http_status_code}: #{error_message}"
end
"Error #{@http_status_code}: #{error_message} '#{paddle_error_code}'"
end
end

module Errors
class BadRequestError < ErrorGenerator
private

def error_message
"Your request was malformed."
end
end

class AuthenticationMissingError < ErrorGenerator
private

def error_message
"You did not supply valid authentication credentials."
end
end

class ForbiddenError < ErrorGenerator
private

def error_message
"You are not allowed to perform that action."
end
end

class EntityNotFoundError < ErrorGenerator
private

def error_message
"No results were found for your request."
end
end

class ConflictError < ErrorGenerator
private

def error_message
"Your request was a conflict."
end
end

class TooManyRequestsError < ErrorGenerator
private

def error_message
"Your request exceeded the API rate limit."
end
end

class InternalError < ErrorGenerator
private

def error_message
"We were unable to perform the request due to server-side problems."
end
end

class ServiceUnavailableError < ErrorGenerator
private

def error_message
"You have been rate limited for sending more than 20 requests per second."
end
end

class NotImplementedError < ErrorGenerator
private

def error_message
"This resource has not been implemented."
end
end
end

class ErrorFactory
HTTP_ERROR_MAP = {
400 => Errors::BadRequestError,
401 => Errors::AuthenticationMissingError,
403 => Errors::ForbiddenError,
404 => Errors::EntityNotFoundError,
409 => Errors::ConflictError,
429 => Errors::TooManyRequestsError,
500 => Errors::InternalError,
503 => Errors::ServiceUnavailableError,
501 => Errors::NotImplementedError
}.freeze

def self.create(response_body, http_status_code)
status = http_status_code
error_class = HTTP_ERROR_MAP[status] || ErrorGenerator
error_class.new(response_body, http_status_code) if error_class
end
end
end
16 changes: 5 additions & 11 deletions test/paddle/error_test.rb
Original file line number Diff line number Diff line change
@@ -1,10 +1,4 @@
class ErrorTest < Minitest::Test
def test_generic_error
error = Paddle::Error.new({ "error" => { "code" => 123, "detail" => "Paddle error message" } }, 409)

assert_equal "Error 409: Paddle error message '123'", error.message
end

def test_bad_request_error
error = Paddle::ErrorFactory.create(
{ "error" => { "code" => 123, "detail" => "Paddle error message" } },
Expand All @@ -23,15 +17,15 @@ def test_authentication_missing_error
assert_equal "Error 401: You did not supply valid authentication credentials.", error.message
end

def test_paddle_error_code
error = Paddle::Error.new({ "error" => { "code" => 123, "detail" => "Paddle error message" } }, 409)
def test_paddle_error_generator_message
error = Paddle::ErrorGenerator.new({ "error" => { "code" => 123, "detail" => "Paddle error message" } }, 409)

assert_equal 123, error.paddle_error_code
assert_equal "Paddle error message", error.paddle_error_message
end

def test_paddle_error_message
error = Paddle::Error.new({ "error" => { "code" => 123, "detail" => "Paddle error message" } }, 409)
error = Paddle::Error.new("Connection failed")

assert_equal "Paddle error message", error.paddle_error_message
assert_equal "Connection failed", error.message
end
end

0 comments on commit b1a2fdd

Please sign in to comment.