affiliate_window 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 879c6696972ede3c678d902070ada3515332070a
4
+ data.tar.gz: 99fdd2cc8dcbc40799a681eb1dbe33e981c95e02
5
+ SHA512:
6
+ metadata.gz: add29aba090cd27d2cb35652d4b8236c425538a84029b9008d9d34d9e5fd0fb4952b7ae62cce4b406469f3f4ebbb6ebc47a3d8efcd4fc44a30371f316d38c414
7
+ data.tar.gz: 20b094621c3c50d30c623ac5f1f24891b7f3139e9dd42bdea3bc77d85adc7578b4b50feae194dacd53ce7f888d8dacfee32054991f4f2584c8606a8b7c95f77b
@@ -0,0 +1,67 @@
1
+ ## Affiliate Window
2
+
3
+ This gem lets you make requests to Affiliate Window's Publisher Service API.
4
+ At the time of writing, it is on version 6. The API is documented
5
+ [here](http://wiki.affiliatewindow.com/index.php/Publisher_Service_API).
6
+
7
+ There is [an existing gem](https://github.com/andyt/affiliate-window) for
8
+ communicating with Affiliate Window but it looks to be unsupported and doesn't
9
+ work with its Publisher Service API.
10
+
11
+ ## Usage
12
+
13
+ ```ruby
14
+ client = AffiliateWindow.login(
15
+ account_id: 1234,
16
+ affiliate_api_password: "your api key",
17
+ )
18
+
19
+ response = client.get_transaction_list(
20
+ start_date: "2006-08-04T00:00:00",
21
+ end_date: "2006-08-14T23:59:59",
22
+ date_type: "transaction",
23
+ )
24
+
25
+ response.dig(:results, :transaction, 0)
26
+ #=> {
27
+ # i_id: "1",
28
+ # s_status: "confirmed",
29
+ # b_paid: true,
30
+ # m_sale_amount: {
31
+ # d_amount: "50.00",
32
+ # s_currency: "GBP"
33
+ # },
34
+ # ...
35
+ ```
36
+
37
+ The gem follows the convention that all API methods are called by their
38
+ snake case name. Parameter names mirror the API, for example:
39
+
40
+ ```
41
+ iMerchantId -> merchant_id
42
+ aTransactionIds -> transaction_ids
43
+ aStatus -> status
44
+ ```
45
+
46
+ If the endpoint returns metadata about how many records were returned, this is
47
+ returned in the `pagination` key of the output, e.g.
48
+
49
+ ```ruby
50
+ response
51
+ #=> {
52
+ # pagination: {
53
+ # i_rows_returned: "10",
54
+ # i_rows_available: "50"
55
+ # }
56
+ ```
57
+
58
+ ## Debugging
59
+
60
+ You can print the SOAP request bodies by enabling debug mode:
61
+
62
+ ```ruby
63
+ client.debug = true
64
+ client.get_merchant_list
65
+ # <?xml version='1.0' encoding='UTF-8'?>
66
+ # ...
67
+ ```
@@ -0,0 +1,7 @@
1
+ require "savon"
2
+ require "rexml/document"
3
+
4
+ require "affiliate_window/base"
5
+ require "affiliate_window/client"
6
+ require "affiliate_window/error_handler"
7
+ require "affiliate_window/parser"
@@ -0,0 +1,132 @@
1
+ # For full API documentation, refer to:
2
+ # http://wiki.affiliatewindow.com/index.php/Publisher_Service_API
3
+
4
+ class AffiliateWindow
5
+ attr_accessor :client, :error_handler, :parser, :debug
6
+
7
+ def self.login(account_id:, affiliate_api_password:)
8
+ client = Client.new(
9
+ account_id: account_id,
10
+ affiliate_api_password: affiliate_api_password,
11
+ )
12
+
13
+ new(client: client)
14
+ end
15
+
16
+ def initialize(client:, error_handler: ErrorHandler, parser: Parser)
17
+ self.client = client
18
+ self.error_handler = error_handler
19
+ self.parser = parser
20
+ end
21
+
22
+ # Gets the commission values for a given commission group and advertiser
23
+ # http://wiki.affiliatewindow.com/index.php/AS:getCommissionGroup
24
+ def get_commission_group(merchant_id:, commission_group_code:)
25
+ call(
26
+ :get_commission_group,
27
+ iMerchantId: merchant_id,
28
+ sCommissionGroupCode: commission_group_code,
29
+ )
30
+ end
31
+
32
+ # Gets an array of commission groups for an advertiser
33
+ # http://wiki.affiliatewindow.com/index.php/AS:getCommissionGroupList
34
+ def get_commission_group_list(merchant_id:)
35
+ call(:get_commission_group_list, iMerchantId: merchant_id)
36
+ end
37
+
38
+ # Gets products for the specified transaction # http://wiki.affiliatewindow.com/index.php/AS:getTransactionProduct
39
+ def get_transaction_product(transaction_ids:)
40
+ call(:get_transaction_product, aTransactionIds: transaction_ids)
41
+ end
42
+
43
+ # Gets the transactions that fall under the specified criteria
44
+ # http://wiki.affiliatewindow.com/index.php/AS:getTransactionList
45
+ def get_transaction_list(merchant_ids: nil, start_date:, end_date:, date_type:, transaction_status: nil, limit: nil, offset: nil)
46
+ call(
47
+ :get_transaction_list,
48
+ aMerchantIds: merchant_ids,
49
+ dStartDate: start_date,
50
+ dEndDate: end_date,
51
+ sDateType: date_type,
52
+ sTransactionStatus: transaction_status,
53
+ iLimit: limit,
54
+ iOffset: offset,
55
+ )
56
+ end
57
+
58
+ # Gets the requested transactions
59
+ # http://wiki.affiliatewindow.com/index.php/AS:getTransaction
60
+ def get_transaction(transaction_ids:)
61
+ call(:get_transaction, aTransactionIds: transaction_ids)
62
+ end
63
+
64
+ # Gets the requested advertisers
65
+ # http://wiki.affiliatewindow.com/index.php/AS:getMerchant
66
+ def get_merchant(merchant_ids:)
67
+ call(:get_merchant, aMerchantIds: merchant_ids)
68
+ end
69
+
70
+ # Gets the advertisers that fall under the specified criteria
71
+ # http://wiki.affiliatewindow.com/index.php/AS:getMerchantList
72
+ def get_merchant_list(relationship: nil)
73
+ call(:get_merchant_list, sRelationship: relationship)
74
+ end
75
+
76
+ # Gets the requested transaction queries
77
+ # http://wiki.affiliatewindow.com/index.php/AS:getTransactionQuerys
78
+ def get_transaction_queries(merchant_ids: nil, status: nil, click_refs:, offset: nil, limit: nil)
79
+ call(
80
+ :get_transaction_queries,
81
+ aMerchantIds: merchant_ids,
82
+ aStatus: status,
83
+ aClickRefs: click_refs,
84
+ iOffset: offset,
85
+ iLimit: limit,
86
+ )
87
+ end
88
+
89
+ # Gets the requested link click stats
90
+ # http://wiki.affiliatewindow.com/index.php/AS:getClickStats
91
+ def get_click_stats(start_date:, end_date:, merchant_ids: nil, date_type:, offset: nil, limit: nil)
92
+ call(
93
+ :get_click_stats,
94
+ dStartDate: start_date,
95
+ dEndDate: end_date,
96
+ aMerchantIds: merchant_ids,
97
+ sDateType: date_type,
98
+ iOffset: offset,
99
+ iLimit: limit,
100
+ )
101
+ end
102
+
103
+ # Gets the requested link impression stats
104
+ # http://wiki.affiliatewindow.com/index.php/AS:getImpressionStats
105
+ def get_impression_stats(start_date:, end_date:, merchant_ids: nil, date_type:, offset: nil, limit: nil)
106
+ call(
107
+ :get_impression_stats,
108
+ dStartDate: start_date,
109
+ dEndDate: end_date,
110
+ aMerchantIds: merchant_ids,
111
+ sDateType: date_type,
112
+ iOffset: offset,
113
+ iLimit: limit,
114
+ )
115
+ end
116
+
117
+ private
118
+
119
+ def call(method, params)
120
+ params = remove_nils(params)
121
+
122
+ response = error_handler.handle do
123
+ client.call(method, params, debug)
124
+ end
125
+
126
+ parser.parse(response, method)
127
+ end
128
+
129
+ def remove_nils(params)
130
+ params.reject { |_, value| value.nil? }
131
+ end
132
+ end
@@ -0,0 +1,43 @@
1
+ class AffiliateWindow
2
+ class Client
3
+ def initialize(account_id:, affiliate_api_password:)
4
+ self.savon_client = Savon.client(
5
+ wsdl: "http://api.affiliatewindow.com/v6/AffiliateService?wsdl",
6
+ namespace: "http://api.affiliatewindow.com/",
7
+ soap_header: {
8
+ "api:UserAuthentication" => {
9
+ "api:iId" => account_id.to_s,
10
+ "api:sPassword" => affiliate_api_password,
11
+ "api:sType" => "affiliate",
12
+ },
13
+ },
14
+ )
15
+ end
16
+
17
+ def call(method, params, debug = false)
18
+ params = convert_to_soap_arrays(params)
19
+
20
+ print_request(method, params) if debug
21
+ savon_client.call(method, message: params)
22
+ end
23
+
24
+ def print_request(method, params)
25
+ request = savon_client.build_request(method, message: params)
26
+ document = REXML::Document.new(request.body)
27
+
28
+ formatter = REXML::Formatters::Pretty.new
29
+ formatter.write(document, $stdout)
30
+ end
31
+
32
+ private
33
+
34
+ def convert_to_soap_arrays(params)
35
+ params.each.with_object({}) do |(key, value), hash|
36
+ value = value.is_a?(Array) ? { int: value } : value
37
+ hash.merge!(key => value)
38
+ end
39
+ end
40
+
41
+ attr_accessor :savon_client
42
+ end
43
+ end
@@ -0,0 +1,13 @@
1
+ class AffiliateWindow
2
+ module ErrorHandler
3
+ def self.handle(&block)
4
+ begin
5
+ block.call
6
+ rescue Savon::Error => e
7
+ raise Error, e.message
8
+ end
9
+ end
10
+ end
11
+
12
+ class Error < StandardError; end
13
+ end
@@ -0,0 +1,17 @@
1
+ class AffiliateWindow
2
+ module Parser
3
+ def self.parse(response, method)
4
+ body = response.body
5
+ root = body.fetch(:"#{method}_response")
6
+
7
+ results = root.fetch(:"#{method}_return")
8
+ pagination = root.fetch(:"#{method}_count_return", nil)
9
+
10
+ if pagination
11
+ { pagination: pagination, results: results }
12
+ else
13
+ results
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,3 @@
1
+ class AffiliateWindow
2
+ VERSION = "0.0.1"
3
+ end
metadata ADDED
@@ -0,0 +1,134 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: affiliate_window
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Reevoo Developers
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-09-21 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: savon
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2.11'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '2.11'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rspec
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '3.5'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '3.5'
41
+ - !ruby/object:Gem::Dependency
42
+ name: pry
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '0.10'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '0.10'
55
+ - !ruby/object:Gem::Dependency
56
+ name: vcr
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '3.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '3.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: webmock
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '2.1'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '2.1'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rake
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '11.3'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '11.3'
97
+ description: A gem for communicating with Affiliate Window's Publisher Service API.
98
+ email: developers@reevoo.com
99
+ executables: []
100
+ extensions: []
101
+ extra_rdoc_files: []
102
+ files:
103
+ - README.md
104
+ - lib/affiliate_window.rb
105
+ - lib/affiliate_window/base.rb
106
+ - lib/affiliate_window/client.rb
107
+ - lib/affiliate_window/error_handler.rb
108
+ - lib/affiliate_window/parser.rb
109
+ - lib/affiliate_window/version.rb
110
+ homepage: https://github.com/reevoo/affiliate_window
111
+ licenses:
112
+ - MIT
113
+ metadata: {}
114
+ post_install_message:
115
+ rdoc_options: []
116
+ require_paths:
117
+ - lib
118
+ required_ruby_version: !ruby/object:Gem::Requirement
119
+ requirements:
120
+ - - ">="
121
+ - !ruby/object:Gem::Version
122
+ version: '0'
123
+ required_rubygems_version: !ruby/object:Gem::Requirement
124
+ requirements:
125
+ - - ">="
126
+ - !ruby/object:Gem::Version
127
+ version: '0'
128
+ requirements: []
129
+ rubyforge_project:
130
+ rubygems_version: 2.5.1
131
+ signing_key:
132
+ specification_version: 4
133
+ summary: 'Affiliate Window: Publisher Service API'
134
+ test_files: []