retreaverjs-rails 0.0.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/Gruntfile.js +48 -0
- data/LICENSE +674 -0
- data/README.md +90 -0
- data/Rakefile +16 -0
- data/config/README +1 -0
- data/config/jsdocs.json +26 -0
- data/lib/retreaverjs/compile.rb +32 -0
- data/lib/retreaverjs/rails/version.rb +5 -0
- data/lib/retreaverjs/rails.rb +8 -0
- data/package.json +46 -0
- data/src/retreaver/base/base64.js +126 -0
- data/src/retreaver/base/cookies.js +59 -0
- data/src/retreaver/base/data.js +81 -0
- data/src/retreaver/base/helpers.js +55 -0
- data/src/retreaver/base/model.js +113 -0
- data/src/retreaver/base/request.js +215 -0
- data/src/retreaver/base/request_number.js +193 -0
- data/src/retreaver/cache.js +1 -0
- data/src/retreaver/callpixels.js +3 -0
- data/src/retreaver/campaign.js +108 -0
- data/src/retreaver/number.js +206 -0
- metadata +121 -0
@@ -0,0 +1,206 @@
|
|
1
|
+
(function () {
|
2
|
+
// Dependencies
|
3
|
+
var Base = Retreaver.Base;
|
4
|
+
/**
|
5
|
+
* @constructor
|
6
|
+
* @memberOf Retreaver
|
7
|
+
* @param {Object} attributes - Attributes
|
8
|
+
* @property {Object} attributes
|
9
|
+
* @property {Number} attributes.id - The CallPixels internal number ID.
|
10
|
+
* @property {String} attributes.formatted_number - Nationally formatted phone number.
|
11
|
+
* @property {String} attributes.number - E.164 formatted phone number.
|
12
|
+
* @property {String} attributes.plain_number - The unformatted phone number digits.
|
13
|
+
* @property {Boolean} attributes.target_open - Whether there is an open, available target.
|
14
|
+
*/
|
15
|
+
Retreaver.Number = function (options) {
|
16
|
+
|
17
|
+
var self = this;
|
18
|
+
self.type = 'numbers';
|
19
|
+
|
20
|
+
function initialize(data) {
|
21
|
+
self.store(data);
|
22
|
+
self.set('is_active', 'true');
|
23
|
+
}
|
24
|
+
|
25
|
+
/**
|
26
|
+
* Add tags to a number.
|
27
|
+
* @memberOf Retreaver.Number
|
28
|
+
* @function add_tags
|
29
|
+
* @instance
|
30
|
+
* @param {Object} tags - A collection of tags {key: 'value', tag2: 'value2'}
|
31
|
+
* @param {Function} callback - Callback that will be fired after request.
|
32
|
+
* @throws Will throw an error if attempting to modify tags on a number that doesn't belong to a number pool
|
33
|
+
* with per-visitor numbers enabled.
|
34
|
+
*/
|
35
|
+
self.add_tags = function (tags, callback) {
|
36
|
+
ensure_is_per_visitor();
|
37
|
+
self.post_data('numbers/tag', tags_payload(tags), callback);
|
38
|
+
};
|
39
|
+
|
40
|
+
/**
|
41
|
+
* Remove tags from a number.
|
42
|
+
* @memberOf Retreaver.Number
|
43
|
+
* @function remove_tags
|
44
|
+
* @instance
|
45
|
+
* @param {Object} tags - A collection of tags {key: 'value', tag2: 'value2'}
|
46
|
+
* @param {Function} callback - Callback that will be fired after request.
|
47
|
+
* @throws Will throw an error if attempting to modify tags on a number that doesn't belong to a number pool
|
48
|
+
* with per-visitor numbers enabled.
|
49
|
+
*/
|
50
|
+
self.remove_tags = function (tags, callback) {
|
51
|
+
ensure_is_per_visitor();
|
52
|
+
self.post_data('numbers/untag', tags_payload(tags), callback);
|
53
|
+
};
|
54
|
+
|
55
|
+
/**
|
56
|
+
* Removes all tags with given keys from a number.
|
57
|
+
* @memberOf Retreaver.Number
|
58
|
+
* @function remove_tags_by_keys
|
59
|
+
* @instance
|
60
|
+
* @param {Array} keys - An array of keys to remove. eg: ['key1', 'key2']
|
61
|
+
* @param {Function} callback - Callback that will be fired after request.
|
62
|
+
* @throws Will throw an error if attempting to modify tags on a number that doesn't belong to a number pool
|
63
|
+
* with per-visitor numbers enabled.
|
64
|
+
*/
|
65
|
+
self.remove_tags_by_keys = function (keys, callback) {
|
66
|
+
ensure_is_per_visitor();
|
67
|
+
if (typeof(keys) === 'string') keys = keys.split(',');
|
68
|
+
var payload = {
|
69
|
+
tag_keys: keys,
|
70
|
+
ids: [ get('id') ],
|
71
|
+
campaign_key: get('campaign_key')
|
72
|
+
};
|
73
|
+
self.post_data('numbers/untag/keys', payload, callback);
|
74
|
+
};
|
75
|
+
|
76
|
+
/**
|
77
|
+
* Clear all tags from a number.
|
78
|
+
* @memberOf Retreaver.Number
|
79
|
+
* @function clear_tags
|
80
|
+
* @instance
|
81
|
+
* @param {Function} callback - Callback that will be fired after request.
|
82
|
+
* @throws Will throw an error if attempting to modify tags on a number that doesn't belong to a number pool
|
83
|
+
* with per-visitor numbers enabled.
|
84
|
+
*/
|
85
|
+
self.clear_tags = function (callback) {
|
86
|
+
ensure_is_per_visitor();
|
87
|
+
var payload = {
|
88
|
+
ids: [ get('id') ],
|
89
|
+
campaign_key: get('campaign_key'),
|
90
|
+
all: 'true'
|
91
|
+
};
|
92
|
+
self.post_data('numbers/untag', payload, callback);
|
93
|
+
};
|
94
|
+
|
95
|
+
/**
|
96
|
+
* Release number back to pool.
|
97
|
+
* @memberOf Retreaver.Number
|
98
|
+
* @function release
|
99
|
+
* @instance
|
100
|
+
*/
|
101
|
+
self.release = function () {
|
102
|
+
self.set('is_active', 'false');
|
103
|
+
};
|
104
|
+
|
105
|
+
/**
|
106
|
+
* Start a call immediately by having a campaign target dial the visitor.
|
107
|
+
* @memberOf Retreaver.Number
|
108
|
+
* @function initiate_call
|
109
|
+
* @instance
|
110
|
+
* @param {String} dial - The number to call.
|
111
|
+
* @param {Object} payload - A collection of tags as key-value pairs and optional secure override properties.
|
112
|
+
* @param {string} [payload.target_map] - A string mapping a placeholder number to a phone number.
|
113
|
+
* @param {string} [payload.target_map_cs] - A SHA1 checksum of the target_map concatenated with your CallPixels API
|
114
|
+
* key.
|
115
|
+
* @param {number} [payload.timer_offset] - Number of seconds to offset the "connect" duration timers by.
|
116
|
+
* @param {string} [payload.timer_offset_cs] - An SHA1 checksum of the timer_offset concatenated with your
|
117
|
+
* CallPixels API key.
|
118
|
+
* @param {(string|number)} [payload.*] - Key value pairs treated as tags.
|
119
|
+
* @param {Function} callback - Callback that will be fired after request.
|
120
|
+
* @example
|
121
|
+
* number.initiate_call('4166686980', {company_name: 'CallPixels'}, function (call) {
|
122
|
+
* alert('Call started with UUID ' + call.uuid)
|
123
|
+
* });
|
124
|
+
*/
|
125
|
+
self.initiate_call = function (dial, payload, callback) {
|
126
|
+
if (typeof(payload) === 'undefined') payload = {};
|
127
|
+
// assign dial to payload
|
128
|
+
payload.dial = dial;
|
129
|
+
// merge payload into payload
|
130
|
+
payload = Base.merge(self.get('id', 'campaign_key'), payload);
|
131
|
+
// post the payload
|
132
|
+
self.post_data('numbers/initiate_call', payload, callback);
|
133
|
+
};
|
134
|
+
|
135
|
+
function tags_payload(tags) {
|
136
|
+
if (typeof(tags) === 'string') tags = Retreaver.Number.extract_tags_from_string(tags);
|
137
|
+
return {
|
138
|
+
tag_values: tags,
|
139
|
+
ids: [ get('id') ],
|
140
|
+
campaign_key: get('campaign_key')
|
141
|
+
};
|
142
|
+
}
|
143
|
+
|
144
|
+
function get(key) {
|
145
|
+
return self.get(key);
|
146
|
+
}
|
147
|
+
|
148
|
+
function ensure_is_per_visitor() {
|
149
|
+
if (self.get('is_per_visitor') === false) {
|
150
|
+
throw "Error: Tried to add tags to non per-visitor number.";
|
151
|
+
}
|
152
|
+
}
|
153
|
+
|
154
|
+
initialize(options);
|
155
|
+
};
|
156
|
+
|
157
|
+
Retreaver.Number.extract_tags_from_string = function (tags) {
|
158
|
+
var output = {};
|
159
|
+
var tags = tags.split(",");
|
160
|
+
for (var i = 0; i < tags.length; i++) {
|
161
|
+
var tag = tags[i].split(":");
|
162
|
+
output[tag[0]] = tag[1]
|
163
|
+
}
|
164
|
+
return output;
|
165
|
+
};
|
166
|
+
|
167
|
+
Retreaver.Number.prototype = new Retreaver.Base.Model();
|
168
|
+
|
169
|
+
function ping_active_numbers(callback) {
|
170
|
+
if (typeof(Retreaver.Base.Data._store) !== 'undefined') {
|
171
|
+
// get numbers
|
172
|
+
var numbers = Retreaver.Base.Data._store['numbers'];
|
173
|
+
// for each number
|
174
|
+
if (typeof(numbers) !== 'undefined') {
|
175
|
+
// group number_ids by campaign_key
|
176
|
+
var grouped = {};
|
177
|
+
for (var primary_key in numbers) {
|
178
|
+
var number = numbers[primary_key];
|
179
|
+
if (number.is_active === 'true') {
|
180
|
+
if (typeof(grouped[number.campaign_key]) === 'undefined') {
|
181
|
+
grouped[number.campaign_key] = [];
|
182
|
+
grouped[number.campaign_key]['ids'] = [];
|
183
|
+
grouped[number.campaign_key]['hashes'] = [];
|
184
|
+
}
|
185
|
+
grouped[number.campaign_key]['ids'].push(number.id);
|
186
|
+
grouped[number.campaign_key]['hashes'].push(number.id_checksum);
|
187
|
+
}
|
188
|
+
}
|
189
|
+
// ping each group of number_ids
|
190
|
+
for (var campaign_key in grouped) {
|
191
|
+
var payload = {
|
192
|
+
ids: grouped[campaign_key].ids,
|
193
|
+
hashes: grouped[campaign_key].hashes
|
194
|
+
};
|
195
|
+
Retreaver.Base.Request.connection().postJSON('/api/v1/numbers/ping', payload, [Retreaver.Base.Model.update, callback], this);
|
196
|
+
}
|
197
|
+
}
|
198
|
+
}
|
199
|
+
// call recursively
|
200
|
+
setTimeout(ping_active_numbers, 15000);
|
201
|
+
}
|
202
|
+
|
203
|
+
// always ping active numbers
|
204
|
+
ping_active_numbers();
|
205
|
+
|
206
|
+
})();
|
metadata
ADDED
@@ -0,0 +1,121 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: retreaverjs-rails
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.12
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Blake Hilscher
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-05-27 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: railties
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: bundler
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.6'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.6'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rake
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: pry
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
description: retreaver.js rails wrapper
|
70
|
+
email:
|
71
|
+
- blake@hilscher.ca
|
72
|
+
executables: []
|
73
|
+
extensions: []
|
74
|
+
extra_rdoc_files: []
|
75
|
+
files:
|
76
|
+
- Gruntfile.js
|
77
|
+
- LICENSE
|
78
|
+
- README.md
|
79
|
+
- Rakefile
|
80
|
+
- config/README
|
81
|
+
- config/jsdocs.json
|
82
|
+
- lib/retreaverjs/compile.rb
|
83
|
+
- lib/retreaverjs/rails.rb
|
84
|
+
- lib/retreaverjs/rails/version.rb
|
85
|
+
- package.json
|
86
|
+
- src/retreaver/base/base64.js
|
87
|
+
- src/retreaver/base/cookies.js
|
88
|
+
- src/retreaver/base/data.js
|
89
|
+
- src/retreaver/base/helpers.js
|
90
|
+
- src/retreaver/base/model.js
|
91
|
+
- src/retreaver/base/request.js
|
92
|
+
- src/retreaver/base/request_number.js
|
93
|
+
- src/retreaver/cache.js
|
94
|
+
- src/retreaver/callpixels.js
|
95
|
+
- src/retreaver/campaign.js
|
96
|
+
- src/retreaver/number.js
|
97
|
+
homepage: ''
|
98
|
+
licenses:
|
99
|
+
- GPLv3
|
100
|
+
metadata: {}
|
101
|
+
post_install_message:
|
102
|
+
rdoc_options: []
|
103
|
+
require_paths:
|
104
|
+
- lib
|
105
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
106
|
+
requirements:
|
107
|
+
- - ">="
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
110
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
111
|
+
requirements:
|
112
|
+
- - ">="
|
113
|
+
- !ruby/object:Gem::Version
|
114
|
+
version: '0'
|
115
|
+
requirements: []
|
116
|
+
rubyforge_project:
|
117
|
+
rubygems_version: 2.2.2
|
118
|
+
signing_key:
|
119
|
+
specification_version: 4
|
120
|
+
summary: retreaver.js rails wrapper
|
121
|
+
test_files: []
|