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
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 806113a37cf70dcb69d16ae7855f7d0bb002aa17
|
4
|
+
data.tar.gz: 4e958c370005c926a951c4f6618b0a07421d209f
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 1ff754329b66454609e84401e491a934b8a790d35aab88a68be7f74dc01b3fd21384e9fcf64b0f22516933020a7358da2189cc935b85664f1c0448dccd52f09c
|
7
|
+
data.tar.gz: 025fb4be299d2efc8055934a7941da4b9aa85808d2eb67e49f1d573803c68f3e397cda6c85ad02165b511142439f2057751fbe70174a1178bc8f3d27cccc5e84
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2013 TODO: Write your name
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
# RouteNGNClient
|
2
|
+
|
3
|
+
## Installation
|
4
|
+
|
5
|
+
Add this line to your application's Gemfile:
|
6
|
+
|
7
|
+
gem 'routengn-client'
|
8
|
+
|
9
|
+
And then execute:
|
10
|
+
|
11
|
+
$ bundle
|
12
|
+
|
13
|
+
Or install it yourself as:
|
14
|
+
|
15
|
+
$ gem install routengn-client
|
16
|
+
|
17
|
+
## Usage
|
18
|
+
|
19
|
+
```ruby
|
20
|
+
MultiJson.use :yajl # set your prefered JSON library
|
21
|
+
Faraday.default_adapter = :excon # set your preferred HTTP adapter
|
22
|
+
|
23
|
+
RouteNGNClient.connect :uri => 'http://web.clusterx.routengn.com', :api_key => 'yourkey' # connect to RouteNGN
|
24
|
+
|
25
|
+
carriers = Carrier.all # profit!
|
26
|
+
```
|
27
|
+
|
28
|
+
## Contributing
|
29
|
+
|
30
|
+
1. Fork it
|
31
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
32
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
33
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
34
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
@@ -0,0 +1,77 @@
|
|
1
|
+
module RouteNGNClient
|
2
|
+
class Connection
|
3
|
+
|
4
|
+
USER_AGENT = "routengn-client v#{RouteNGNClient::VERSION}"
|
5
|
+
|
6
|
+
attr_accessor :options, :faraday
|
7
|
+
|
8
|
+
def initialize(options = {})
|
9
|
+
@options = options
|
10
|
+
@faraday = self.create_faraday(@options[:uri], @options[:api_key]) if @options[:uri]
|
11
|
+
end
|
12
|
+
|
13
|
+
def create_faraday(uri, api_key = nil)
|
14
|
+
@faraday = Faraday.new uri do |c|
|
15
|
+
c.headers['User-Agent'] = USER_AGENT
|
16
|
+
|
17
|
+
c.request :oauth2, api_key, :param_name => 'api_key' if api_key
|
18
|
+
c.request :multipart
|
19
|
+
c.request :url_encoded
|
20
|
+
c.request :multi_json
|
21
|
+
|
22
|
+
c.response :xml, :content_type => /\bxml$/
|
23
|
+
c.response :multi_json, symbolize_keys: true, :content_type => /\bjson$/
|
24
|
+
c.response :routengn_response
|
25
|
+
c.response :logger, RouteNGNClient.logger
|
26
|
+
|
27
|
+
c.use :instrumentation
|
28
|
+
c.adapter Faraday.default_adapter
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def request(method, path, params, options, &callback)
|
33
|
+
sent_at = nil
|
34
|
+
|
35
|
+
response = @faraday.send(method) { |request|
|
36
|
+
sent_at = Time.now
|
37
|
+
request = config_request(request, method, path, params, options)
|
38
|
+
}.on_complete { |env|
|
39
|
+
env[:total_time] = Time.now.utc.to_f - sent_at.utc.to_f if sent_at
|
40
|
+
env[:request_params] = params
|
41
|
+
env[:request_options] = options
|
42
|
+
callback.call(env) if callback
|
43
|
+
}
|
44
|
+
|
45
|
+
response
|
46
|
+
end
|
47
|
+
|
48
|
+
def config_request(request, method, path, params, options)
|
49
|
+
case method.to_sym
|
50
|
+
when :delete, :get
|
51
|
+
request.url(path, params)
|
52
|
+
when :post, :put
|
53
|
+
request.path = path
|
54
|
+
request.body = params unless params.empty?
|
55
|
+
end
|
56
|
+
|
57
|
+
request
|
58
|
+
end
|
59
|
+
|
60
|
+
def get(path, params={}, options={}, &callback)
|
61
|
+
request(:get, path, params, options, &callback)
|
62
|
+
end
|
63
|
+
|
64
|
+
def delete(path, params={}, options={}, &callback)
|
65
|
+
request(:delete, path, params, options, &callback)
|
66
|
+
end
|
67
|
+
|
68
|
+
def post(path, params={}, options={}, &callback)
|
69
|
+
request(:post, path, params, options, &callback)
|
70
|
+
end
|
71
|
+
|
72
|
+
def put(path, params={}, options={}, &callback)
|
73
|
+
request(:put, path, params, options, &callback)
|
74
|
+
end
|
75
|
+
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,8 @@
|
|
1
|
+
module RouteNGNClient
|
2
|
+
class RateNGNClientException < StandardError; end
|
3
|
+
class UnexpectedHTTPException < RateNGNClientException; end
|
4
|
+
class PermissionDeniedException < RateNGNClientException; end
|
5
|
+
class NonExistentRecord < RateNGNClientException; end
|
6
|
+
class RateNGNClientConnectionException < RateNGNClientException; end
|
7
|
+
class RouteNGNResponseException < RateNGNClientException; end
|
8
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module RouteNGNClient
|
2
|
+
module Logging
|
3
|
+
def logger
|
4
|
+
@logger ||= init_logger(STDOUT, :debug)
|
5
|
+
end
|
6
|
+
|
7
|
+
def init_logger(io, level)
|
8
|
+
logger = unless io
|
9
|
+
Logger.new(STDOUT)
|
10
|
+
else
|
11
|
+
Logger.new(io)
|
12
|
+
end
|
13
|
+
|
14
|
+
if level == :debug
|
15
|
+
logger.level = Logger::DEBUG
|
16
|
+
else
|
17
|
+
logger.level = Logger::INFO
|
18
|
+
end
|
19
|
+
|
20
|
+
logger
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module RouteNGNClient
|
2
|
+
class RouteNGNResponseMiddleware < Faraday::Response::Middleware
|
3
|
+
include RouteNGNClient::Logging
|
4
|
+
|
5
|
+
ERROR_STATUSES = (400...600)
|
6
|
+
|
7
|
+
def on_complete(env)
|
8
|
+
case env[:status]
|
9
|
+
when 401
|
10
|
+
raise PermissionDeniedException
|
11
|
+
when 404
|
12
|
+
raise NonExistentRecord
|
13
|
+
when 0
|
14
|
+
raise UnexpectedHTTPException, "recieved an unexpected HTTP response code #{env[:status]}"
|
15
|
+
when ERROR_STATUSES
|
16
|
+
raise UnexpectedHTTPException, "recieved an unexpected HTTP response code #{env[:status]}"
|
17
|
+
end
|
18
|
+
|
19
|
+
env
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,177 @@
|
|
1
|
+
module RouteNGNClient
|
2
|
+
class Model
|
3
|
+
include Logging
|
4
|
+
|
5
|
+
attr_accessor :attributes, :request_account_id
|
6
|
+
|
7
|
+
def initialize(attributes = {})
|
8
|
+
@attributes = OpenStruct.new(attributes)
|
9
|
+
@request_account_id = nil
|
10
|
+
self.create_parent_accessors
|
11
|
+
self.create_child_accessors
|
12
|
+
self.create_only_child_accessors
|
13
|
+
end
|
14
|
+
|
15
|
+
def to_hash
|
16
|
+
@attributes.marshal_dump
|
17
|
+
end
|
18
|
+
|
19
|
+
def to_json(pretty = false)
|
20
|
+
MultiJson.dump(self.to_hash, :pretty => pretty)
|
21
|
+
end
|
22
|
+
|
23
|
+
def to_log(options = {})
|
24
|
+
self.to_json(true)
|
25
|
+
end
|
26
|
+
|
27
|
+
module ClassMethods
|
28
|
+
|
29
|
+
attr_accessor :parents
|
30
|
+
attr_accessor :children
|
31
|
+
attr_accessor :only_children
|
32
|
+
|
33
|
+
def from_hash(h)
|
34
|
+
new h
|
35
|
+
end
|
36
|
+
|
37
|
+
def from_json(s)
|
38
|
+
from_hash MultiJson.load(s, :symbolize_keys => true)
|
39
|
+
end
|
40
|
+
|
41
|
+
def belongs_to(*args)
|
42
|
+
@parents = args.collect do |arg|
|
43
|
+
"RouteNGNClient::#{arg.to_s.classify}".constantize
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def has_many(*args)
|
48
|
+
@children = args.collect do |arg|
|
49
|
+
"RouteNGNClient::#{arg.to_s.classify}".constantize
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def has_one(*args)
|
54
|
+
@only_children = args.collect do |arg|
|
55
|
+
"RouteNGNClient::#{arg.to_s.classify}".constantize
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
|
61
|
+
extend ClassMethods
|
62
|
+
|
63
|
+
protected
|
64
|
+
|
65
|
+
def create_only_child_accessors
|
66
|
+
return if self.class.only_children.blank?
|
67
|
+
|
68
|
+
p = self.class.to_s.demodulize.underscore.singularize.to_sym
|
69
|
+
instance = self
|
70
|
+
|
71
|
+
self.class.only_children.each do |klass|
|
72
|
+
c = klass.to_s.demodulize.underscore.singularize.to_sym
|
73
|
+
instance_var = "@#{klass.to_s.demodulize.underscore.singularize}".to_sym
|
74
|
+
|
75
|
+
(class << self; self; end).class_eval do
|
76
|
+
define_method(c) do |options = {}|
|
77
|
+
if model = instance_variable_get(instance_var)
|
78
|
+
return model
|
79
|
+
else
|
80
|
+
if attributes.send(c).is_a?(klass)
|
81
|
+
model = attributes.send(c)
|
82
|
+
elsif attributes.send(c).kind_of?(Hash)
|
83
|
+
model = klass.send :from_hash, attributes.send(c)
|
84
|
+
else
|
85
|
+
child_id = attributes.send("#{c.to_s}_id".to_sym)
|
86
|
+
model = klass.send(:find, child_id, :account_id => instance.request_account_id) unless options[:no_fetch] || !child_id
|
87
|
+
end
|
88
|
+
|
89
|
+
return unless model
|
90
|
+
|
91
|
+
model.request_account_id = instance.request_account_id
|
92
|
+
|
93
|
+
instance_variable_set(instance_var, model)
|
94
|
+
|
95
|
+
model
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
def create_child_accessors
|
103
|
+
return if self.class.children.blank?
|
104
|
+
|
105
|
+
p = self.class.to_s.demodulize.underscore.singularize.to_sym
|
106
|
+
instance = self
|
107
|
+
|
108
|
+
self.class.children.each do |klass|
|
109
|
+
c = klass.to_s.demodulize.underscore.pluralize.to_sym
|
110
|
+
instance_var = "@#{klass.to_s.demodulize.underscore.pluralize}".to_sym
|
111
|
+
|
112
|
+
(class << self; self; end).class_eval do
|
113
|
+
define_method(c) do |options = {}|
|
114
|
+
if models = instance_variable_get(instance_var)
|
115
|
+
return models
|
116
|
+
else
|
117
|
+
collection = attributes.send(c) || []
|
118
|
+
|
119
|
+
models = collection.collect do |h|
|
120
|
+
if h.kind_of?(Hash) && h[c.to_s.singularize.to_sym]
|
121
|
+
model = klass.send :from_hash, h[c.to_s.singularize.to_sym]
|
122
|
+
elsif h.kind_of?(Hash)
|
123
|
+
model = klass.send :from_hash, h
|
124
|
+
else
|
125
|
+
model = h
|
126
|
+
end
|
127
|
+
|
128
|
+
model.request_account_id = instance.request_account_id
|
129
|
+
|
130
|
+
model
|
131
|
+
end
|
132
|
+
|
133
|
+
instance_variable_set(instance_var, models)
|
134
|
+
|
135
|
+
models
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
end
|
142
|
+
|
143
|
+
def create_parent_accessors
|
144
|
+
return if self.class.parents.blank?
|
145
|
+
|
146
|
+
self.class.parents.each do |klass|
|
147
|
+
p = klass.to_s.demodulize.underscore.singularize.to_sym
|
148
|
+
instance_var = "@#{klass.to_s.demodulize.underscore.singularize}".to_sym
|
149
|
+
instance = self
|
150
|
+
|
151
|
+
(class << self; self; end).class_eval do
|
152
|
+
define_method(p) do |options = {}|
|
153
|
+
if model = instance_variable_get(instance_var)
|
154
|
+
return model
|
155
|
+
else
|
156
|
+
if v = attributes.send(p)
|
157
|
+
model = v.kind_of?(Hash) ? klass.send(:from_hash, v) : v
|
158
|
+
model.request_account_id = instance.request_account_id
|
159
|
+
instance_variable_set(instance_var, model)
|
160
|
+
model
|
161
|
+
elsif !(id = attributes.send("#{p.to_s}_id".to_sym)).blank?
|
162
|
+
model = attributes.send(p) if attributes.send(p).is_a?(klass)
|
163
|
+
|
164
|
+
model = klass.send(:find, id, :account_id => instance.request_account_id) unless model || options[:no_fetch]
|
165
|
+
|
166
|
+
instance_variable_set(instance_var, model)
|
167
|
+
|
168
|
+
model
|
169
|
+
end
|
170
|
+
end
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
end
|
177
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module RouteNGNClient
|
2
|
+
class Account < RemoteModel
|
3
|
+
|
4
|
+
set_resource_attributes({
|
5
|
+
:path_base => 'system_admin/accounts',
|
6
|
+
:collection_name => 'accounts',
|
7
|
+
:per_page => 50,
|
8
|
+
:request_options => {
|
9
|
+
}
|
10
|
+
})
|
11
|
+
|
12
|
+
has_many :users, :rate_sheets, :code_sheets, :carriers
|
13
|
+
|
14
|
+
attr_accessor :inbound_end_point_groups
|
15
|
+
|
16
|
+
def initialize(attributes = {})
|
17
|
+
super
|
18
|
+
|
19
|
+
@inbound_end_point_groups ||= []
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module RouteNGNClient
|
2
|
+
class AllowList < Model
|
3
|
+
|
4
|
+
belongs_to :inbound_end_point_group
|
5
|
+
|
6
|
+
def initialize(attributes = {})
|
7
|
+
super attributes
|
8
|
+
|
9
|
+
@attributes.uri_matchers = (@attributes.uri_matchers || []).collect { |h| RouteNGNClient::URIMatcher.from_hash h }
|
10
|
+
self.order_uri_matchers!
|
11
|
+
end
|
12
|
+
|
13
|
+
def order_uri_matchers!
|
14
|
+
@attributes.uri_matchers.sort!
|
15
|
+
end
|
16
|
+
|
17
|
+
def best_uri_match(header, uri)
|
18
|
+
return nil unless header && uri && @attributes.uri_matchers.find { |uri_matcher| uri_matcher.matches_header? header }
|
19
|
+
|
20
|
+
prefix = uri.user.prefix(self.inbound_end_point_group.dialcode_prefix_regexp) unless uri.user.blank?
|
21
|
+
user_params = uri.user.params.collect { |k,v| "#{k}=#{v}" } unless uri.user.params.blank?
|
22
|
+
uri_params = uri.params.collect { |k,v| "#{k}=#{v}" } unless uri.params.blank?
|
23
|
+
|
24
|
+
h = {}.with_indifferent_access
|
25
|
+
h[:header] = header
|
26
|
+
h[:prefix] = prefix unless prefix.blank?
|
27
|
+
h[:user_params] = user_params unless user_params.blank?
|
28
|
+
h[:uri_params] = uri_params unless uri_params.blank?
|
29
|
+
|
30
|
+
@attributes.uri_matchers.each do |uri_matcher|
|
31
|
+
return uri_matcher if uri_matcher.matches? h
|
32
|
+
end
|
33
|
+
|
34
|
+
nil
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module RouteNGNClient
|
2
|
+
class Carrier < RemoteModel
|
3
|
+
|
4
|
+
set_resource_attributes({
|
5
|
+
:path_base => 'metallic/carriers',
|
6
|
+
:collection_name => 'carriers',
|
7
|
+
:per_page => 25
|
8
|
+
})
|
9
|
+
|
10
|
+
belongs_to :account
|
11
|
+
has_many :outbound_end_point_groups, :inbound_end_point_groups
|
12
|
+
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module RouteNGNClient
|
2
|
+
class Code < RemoteModel
|
3
|
+
|
4
|
+
set_resource_attributes({
|
5
|
+
:path_base => 'metallic/codes',
|
6
|
+
:collection_name => 'codes',
|
7
|
+
:per_page => 200,
|
8
|
+
:request_options => {
|
9
|
+
}
|
10
|
+
})
|
11
|
+
|
12
|
+
class << self
|
13
|
+
|
14
|
+
def find_by_exploded_dialcode(dialcode, options = {}, &callback)
|
15
|
+
subsets = Utils.string_subsets dialcode
|
16
|
+
find_by_dialcodes subsets, options, &callback
|
17
|
+
end
|
18
|
+
|
19
|
+
def find_by_dialcodes(dialcodes, options = {}, &callback)
|
20
|
+
options = {:page => 1, :per_page => (dialcodes.length + 1)}.merge(self.resource_attributes[:request_options]).merge(options)
|
21
|
+
|
22
|
+
models = all({:code => {:dialcode => {'$in' => dialcodes}}}, options)
|
23
|
+
|
24
|
+
callback.call(models) if callback
|
25
|
+
|
26
|
+
models
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,124 @@
|
|
1
|
+
module RouteNGNClient
|
2
|
+
class Contact < Model
|
3
|
+
|
4
|
+
def route
|
5
|
+
@attributes.route
|
6
|
+
end
|
7
|
+
|
8
|
+
def end_point
|
9
|
+
@attributes.end_point
|
10
|
+
end
|
11
|
+
|
12
|
+
def inbound_rate
|
13
|
+
self.route ? self.route.inbound_rate : nil
|
14
|
+
end
|
15
|
+
|
16
|
+
def outbound_rate
|
17
|
+
self.route ? self.route.outbound_rate : nil
|
18
|
+
end
|
19
|
+
|
20
|
+
def outbound_end_point_group
|
21
|
+
self.route.outbound_end_point_group if self.route
|
22
|
+
end
|
23
|
+
|
24
|
+
def aor
|
25
|
+
@attributes.aor
|
26
|
+
end
|
27
|
+
|
28
|
+
def build_aor(sip_request, inbound_end_point_group, options = {})
|
29
|
+
options = options.with_indifferent_access
|
30
|
+
|
31
|
+
uri = self.build_uri(sip_request)
|
32
|
+
|
33
|
+
template = Template.new(inbound_end_point_group.attributes.contact_template)
|
34
|
+
template.sub!(self, uri, :inbound_end_point_host => options[:inbound_end_point_host], :inbound_end_point_port => options[:inbound_end_point_port])
|
35
|
+
|
36
|
+
@attributes.aor = template.contact_template
|
37
|
+
end
|
38
|
+
|
39
|
+
def build_uri(sip_request, options = {})
|
40
|
+
options = options.with_indifferent_access
|
41
|
+
|
42
|
+
request_uri = sip_request.request_uri
|
43
|
+
sip_uri = request_uri.clone
|
44
|
+
oepg = self.outbound_end_point_group
|
45
|
+
oepg_parts = oepg ? oepg.build_uri_parts : {}
|
46
|
+
oep_parts = self.end_point ? self.end_point.build_uri_parts : {}
|
47
|
+
|
48
|
+
dialcode = oepg && oepg.attributes.dialcode_expression ? sip_uri.user.dialcode(oepg.dialcode_regexp) : sip_uri.user.user
|
49
|
+
dialcode = oepg.attributes.dialcode_template.gsub("${dialcode_match}", dialcode) if dialcode && oepg && oepg.attributes.dialcode_template
|
50
|
+
|
51
|
+
blacklisted_user_params = oepg.attributes.uri_user_params_blacklist || [] if oepg
|
52
|
+
blacklisted_params = oepg.attributes.uri_params_blacklist || [] if oepg
|
53
|
+
merge_user_params, merge_params = {}, {}
|
54
|
+
|
55
|
+
merge_user_params['rn'] = sip_request.rn if sip_request.rn && !sip_request.request_uri.params.keys.include?('rn') && !sip_request.request_uri.params.keys.include?('rn')
|
56
|
+
merge_user_params['npdi'] = sip_request.npdi if sip_request.npdi && !sip_request.request_uri.params.keys.include?('npdi') && !sip_request.request_uri.params.keys.include?('npdi')
|
57
|
+
merge_user_params.merge! oepg_parts[:uri_user_params]
|
58
|
+
merge_params['rn'] = sip_request.rn if sip_request.rn && !merge_user_params.has_key?('rn')
|
59
|
+
merge_params['npdi'] = sip_request.npdi if sip_request.npdi && !merge_user_params.has_key?('npdi')
|
60
|
+
merge_params.merge! oepg_parts[:uri_params]
|
61
|
+
|
62
|
+
sip_uri.regenerate(:user => {
|
63
|
+
:user => dialcode,
|
64
|
+
:merge_params => merge_user_params,
|
65
|
+
:blacklisted_params => blacklisted_user_params
|
66
|
+
},
|
67
|
+
:host => oep_parts[:host],
|
68
|
+
:port => oep_parts[:port],
|
69
|
+
:merge_params => merge_params,
|
70
|
+
:blacklisted_params => blacklisted_params)
|
71
|
+
end
|
72
|
+
|
73
|
+
class Template
|
74
|
+
|
75
|
+
attr_accessor :contact_template
|
76
|
+
|
77
|
+
def initialize(contact_template)
|
78
|
+
@contact_template = contact_template.clone
|
79
|
+
end
|
80
|
+
|
81
|
+
def sub!(contact, sip_uri, options = {})
|
82
|
+
options = options.with_indifferent_access
|
83
|
+
|
84
|
+
iep_host = options[:inbound_end_point_host]
|
85
|
+
iep_port = options[:inbound_end_point_port]
|
86
|
+
|
87
|
+
#@contact_template.gsub!("${oepg.prefix}", '') # legacy as of 10/24/12
|
88
|
+
@contact_template.gsub!("${ruri.dialcode}", sip_uri.user.user_string)
|
89
|
+
@contact_template.gsub!("${ruri.user_params}", !sip_uri.user.params.blank? ? ";#{sip_uri.user.params_string}" : '')
|
90
|
+
@contact_template.gsub!("${ruri.params}", !sip_uri.params.blank? ? ";#{sip_uri.params_string}" : '')
|
91
|
+
@contact_template.gsub!("${iep.host}", !iep_host.blank? ? iep_host : '')
|
92
|
+
@contact_template.gsub!("${iep.port}", !iep_port.blank? ? ":#{iep_port}" : '')
|
93
|
+
@contact_template.gsub!("${oep.host}", sip_uri.host)
|
94
|
+
@contact_template.gsub!("${oep.port}", ":#{sip_uri.port}")
|
95
|
+
@contact_template.gsub!("${oepg.prefix}", '') # legacy as of 10/24/12
|
96
|
+
@contact_template.gsub!("${oepg.uri_user_params}", '') #legacy as of 3/29/13 (params already merged in)
|
97
|
+
@contact_template.gsub!("${oepg.uri_params}", '') #legacy as of 3/29/13 (params already merged in)
|
98
|
+
|
99
|
+
self.sub_outbound_rate! contact.outbound_rate
|
100
|
+
self.sub_inbound_rate! contact.inbound_rate
|
101
|
+
end
|
102
|
+
|
103
|
+
def sub_outbound_rate!(rate)
|
104
|
+
@contact_template.gsub!("${or.price}", rate && rate.attributes.price ? rate.attributes.price.to_s : '?')
|
105
|
+
@contact_template.gsub!("${or.type}", rate && rate.attributes.type ? rate.attributes.type : '?')
|
106
|
+
@contact_template.gsub!("${or.dialcode}", rate && rate.attributes.dialcode ? rate.attributes.dialcode : '?')
|
107
|
+
@contact_template.gsub!("${or.lata}", rate && rate.attributes.lata ? rate.attributes.lata : '?')
|
108
|
+
@contact_template.gsub!("${or.ocn}", rate && rate.attributes.ocn ? rate.attributes.ocn : '?')
|
109
|
+
@contact_template.gsub!("${or.billing_increment}", rate && rate.attributes.billing_increment ? rate.attributes.billing_increment.to_s : '?')
|
110
|
+
end
|
111
|
+
|
112
|
+
def sub_inbound_rate!(rate)
|
113
|
+
@contact_template.gsub!("${ir.price}", rate && rate.attributes.price ? rate.attributes.price.to_s : '?')
|
114
|
+
@contact_template.gsub!("${ir.type}", rate && rate.attributes.type ? rate.attributes.type : '?')
|
115
|
+
@contact_template.gsub!("${ir.dialcode}", rate && rate.attributes.dialcode ? rate.attributes.dialcode : '?')
|
116
|
+
@contact_template.gsub!("${ir.billing_increment}", rate && rate.attributes.billing_increment ? rate.attributes.billing_increment.to_s : '?')
|
117
|
+
@contact_template.gsub!("${ir.lata}", rate && rate.attributes.lata ? rate.attributes.lata : '?')
|
118
|
+
@contact_template.gsub!("${ir.ocn}", rate && rate.attributes.ocn ? rate.attributes.ocn : '?')
|
119
|
+
end
|
120
|
+
|
121
|
+
end
|
122
|
+
|
123
|
+
end
|
124
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module RouteNGNClient
|
2
|
+
class EndPoint < Model
|
3
|
+
|
4
|
+
belongs_to :outbound_end_point_group, :inbound_end_point_group
|
5
|
+
|
6
|
+
def build_uri_parts(options = {})
|
7
|
+
{
|
8
|
+
:host => (self.attributes.host ? self.attributes.host.strip : ''),
|
9
|
+
:port => (self.attributes.port ? self.attributes.port.to_s : '')
|
10
|
+
}
|
11
|
+
end
|
12
|
+
|
13
|
+
def random_priority(max = 1000)
|
14
|
+
rand(max)
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
end
|