routengn-client 0.1.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +17 -0
- data/.rspec +2 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +34 -0
- data/Rakefile +1 -0
- data/lib/routengn_client/connection.rb +77 -0
- data/lib/routengn_client/exceptions.rb +8 -0
- data/lib/routengn_client/logging.rb +23 -0
- data/lib/routengn_client/middleware/routengn_response_middleware.rb +23 -0
- data/lib/routengn_client/model.rb +177 -0
- data/lib/routengn_client/models/account.rb +23 -0
- data/lib/routengn_client/models/allow_list.rb +38 -0
- data/lib/routengn_client/models/carrier.rb +14 -0
- data/lib/routengn_client/models/code.rb +32 -0
- data/lib/routengn_client/models/code_sheet.rb +11 -0
- data/lib/routengn_client/models/contact.rb +124 -0
- data/lib/routengn_client/models/end_point.rb +18 -0
- data/lib/routengn_client/models/inbound_end_point_group.rb +70 -0
- data/lib/routengn_client/models/inbound_rate.rb +13 -0
- data/lib/routengn_client/models/outbound_end_point_group.rb +51 -0
- data/lib/routengn_client/models/outbound_rate.rb +13 -0
- data/lib/routengn_client/models/rate_sheet.rb +13 -0
- data/lib/routengn_client/models/record.rb +231 -0
- data/lib/routengn_client/models/route.rb +42 -0
- data/lib/routengn_client/models/route_block.rb +7 -0
- data/lib/routengn_client/models/route_container.rb +18 -0
- data/lib/routengn_client/models/route_ordering_override.rb +7 -0
- data/lib/routengn_client/models/route_table.rb +30 -0
- data/lib/routengn_client/models/system_admin_account.rb +5 -0
- data/lib/routengn_client/models/uri_matcher.rb +72 -0
- data/lib/routengn_client/models/user.rb +20 -0
- data/lib/routengn_client/remote_model.rb +69 -0
- data/lib/routengn_client/request.rb +34 -0
- data/lib/routengn_client/response.rb +108 -0
- data/lib/routengn_client/utils.rb +20 -0
- data/lib/routengn_client/version.rb +3 -0
- data/lib/routengn_client.rb +72 -0
- data/routengn-client.gemspec +37 -0
- data/spec/lib/routengn_client/connection_spec.rb +44 -0
- data/spec/lib/routengn_client/logging_spec.rb +9 -0
- data/spec/lib/routengn_client/model_spec.rb +82 -0
- data/spec/lib/routengn_client/models/account_spec.rb +28 -0
- data/spec/lib/routengn_client/models/carrier_spec.rb +20 -0
- data/spec/lib/routengn_client/models/code_spec.rb +32 -0
- data/spec/lib/routengn_client/models/contact_spec.rb +57 -0
- data/spec/lib/routengn_client/models/inbound_end_point_group_spec.rb +33 -0
- data/spec/lib/routengn_client/models/inbound_rate_spec.rb +10 -0
- data/spec/lib/routengn_client/models/outbound_end_point_group_spec.rb +52 -0
- data/spec/lib/routengn_client/models/outbound_rate_spec.rb +10 -0
- data/spec/lib/routengn_client/models/rate_sheet_spec.rb +0 -0
- data/spec/lib/routengn_client/models/record_spec.rb +59 -0
- data/spec/lib/routengn_client/models/route_container_spec.rb +10 -0
- data/spec/lib/routengn_client/models/route_spec.rb +228 -0
- data/spec/lib/routengn_client/models/route_table_spec.rb +87 -0
- data/spec/lib/routengn_client/remote_model_spec.rb +60 -0
- data/spec/lib/routengn_client/request_spec.rb +14 -0
- data/spec/lib/routengn_client/response_spec.rb +29 -0
- data/spec/lib/routengn_client_spec.rb +5 -0
- data/spec/spec_helper.rb +34 -0
- data/spec/support/blueprints.rb +157 -0
- metadata +351 -0
@@ -0,0 +1,70 @@
|
|
1
|
+
module RouteNGNClient
|
2
|
+
class InboundEndPointGroup < RemoteModel
|
3
|
+
|
4
|
+
set_resource_attributes({
|
5
|
+
:path_base => 'metallic/inbound_end_point_groups',
|
6
|
+
:collection_name => 'inbound_end_point_groups',
|
7
|
+
:per_page => 200,
|
8
|
+
:request_options => {
|
9
|
+
}
|
10
|
+
})
|
11
|
+
|
12
|
+
belongs_to :carrier
|
13
|
+
has_many :end_points, :inbound_rates, :rate_sheets
|
14
|
+
has_one :allow_list
|
15
|
+
|
16
|
+
attr_accessor :account
|
17
|
+
|
18
|
+
def initialize(attributes = {})
|
19
|
+
super
|
20
|
+
|
21
|
+
@account ||= nil
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.find_by_end_point_host(host, options = {}, &callback)
|
25
|
+
options = { :per_page => 200 }.merge(options)
|
26
|
+
all({:inbound_end_point_group => {:'end_points.host' => host}}, options, &callback)
|
27
|
+
end
|
28
|
+
|
29
|
+
def primary_route_table(options = {}, &callback)
|
30
|
+
if self.attributes.primary_route_table_id.blank?
|
31
|
+
callback.call(nil) if callback
|
32
|
+
else
|
33
|
+
RouteTable.find self.attributes.primary_route_table_id, options, &callback
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def secondary_route_table(options = {}, &callback)
|
38
|
+
if self.attributes.secondary_route_table_id.blank?
|
39
|
+
callback.call(nil) if callback
|
40
|
+
else
|
41
|
+
RouteTable.find self.attributes.secondary_route_table_id, options, &callback
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def dialcode_regexp
|
46
|
+
return @dr if @dr
|
47
|
+
|
48
|
+
@dr = Regexp.new(self.attributes.dialcode_expression) unless self.attributes.dialcode_expression.blank?
|
49
|
+
end
|
50
|
+
|
51
|
+
def dialcode_prefix_regexp
|
52
|
+
return @dpr if @dpr
|
53
|
+
|
54
|
+
@dpr = Regexp.new(self.attributes.dialcode_prefix_expression) unless self.attributes.dialcode_prefix_expression.blank?
|
55
|
+
end
|
56
|
+
|
57
|
+
def ani_regexp
|
58
|
+
return @ar if @ar
|
59
|
+
|
60
|
+
@ar = Regexp.new(self.attributes.ani_expression) unless self.attributes.ani_expression.blank?
|
61
|
+
end
|
62
|
+
|
63
|
+
def ani_prefix_regexp
|
64
|
+
return @apr if @apr
|
65
|
+
|
66
|
+
@apr = Regexp.new(self.attributes.ani_prefix_expression) unless self.attributes.ani_prefix_expression.blank?
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module RouteNGNClient
|
2
|
+
class OutboundEndPointGroup < RemoteModel
|
3
|
+
|
4
|
+
set_resource_attributes({
|
5
|
+
:path_base => 'metallic/outbound_end_point_groups',
|
6
|
+
:collection_name => 'outbound_end_point_groups',
|
7
|
+
:per_page => 50,
|
8
|
+
:request_options => {
|
9
|
+
}
|
10
|
+
})
|
11
|
+
|
12
|
+
belongs_to :carrier
|
13
|
+
has_many :end_points, :outbound_rates
|
14
|
+
|
15
|
+
def prioritized_end_points
|
16
|
+
eps_with_priority = self.end_points.select { |ep| !ep.attributes.priority.nil? }
|
17
|
+
eps_with_priority.shuffle!
|
18
|
+
eps_without_priority = self.end_points.select { |ep| ep.attributes.priority.nil? }
|
19
|
+
eps_without_priority.shuffle!
|
20
|
+
|
21
|
+
eps_with_priority.sort! { |x,y| x.attributes.priority <=> y.attributes.priority }
|
22
|
+
eps_without_priority.sort! { |x,y| x.random_priority <=> y.random_priority }
|
23
|
+
|
24
|
+
eps = (eps_with_priority + eps_without_priority)
|
25
|
+
self.attributes.max_contact_end_points ? eps[0, self.attributes.max_contact_end_points] : eps
|
26
|
+
end
|
27
|
+
|
28
|
+
def dialcode_regexp
|
29
|
+
Regexp.new(self.attributes.dialcode_expression) unless self.attributes.dialcode_expression.blank?
|
30
|
+
end
|
31
|
+
|
32
|
+
def build_uri_parts(options = {})
|
33
|
+
{
|
34
|
+
:uri_user_params => self.s_to_h(self.attributes.uri_user_params ? self.attributes.uri_user_params.strip : ''),
|
35
|
+
:uri_params => self.s_to_h(self.attributes.uri_params ? self.attributes.uri_params.strip : '')
|
36
|
+
}
|
37
|
+
end
|
38
|
+
|
39
|
+
protected
|
40
|
+
|
41
|
+
def s_to_h(s)
|
42
|
+
h = {}
|
43
|
+
m = s.match /^;*(.*);*$/
|
44
|
+
|
45
|
+
h = Hash[m[1].split(';').map! {|p| p.split('=')}] if m[1]
|
46
|
+
|
47
|
+
h
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module RouteNGNClient
|
2
|
+
class RateSheet < RemoteModel
|
3
|
+
|
4
|
+
set_resource_attributes({
|
5
|
+
:collection_name => 'rate_sheets',
|
6
|
+
:per_page => 25
|
7
|
+
})
|
8
|
+
belongs_to :account
|
9
|
+
belongs_to :inbound_end_point_group
|
10
|
+
belongs_to :outbound_end_point_group
|
11
|
+
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,231 @@
|
|
1
|
+
module RouteNGNClient
|
2
|
+
class Record < RemoteModel
|
3
|
+
|
4
|
+
set_resource_attributes({
|
5
|
+
:collection_name => 'records',
|
6
|
+
:per_page => 25
|
7
|
+
})
|
8
|
+
|
9
|
+
belongs_to :account
|
10
|
+
belongs_to :inbound_end_point_group
|
11
|
+
|
12
|
+
def initialize(attributes = {})
|
13
|
+
super
|
14
|
+
end
|
15
|
+
|
16
|
+
def create!(attributes = {}, options = {})
|
17
|
+
options = options.merge({ :account_id => (self.account_id || (self.account.id if self.account)) })
|
18
|
+
|
19
|
+
attrs = attributes.merge({
|
20
|
+
:call_detail_record => (self.call_detail_record || self.call_detail_record_hash),
|
21
|
+
:inbound_end_point_group_id => (self.inbound_end_point_group_id || (self.inbound_end_point_group.id if self.inbound_end_point_group)),
|
22
|
+
:requested_at_float => (self.requested_at_float || (self.request.requested_at_float if self.request)),
|
23
|
+
:response_code => (self.response_code || (self.final_response.response_code if self.final_response)),
|
24
|
+
:logs => self.logs
|
25
|
+
})
|
26
|
+
|
27
|
+
self.class.create!(attrs, options)
|
28
|
+
end
|
29
|
+
|
30
|
+
def call_detail_record
|
31
|
+
self.attributes.call_detail_record
|
32
|
+
end
|
33
|
+
|
34
|
+
def call_detail_record_hash
|
35
|
+
self.class.values_to_hash(self.to_comma_headers, self.to_comma)
|
36
|
+
end
|
37
|
+
|
38
|
+
def routes_csvs(delimiter = ';')
|
39
|
+
(self.routes || []).map { |r| CSV.generate_line(r.to_comma, :force_quotes => true, :col_sep => delimiter, :quote_char => '\'').strip! }
|
40
|
+
end
|
41
|
+
|
42
|
+
def routes_string(delimiter = '|')
|
43
|
+
self.routes_csvs.join(delimiter)
|
44
|
+
end
|
45
|
+
|
46
|
+
def append_log(s, options = {})
|
47
|
+
append_timestamp = options.has_key?(:append_timestamp) ? options[:append_timestamp] : true
|
48
|
+
|
49
|
+
self.attributes.logs ||= []
|
50
|
+
|
51
|
+
if append_timestamp
|
52
|
+
age = self.attributes.request ? self.attributes.request.age.round(5) : nil
|
53
|
+
self.attributes.logs << "#{age}: #{s}"
|
54
|
+
else
|
55
|
+
self.attributes.logs << "#{s}"
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def set_request(r)
|
60
|
+
return unless r
|
61
|
+
|
62
|
+
self.attributes.request = r
|
63
|
+
self.requested_at_float = r.requested_at_float
|
64
|
+
self.attributes.sip_request = r.sip_request
|
65
|
+
self.append_log "Processing request: #{(r.sip_request.blank? || r.sip_request.method.blank?) ? 'Unknown' : r.sip_request.method} from #{r.peer_ip.blank? ? 'Unknown' : r.peer_ip}"
|
66
|
+
self.append_log "#{r.sip_request.data if r.sip_request}"
|
67
|
+
end
|
68
|
+
|
69
|
+
def set_inbound_end_point_group(iepg)
|
70
|
+
return unless iepg
|
71
|
+
|
72
|
+
self.append_log "Using inbound_end_point_group:"
|
73
|
+
self.append_log iepg.to_log, :append_timestamp => false
|
74
|
+
self.attributes.inbound_end_point_group = iepg
|
75
|
+
self.attributes.account = iepg.account if iepg
|
76
|
+
end
|
77
|
+
|
78
|
+
def set_inbound_rate(rate)
|
79
|
+
return unless rate
|
80
|
+
|
81
|
+
self.append_log "Using inbound_rate:"
|
82
|
+
self.append_log rate.to_log, :append_timestamp => false
|
83
|
+
self.attributes.inbound_rate = rate
|
84
|
+
end
|
85
|
+
|
86
|
+
def set_origination_code(code)
|
87
|
+
return unless code
|
88
|
+
|
89
|
+
self.append_log "Using origination_code:"
|
90
|
+
self.append_log code.to_log, :append_timestamp => false
|
91
|
+
self.attributes.origination_code = code
|
92
|
+
end
|
93
|
+
|
94
|
+
def set_destination_code(code)
|
95
|
+
return unless code
|
96
|
+
|
97
|
+
self.append_log "Using destination_code:"
|
98
|
+
self.append_log code.to_log, :append_timestamp => false
|
99
|
+
self.attributes.destination_code = code
|
100
|
+
end
|
101
|
+
|
102
|
+
def set_rate_type(type)
|
103
|
+
return unless type
|
104
|
+
|
105
|
+
self.append_log "Using rate_type: #{type}"
|
106
|
+
self.attributes.rate_type = type
|
107
|
+
end
|
108
|
+
|
109
|
+
def add_route(route)
|
110
|
+
return unless route
|
111
|
+
|
112
|
+
self.append_log "Added route:"
|
113
|
+
self.append_log route.to_log, :append_timestamp => false
|
114
|
+
self.attributes.routes ||= []
|
115
|
+
self.attributes.routes << route
|
116
|
+
end
|
117
|
+
|
118
|
+
def add_route_table(route_table)
|
119
|
+
return unless route_table
|
120
|
+
|
121
|
+
self.append_log "Using route_table:"
|
122
|
+
self.append_log route_table.to_log, :append_timestamp => false
|
123
|
+
self.attributes.route_tables ||= []
|
124
|
+
self.attributes.route_tables << route_table
|
125
|
+
end
|
126
|
+
|
127
|
+
def final_route_table
|
128
|
+
self.attributes.route_tables.blank? ? nil : self.attributes.route_tables.last
|
129
|
+
end
|
130
|
+
|
131
|
+
def add_response(r)
|
132
|
+
return unless r
|
133
|
+
|
134
|
+
self.attributes.responses ||= []
|
135
|
+
self.attributes.responses << r
|
136
|
+
self.append_log "Sending response code: #{(r.sip_response.blank? || r.sip_response.status_code.blank?) ? 'Unknown' : r.sip_response.status_code}"
|
137
|
+
self.append_log "#{r.sip_response.data if r.sip_response}"
|
138
|
+
end
|
139
|
+
|
140
|
+
def final_response
|
141
|
+
self.attributes.responses.blank? ? nil : self.attributes.responses.last
|
142
|
+
end
|
143
|
+
|
144
|
+
def request
|
145
|
+
self.attributes.request
|
146
|
+
end
|
147
|
+
|
148
|
+
def sip_request
|
149
|
+
self.attributes.sip_request
|
150
|
+
end
|
151
|
+
|
152
|
+
def origination_code
|
153
|
+
self.attributes.origination_code
|
154
|
+
end
|
155
|
+
|
156
|
+
def destination_code
|
157
|
+
self.attributes.destination_code
|
158
|
+
end
|
159
|
+
|
160
|
+
def inbound_rate
|
161
|
+
self.attributes.inbound_rate
|
162
|
+
end
|
163
|
+
|
164
|
+
def sip_redirector_version
|
165
|
+
self.attributes.sip_redirector_version
|
166
|
+
end
|
167
|
+
|
168
|
+
def cache_prep!
|
169
|
+
attrs = Hashie::Mash.new
|
170
|
+
attrs.call_detail_record = self.call_detail_record_hash
|
171
|
+
attrs.account_id = self.account_id || (self.account.id if self.account)
|
172
|
+
attrs.inbound_end_point_group_id = self.inbound_end_point_group.id if self.inbound_end_point_group
|
173
|
+
attrs.requested_at_float = self.requested_at_float || (self.request.requested_at_float if self.request)
|
174
|
+
attrs.response_code = self.final_response.response_code if self.final_response
|
175
|
+
attrs.logs = self.logs
|
176
|
+
self.attributes = attrs
|
177
|
+
end
|
178
|
+
|
179
|
+
def as_cdr(delimiter = ',')
|
180
|
+
CSV.generate_line self.to_comma, :force_quotes => true, :col_sep => delimiter, :row_sep => nil
|
181
|
+
end
|
182
|
+
|
183
|
+
def self.values_to_hash(headers, values)
|
184
|
+
values.each_with_index {| v,i| headers[i] = [headers[i].to_sym, v] }
|
185
|
+
Hash[headers]
|
186
|
+
end
|
187
|
+
|
188
|
+
comma do
|
189
|
+
request :requested_at_iso => 'requested_at_iso'
|
190
|
+
request :requested_at_float => 'requested_at_float'
|
191
|
+
request :server_hostname => 'server'
|
192
|
+
request :peer_ip => 'peer_ip'
|
193
|
+
request :peer_port => 'peer_port'
|
194
|
+
request :sip_request_method => 'request_method'
|
195
|
+
request :uuid => 'request_uuid'
|
196
|
+
request :worker_id => 'worker_id'
|
197
|
+
sip_request :prefix => 'request_prefix'
|
198
|
+
sip_request :dialcode => 'request_dialcode'
|
199
|
+
sip_request :call_id => 'request_call_id'
|
200
|
+
sip_request :npdi => 'request_npdi'
|
201
|
+
sip_request :rn => 'request_rn'
|
202
|
+
sip_request :ani => 'request_ani'
|
203
|
+
origination_code :dialcode => 'origination_dialcode'
|
204
|
+
origination_code :local => 'origination_local'
|
205
|
+
origination_code :city => 'origination_city'
|
206
|
+
origination_code :state => 'origination_state'
|
207
|
+
origination_code :country => 'origination_country'
|
208
|
+
origination_code :lata => 'origination_lata'
|
209
|
+
origination_code :ocn => 'origination_ocn'
|
210
|
+
destination_code :dialcode => 'destination_dialcode'
|
211
|
+
destination_code :local => 'destination_local'
|
212
|
+
destination_code :city => 'destination_city'
|
213
|
+
destination_code :state => 'destination_state'
|
214
|
+
destination_code :country => 'destination_country'
|
215
|
+
destination_code :lata => 'destination_lata'
|
216
|
+
destination_code :ocn => 'destination_ocn'
|
217
|
+
final_route_table :name => 'route_table_name'
|
218
|
+
inbound_end_point_group :id => 'inbound_end_point_group_id'
|
219
|
+
inbound_end_point_group :name => 'inbound_end_point_group_name'
|
220
|
+
inbound_rate :price => 'inbound_rate_price'
|
221
|
+
inbound_rate :type => 'inbound_rate_type'
|
222
|
+
routes_string 'routes' #"routes #{Route.to_comma_headers.join(';')}|route2|route3..."
|
223
|
+
final_response :elapsed_time => 'elapsed_time'
|
224
|
+
final_response :response_code => 'response_code'
|
225
|
+
final_response :internal_response_code => 'internal_response_code'
|
226
|
+
account :id => 'account_id'
|
227
|
+
sip_redirector_version 'sip_redirector_version'
|
228
|
+
end
|
229
|
+
|
230
|
+
end
|
231
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module RouteNGNClient
|
2
|
+
class Route < Model
|
3
|
+
|
4
|
+
belongs_to :route_table, :outbound_end_point_group
|
5
|
+
has_one :outbound_rate
|
6
|
+
|
7
|
+
def contacts
|
8
|
+
@contacts ||= self.build_contacts
|
9
|
+
end
|
10
|
+
|
11
|
+
def build_contacts(end_points = nil)
|
12
|
+
if oepg = self.outbound_end_point_group
|
13
|
+
end_points ||= oepg.prioritized_end_points
|
14
|
+
@contacts = end_points.collect do |end_point|
|
15
|
+
Contact.new(:end_point => end_point, :route => self)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def build_aors(sip_request, inbound_end_point_group, options = {})
|
21
|
+
self.contacts.collect { |c| c.build_aor(sip_request, inbound_end_point_group, options) }
|
22
|
+
end
|
23
|
+
|
24
|
+
def inbound_rate
|
25
|
+
@attributes.inbound_rate
|
26
|
+
end
|
27
|
+
|
28
|
+
def blocked?
|
29
|
+
@attributes.has_key?('blocked') && @attributes.blocked == 'true' ? true : false
|
30
|
+
end
|
31
|
+
|
32
|
+
comma do
|
33
|
+
outbound_rate :price => 'outbound_rate_price'
|
34
|
+
outbound_rate :type => 'outbound_rate_type'
|
35
|
+
outbound_rate :dialcode => 'outbound_rate_dialcode'
|
36
|
+
outbound_rate :lata => 'outbound_rate_lata'
|
37
|
+
outbound_rate :ocn => 'outbound_rate_ocn'
|
38
|
+
outbound_end_point_group :name => 'outbound_end_point_group_name'
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module RouteNGNClient
|
2
|
+
class RouteContainer < Model
|
3
|
+
|
4
|
+
belongs_to :route_table
|
5
|
+
has_many :routes
|
6
|
+
has_one :inbound_rate
|
7
|
+
|
8
|
+
def enhanced_routes
|
9
|
+
self.routes.each do |route|
|
10
|
+
route.attributes.inbound_rate = self.inbound_rate
|
11
|
+
route.attributes.outbound_end_point_group = OutboundEndPointGroup.find(route.attributes.outbound_end_point_group_id, {:account_id => route.request_account_id})
|
12
|
+
end
|
13
|
+
|
14
|
+
self.routes
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module RouteNGNClient
|
2
|
+
class RouteTable < RemoteModel
|
3
|
+
|
4
|
+
set_resource_attributes({
|
5
|
+
:path_base => 'metallic/route_tables',
|
6
|
+
:collection_name => 'route_tables',
|
7
|
+
:per_page => 25,
|
8
|
+
:request_options => {
|
9
|
+
}
|
10
|
+
})
|
11
|
+
|
12
|
+
belongs_to :account
|
13
|
+
has_many :routes, :outbound_end_point_groups
|
14
|
+
|
15
|
+
def route_containers(params = {}, options = {}, &callback)
|
16
|
+
options[:klass] ||= RouteContainer
|
17
|
+
options[:account_id] ||= self.request_account_id
|
18
|
+
|
19
|
+
models = []
|
20
|
+
|
21
|
+
response = Request.new(self.class.resource_attributes.merge(:collection_name => 'route_containers'), :get, [self.class.path_base, self.attributes.id, 'route_containers'], self.class.path_ext, params, options).execute(RouteNGNClient.connection)
|
22
|
+
models = response.to_models
|
23
|
+
|
24
|
+
callback.call(models) if callback
|
25
|
+
|
26
|
+
models
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
module RouteNGNClient
|
2
|
+
class URIMatcher < Model
|
3
|
+
include Comparable
|
4
|
+
|
5
|
+
HEADER_ORDER = %(contact from request)
|
6
|
+
|
7
|
+
belongs_to :allow_list
|
8
|
+
|
9
|
+
def <=>(other)
|
10
|
+
if self.header == other.header
|
11
|
+
case (self.weight <=> other.weight)
|
12
|
+
when 0
|
13
|
+
self.id.to_s <=> other.id.to_s
|
14
|
+
when 1 #self.weight is higher
|
15
|
+
-1
|
16
|
+
when -1 #self.weight is lower
|
17
|
+
1
|
18
|
+
else
|
19
|
+
0
|
20
|
+
end
|
21
|
+
else
|
22
|
+
return 0 if !HEADER_ORDER.include?(self.header) && !HEADER_ORDER.include?(other.header)
|
23
|
+
return -1 if !HEADER_ORDER.include?(self.header)
|
24
|
+
return 1 if !HEADER_ORDER.include?(other.header)
|
25
|
+
return (HEADER_ORDER.index(self.header) <=> HEADER_ORDER.index(other.header))
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def weight
|
30
|
+
@weight ||= [@attributes.prefix, @attributes.user_params, @attributes.uri_params].select { |x| !x.blank? }.length
|
31
|
+
end
|
32
|
+
|
33
|
+
def matches?(args = {})
|
34
|
+
return false if !self.matches_header?(args[:header])
|
35
|
+
return false if !@attributes.prefix.blank? && !self.matches_prefix?(args[:prefix])
|
36
|
+
return false if !@attributes.user_params.blank? && !self.matches_user_params?(args[:user_params])
|
37
|
+
return false if !@attributes.uri_params.blank? && !self.matches_uri_params?(args[:uri_params])
|
38
|
+
return true
|
39
|
+
end
|
40
|
+
|
41
|
+
def matches_header?(arg)
|
42
|
+
!@attributes.header.blank? && !arg.blank? && @attributes.header == arg
|
43
|
+
end
|
44
|
+
|
45
|
+
def matches_prefix?(arg)
|
46
|
+
@attributes.prefix == arg
|
47
|
+
end
|
48
|
+
|
49
|
+
def matches_user_params?(arg)
|
50
|
+
if arg.is_a?(String)
|
51
|
+
@attributes.user_params == arg
|
52
|
+
elsif arg.is_a?(Array)
|
53
|
+
arg.include?(@attributes.user_params)
|
54
|
+
else
|
55
|
+
false
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def matches_uri_params?(arg)
|
60
|
+
if arg.is_a?(String)
|
61
|
+
@attributes.uri_params == arg
|
62
|
+
elsif arg.is_a?(Array)
|
63
|
+
arg.include?(@attributes.uri_params)
|
64
|
+
else
|
65
|
+
false
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
70
|
+
|
71
|
+
class UriMatcher < URIMatcher;end
|
72
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module RouteNGNClient
|
2
|
+
class User < RemoteModel
|
3
|
+
|
4
|
+
set_resource_attributes({
|
5
|
+
:collection_name => 'users',
|
6
|
+
:per_page => 25
|
7
|
+
})
|
8
|
+
|
9
|
+
belongs_to :account
|
10
|
+
|
11
|
+
def admin?
|
12
|
+
self.admin.nil? ? false : self.admin
|
13
|
+
end
|
14
|
+
|
15
|
+
def call_processor?
|
16
|
+
self.call_processor.nil? ? false : self.call_processor
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
module RouteNGNClient
|
2
|
+
class RemoteModel < Model
|
3
|
+
|
4
|
+
DEFAULT_RESOURCE_ATTRIBUTES = {
|
5
|
+
:path_base => nil,
|
6
|
+
:path_ext => '.json',
|
7
|
+
:index_method => nil,
|
8
|
+
:collection_name => '',
|
9
|
+
:per_page => 25,
|
10
|
+
:request_options => {}
|
11
|
+
}
|
12
|
+
|
13
|
+
@resource_attributes = DEFAULT_RESOURCE_ATTRIBUTES
|
14
|
+
|
15
|
+
module ClassMethods
|
16
|
+
attr_reader :resource_attributes
|
17
|
+
|
18
|
+
def path_ext;@resource_attributes[:path_ext];end
|
19
|
+
def index_method;@resource_attributes[:index_method];end
|
20
|
+
def collection_name;@resource_attributes[:collection_name];end
|
21
|
+
|
22
|
+
def set_resource_attributes(ra)
|
23
|
+
@resource_attributes = DEFAULT_RESOURCE_ATTRIBUTES.merge(ra)
|
24
|
+
end
|
25
|
+
|
26
|
+
def path_base(params = {})
|
27
|
+
pb = @resource_attributes[:path_base] || File.join('/', @resource_attributes[:collection_name])
|
28
|
+
params.each { |k,v| pb.gsub!(":#{k}", v) } unless params.blank?
|
29
|
+
pb
|
30
|
+
end
|
31
|
+
|
32
|
+
def all(conditions = {}, options = {}, &callback)
|
33
|
+
options.merge!(:klass => self)
|
34
|
+
params = conditions
|
35
|
+
params[:per_page] ||= @resource_attributes[:per_page]
|
36
|
+
params[:page] ||= 1
|
37
|
+
params[:include_paging_info] = 'true' unless params.has_key?(:include_paging_info)
|
38
|
+
|
39
|
+
response = Request.new(@resource_attributes, :get, [path_base, index_method], path_ext, params, options).execute(RouteNGNClient.connection)
|
40
|
+
models = response.to_models
|
41
|
+
|
42
|
+
callback.call(models) if callback
|
43
|
+
|
44
|
+
models
|
45
|
+
end
|
46
|
+
|
47
|
+
def where(conditions = {}, options = {}, &callback)
|
48
|
+
self.all(conditions, options, &callback)
|
49
|
+
end
|
50
|
+
|
51
|
+
def find(id, options = {}, &callback)
|
52
|
+
options.merge!(:klass => self)
|
53
|
+
|
54
|
+
response = Request.new(@resource_attributes, :get, [path_base, id.to_s], path_ext, {}, options).execute(RouteNGNClient.connection)
|
55
|
+
model = response.to_model
|
56
|
+
|
57
|
+
callback.call(models) if callback
|
58
|
+
|
59
|
+
model
|
60
|
+
end
|
61
|
+
|
62
|
+
def create!(attributes = {}, options = {}, &callback)
|
63
|
+
raise NotImplementedError
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
extend ClassMethods
|
68
|
+
end
|
69
|
+
end
|