data-com-api 0.0.1 → 0.1.0
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 +8 -8
- data/README.md +81 -3
- data/data-com-api.gemspec +3 -1
- data/lib/data-com-api/api_uri.rb +40 -0
- data/lib/data-com-api/client.rb +247 -0
- data/lib/data-com-api/company.rb +17 -0
- data/lib/data-com-api/company_contact_count/department.rb +17 -0
- data/lib/data-com-api/company_contact_count/level.rb +17 -0
- data/lib/data-com-api/contact.rb +32 -0
- data/lib/data-com-api/errors.rb +96 -0
- data/lib/data-com-api/query_parameters.rb +66 -0
- data/lib/data-com-api/responses/base.rb +19 -0
- data/lib/data-com-api/responses/company_contact_count.rb +96 -0
- data/lib/data-com-api/responses/contacts.rb +97 -0
- data/lib/data-com-api/responses/search_base.rb +112 -0
- data/lib/data-com-api/responses/search_company.rb +23 -0
- data/lib/data-com-api/responses/search_contact.rb +23 -0
- data/lib/data-com-api/version.rb +1 -1
- data/lib/data-com-api.rb +14 -1
- data/spec/factories/client_factory.rb +12 -0
- data/spec/factories/data-com/company_contact_count/department_factory.rb +14 -0
- data/spec/factories/data-com/company_contact_count/level_factory.rb +14 -0
- data/spec/factories/data-com/company_contact_count_response_factory.rb +39 -0
- data/spec/factories/data-com/contact_factory.rb +35 -0
- data/spec/factories/data-com/contacts_response_factory.rb +30 -0
- data/spec/factories/data-com/search_contact_response_factory.rb +30 -0
- data/spec/factories/query_parameters_factory.rb +11 -0
- data/spec/factories/responses/search_contact_factory.rb +13 -0
- data/spec/integration/client_spec.rb +167 -0
- data/spec/integration/webmock_spec.rb +34 -0
- data/spec/models/client_spec.rb +164 -0
- data/spec/models/query_parameters_spec.rb +42 -0
- data/spec/models/search_base_spec.rb +80 -0
- data/spec/spec_helper.rb +22 -2
- data/spec/support/data_com_api_stub_requests.rb +229 -0
- metadata +75 -8
- data/spec/factories.rb +0 -4
- data/spec/requests/client_spec.rb +0 -6
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
ZmJiODI5NjlmY2YxNTllZWYxMTM1NDZjYTA1MTI4ZTg5YWNkYTYxYQ==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
ZWU3YzRiZDY4NjRlMTJiMDMzNDMyZmZjOGNkYmI5ZWM1OWU5NWU0NA==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
YjQ0OWJkMWU0ZDA4MGMzMWNlNTBjOTE0ZjYwMDI1MjQ2NjYzODg2OGRjNTg0
|
10
|
+
MzAyZmI3MjVjN2VjMjk1YTQ5NWRiZDM4ZDNiYzQ3MDM3Y2JhYzliMjhjYjAx
|
11
|
+
NWEyN2Y4OTg1Y2I1YTdiZTI3OWRiYTU3NmNhN2FhY2NmNjExZjI=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
MzFmMTM4NjhkNTZhMjQ4M2UyNzhjZjg4NDYyNWZhNTdmYWRmYTZjNTVmNjE0
|
14
|
+
ODkzYjg5MGIyNDY5OTc2YzUzN2ZiZTljY2JiMWVmZTdkOTQ2ZjAzNjk4NjVh
|
15
|
+
ODhhYTMzNzhkMzU4ZWQxNWQ2Mzk5YmM5YjE4NWJiNTc1NGUzZTE=
|
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
#
|
1
|
+
# DataComApi
|
2
2
|
|
3
3
|
Allows to interface with Data.com API ( Salesforce, ex Jigsaw ).
|
4
4
|
**Work in progress**
|
@@ -7,7 +7,7 @@ Allows to interface with Data.com API ( Salesforce, ex Jigsaw ).
|
|
7
7
|
|
8
8
|
Add this line to your application's Gemfile:
|
9
9
|
|
10
|
-
gem 'data-com-api'
|
10
|
+
gem 'data-com-api', '~> 0.1.0'
|
11
11
|
|
12
12
|
And then execute:
|
13
13
|
|
@@ -19,7 +19,85 @@ Or install it yourself as:
|
|
19
19
|
|
20
20
|
## Usage
|
21
21
|
|
22
|
-
|
22
|
+
First, create a `DataComApi::Client` instance with the following line:
|
23
|
+
|
24
|
+
```ruby
|
25
|
+
client = DataComApi::Client.new('your-api-token')
|
26
|
+
```
|
27
|
+
|
28
|
+
You can then configure the client in the following way:
|
29
|
+
|
30
|
+
```ruby
|
31
|
+
client.page_size = 100 # Value must be between 1 and 100
|
32
|
+
```
|
33
|
+
|
34
|
+
You can also get the totals API calls performed on the client with:
|
35
|
+
|
36
|
+
```ruby
|
37
|
+
client.api_calls_count
|
38
|
+
```
|
39
|
+
|
40
|
+
Then, you can perform one of the following requests:
|
41
|
+
|
42
|
+
- `search_contact`
|
43
|
+
- `search_company`
|
44
|
+
- `company_contact_count`
|
45
|
+
- `contacts`
|
46
|
+
|
47
|
+
Every method matches the Data.com API call and support the same parameters. All requests are *lazy*,
|
48
|
+
which means that the request will be performed only once you actually perform an action on the response, like
|
49
|
+
requesting `size`, `all`, `each` and such (keep reading).
|
50
|
+
|
51
|
+
### Client methods aka API responses
|
52
|
+
#### #search\_contact and #search\_company
|
53
|
+
|
54
|
+
The parameters accepted by this method are the keys of the [DataComApi::QueryParameters](https://github.com/Fire-Dragon-DoL/data-com-api/blob/master/lib/data-com-api/query_parameters.rb). Notice that you can use the key specified as `:from` for a more ruby-like
|
55
|
+
syntax.
|
56
|
+
|
57
|
+
The returned object is a `DataComApi::SearchContact` which is mostly a [DataComApi::SearchBase](https://github.com/Fire-Dragon-DoL/data-com-api/blob/master/lib/data-com-api/responses/search_base.rb) instance with the following main methods:
|
58
|
+
- `size` which returns the `totalHits` field from the response
|
59
|
+
(it will perform a request only if none performed)
|
60
|
+
- `all` which returns an array containing all records that can be fetched
|
61
|
+
(be careful, can be **memory hungry**). Will handle paging by itself
|
62
|
+
- `each` which yields each record that can be obtained with the request, less memory hungry than previous
|
63
|
+
request. Will handle paging by itself
|
64
|
+
- `each_with_index` same as previous one but with index
|
65
|
+
- `at_offset` which get one page of records (as an array) at specified offset
|
66
|
+
|
67
|
+
Every record returned will be a [DataComApi::Contact](https://github.com/Fire-Dragon-DoL/data-com-api/blob/master/lib/data-com-api/contact.rb) or a [DataComApi::Company](https://github.com/Fire-Dragon-DoL/data-com-api/blob/master/lib/data-com-api/company.rb) instance.
|
68
|
+
|
69
|
+
#### #company\_contact\_count
|
70
|
+
|
71
|
+
The parameters accepted by this method are `company_id` (required) and the second one is [DataComApi::QueryParameters](https://github.com/Fire-Dragon-DoL/data-com-api/blob/master/lib/data-com-api/query_parameters.rb) which is useful only for the `include_graveyard` key
|
72
|
+
|
73
|
+
This method allows you to count contacts per company, the response has the following methods:
|
74
|
+
- `size` which returns `totalCount` from API response
|
75
|
+
- `url` which returns `url` from API response
|
76
|
+
- `levels` which returns an array of [DataComApi::CompanyContactCount::Level](https://github.com/Fire-Dragon-DoL/data-com-api/blob/master/lib/data-com-api/company_contact_count/level.rb)
|
77
|
+
- `departments` which returns an array of [DataComApi::CompanyContactCount::Departments](https://github.com/Fire-Dragon-DoL/data-com-api/blob/master/lib/data-com-api/company_contact_count/department.rb)
|
78
|
+
|
79
|
+
#### #contacts
|
80
|
+
|
81
|
+
The parameters accepted by this method are `contact_ids` (an array of `Fixnum`), `username`, `password`
|
82
|
+
which are required and the optional `purchase_flag` which defaults to `false`.
|
83
|
+
|
84
|
+
**Be careful, this method may purchase records.**
|
85
|
+
This response has the following methods:
|
86
|
+
- `size` which returns `totalHits` from API response
|
87
|
+
- `used_points` which returns `pointsUsed` from API response
|
88
|
+
- `purchased_contacts` which returns `numberOfContactsPurchased` from API response
|
89
|
+
- `point_balance` which returns `pointBalance` from API response
|
90
|
+
- `contacts` which returns an array of [DataComApi::Contact](https://github.com/Fire-Dragon-DoL/data-com-api/blob/master/lib/data-com-api/contact.rb)
|
91
|
+
|
92
|
+
## TODO
|
93
|
+
|
94
|
+
- Implement `partner` request
|
95
|
+
- Implement `partner_contacts` request
|
96
|
+
- Implement `user` request used to purchase points through API
|
97
|
+
- Write some tests for `search_company` which is exactly the same as
|
98
|
+
`search_contact`
|
99
|
+
- Improve tests organization
|
100
|
+
- Test exceptions when performing API requests
|
23
101
|
|
24
102
|
## Contributing
|
25
103
|
|
data/data-com-api.gemspec
CHANGED
@@ -22,7 +22,9 @@ Gem::Specification.new do |spec|
|
|
22
22
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
23
23
|
spec.require_paths = ["lib"]
|
24
24
|
|
25
|
-
spec.add_dependency 'httparty',
|
25
|
+
spec.add_dependency 'httparty', '~> 0.12'
|
26
|
+
spec.add_dependency 'activesupport', '~> 4.0'
|
27
|
+
spec.add_dependency 'hashie', '~> 2.0'
|
26
28
|
|
27
29
|
spec.add_development_dependency 'rspec', '~> 2.14'
|
28
30
|
spec.add_development_dependency 'rspec-mocks', '~> 2.14'
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'singleton'
|
2
|
+
|
3
|
+
module DataComApi
|
4
|
+
|
5
|
+
class BaseApiURI
|
6
|
+
include Singleton
|
7
|
+
|
8
|
+
def company_contact_count(company_id)
|
9
|
+
"/rest/companyContactCount/#{ company_id }.json"
|
10
|
+
end
|
11
|
+
|
12
|
+
def search_contact
|
13
|
+
"/rest/searchContact.json"
|
14
|
+
end
|
15
|
+
|
16
|
+
def search_company
|
17
|
+
"/rest/searchCompany.json"
|
18
|
+
end
|
19
|
+
|
20
|
+
def contacts(contact_ids)
|
21
|
+
"/rest/contacts/#{ contact_ids.join(',') }.json"
|
22
|
+
end
|
23
|
+
|
24
|
+
def partner_contacts(contact_ids)
|
25
|
+
"/rest/partnerContacts/#{ contact_ids.join(',') }.json"
|
26
|
+
end
|
27
|
+
|
28
|
+
def partner
|
29
|
+
"/rest/partner.json"
|
30
|
+
end
|
31
|
+
|
32
|
+
def user
|
33
|
+
"/rest/user.json"
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
ApiURI = BaseApiURI.instance
|
39
|
+
|
40
|
+
end
|
data/lib/data-com-api/client.rb
CHANGED
@@ -1,4 +1,251 @@
|
|
1
|
+
require 'httparty'
|
2
|
+
require 'json'
|
3
|
+
require 'data-com-api/errors'
|
4
|
+
require 'data-com-api/api_uri'
|
5
|
+
require 'data-com-api/responses/search_contact'
|
6
|
+
require 'data-com-api/responses/search_company'
|
7
|
+
require 'data-com-api/responses/company_contact_count'
|
8
|
+
require 'data-com-api/responses/contacts'
|
9
|
+
|
1
10
|
module DataComApi
|
11
|
+
|
2
12
|
class Client
|
13
|
+
include HTTParty
|
14
|
+
base_uri 'https://www.jigsaw.com'
|
15
|
+
|
16
|
+
ENV_NAME_TOKEN = 'DATA_COM_TOKEN'.freeze
|
17
|
+
TIME_ZONE = 'Pacific Time (US & Canada)'.freeze
|
18
|
+
BASE_OFFSET = 0
|
19
|
+
BASE_PAGE_SIZE = 50
|
20
|
+
SIZE_ONLY_PAGE_SIZE = 0
|
21
|
+
# We start at 1, 0 is a special case
|
22
|
+
MIN_PAGE_SIZE = 1
|
23
|
+
MAX_PAGE_SIZE = 100
|
24
|
+
MAX_OFFSET = 100_000
|
25
|
+
|
26
|
+
attr_reader :api_calls_count
|
27
|
+
attr_reader :token
|
28
|
+
|
29
|
+
def max_offset
|
30
|
+
MAX_OFFSET
|
31
|
+
end
|
32
|
+
|
33
|
+
def size_only_page_size
|
34
|
+
SIZE_ONLY_PAGE_SIZE
|
35
|
+
end
|
36
|
+
|
37
|
+
def initialize(api_token=nil)
|
38
|
+
@token = api_token || ENV[ENV_NAME_TOKEN]
|
39
|
+
@page_size = BASE_PAGE_SIZE
|
40
|
+
@api_calls_count = 0
|
41
|
+
|
42
|
+
raise TokenFailError, 'No token set!' unless @token
|
43
|
+
end
|
44
|
+
|
45
|
+
def page_size
|
46
|
+
@page_size
|
47
|
+
end
|
48
|
+
|
49
|
+
# Page size = 0 returns objects count only (small request)
|
50
|
+
def page_size=(value)
|
51
|
+
real_value = value.to_i
|
52
|
+
|
53
|
+
if real_value < MIN_PAGE_SIZE || real_value > MAX_PAGE_SIZE
|
54
|
+
raise ParamError, <<-eos
|
55
|
+
page_size must be between #{ MIN_PAGE_SIZE } and #{ MAX_PAGE_SIZE },
|
56
|
+
received #{ real_value }"
|
57
|
+
eos
|
58
|
+
end
|
59
|
+
|
60
|
+
@page_size = real_value
|
61
|
+
end
|
62
|
+
|
63
|
+
def search_contact(options={})
|
64
|
+
Responses::SearchContact.new(self, options)
|
65
|
+
end
|
66
|
+
|
67
|
+
def company_contact_count(company_id, options={})
|
68
|
+
Responses::CompanyContactCount.new(self, company_id, options)
|
69
|
+
end
|
70
|
+
|
71
|
+
def contacts(contact_ids, username, password, purchase_flag=false)
|
72
|
+
Responses::Contacts.new(
|
73
|
+
self,
|
74
|
+
contact_ids,
|
75
|
+
username,
|
76
|
+
password,
|
77
|
+
purchase_flag
|
78
|
+
)
|
79
|
+
end
|
80
|
+
|
81
|
+
# Raw calls
|
82
|
+
|
83
|
+
def company_contact_count_raw(company_id, include_graveyard)
|
84
|
+
params = QueryParameters.new(
|
85
|
+
token: token,
|
86
|
+
company_id: company_id,
|
87
|
+
include_graveyard: include_graveyard
|
88
|
+
)
|
89
|
+
|
90
|
+
response = self.class.get(
|
91
|
+
ApiURI.company_contact_count(company_id),
|
92
|
+
{ query: params }
|
93
|
+
)
|
94
|
+
increase_api_calls_count!
|
95
|
+
|
96
|
+
response.body
|
97
|
+
end
|
98
|
+
|
99
|
+
def search_contact_raw(options={})
|
100
|
+
response = self.class.get(
|
101
|
+
ApiURI.search_contact,
|
102
|
+
generate_params(options)
|
103
|
+
)
|
104
|
+
increase_api_calls_count!
|
105
|
+
|
106
|
+
response.body
|
107
|
+
end
|
108
|
+
|
109
|
+
def search_company_raw(options={})
|
110
|
+
response = self.class.get(
|
111
|
+
ApiURI.search_company,
|
112
|
+
generate_params(options)
|
113
|
+
)
|
114
|
+
increase_api_calls_count!
|
115
|
+
|
116
|
+
response.body
|
117
|
+
end
|
118
|
+
|
119
|
+
def contacts_raw(contact_ids, username, password, purchase_flag=false)
|
120
|
+
raise ParamError, 'One contact required at least' unless contact_ids.size > 0
|
121
|
+
|
122
|
+
params = QueryParameters.new(
|
123
|
+
token: token,
|
124
|
+
username: username,
|
125
|
+
password: password,
|
126
|
+
purchase_flag: purchase_flag
|
127
|
+
)
|
128
|
+
|
129
|
+
response = self.class.get(
|
130
|
+
ApiURI.contacts(contact_ids),
|
131
|
+
{ query: params }
|
132
|
+
)
|
133
|
+
increase_api_calls_count!
|
134
|
+
|
135
|
+
response.body
|
136
|
+
end
|
137
|
+
|
138
|
+
def partner_contacts_raw(contact_ids, end_org_id, end_user_id)
|
139
|
+
raise ParamError, 'One contact required at least' unless contact_ids.size > 0
|
140
|
+
|
141
|
+
params = QueryParameters.new(
|
142
|
+
token: token,
|
143
|
+
end_org_id: end_org_id,
|
144
|
+
end_user_id: end_user_id
|
145
|
+
)
|
146
|
+
|
147
|
+
response = self.class.get(
|
148
|
+
ApiURI.partner_contacts(contact_ids),
|
149
|
+
{ query: params }
|
150
|
+
)
|
151
|
+
increase_api_calls_count!
|
152
|
+
|
153
|
+
response.body
|
154
|
+
end
|
155
|
+
|
156
|
+
def partner_raw
|
157
|
+
params = QueryParameters.new(token: token)
|
158
|
+
|
159
|
+
response = self.class.get(
|
160
|
+
ApiURI.partner,
|
161
|
+
{ query: params }
|
162
|
+
)
|
163
|
+
increase_api_calls_count!
|
164
|
+
|
165
|
+
response.body
|
166
|
+
end
|
167
|
+
|
168
|
+
def user_raw(username, password)
|
169
|
+
params = QueryParameters.new(
|
170
|
+
username: username,
|
171
|
+
password: password,
|
172
|
+
token: token
|
173
|
+
)
|
174
|
+
|
175
|
+
response = self.class.get(
|
176
|
+
ApiURI.user,
|
177
|
+
{ query: params }
|
178
|
+
)
|
179
|
+
increase_api_calls_count!
|
180
|
+
|
181
|
+
response.body
|
182
|
+
end
|
183
|
+
|
184
|
+
# JSON calls
|
185
|
+
|
186
|
+
def company_contact_count_raw_json(company_id, include_graveyard)
|
187
|
+
json_or_raise company_contact_count_raw(company_id, include_graveyard)
|
188
|
+
end
|
189
|
+
|
190
|
+
def search_contact_raw_json(options={})
|
191
|
+
json_or_raise search_contact_raw(options)
|
192
|
+
end
|
193
|
+
|
194
|
+
def search_company_raw_json(options={})
|
195
|
+
json_or_raise search_company_raw(options)
|
196
|
+
end
|
197
|
+
|
198
|
+
def contacts_raw_json(contact_ids, username, password, purchase_flag=false)
|
199
|
+
json_or_raise contacts_raw(
|
200
|
+
contact_ids,
|
201
|
+
username,
|
202
|
+
password,
|
203
|
+
purchase_flag
|
204
|
+
)
|
205
|
+
end
|
206
|
+
|
207
|
+
def partner_contacts_raw_json(contact_ids, end_org_id, end_user_id)
|
208
|
+
json_or_raise partner_contacts_raw(
|
209
|
+
contact_ids,
|
210
|
+
end_org_id,
|
211
|
+
end_user_id
|
212
|
+
)
|
213
|
+
end
|
214
|
+
|
215
|
+
def partner_raw_json
|
216
|
+
json_or_raise partner_raw
|
217
|
+
end
|
218
|
+
|
219
|
+
def user_raw_json(username, password)
|
220
|
+
json_or_raise user_raw(username, password)
|
221
|
+
end
|
222
|
+
|
223
|
+
private
|
224
|
+
|
225
|
+
def json_or_raise(json_str)
|
226
|
+
json = JSON.parse(json_str)
|
227
|
+
|
228
|
+
if json.kind_of? Array
|
229
|
+
error = json.first
|
230
|
+
raise Error.from_code(error['errorCode']).new(error['errorMsg'])
|
231
|
+
end
|
232
|
+
|
233
|
+
json
|
234
|
+
end
|
235
|
+
|
236
|
+
def generate_params(options)
|
237
|
+
params = QueryParameters.new(options)
|
238
|
+
params.offset = BASE_OFFSET unless params.offset
|
239
|
+
params.page_size = page_size unless params.pageSize
|
240
|
+
params.token = token
|
241
|
+
|
242
|
+
{ query: params }
|
243
|
+
end
|
244
|
+
|
245
|
+
def increase_api_calls_count!
|
246
|
+
@api_calls_count += 1
|
247
|
+
end
|
248
|
+
|
3
249
|
end
|
250
|
+
|
4
251
|
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'hashie'
|
2
|
+
|
3
|
+
module DataComApi
|
4
|
+
class Company < Hashie::Trash
|
5
|
+
property :id, from: :companyId
|
6
|
+
property :zip
|
7
|
+
property :address
|
8
|
+
property :name
|
9
|
+
property :active_contacts, from: :activeContacts
|
10
|
+
property :state
|
11
|
+
property :graveyarded
|
12
|
+
property :city
|
13
|
+
property :country
|
14
|
+
|
15
|
+
alias_method :graveyarded?, :graveyarded
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'hashie'
|
2
|
+
require 'active_support/time'
|
3
|
+
|
4
|
+
module DataComApi
|
5
|
+
class Contact < Hashie::Trash
|
6
|
+
property :id, from: :contactId
|
7
|
+
property :zip
|
8
|
+
property :phone
|
9
|
+
property :area_code, from: :areaCode
|
10
|
+
property :updated_at, from: :updatedDate, with: ->(v) { Time.parse(v.to_s).utc }
|
11
|
+
property :seo_contact_url, from: :seoContactURL
|
12
|
+
property :state
|
13
|
+
property :first_name, from: :firstname
|
14
|
+
property :last_name, from: :lastname
|
15
|
+
property :company_name, from: :companyName
|
16
|
+
property :contact_url, from: :contactURL
|
17
|
+
property :contact_sales, from: :contactSales
|
18
|
+
property :country
|
19
|
+
property :owned
|
20
|
+
property :city
|
21
|
+
property :title
|
22
|
+
property :email
|
23
|
+
property :address
|
24
|
+
property :graveyard_status, from: :graveyardStatus
|
25
|
+
property :owned_type, from: :ownedType
|
26
|
+
property :company_id, from: :companyId
|
27
|
+
|
28
|
+
alias_method :graveyarded, :graveyard_status
|
29
|
+
alias_method :graveyarded?, :graveyarded
|
30
|
+
alias_method :owned?, :owned
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,96 @@
|
|
1
|
+
require 'active_support/core_ext/hash/reverse_merge'
|
2
|
+
|
3
|
+
module DataComApi
|
4
|
+
|
5
|
+
class Error < StandardError
|
6
|
+
|
7
|
+
API_HTTP_STATUS_CODE = 0
|
8
|
+
API_ERROR_CODE = 'no error code provided'
|
9
|
+
|
10
|
+
attr_reader :http_status_code
|
11
|
+
attr_reader :api_stack_trace
|
12
|
+
attr_reader :error_code
|
13
|
+
|
14
|
+
def initialize(msg=nil, options={})
|
15
|
+
options = options.reverse_merge({
|
16
|
+
http_status_code: nil,
|
17
|
+
api_stack_trace: nil,
|
18
|
+
error_code: nil
|
19
|
+
})
|
20
|
+
|
21
|
+
@http_status_code ||= options[:http_status_code] || self.class::API_HTTP_STATUS_CODE
|
22
|
+
@api_stack_trace ||= options[:api_stack_trace]
|
23
|
+
@error_code ||= options[:error_code] || self.class::API_ERROR_CODE
|
24
|
+
|
25
|
+
super(msg)
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.from_code(error_code_str)
|
29
|
+
case error_code_str
|
30
|
+
when ParamError::API_ERROR_CODE then ParamError
|
31
|
+
when LoginFailError::API_ERROR_CODE then LoginFailError
|
32
|
+
when TokenFailError::API_ERROR_CODE then TokenFailError
|
33
|
+
when PurchaseLowPointsError::API_ERROR_CODE then PurchaseLowPointsError
|
34
|
+
when ContactNotExistError::API_ERROR_CODE then ContactNotExistError
|
35
|
+
when ContactNotOwnedError::API_ERROR_CODE then ContactNotOwnedError
|
36
|
+
when SearchError::API_ERROR_CODE then SearchError
|
37
|
+
when SysError::API_ERROR_CODE then SysError
|
38
|
+
when NotImplementedError::API_ERROR_CODE then NotImplementedError
|
39
|
+
when NotAvailableError::API_ERROR_CODE then NotAvailableError
|
40
|
+
else Error
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
|
46
|
+
class ParamError < Error
|
47
|
+
API_HTTP_STATUS_CODE = 400
|
48
|
+
API_ERROR_CODE = 'PARAM_ERROR'.freeze
|
49
|
+
end
|
50
|
+
|
51
|
+
class LoginFailError < Error
|
52
|
+
API_HTTP_STATUS_CODE = 403
|
53
|
+
API_ERROR_CODE = 'LOGIN_FAIL'.freeze
|
54
|
+
end
|
55
|
+
|
56
|
+
class TokenFailError < Error
|
57
|
+
API_HTTP_STATUS_CODE = 403
|
58
|
+
API_ERROR_CODE = 'TOKEN_FAIL'.freeze
|
59
|
+
end
|
60
|
+
|
61
|
+
class PurchaseLowPointsError < Error
|
62
|
+
API_HTTP_STATUS_CODE = 405
|
63
|
+
API_ERROR_CODE = 'PURCHASE_LOW_POINTS'.freeze
|
64
|
+
end
|
65
|
+
|
66
|
+
class ContactNotExistError < Error
|
67
|
+
API_HTTP_STATUS_CODE = 404
|
68
|
+
API_ERROR_CODE = 'CONTACT_NOT_EXIST'.freeze
|
69
|
+
end
|
70
|
+
|
71
|
+
class ContactNotOwnedError < Error
|
72
|
+
API_HTTP_STATUS_CODE = 405
|
73
|
+
API_ERROR_CODE = 'CONTACT_NOT_OWNED'.freeze
|
74
|
+
end
|
75
|
+
|
76
|
+
class SearchError < Error
|
77
|
+
API_HTTP_STATUS_CODE = 500
|
78
|
+
API_ERROR_CODE = 'SEARCH_ERROR'.freeze
|
79
|
+
end
|
80
|
+
|
81
|
+
class SysError < Error
|
82
|
+
API_HTTP_STATUS_CODE = 500
|
83
|
+
API_ERROR_CODE = 'SYS_ERROR'.freeze
|
84
|
+
end
|
85
|
+
|
86
|
+
class NotImplementedError < Error
|
87
|
+
API_HTTP_STATUS_CODE = 501
|
88
|
+
API_ERROR_CODE = 'NOT_IMPLEMENTED'.freeze
|
89
|
+
end
|
90
|
+
|
91
|
+
class NotAvailableError < Error
|
92
|
+
API_HTTP_STATUS_CODE = 503
|
93
|
+
API_ERROR_CODE = 'NOT_AVAILABLE'.freeze
|
94
|
+
end
|
95
|
+
|
96
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
require 'hashie'
|
2
|
+
require 'active_support/time'
|
3
|
+
|
4
|
+
module DataComApi
|
5
|
+
class QueryParameters < Hashie::Trash
|
6
|
+
UNALLOWED_FIELDS = [
|
7
|
+
:offset,
|
8
|
+
:pageSize,
|
9
|
+
:page_size,
|
10
|
+
:username,
|
11
|
+
:password,
|
12
|
+
:token
|
13
|
+
].freeze
|
14
|
+
|
15
|
+
property :companyId, from: :company_id
|
16
|
+
property :updatedSince, from: :updated_since, with: ->(v) do
|
17
|
+
Time.parse(v).utc.in_time_zone(Client::TIME_ZONE)
|
18
|
+
end
|
19
|
+
property :title
|
20
|
+
property :companyName, from: :company_name
|
21
|
+
property :name
|
22
|
+
property :lastname
|
23
|
+
property :firstname
|
24
|
+
property :email
|
25
|
+
property :levels
|
26
|
+
property :departments
|
27
|
+
property :country
|
28
|
+
property :state
|
29
|
+
property :metroArea, from: :metro_area
|
30
|
+
property :areaCode, from: :area_code
|
31
|
+
property :zipCode, from: :zip_code
|
32
|
+
property :industry
|
33
|
+
property :subIndustry, from: :sub_industry
|
34
|
+
property :employees
|
35
|
+
property :revenue
|
36
|
+
property :ownership
|
37
|
+
property :websiteType, from: :website_type
|
38
|
+
property :fortuneRank, from: :fortune_rank
|
39
|
+
property :includeGraveyard, from: :include_graveyard
|
40
|
+
property :order
|
41
|
+
property :orderBy, from: :order_by
|
42
|
+
property :purchaseFlag, from: :purchase_flag
|
43
|
+
property :endOrgId, from: :end_org_id
|
44
|
+
property :endUserId, from: :end_user_id
|
45
|
+
|
46
|
+
# Special params, used to inject into query, set only through gem
|
47
|
+
property :offset
|
48
|
+
property :pageSize, from: :page_size
|
49
|
+
property :username
|
50
|
+
property :password
|
51
|
+
property :token
|
52
|
+
|
53
|
+
# Destructively convert all values using into strings
|
54
|
+
def self.stringify_hash_values(hash)
|
55
|
+
hash.each_pair do |key, value|
|
56
|
+
hash[key] = value.to_s
|
57
|
+
end
|
58
|
+
hash
|
59
|
+
end
|
60
|
+
|
61
|
+
def to_hash
|
62
|
+
self.class.stringify_hash_values(super)
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
66
|
+
end
|