diff --git a/CHANGELOG.md b/CHANGELOG.md index 34d5ab3..ad468cd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## [0.1.2] - 2025-05-09 + +- Add `Gslide::HTTPError`, `Gslide::UnauthorizedError` and `Gslide::QuotaExceededError` #10 + ## [0.1.1] - 2025-04-14 - Use a regular expression for finding a presentation id from url #8 diff --git a/lib/gslide.rb b/lib/gslide.rb index b522459..96485a0 100644 --- a/lib/gslide.rb +++ b/lib/gslide.rb @@ -7,5 +7,7 @@ module Gslide class Error < StandardError; end - + class HTTPError < Error; end + class UnauthorizedError < HTTPError; end + class QuotaExceededError < HTTPError; end end diff --git a/lib/gslide/concerns/requests.rb b/lib/gslide/concerns/requests.rb index b7be051..b9055e5 100644 --- a/lib/gslide/concerns/requests.rb +++ b/lib/gslide/concerns/requests.rb @@ -7,9 +7,21 @@ def get_request(uri, auth_token: "") req = Net::HTTP::Get.new(uri.to_s) req['Authorization'] = "Bearer #{auth_token}" - Net::HTTP.start(uri.host, uri.port, :use_ssl => uri.scheme == 'https') do |http| + res = Net::HTTP.start(uri.host, uri.port, :use_ssl => uri.scheme == 'https') do |http| http.request(req) end + response_body = JSON(res.body) + + case res + when Net::HTTPSuccess + response_body + when Net::HTTPUnauthorized + msg = response_body["error"] ? response_body["error"]["message"] : "Unauthorized" + raise Gslide::UnauthorizedError, msg + else + msg = response_body["error"] ? response_body["error"]["message"] : "HTTPError" + raise Gslide::HTTPError, msg + end end def post_request(uri, auth_token: "", body: {}) @@ -19,9 +31,29 @@ def post_request(uri, auth_token: "", body: {}) req.body = body - Net::HTTP.start(uri.host, uri.port, :use_ssl => uri.scheme == 'https') do |http| + res = Net::HTTP.start(uri.host, uri.port, :use_ssl => uri.scheme == 'https') do |http| http.request(req) end + + response_body = JSON(res.body) + + case res + when Net::HTTPSuccess + response_body + when Net::HTTPUnauthorized + msg = response_body["error"] ? response_body["error"]["message"] : "Unauthorized" + raise Gslide::UnauthorizedError, msg + when Net::HTTPTooManyRequests + # "Quota exceeded for quota metric 'Write requests' and limit 'Write requests per minute per user' of service 'slides.googleapis.com' for consumer 'project_number:012345678901'." + if response_body["error"] && response_body["error"]["message"] =~ /Quota exceeded/ + raise Gslide::QuotaExceededError, msg + else + raise Gslide::HTTPError, msg || "TooManyRequests" + end + else + msg = response_body["error"] ? response_body["error"]["message"] : "HTTPError" + raise Gslide::HTTPError, msg + end end end end diff --git a/lib/gslide/models/editor.rb b/lib/gslide/models/editor.rb index b49c32a..8a09258 100644 --- a/lib/gslide/models/editor.rb +++ b/lib/gslide/models/editor.rb @@ -23,12 +23,7 @@ def insert_presentation(options = {}) uri = URI(GOOGLE_SLIDES + "") # "title" is the only allowed field in the request body - res = post_request(uri, auth_token: @token, body: options.to_json) - response_body = JSON(res.body) - - if response_body["error"] - raise Gslide::Error.new(response_body["error"]["message"]) - end + response_body = post_request(uri, auth_token: @token, body: options.to_json) Presentation.new response_body["presentationId"], auth: self end end diff --git a/lib/gslide/models/presentation.rb b/lib/gslide/models/presentation.rb index 325d18a..055dd4c 100644 --- a/lib/gslide/models/presentation.rb +++ b/lib/gslide/models/presentation.rb @@ -19,8 +19,8 @@ def initialize(id_or_url, auth: nil) def get uri = URI(GOOGLE_SLIDES + "/#{@id}") - res = get_request(uri, auth_token: @auth.token) - JSON(res.body).convert_keys {|k| k.snake_case.to_sym } + response_body = get_request(uri, auth_token: @auth.token) + response_body.convert_keys {|k| k.snake_case.to_sym } end def link_url @@ -36,23 +36,16 @@ def batch_update(options = {}) uri = URI(GOOGLE_SLIDES + "/#{@id}:batchUpdate") request_body = options.convert_keys { |k| k.to_s.lower_camel_case }.to_json - res = post_request(uri, auth_token: @auth.token, body: request_body) - response_body = JSON(res.body) - - if response_body["error"] - raise Gslide::Error.new(response_body["error"]["message"]) - end + response_body = post_request(uri, auth_token: @auth.token, body: request_body) response_body["presentationId"] == @id - - rescue Gslide::Error => e - if e.message =~ /Quota exceeded/ && (retries += 1) < 3 - # "Quota exceeded for quota metric 'Write requests' and limit 'Write requests per minute per user' of service 'slides.googleapis.com' for consumer 'project_number:012345678901'." + rescue Gslide::QuotaExceededError + if (retries += 1) < 3 sleep 10 + retries * retries * 10 retry end - # all retries failed, re-raise exception - raise e + # all retries failed, raise exception + raise end def get_slide_ids diff --git a/lib/gslide/models/spreadsheet.rb b/lib/gslide/models/spreadsheet.rb index 3fc56ae..7f6c44d 100644 --- a/lib/gslide/models/spreadsheet.rb +++ b/lib/gslide/models/spreadsheet.rb @@ -17,8 +17,8 @@ def initialize(id, auth: nil) def get uri = URI(GOOGLE_SHEETS + "/#{@id}") - res = get_request(uri, auth_token: @auth.token) - JSON(res.body).convert_keys {|k| k.snake_case.to_sym } + response_body = get_request(uri, auth_token: @auth.token) + response_body.convert_keys {|k| k.snake_case.to_sym } end def link_url @@ -32,12 +32,7 @@ def batch_update(options = {}) uri = URI(GOOGLE_SHEETS + "/#{@id}:batchUpdate") request_body = options.convert_keys { |k| k.to_s.lower_camel_case }.to_json - res = post_request(uri, auth_token: @auth.token, body: request_body) - response_body = JSON(res.body) - - if response_body["error"] - raise Gslide::Error.new(response_body["error"]["message"]) - end + response_body = post_request(uri, auth_token: @auth.token, body: request_body) response_body["spreadsheetId"] == @id end @@ -58,11 +53,8 @@ def create(options = {}) request_body = options.convert_keys { |k| k.to_s.lower_camel_case }.to_json uri = URI(GOOGLE_SHEETS) - res = post_request(uri, auth_token: @auth.token, body: request_body) - response_body = JSON(res.body) - if response_body["error"] - raise Gslide::Error.new(response_body["error"]["message"]) - end + response_body = post_request(uri, auth_token: @auth.token, body: request_body) + spreadsheet_id = response_body["spreadsheetId"] Spreadsheet.new(spreadsheet_id, auth: @auth) end diff --git a/lib/gslide/version.rb b/lib/gslide/version.rb index 40bc4cf..85d7498 100644 --- a/lib/gslide/version.rb +++ b/lib/gslide/version.rb @@ -1,5 +1,5 @@ # frozen_string_literal: true module Gslide - VERSION = "0.1.1" + VERSION = "0.1.2" end