Class: Reach::REST::Page

Inherits:
Object
  • Object
show all
Includes:
Enumerable
Defined in:
lib/reach-ruby/framework/rest/page.rb

Overview

Page Base Class

Constant Summary collapse

META_KEYS =
[
  'page',
  'pageSize',
  'totalPages',
  'outOfPageRange'
].freeze

Instance Method Summary collapse

Constructor Details

#initialize(url, version, response) ⇒ Page

Returns a new instance of Page.



16
17
18
19
20
21
22
23
24
# File 'lib/reach-ruby/framework/rest/page.rb', line 16

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

  @url = url
  @version = version
  @payload = payload
  @solution = {}
  @records = load_page(payload)
end

Instance Method Details

#eachObject



133
134
135
136
137
# File 'lib/reach-ruby/framework/rest/page.rb', line 133

def each
  @records.each do |record|
    yield get_instance(record)
  end
end

#get_instance(payload) ⇒ Object



113
114
115
# File 'lib/reach-ruby/framework/rest/page.rb', line 113

def get_instance(payload)
  raise Reach::REST::ReachError, 'Page.get_instance() must be implemented in the derived class'
end

#load_page(payload) ⇒ Object



34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/reach-ruby/framework/rest/page.rb', line 34

def load_page(payload)
  if payload['meta'] && payload['meta']['key']
    return payload[payload['meta']['key']]
  else
    keys = payload.keys
    key = keys - META_KEYS
    if key.size == 1
      return payload[key.first]
    end
    if key.size == 2
      key1 = key[0]
      key2 = key[1]
      if key1.length > key2.length
        aux = key2
        key2 = key1
        key1 = aux
      end
      val = "total" + key1[0,1].upcase + key1[1..-1]
      if val == key2
        return payload[key1]
      end
    end
  end

  raise Reach::REST::ReachError, 'Page Records can not be deserialized'
end

#next_pageObject



125
126
127
128
129
130
131
# File 'lib/reach-ruby/framework/rest/page.rb', line 125

def next_page
  return nil unless next_page_url

  response = @version.domain.request('GET', next_page_url)

  self.class.new(@url, @version, response, @solution)
end

#next_page_urlObject



83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
# File 'lib/reach-ruby/framework/rest/page.rb', line 83

def next_page_url
  page = 0
  if @payload.key?('page')
    page = @payload['page']
  end
  pageSize = 1
  if @payload.key?('pageSize')
    pageSize = @payload['pageSize']
  end
  outOfPageRange = true
  if @payload.key?('outOfPageRange')
    outOfPageRange = @payload['outOfPageRange']
  end
  totalPages = 1
  if @payload.key?('totalPages')
    totalPages = @payload['totalPages']
  end
  if !(outOfPageRange || (page + 1 >= totalPages))
    query = "pageSize=#{pageSize}&page=#{page+1}"
    uri = URI.parse(@url)
    if (!(uri.query == nil || uri.query.length == 0))
      query = uri.query + "&" + query
    end
    uri.query = query
    return uri.to_s
  end

  nil
end

#previous_pageObject



117
118
119
120
121
122
123
# File 'lib/reach-ruby/framework/rest/page.rb', line 117

def previous_page
  return nil unless previous_page_url

  response = @version.domain.request('GET', previous_page_url)

  self.class.new(@url, @version, response, @solution)
end

#previous_page_urlObject



61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
# File 'lib/reach-ruby/framework/rest/page.rb', line 61

def previous_page_url
  page = 0
  if @payload.key?('page')
    page = @payload['page']
  end
  pageSize = 1
  if @payload.key?('pageSize')
    pageSize = @payload['pageSize']
  end
  if page > 0
    query = "pageSize=#{pageSize}&page=#{page-1}"
    uri = URI.parse(@url)
    if (!(uri.query == nil || uri.query.length == 0))
      query = uri.query + "&" + query
    end
    uri.query = query
    return uri.to_s
  end

  nil
end

#process_response(response) ⇒ Object



26
27
28
29
30
31
32
# File 'lib/reach-ruby/framework/rest/page.rb', line 26

def process_response(response)
  if response.status_code != 200
    raise Reach::REST::RestError.new('Unable to fetch page', response)
  end

  response.body
end

#to_sObject



139
140
141
# File 'lib/reach-ruby/framework/rest/page.rb', line 139

def to_s
  '#<Page>'
end