lib/buttercms-ruby.rb in buttercms-ruby-1.3.2 vs lib/buttercms-ruby.rb in buttercms-ruby-1.4
- old
+ new
@@ -25,10 +25,11 @@
module ButterCMS
@api_url = URI.parse('https://api.buttercms.com/v2')
class << self
attr_accessor :api_token
+ attr_accessor :write_api_token
attr_accessor :test_mode
attr_accessor :read_timeout
attr_reader :data_store
attr_writer :logger
end
@@ -69,17 +70,10 @@
query[:test] = 1
end
path = "#{@api_url.path}#{URI.encode(path)}?#{URI.encode_www_form(query)}"
- http_options = {
- open_timeout: 2.0,
- read_timeout: read_timeout || 5.0,
- ssl_timeout: 2.0,
- use_ssl: @api_url.scheme == "https",
- }
-
response =
Net::HTTP.start(@api_url.host, @api_url.port, http_options) do |http|
request = Net::HTTP::Get.new(path)
request["User-Agent"] = "ButterCMS/Ruby #{ButterCMS::VERSION}"
request["Accept"] = "application/json"
@@ -125,7 +119,63 @@
# Raise request exception if there's no data store or value returned
raise e unless data_store && result
end
return JSON.parse(result)
+ end
+
+ def self.write_request(path, options = {})
+ raise ArgumentError.new "Please set your write API token" unless write_api_token
+ result = write_api_request(path, options)
+
+ return JSON.parse(result)
+ end
+
+ def self.write_api_request(path, options = {})
+ query = options.dup
+ token_for_request = query.delete(:auth_token) || write_api_token
+
+ path = "#{@api_url.path}#{URI.encode(path)}"
+
+ response =
+ Net::HTTP.start(@api_url.host, @api_url.port, http_options) do |http|
+ write_type = query.delete(:method) || "Post"
+ request_type = "Net::HTTP::#{write_type}".constantize
+ request = request_type.new(path)
+ request["User-Agent"] = "ButterCMS/Ruby #{ButterCMS::VERSION}"
+ request["Accept"] = "application/json"
+ request["Content-Type"] = "application/json"
+ request["Authorization"] = "Token #{token_for_request}"
+ request.body = query.except(:auth_token).to_json
+
+ http.request(request)
+ end
+
+ case response
+ when Net::HTTPNotFound
+ raise ::ButterCMS::NotFound, JSON.parse(response.body)["detail"]
+ when Net::HTTPBadRequest
+ parsed_body = JSON.parse(response.body)
+ errors = if parsed_body.is_a?(Array)
+ parsed_body.join(' ')
+ else
+ parsed_body.map do |k, v|
+ "#{k}: #{v}"
+ end.join(" ")
+ end
+ raise ::ButterCMS::BadRequest, errors
+ end
+
+ response.body
+ end
+
+ private
+
+ def self.http_options
+ {
+ open_timeout: 2.0,
+ read_timeout: read_timeout || 5.0,
+ ssl_timeout: 2.0,
+ use_ssl: @api_url.scheme == "https",
+ }
end
end