Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
83 changes: 83 additions & 0 deletions lib/twilio-ruby/framework/rest/page_metadata.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
# frozen_string_literal: true

module Twilio
module REST
# Page Base Class
class PageMetadata
META_KEYS = [
'end',
'first_page_uri',
'next_page_uri',
'last_page_uri',
'page',
'page_size',
'previous_page_uri',
'total',
'num_pages',
'start',
'uri'
].freeze

def initialize(version, response)
payload = process_response(response)

@version = version
@payload = payload
@solution = {}
@records = payload
end

def process_response(response)
return response if response.status_code == 200

raise Twilio::REST::RestError.new('Unable to fetch page', response)
end

def get_key(payload)
return 'Resources' if payload['Resources']

return payload['meta']['key'] if payload['meta'] && payload['meta']['key']

keys = payload.keys
key = keys - META_KEYS
return key.first if key.size == 1

raise Twilio::REST::TwilioError, 'Page Records can not be deserialized'
end

def previous_page_url
# rubocop:disable Layout/LineLength
return @version.domain.absolute_url(URI.parse(@payload['meta']['previous_page_url']).request_uri) if @payload['meta'] && @payload['meta']['previous_page_url']
# rubocop:enable Layout/LineLength
return @version.domain.absolute_url(@payload['previous_page_uri']) if @payload['previous_page_uri']

nil
end

def next_page_url
# rubocop:disable Layout/LineLength
return @version.domain.absolute_url(URI.parse(@payload.body['meta']['next_page_url']).request_uri) if @payload.body['meta'] && @payload.body['meta']['next_page_url']
# rubocop:enable Layout/LineLength
return @version.domain.absolute_url(@payload.body['next_page_uri']) if @payload.body['next_page_uri']

nil
end

def previous_page
return nil unless previous_page_url

@version.domain.request('GET', previous_page_url)
end

def next_page
return nil unless next_page_url

@version.domain.request('GET', next_page_url)
end

def to_s
'#<PageMetadata>'
end
end
end
end
16 changes: 16 additions & 0 deletions lib/twilio-ruby/framework/rest/resource.rb
Original file line number Diff line number Diff line change
Expand Up @@ -19,5 +19,21 @@ def initialize(version)
@version = version
end
end

class InstanceResourceMetadata
def initialize(payload, headers, status_code)
@payload = payload
@headers = headers
@status_code = status_code
end
end

class InstanceListResource
def initialize(version, headers, status_code)
@version = version
@headers = headers
@status_code = status_code
end
end
end
end
71 changes: 70 additions & 1 deletion lib/twilio-ruby/framework/rest/version.rb
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ def relative_uri(uri)

def request(method, uri, params = {}, data = {}, headers = {}, auth = nil, timeout = nil)
url = relative_uri(uri)
params = params.delete_if { |_k, v| v.nil? }
params.delete_if { |_k, v| v.nil? }
data = data
@domain.request(method, url, params, data, headers, auth, timeout)
end
Expand Down Expand Up @@ -157,6 +157,10 @@ def stream(page, limit: nil, page_limit: nil)
RecordStream.new(page, limit: limit, page_limit: page_limit)
end

def stream_with_metadata(page, limit: nil, page_limit: nil)
RecordStream.new(page, limit: limit, page_limit: page_limit)
end

def create(method, uri, params: {}, data: {}, headers: {}, auth: nil, timeout: nil)
response = request(method, uri, params, data, headers, auth, timeout)

Expand All @@ -166,6 +170,71 @@ def create(method, uri, params: {}, data: {}, headers: {}, auth: nil, timeout: n

response.body
end

def create_with_metadata(method, uri, params: {}, data: {}, headers: {}, auth: nil, timeout: nil)
response = request(method, uri, params, data, headers, auth, timeout)

if response.status_code < 200 || response.status_code >= 300
raise exception(response, 'Unable to create record')
end

response
end

def fetch_with_metadata(method, uri, params: {}, data: {}, headers: {}, auth: nil, timeout: nil)
response = request(
method,
uri,
params,
data,
headers,
auth,
timeout
)

# Note that 3XX response codes are allowed for fetches.
if response.status_code < 200 || response.status_code >= 400
raise exception(response, 'Unable to fetch record')
end

response
end

def update_with_metadata(method, uri, params: {}, data: {}, headers: {}, auth: nil, timeout: nil)
response = request(
method,
uri,
params,
data,
headers,
auth,
timeout
)

if response.status_code < 200 || response.status_code >= 300
raise exception(response, 'Unable to update record')
end

response
end

def delete_with_metadata(method, uri, params: {}, data: {}, headers: {}, auth: nil, timeout: nil)
response = request(
method,
uri,
params,
data,
headers,
auth,
timeout
)

if response.status_code < 200 || response.status_code >= 400
raise exception(response, 'Unable to delete record')
end

response
end
end
end
end
Loading
Loading