forked from urbanairship/ruby-library
/
urbanairship.rb
213 lines (171 loc) · 8.07 KB
/
urbanairship.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
require 'json'
require 'net/https'
require 'time'
require File.join(File.dirname(__FILE__), 'urbanairship/response')
module Urbanairship
begin
require 'system_timer'
Timer = SystemTimer
rescue LoadError
require 'timeout'
Timer = Timeout
end
module ClassMethods
attr_accessor :application_key, :application_secret, :master_secret, :logger, :request_timeout, :provider
def register_device(device_token, options = {})
body = parse_register_options(options).to_json
if ( (options[:provider] || @provider) == :android ) || ( (options[:provider] || @provider) == 'android' )
do_request(:put, "/api/apids/#{device_token}", :body => body, :authenticate_with => :application_secret)
else
do_request(:put, "/api/device_tokens/#{device_token}", :body => body, :authenticate_with => :application_secret)
end
end
def unregister_device(device_token, options = {})
if ( (options[:provider] || @provider) == :android ) || ( (options[:provider] || @provider) == 'android' )
do_request(:delete, "/api/apids/#{device_token}", :authenticate_with => :application_secret)
else
do_request(:delete, "/api/device_tokens/#{device_token}", :authenticate_with => :application_secret)
end
end
def device_info(device_token, options = {})
if ( (options[:provider] || @provider) == :android ) || ( (options[:provider] || @provider) == 'android' )
do_request(:get, "/api/apids/#{device_token}", :authenticate_with => :application_secret)
else
do_request(:get, "/api/device_tokens/#{device_token}", :authenticate_with => :application_secret)
end
end
def delete_scheduled_push(param)
warn "[DEPRECATED] http://docs.urbanairship.com/reference/api/v3/api-v3-migration-guide.html#api-push-batch"
path = param.is_a?(Hash) ? "/api/push/scheduled/alias/#{param[:alias].to_s}" : "/api/push/scheduled/#{param.to_s}"
do_request(:delete, path, :authenticate_with => :master_secret)
end
def push(options = {})
body = parse_push_options(options.dup).to_json
do_request(:post, "/api/push/", :body => body, :authenticate_with => :master_secret, :version => options[:version])
end
def push_to_segment(options = {})
warn "[DEPRECATED] http://docs.urbanairship.com/reference/api/v3/api-v3-migration-guide.html#api-push-segments"
body = parse_push_options(options).to_json
do_request(:post, "/api/push/segments", :body => body, :authenticate_with => :master_secret)
end
def batch_push(notifications = [])
warn "[DEPRECATION] http://docs.urbanairship.com/reference/api/v3/api-v3-migration-guide.html#api-push-batch"
body = notifications.map{|notification| parse_push_options(notification)}.to_json
do_request(:post, "/api/push/batch/", :body => body, :authenticate_with => :master_secret)
end
def broadcast_push(options = {})
warn "[DEPRECATED] http://docs.urbanairship.com/reference/api/v3/api-v3-migration-guide.html#api-push-broadcast"
body = parse_push_options(options).to_json
do_request(:post, "/api/push/broadcast/", :body => body, :authenticate_with => :master_secret)
end
def feedback(time)
do_request(:get, "/api/device_tokens/feedback/?since=#{format_time(time)}", :authenticate_with => :master_secret)
end
def tags
do_request(:get, "/api/tags/", :authenticate_with => :master_secret)
end
def add_tag(tag)
do_request(:put, "/api/tags/#{tag}", :authenticate_with => :master_secret, :content_type => 'text/plain')
end
def remove_tag(tag)
do_request(:delete, "/api/tags/#{tag}", :authenticate_with => :master_secret)
end
def tags_for_device(device_token)
do_request(:get, "/api/device_tokens/#{device_token}/tags/", :authenticate_with => :master_secret)
end
def tag_device(params)
provider_field = ( (params[:provider] || @provider) == :android ) || ( (params[:provider] || @provider) == 'android' ) ? :apids : :device_tokens
do_request(:post, "/api/tags/#{params[:tag]}", :body => {provider_field => {:add => [params[:device_token]]}}.to_json, :authenticate_with => :master_secret)
end
def untag_device(params)
provider_field = ( (params[:provider] || @provider) == :android ) || ( (params[:provider] || @provider) == 'android' ) ? :apids : :device_tokens
do_request(:post, "/api/tags/#{params[:tag]}", :body => {provider_field => {:remove => [params[:device_token]]}}.to_json, :authenticate_with => :master_secret)
end
def device_tokens
do_request(:get, "/api/device_tokens/", :authenticate_with => :master_secret)
end
def device_tokens_count
do_request(:get, "/api/device_tokens/count/", :authenticate_with => :master_secret)
end
def segments
do_request(:get, "/api/segments", :authenticate_with => :master_secret)
end
def create_segment(segment)
do_request(:post, "/api/segments", :body => segment.to_json, :authenticate_with => :master_secret)
end
def segment(id)
do_request(:get, "/api/segments/#{id}", :authenticate_with => :master_secret)
end
def update_segment(id, segment)
do_request(:put, "/api/segments/#{id}", :body => segment.to_json, :authenticate_with => :master_secret)
end
def delete_segment(id)
do_request(:delete, "/api/segments/#{id}", :authenticate_with => :master_secret)
end
private
def do_request(http_method, path, options = {})
verify_configuration_values(:application_key, options[:authenticate_with])
klass = Net::HTTP.const_get(http_method.to_s.capitalize)
request = klass.new(path)
request.basic_auth @application_key, instance_variable_get("@#{options[:authenticate_with]}")
request.add_field "Content-Type", options[:content_type] || "application/json"
request.body = options[:body] if options[:body]
request["Accept"] = "application/vnd.urbanairship+json; version=#{options[:version]};" if options[:version]
Timer.timeout(request_timeout) do
start_time = Time.now
response = http_client.request(request)
log_request_and_response(request, response, Time.now - start_time)
Urbanairship::Response.wrap(response)
end
rescue Timeout::Error
unless logger.nil?
logger.error "Urbanairship request timed out after #{request_timeout} seconds: [#{http_method} #{request.path} #{request.body}]"
end
Urbanairship::Response.wrap(nil, :body => {:error => 'Request timeout'}, :code => '503')
end
def verify_configuration_values(*symbols)
absent_values = symbols.select{|symbol| instance_variable_get("@#{symbol}").nil? }
raise("Must configure #{absent_values.join(", ")} before making this request.") unless absent_values.empty?
end
def http_client
Net::HTTP.new("go.urbanairship.com", 443).tap{|http| http.use_ssl = true}
end
def parse_register_options(hash = {})
hash[:alias] = hash[:alias].to_s unless hash[:alias].nil?
hash
end
def parse_push_options(hash = {})
hash[:aliases] = hash[:aliases].map{|a| a.to_s} unless hash[:aliases].nil?
hash[:schedule_for] = hash[:schedule_for].map{|elem| process_scheduled_elem(elem)} unless hash[:schedule_for].nil?
hash.delete(:version)
hash
end
def log_request_and_response(request, response, time)
return if logger.nil?
time = (time * 1000).to_i
http_method = request.class.to_s.split('::')[-1]
logger.info "Urbanairship (#{time}ms): [#{http_method} #{request.path}, #{request.body}], [#{response.code}, #{response.body}]"
logger.flush if logger.respond_to?(:flush)
end
def format_time(time)
time = Time.parse(time) if time.is_a?(String)
time.utc.strftime("%Y-%m-%dT%H:%M:%SZ")
end
def process_scheduled_elem(elem)
if elem.class == Hash
elem.merge!(:scheduled_time => format_time(elem[:scheduled_time]))
else
format_time(elem)
end
end
def request_timeout
@request_timeout || 5.0
end
end
class << self
include ClassMethods
end
class Client
include ClassMethods
end
end