Skip to content

Commit 901b199

Browse files
authored
Services resource (#4)
* List all services (#3) * List all services * Add helper methods to service object * Retrieve a service (#5) * Create functionality for creating a service (#6) * Create functionality for updating a service (#7) * Create functionality for deleting a service (#8) * Create suspending and resuming functions * Create retrieving and updating functions for environment variables * Create retrieving for headers, redirects and rules * Create scaling action
1 parent 8db9f1c commit 901b199

10 files changed

+123
-18
lines changed

lib/render_ruby.rb

+6
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,13 @@ module RenderRuby
1212

1313
# resources
1414
autoload :OwnerResource, 'render_ruby/resources/owners'
15+
autoload :ServiceResource, 'render_ruby/resources/services'
1516

1617
# objects
1718
autoload :Owner, 'render_ruby/objects/owner'
19+
autoload :Service, 'render_ruby/objects/service'
20+
autoload :EnvironmentVariable, 'render_ruby/objects/environment_variable'
21+
autoload :Header, 'render_ruby/objects/header'
22+
autoload :Rule, 'render_ruby/objects/rule'
23+
autoload :Scale, 'render_ruby/objects/scale'
1824
end

lib/render_ruby/client.rb

+4
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,10 @@ def owners
1818
OwnerResource.new(self)
1919
end
2020

21+
def services
22+
ServiceResource.new(self)
23+
end
24+
2125
def connection
2226
@connection ||= Faraday.new(BASE_URL) do |conn|
2327
conn.request :authorization, :Bearer, api_key

lib/render_ruby/collection.rb

+3
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@ class Collection
66

77
def self.from_response(response, type:)
88
body = response.body
9+
10+
return new(data: [], total: 0, next_cursor: '', prev_cursor: '') if body.empty?
11+
912
new(
1013
data: body.map { |attrs| type.new(attrs) },
1114
total: body.count,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
# frozen_string_literal: true
2+
3+
module RenderRuby
4+
class EnvironmentVariable < Object
5+
end
6+
end

lib/render_ruby/objects/header.rb

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
# frozen_string_literal: true
2+
3+
module RenderRuby
4+
class Header < Object
5+
end
6+
end

lib/render_ruby/objects/rule.rb

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# frozen_string_literal: true
2+
3+
module RenderRuby
4+
class Rule < Object
5+
TYPES = %w[redirect rewrite].freeze
6+
7+
TYPES.each do |type|
8+
define_method "#{type}?" do
9+
type == self.type
10+
end
11+
end
12+
end
13+
end

lib/render_ruby/objects/scale.rb

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
# frozen_string_literal: true
2+
3+
module RenderRuby
4+
class Scale < Object
5+
end
6+
end

lib/render_ruby/objects/service.rb

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
# frozen_string_literal: true
2+
3+
module RenderRuby
4+
class Service < Object
5+
TYPES = %w[static_site web_service private_service background_worker cron_job].freeze
6+
7+
def auto_deploy_enabled?
8+
autoDeploy.equal?('yes')
9+
end
10+
11+
def suspended?
12+
suspended.equal?('suspended')
13+
end
14+
end
15+
end

lib/render_ruby/resource.rb

+1-18
Original file line numberDiff line numberDiff line change
@@ -30,27 +30,10 @@ def delete_request(url, params: {}, headers: {})
3030
handle_response client.connection.delete(url, params, headers)
3131
end
3232

33-
# rubocop:disable Metrics/CyclomaticComplexity
3433
def handle_response(response)
35-
case response.status
36-
when 400
37-
raise Error, "Your request was malformed. #{response.body}"
38-
when 401
39-
raise Error, "You did not supply valid authentication credentials. #{response.body}"
40-
when 403
41-
raise Error, "You are not allowed to perform that action. #{response.body}"
42-
when 404
43-
raise Error, "No results were found for your request. #{response.body}"
44-
when 429
45-
raise Error, "Your request exceeded the API rate limit. #{response.body}"
46-
when 500
47-
raise Error, "We were unable to perform the request due to server-side problems. #{response.body}"
48-
when 503
49-
raise Error, "You have been rate limited for sending more than 30 requests per minute. #{response.body}"
50-
end
34+
raise Error, response.body['message'] unless [200, 201, 202, 204].include?(response.status)
5135

5236
response
5337
end
54-
# rubocop:enable Metrics/CyclomaticComplexity
5538
end
5639
end

lib/render_ruby/resources/services.rb

+63
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
# frozen_string_literal: true
2+
3+
module RenderRuby
4+
class ServiceResource < Resource
5+
def list(**params)
6+
response = get_request('services', params: params)
7+
8+
Collection.from_response(response, type: Service)
9+
end
10+
11+
def retrieve(service_id:)
12+
Service.new get_request("services/#{service_id}").body
13+
end
14+
15+
def create(**attributes)
16+
Service.new post_request('services', body: attributes).body
17+
end
18+
19+
def update(service_id:, **attributes)
20+
Service.new patch_request("services/#{service_id}", body: attributes).body
21+
end
22+
23+
def delete(service_id:)
24+
delete_request("services/#{service_id}")
25+
end
26+
27+
def suspend(service_id:)
28+
post_request("services/#{service_id}/suspend", body: {})
29+
end
30+
31+
def resume(service_id:)
32+
post_request("services/#{service_id}/resume", body: {})
33+
end
34+
35+
def retrieve_env_vars(service_id:, **params)
36+
response = get_request("services/#{service_id}/env-vars", params: params)
37+
38+
Collection.from_response(response, type: EnvironmentVariable)
39+
end
40+
41+
def update_env_var(service_id:, env_vars:)
42+
response = put_request("services/#{service_id}/env-vars", body: env_vars)
43+
44+
Collection.from_response(response, type: EnvironmentVariable)
45+
end
46+
47+
def retrieve_headers(service_id:, **params)
48+
response = get_request("services/#{service_id}/headers", params: params)
49+
50+
Collection.from_response(response, type: Header)
51+
end
52+
53+
def retrieve_redirect_and_rewrite_rules(service_id:, **params)
54+
response = get_request("services/#{service_id}/routes", params: params)
55+
56+
Collection.from_response(response, type: Rule)
57+
end
58+
59+
def scale(service_id:, num_instances:)
60+
Scale.new post_request("services/#{service_id}/scale", body: { numInstances: num_instances }).body
61+
end
62+
end
63+
end

0 commit comments

Comments
 (0)