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