diff --git a/lib/render_ruby.rb b/lib/render_ruby.rb index 4f25880..0ab6138 100644 --- a/lib/render_ruby.rb +++ b/lib/render_ruby.rb @@ -12,7 +12,13 @@ module RenderRuby # resources autoload :OwnerResource, 'render_ruby/resources/owners' + autoload :ServiceResource, 'render_ruby/resources/services' # objects autoload :Owner, 'render_ruby/objects/owner' + autoload :Service, 'render_ruby/objects/service' + autoload :EnvironmentVariable, 'render_ruby/objects/environment_variable' + autoload :Header, 'render_ruby/objects/header' + autoload :Rule, 'render_ruby/objects/rule' + autoload :Scale, 'render_ruby/objects/scale' end diff --git a/lib/render_ruby/client.rb b/lib/render_ruby/client.rb index 74c8cd4..5a165aa 100644 --- a/lib/render_ruby/client.rb +++ b/lib/render_ruby/client.rb @@ -18,6 +18,10 @@ def owners OwnerResource.new(self) end + def services + ServiceResource.new(self) + end + def connection @connection ||= Faraday.new(BASE_URL) do |conn| conn.request :authorization, :Bearer, api_key diff --git a/lib/render_ruby/collection.rb b/lib/render_ruby/collection.rb index 5716e1d..cc1c561 100644 --- a/lib/render_ruby/collection.rb +++ b/lib/render_ruby/collection.rb @@ -6,6 +6,9 @@ class Collection def self.from_response(response, type:) body = response.body + + return new(data: [], total: 0, next_cursor: '', prev_cursor: '') if body.empty? + new( data: body.map { |attrs| type.new(attrs) }, total: body.count, diff --git a/lib/render_ruby/objects/environment_variable.rb b/lib/render_ruby/objects/environment_variable.rb new file mode 100644 index 0000000..33c129d --- /dev/null +++ b/lib/render_ruby/objects/environment_variable.rb @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +module RenderRuby + class EnvironmentVariable < Object + end +end diff --git a/lib/render_ruby/objects/header.rb b/lib/render_ruby/objects/header.rb new file mode 100644 index 0000000..d49cf22 --- /dev/null +++ b/lib/render_ruby/objects/header.rb @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +module RenderRuby + class Header < Object + end +end diff --git a/lib/render_ruby/objects/rule.rb b/lib/render_ruby/objects/rule.rb new file mode 100644 index 0000000..02d6fd7 --- /dev/null +++ b/lib/render_ruby/objects/rule.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +module RenderRuby + class Rule < Object + TYPES = %w[redirect rewrite].freeze + + TYPES.each do |type| + define_method "#{type}?" do + type == self.type + end + end + end +end diff --git a/lib/render_ruby/objects/scale.rb b/lib/render_ruby/objects/scale.rb new file mode 100644 index 0000000..550647d --- /dev/null +++ b/lib/render_ruby/objects/scale.rb @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +module RenderRuby + class Scale < Object + end +end diff --git a/lib/render_ruby/objects/service.rb b/lib/render_ruby/objects/service.rb new file mode 100644 index 0000000..2cda3c6 --- /dev/null +++ b/lib/render_ruby/objects/service.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +module RenderRuby + class Service < Object + TYPES = %w[static_site web_service private_service background_worker cron_job].freeze + + def auto_deploy_enabled? + autoDeploy.equal?('yes') + end + + def suspended? + suspended.equal?('suspended') + end + end +end diff --git a/lib/render_ruby/resource.rb b/lib/render_ruby/resource.rb index 6bd22c2..1fc8bdd 100644 --- a/lib/render_ruby/resource.rb +++ b/lib/render_ruby/resource.rb @@ -30,27 +30,10 @@ def delete_request(url, params: {}, headers: {}) handle_response client.connection.delete(url, params, headers) end - # rubocop:disable Metrics/CyclomaticComplexity def handle_response(response) - case response.status - when 400 - raise Error, "Your request was malformed. #{response.body}" - when 401 - raise Error, "You did not supply valid authentication credentials. #{response.body}" - when 403 - raise Error, "You are not allowed to perform that action. #{response.body}" - when 404 - raise Error, "No results were found for your request. #{response.body}" - when 429 - raise Error, "Your request exceeded the API rate limit. #{response.body}" - when 500 - raise Error, "We were unable to perform the request due to server-side problems. #{response.body}" - when 503 - raise Error, "You have been rate limited for sending more than 30 requests per minute. #{response.body}" - end + raise Error, response.body['message'] unless [200, 201, 202, 204].include?(response.status) response end - # rubocop:enable Metrics/CyclomaticComplexity end end diff --git a/lib/render_ruby/resources/services.rb b/lib/render_ruby/resources/services.rb new file mode 100644 index 0000000..486b4d7 --- /dev/null +++ b/lib/render_ruby/resources/services.rb @@ -0,0 +1,63 @@ +# frozen_string_literal: true + +module RenderRuby + class ServiceResource < Resource + def list(**params) + response = get_request('services', params: params) + + Collection.from_response(response, type: Service) + end + + def retrieve(service_id:) + Service.new get_request("services/#{service_id}").body + end + + def create(**attributes) + Service.new post_request('services', body: attributes).body + end + + def update(service_id:, **attributes) + Service.new patch_request("services/#{service_id}", body: attributes).body + end + + def delete(service_id:) + delete_request("services/#{service_id}") + end + + def suspend(service_id:) + post_request("services/#{service_id}/suspend", body: {}) + end + + def resume(service_id:) + post_request("services/#{service_id}/resume", body: {}) + end + + def retrieve_env_vars(service_id:, **params) + response = get_request("services/#{service_id}/env-vars", params: params) + + Collection.from_response(response, type: EnvironmentVariable) + end + + def update_env_var(service_id:, env_vars:) + response = put_request("services/#{service_id}/env-vars", body: env_vars) + + Collection.from_response(response, type: EnvironmentVariable) + end + + def retrieve_headers(service_id:, **params) + response = get_request("services/#{service_id}/headers", params: params) + + Collection.from_response(response, type: Header) + end + + def retrieve_redirect_and_rewrite_rules(service_id:, **params) + response = get_request("services/#{service_id}/routes", params: params) + + Collection.from_response(response, type: Rule) + end + + def scale(service_id:, num_instances:) + Scale.new post_request("services/#{service_id}/scale", body: { numInstances: num_instances }).body + end + end +end