stream-ruby 2.10.0 → 4.0.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c46f30b8b5b9225d17473b0f6d40dc62e8ef622a060dfd5bf89725878f5c131d
4
- data.tar.gz: ee771c68ca17e54afa507590dc57b19a11ae87623b7a83909f596aee2a607137
3
+ metadata.gz: 31aab2710cc563a2d15372a93ef3c7247525e3579a0fc3208f08986cbdab50ba
4
+ data.tar.gz: 6d6c543c663e877798aad76d4af12c8b6c6db23bdbaa3fda050418bf460ff191
5
5
  SHA512:
6
- metadata.gz: 6a976e51b5f9b88b9c436ebb528a721c7b1e316e36815710ec981bf6ccc0149ec7e8dabef2594ecd9ca986c4e9e52e018a88a0b7b793497a8d49b0d816277879
7
- data.tar.gz: c348cafe7287e8b3e97b7d1404405793a99b7737056f1eee7e12b13201a75698547e5fb150dc2c213ccac65e871ecfc51eb548c2af04135cd5599619fbb839ec
6
+ metadata.gz: 5ee20ef5160fa068b869c4eace00310bcae8d7fc15e2730c01312015060b533deb68be4d944ada943042d7a2d84e3c83564599df76b2edb5f954db124bd81ca6
7
+ data.tar.gz: 814193cfdcd06a7376303fea24ce59c8881d914893e4fd336a85b093f757de642fd268c146112ff2cedd65185aef3e389757a9a10aec9a83493ea4f1c3f32ca6
data/README.md CHANGED
@@ -1,5 +1,4 @@
1
- stream-ruby
2
- ===========
1
+ # stream-ruby
3
2
 
4
3
  [![Build Status](https://travis-ci.org/GetStream/stream-ruby.svg?branch=master)](https://travis-ci.org/GetStream/stream-ruby) [![Gem Version](https://badge.fury.io/rb/stream-ruby.svg)](http://badge.fury.io/rb/stream-ruby)
5
4
 
@@ -11,19 +10,14 @@ You can sign up for a Stream account at https://getstream.io/get_started.
11
10
 
12
11
  #### Ruby version requirements and support
13
12
 
14
- This API Client project requires Ruby 2.2.8 at a minimum. We will support the following versions:
15
- - 2.2.8
16
- - 2.3.1
17
- - 2.3.5
18
- - 2.4.2
19
- - 2.5.1
13
+ This API Client project requires Ruby 2.5.x at a minimum.
20
14
 
21
15
  See the [Travis configuration](.travis.yml) for details of how it is built and tested.
22
16
 
23
17
  ### Installation
24
18
 
25
19
  ```bash
26
- gem install "stream-ruby"
20
+ gem install 'stream-ruby'
27
21
  ```
28
22
 
29
23
  ### Full documentation
@@ -35,30 +29,43 @@ Documentation for this Ruby client are available at the [Stream website](https:/
35
29
  ```ruby
36
30
  # Instantiate a new client to connect to us east API endpoint
37
31
  require 'stream'
38
- client = Stream::Client.new('YOUR_API_KEY', 'API_KEY_SECRET', 'APP_ID', :location => 'us-east')
32
+ client = Stream::Client.new('YOUR_API_KEY', 'API_KEY_SECRET', 'APP_ID', location: 'us-east')
33
+
39
34
  # Find your API keys here https://getstream.io/dashboard/
40
35
 
41
36
  # Instantiate a feed object
42
37
  user_feed_1 = client.feed('user', '1')
43
38
 
44
39
  # Get activities from 5 to 10 (slow pagination)
45
- result = user_feed_1.get(:limit=>5, :offset=>5)
40
+ result = user_feed_1.get(limit: 5, offset: 5)
46
41
  # (Recommended & faster) Filter on an id less than the given UUID
47
- result = user_feed_1.get(:limit=>5, :id_lt=>'e561de8f-00f1-11e4-b400-0cc47a024be0')
42
+ result =
43
+ user_feed_1.get(limit: 5, id_lt: 'e561de8f-00f1-11e4-b400-0cc47a024be0')
48
44
 
49
45
  # Create a new activity
50
- activity_data = {:actor => 1, :verb => 'tweet', :object => 1, :foreign_id => 'tweet:1'}
46
+ activity_data = { actor: 1, verb: 'tweet', object: 1, foreign_id: 'tweet:1' }
51
47
  activity_response = user_feed_1.add_activity(activity_data)
52
48
  # Create a bit more complex activity
53
- activity_data = {:actor => 1, :verb => 'tweet', :object => 1, :foreign_id => 'tweet:1',
54
- :course => {:name => 'Golden Gate park', :distance => 10},
55
- :participants => ['Thierry', 'Tommaso'],
56
- :started_at => DateTime.now()
49
+ activity_data = {
50
+ actor: 1,
51
+ verb: 'tweet',
52
+ object: 1,
53
+ foreign_id: 'tweet:1',
54
+ course: { name: 'Golden Gate park', distance: 10 },
55
+ participants: %w[Thierry Tommaso],
56
+ started_at: DateTime.now
57
57
  }
58
58
  activity_response = user_feed_1.add_activity(activity_data)
59
59
 
60
60
  # Update an existing activity (requires both :foreign_id and :time fields)
61
- activity_data = {:actor => 1, :verb => 'tweet', :object => 1, :foreign_id => 'tweet:1', :popularity => 100, :time => '2016-05-13T16:12:30'}
61
+ activity_data = {
62
+ actor: 1,
63
+ verb: 'tweet',
64
+ object: 1,
65
+ foreign_id: 'tweet:1',
66
+ popularity: 100,
67
+ time: '2016-05-13T16:12:30'
68
+ }
62
69
  client.update_activity(activity_data)
63
70
 
64
71
  # Update activities
@@ -68,7 +75,7 @@ client.update_activities([activity_data])
68
75
  user_feed_1.remove_activity('e561de8f-00f1-11e4-b400-0cc47a024be0')
69
76
 
70
77
  # Remove activities by their foreign_id
71
- user_feed_1.remove_activity('tweet:1', foreign_id=true)
78
+ user_feed_1.remove_activity('tweet:1', foreign_id: true)
72
79
 
73
80
  # Follow another feed
74
81
  user_feed_1.follow('flat', '42')
@@ -78,62 +85,45 @@ user_feed_1.unfollow('flat', '42')
78
85
 
79
86
  # Batch adding activities
80
87
  activities = [
81
- [:actor => '1', :verb => 'tweet', :object => '1'],
82
- [:actor => '2', :verb => 'like', :object => '3']
88
+ [actor: '1', verb: 'tweet', object: '1'],
89
+ [actor: '2', verb: 'like', object: '3']
83
90
  ]
84
91
  user_feed_1.add_activities(activities)
85
92
 
86
93
  # Batch following many feeds (requires ruby 2.1 or later)
87
94
  follows = [
88
- {:source => 'flat:1', :target => 'user:1'},
89
- {:source => 'flat:1', :target => 'user:2'},
90
- {:source => 'flat:1', :target => 'user:3'},
95
+ { source: 'flat:1', target: 'user:1' },
96
+ { source: 'flat:1', target: 'user:2' },
97
+ { source: 'flat:1', target: 'user:3' }
91
98
  ]
92
99
  client.follow_many(follows)
93
100
 
94
101
  # Add an activity and push it to other feeds too using the `to` field
95
- data = [
96
- :actor_id => '1',
97
- :verb => 'like',
98
- :object_id => '3',
99
- :to => %w(user:44 user:45)
100
- ]
102
+ data = [actor_id: '1', verb: 'like', object_id: '3', to: %w[user:44 user:45]]
101
103
  user_feed_1.add_activity(data)
102
104
 
103
- # Remove a feed and its content
104
- user_feed_1.delete
105
-
106
105
  # Updating parts of an activity
107
106
  set = {
108
- 'product.price': 19.99,
109
- 'shares': {
110
- 'facebook': '...',
111
- 'twitter': '...'
112
- },
107
+ 'product.price': 19.99, 'shares': { 'facebook': '...', 'twitter': '...' }
113
108
  }
114
- unset = [
115
- 'daily_likes',
116
- 'popularity'
117
- ]
109
+ unset = %w[daily_likes popularity]
118
110
  # ...by ID
119
111
  client.activity_partial_update(
120
- id: '54a60c1e-4ee3-494b-a1e3-50c06acb5ed4',
121
- set: set,
122
- unset: unset,
112
+ id: '54a60c1e-4ee3-494b-a1e3-50c06acb5ed4', set: set, unset: unset
123
113
  )
124
114
  # ...or by combination of foreign ID and time
125
115
  client.activity_partial_update(
126
116
  foreign_id: 'product:123',
127
117
  time: '2016-11-10T13:20:00.000000',
128
118
  set: set,
129
- unset: unset,
119
+ unset: unset
130
120
  )
131
121
 
132
122
  # Generating tokens for client side usage
133
123
  token = user_feed_1.readonly_token
134
124
 
135
125
  # Javascript client side feed initialization
136
- user1 = client.feed('user', '1', '{{ token }}');
126
+ user1 = client.feed('user', '1', '{{ token }}')
137
127
 
138
128
  # Retrieve first 10 followers of a feed
139
129
  user_feed_1.followers(0, 10)
@@ -148,16 +138,21 @@ user_feed_1.following(10)
148
138
  user_feed_1.following(10, 10)
149
139
 
150
140
  # Check if user_feed_1 follows specific feeds
151
- user_feed_1.following(0, 2, filter=['user:42', 'user:43'])
141
+ user_feed_1.following(0, 2, filter = %w[user:42 user:43])
152
142
 
153
143
  # Add one activity to many feeds in one request
154
- feeds = %w(flat:1 flat:2 flat:3 flat:4)
155
- activity = {:actor => "User:2", :verb => "pin", :object => "Place:42", :target => "Board:1"}
144
+ feeds = %w[flat:1 flat:2 flat:3 flat:4]
145
+ activity = {
146
+ actor: 'User:2', verb: 'pin', object: 'Place:42', target: 'Board:1'
147
+ }
156
148
  client.add_to_many(activity, feeds)
149
+
150
+ # Retrive open graph information
151
+ client.og('https://google.com')
157
152
  ```
158
153
 
159
154
  ### Copyright and License Information
160
155
 
161
- Copyright (c) 2014-2017 Stream.io Inc, and individual contributors. All rights reserved.
156
+ Copyright (c) 2014-2020 Stream.io Inc, and individual contributors. All rights reserved.
162
157
 
163
158
  See the file "LICENSE" for information on the history of this software, terms & conditions for usage, and a DISCLAIMER OF ALL WARRANTIES.
@@ -1,6 +1,5 @@
1
1
  module Stream
2
2
  module Activities
3
-
4
3
  #
5
4
  # Get activities directly, via ID or Foreign ID + timestamp
6
5
  #
@@ -8,34 +7,33 @@ module Stream
8
7
  #
9
8
  # @return the found activities, if any.
10
9
  #
11
- # @example
12
- #
10
+ # @example Retrieve by activity IDs
11
+ # @client.get_activities(
12
+ # ids: [
13
+ # '4b39fda2-d6e2-42c9-9abf-5301ef071b12',
14
+ # '89b910d3-1ef5-44f8-914e-e7735d79e817'
15
+ # ]
16
+ # )
13
17
  #
14
- # @client.get_activities(
15
- # ids: [
16
- # '4b39fda2-d6e2-42c9-9abf-5301ef071b12',
17
- # '89b910d3-1ef5-44f8-914e-e7735d79e817'
18
- # ]
19
- # )
20
- #
21
- # @client.get_activities(
22
- # foreign_id_times: [
23
- # { foreign_id: 'post:1000', time: '2016-11-10T13:20:00.000000' },
24
- # { foreign_id: 'like:2000', time: '2018-01-07T09:15:59.123456' }
25
- # ]
26
- # )
18
+ # @example Retrieve by Foreign IDs + timestamps
19
+ # @client.get_activities(
20
+ # foreign_id_times: [
21
+ # { foreign_id: 'post:1000', time: '2016-11-10T13:20:00.000000' },
22
+ # { foreign_id: 'like:2000', time: '2018-01-07T09:15:59.123456' }
23
+ # ]
24
+ # )
27
25
  #
28
26
  def get_activities(params = {})
29
27
  if params[:foreign_id_times]
30
28
  foreign_ids = []
31
29
  timestamps = []
32
- params[:foreign_id_times].each{|e|
30
+ params[:foreign_id_times].each do |e|
33
31
  foreign_ids << e[:foreign_id]
34
32
  timestamps << e[:time]
35
- }
33
+ end
36
34
  params = {
37
35
  foreign_ids: foreign_ids,
38
- timestamps: timestamps,
36
+ timestamps: timestamps
39
37
  }
40
38
  end
41
39
  signature = Stream::Signer.create_jwt_token('activities', '*', @api_secret, '*')
@@ -43,42 +41,108 @@ module Stream
43
41
  end
44
42
 
45
43
  #
46
- # Partial update activity, via foreign ID or Foreign ID + timestamp
44
+ # Partial update activity, via activity ID or Foreign ID + timestamp
47
45
  #
48
46
  # @param [Hash<:id, :foreign_id, :time, :set, :unset>] data the request params (id and foreign_id+timestamp mutually exclusive)
49
47
  #
50
48
  # @return the updated activity.
51
49
  #
52
- # @example
53
- #
54
- # @client.activity_partial_update(
55
- # id: "4b39fda2-d6e2-42c9-9abf-5301ef071b12",
56
- # set: {
57
- # "product.price.eur": 12.99,
58
- # "colors": {
59
- # "blue": "#0000ff",
60
- # "green": "#00ff00",
61
- # }
62
- # },
63
- # unset: [ "popularity", "size.xl" ]
64
- # )
65
- #
66
- # @client.activity_partial_update(
67
- # foreign_id: 'product:123',
68
- # time: '2016-11-10T13:20:00.000000',
69
- # set: {
70
- # "product.price.eur": 12.99,
71
- # "colors": {
72
- # "blue": "#0000ff",
73
- # "green": "#00ff00",
74
- # }
75
- # },
76
- # unset: [ "popularity", "size.xl" ]
77
- # )
50
+ # @example Identify using activity ID
51
+ # @client.activity_partial_update(
52
+ # id: "4b39fda2-d6e2-42c9-9abf-5301ef071b12",
53
+ # set: {
54
+ # "product.price.eur": 12.99,
55
+ # "colors": {
56
+ # "blue": "#0000ff",
57
+ # "green": "#00ff00",
58
+ # }
59
+ # },
60
+ # unset: [ "popularity", "size.xl" ]
61
+ # )
62
+ #
63
+ # @example Identify using Foreign ID + timestamp
64
+ # @client.activity_partial_update(
65
+ # foreign_id: 'product:123',
66
+ # time: '2016-11-10T13:20:00.000000',
67
+ # set: {
68
+ # "product.price.eur": 12.99,
69
+ # "colors": {
70
+ # "blue": "#0000ff",
71
+ # "green": "#00ff00",
72
+ # }
73
+ # },
74
+ # unset: [ "popularity", "size.xl" ]
75
+ # )
76
+ #
78
77
  def activity_partial_update(data = {})
79
78
  signature = Stream::Signer.create_jwt_token('activities', '*', @api_secret, '*')
80
79
  make_request(:post, '/activity/', signature, {}, data)
81
80
  end
82
81
 
82
+ #
83
+ # Batch partial activity update
84
+ #
85
+ # @param [Array< Hash<:id, :foreign_id, :time, :set, :unset> >] changes the list of changes to be applied
86
+ #
87
+ # @return the updated activities
88
+ #
89
+ # @example Identify using activity IDs
90
+ # @client.batch_activity_partial_update([
91
+ # {
92
+ # id: "4b39fda2-d6e2-42c9-9abf-5301ef071b12",
93
+ # set: {
94
+ # "product.price.eur": 12.99,
95
+ # "colors": {
96
+ # "blue": "#0000ff",
97
+ # "green": "#00ff00",
98
+ # }
99
+ # },
100
+ # unset: [ "popularity", "size.x2" ]
101
+ # },
102
+ # {
103
+ # id: "8d2dcad8-1e34-11e9-8b10-9cb6d0925edd",
104
+ # set: {
105
+ # "product.price.eur": 17.99,
106
+ # "colors": {
107
+ # "red": "#ff0000",
108
+ # "green": "#00ff00",
109
+ # }
110
+ # },
111
+ # unset: [ "rating" ]
112
+ # }
113
+ # ])
114
+ #
115
+ # @example Identify using Foreign IDs + timestamps
116
+ # @client.batch_activity_partial_update([
117
+ # {
118
+ # foreign_id: "product:123",
119
+ # time: '2016-11-10T13:20:00.000000',
120
+ # set: {
121
+ # "product.price.eur": 22.99,
122
+ # "colors": {
123
+ # "blue": "#0000ff",
124
+ # "green": "#00ff00",
125
+ # }
126
+ # },
127
+ # unset: [ "popularity", "size.x2" ]
128
+ # },
129
+ # {
130
+ # foreign_id: "product:1234",
131
+ # time: '2017-11-10T13:20:00.000000',
132
+ # set: {
133
+ # "product.price.eur": 37.99,
134
+ # "colors": {
135
+ # "black": "#000000",
136
+ # "white": "#ffffff",
137
+ # }
138
+ # },
139
+ # unset: [ "rating" ]
140
+ # }
141
+ # ])
142
+ #
143
+ def batch_activity_partial_update(changes = [])
144
+ signature = Stream::Signer.create_jwt_token('activities', '*', @api_secret, '*')
145
+ make_request(:post, '/activity/', signature, {}, { changes: changes })
146
+ end
83
147
  end
84
148
  end
@@ -8,20 +8,17 @@ module Stream
8
8
  # @return [nil]
9
9
  #
10
10
  # @example
11
- #
12
- #
13
- # follows = [
14
- # {:source => 'flat:1', :target => 'user:1'},
15
- # {:source => 'flat:1', :target => 'user:3'}
16
- # ]
17
- # @client.follow_many(follows)
11
+ # follows = [
12
+ # {:source => 'flat:1', :target => 'user:1'},
13
+ # {:source => 'flat:1', :target => 'user:3'}
14
+ # ]
15
+ # @client.follow_many(follows)
18
16
  #
19
17
  def follow_many(follows, activity_copy_limit = nil)
20
18
  query_params = {}
21
- unless activity_copy_limit.nil?
22
- query_params['activity_copy_limit'] = activity_copy_limit
23
- end
24
- make_signed_request(:post, '/follow_many/', query_params, follows)
19
+ query_params['activity_copy_limit'] = activity_copy_limit unless activity_copy_limit.nil?
20
+ signature = Stream::Signer.create_jwt_token('follower', '*', @api_secret, '*')
21
+ make_request(:post, '/follow_many/', signature, query_params, follows)
25
22
  end
26
23
 
27
24
  #
@@ -32,18 +29,17 @@ module Stream
32
29
  # return [nil]
33
30
  #
34
31
  # @example
35
- #
36
- #
37
- # unfollows = [
38
- # {source: 'user:1', target: 'timeline:1'},
39
- # {source: 'user:2', target: 'timeline:2', keep_history: false}
40
- # ]
41
- # @client.unfollow_many(unfollows)
32
+ # unfollows = [
33
+ # {source: 'user:1', target: 'timeline:1'},
34
+ # {source: 'user:2', target: 'timeline:2', keep_history: false}
35
+ # ]
36
+ # @client.unfollow_many(unfollows)
42
37
  #
43
38
  def unfollow_many(unfollows)
44
- make_signed_request(:post, '/unfollow_many/', {}, unfollows)
39
+ signature = Stream::Signer.create_jwt_token('follower', '*', @api_secret, '*')
40
+ make_request(:post, '/unfollow_many/', signature, {}, unfollows)
45
41
  end
46
-
42
+
47
43
  #
48
44
  # Adds an activity to many feeds in one single request
49
45
  #
@@ -54,10 +50,11 @@ module Stream
54
50
  #
55
51
  def add_to_many(activity_data, feeds)
56
52
  data = {
57
- :feeds => feeds,
58
- :activity => activity_data
53
+ feeds: feeds,
54
+ activity: activity_data
59
55
  }
60
- make_signed_request(:post, '/feed/add_to_many/', {}, data)
56
+ signature = Stream::Signer.create_jwt_token('feed', '*', @api_secret, '*')
57
+ make_request(:post, '/feed/add_to_many/', signature, {}, data)
61
58
  end
62
59
  end
63
60
  end
@@ -5,8 +5,8 @@ require 'stream/signer'
5
5
  require 'stream/url'
6
6
 
7
7
  module Stream
8
- STREAM_URL_COM_RE = %r{https\:\/\/(?<key>\w+)\:(?<secret>\w+)@((api\.)|((?<location>[-\w]+)\.))?(?<api_hostname>stream-io-api\.com)\/[\w=-\?%&]+app_id=(?<app_id>\d+)}i
9
- STREAM_URL_IO_RE = %r{https\:\/\/(?<key>\w+)\:(?<secret>\w+)@((api\.)|((?<location>[-\w]+)\.))?(?<api_hostname>getstream\.io)\/[\w=-\?%&]+app_id=(?<app_id>\d+)}i
8
+ STREAM_URL_COM_RE = %r{https://(?<key>\w+):(?<secret>\w+)@((api\.)|((?<location>[-\w]+)\.))?(?<api_hostname>stream-io-api\.com)/[\w=-?%&]+app_id=(?<app_id>\d+)}i.freeze
9
+ STREAM_URL_IO_RE = %r{https://(?<key>\w+):(?<secret>\w+)@((api\.)|((?<location>[-\w]+)\.))?(?<api_hostname>getstream\.io)/[\w=-?%&]+app_id=(?<app_id>\d+)}i.freeze
10
10
 
11
11
  class Client
12
12
  attr_reader :api_key
@@ -14,17 +14,15 @@ module Stream
14
14
  attr_reader :app_id
15
15
  attr_reader :client_options
16
16
 
17
- if RUBY_VERSION.to_f >= 2.1
18
- require 'stream/batch'
19
- require 'stream/signedrequest'
20
- require 'stream/personalization'
21
- require 'stream/collections'
22
- require 'stream/activities'
17
+ require 'stream/batch'
18
+ require 'stream/personalization'
19
+ require 'stream/collections'
20
+ require 'stream/activities'
21
+ require 'stream/reactions'
22
+ require 'stream/users'
23
23
 
24
- include Stream::SignedRequest
25
- include Stream::Batch
26
- include Stream::Activities
27
- end
24
+ include Stream::Batch
25
+ include Stream::Activities
28
26
 
29
27
  #
30
28
  # initializes a Stream API Client
@@ -46,7 +44,7 @@ module Stream
46
44
  re = Stream::STREAM_URL_IO_RE
47
45
  end
48
46
  raise ArgumentError, 'empty api_key parameter and missing or invalid STREAM_URL env variable' unless re
49
-
47
+
50
48
  matches = re.match(ENV['STREAM_URL'])
51
49
  api_key = matches['key']
52
50
  api_secret = matches['secret']
@@ -77,8 +75,31 @@ module Stream
77
75
  # @return [Stream::Feed]
78
76
  #
79
77
  def feed(feed_slug, user_id)
80
- token = @signer.sign(feed_slug, user_id)
81
- Stream::Feed.new(self, feed_slug, user_id, token)
78
+ Stream::Feed.new(self, feed_slug, user_id)
79
+ end
80
+
81
+ # Creates a user token
82
+ #
83
+ # @deprecated Use Client#create_user_token instead
84
+ #
85
+ # @param [string] user_id the user_if of this token (e.g. User42)
86
+ # @param [hash] extra_data additional token data
87
+ #
88
+ # @return [string]
89
+ #
90
+ def create_user_session_token(user_id, extra_data = {})
91
+ create_user_token(user_id, extra_data)
92
+ end
93
+
94
+ # Creates a user token
95
+ #
96
+ # @param [string] user_id the user_if of this token (e.g. User42)
97
+ # @param [hash] extra_data additional token data
98
+ #
99
+ # @return [string]
100
+ #
101
+ def create_user_token(user_id, extra_data = {})
102
+ Stream::Signer.create_user_token(user_id, extra_data, api_secret)
82
103
  end
83
104
 
84
105
  def personalization
@@ -89,6 +110,14 @@ module Stream
89
110
  CollectionsClient.new(api_key, api_secret, app_id, client_options)
90
111
  end
91
112
 
113
+ def reactions
114
+ ReactionsClient.new(api_key, api_secret, app_id, client_options)
115
+ end
116
+
117
+ def users
118
+ UsersClient.new(api_key, api_secret, app_id, client_options)
119
+ end
120
+
92
121
  def update_activity(activity)
93
122
  update_activities([activity])
94
123
  end
@@ -98,22 +127,26 @@ module Stream
98
127
  make_request(:post, '/activities/', auth_token, {}, 'activities' => activities)
99
128
  end
100
129
 
130
+ def og(uri)
131
+ auth_token = Stream::Signer.create_jwt_token('*', '*', @api_secret, '*')
132
+ make_request(:get, '/og', auth_token, { url: uri })
133
+ end
134
+
101
135
  def get_default_params
102
- {:api_key => @api_key}
136
+ { api_key: @api_key }
103
137
  end
104
138
 
105
139
  def get_http_client
106
- @http_client ||= StreamHTTPClient.new(url_generator)
140
+ @get_http_client ||= StreamHTTPClient.new(url_generator)
107
141
  end
108
142
 
109
143
  def make_query_params(params)
110
- Hash[get_default_params.merge(params).sort_by {|k, v| k.to_s}]
144
+ Hash[get_default_params.merge(params).sort_by { |k, _v| k.to_s }]
111
145
  end
112
146
 
113
147
  def make_request(method, relative_url, signature, params = {}, data = {}, headers = {})
114
148
  headers['Authorization'] = signature
115
149
  headers['stream-auth-type'] = 'jwt'
116
-
117
150
  get_http_client.make_http_request(method, relative_url, make_query_params(params), data, headers)
118
151
  end
119
152
 
@@ -158,7 +191,7 @@ module Stream
158
191
 
159
192
  case response[:status].to_i
160
193
  when 200..203
161
- return ::JSON.parse(response[:body])
194
+ ::JSON.parse(response[:body])
162
195
  end
163
196
  end
164
197
  end
@@ -167,16 +200,16 @@ module Stream
167
200
  def call(env)
168
201
  @app.call(env).on_complete do |response|
169
202
  case response[:status].to_i
170
- when 200..203
171
- return response
172
- when 401
173
- raise StreamApiResponseException, error_message(response, 'Bad feed')
174
- when 403
175
- raise StreamApiResponseException, error_message(response, 'Bad auth/headers')
176
- when 404
177
- raise StreamApiResponseException, error_message(response, 'url not found')
178
- when 204...600
179
- raise StreamApiResponseException, error_message(response, _build_error_message(response.body))
203
+ when 200..203
204
+ return response
205
+ when 401
206
+ raise StreamApiResponseException, error_message(response, 'Bad feed')
207
+ when 403
208
+ raise StreamApiResponseException, error_message(response, 'Bad auth/headers')
209
+ when 404
210
+ raise StreamApiResponseException, error_message(response, 'url not found')
211
+ when 204...600
212
+ raise StreamApiResponseException, error_message(response, _build_error_message(response.body))
180
213
  end
181
214
  end
182
215
  end
@@ -200,7 +233,7 @@ module Stream
200
233
  end
201
234
 
202
235
  def error_message(response, body = nil)
203
- "#{response[:method].to_s.upcase} #{response[:url]}: #{[response[:status].to_s + ':', body].compact.join(' ')}"
236
+ "#{response[:method].to_s.upcase} #{response[:url]}: #{["#{response[:status]}:", body].compact.join(' ')}"
204
237
  end
205
238
  end
206
239
  end
@@ -1,5 +1,33 @@
1
1
  module Stream
2
2
  class CollectionsClient < Client
3
+ def add(collection_name, collection_data, id: nil, user_id: nil)
4
+ data = {
5
+ id: id,
6
+ user_id: user_id,
7
+ data: collection_data
8
+ }
9
+ uri = "/collections/#{collection_name}/"
10
+ make_collection_request(:post, {}, data, endpoint: uri)
11
+ end
12
+
13
+ def get(collection_name, id)
14
+ uri = "collections/#{collection_name}/#{id}/"
15
+ make_collection_request(:get, {}, {}, endpoint: uri)
16
+ end
17
+
18
+ def update(collection_name, id, data: nil)
19
+ data = {
20
+ data: data
21
+ }
22
+ uri = "collections/#{collection_name}/#{id}/"
23
+ make_collection_request(:put, {}, data, endpoint: uri)
24
+ end
25
+
26
+ def delete(collection_name, id)
27
+ uri = "collections/#{collection_name}/#{id}/"
28
+ make_collection_request(:delete, {}, {}, endpoint: uri)
29
+ end
30
+
3
31
  def upsert(collection, objects = [])
4
32
  data = {
5
33
  data: {
@@ -9,14 +37,14 @@ module Stream
9
37
  make_collection_request(:post, {}, data)
10
38
  end
11
39
 
12
- def get(collection, ids = [])
40
+ def select(collection, ids = [])
13
41
  params = {
14
42
  foreign_ids: ids.map { |id| "#{collection}:#{id}" }.join(',')
15
43
  }
16
44
  make_collection_request(:get, params, {})
17
45
  end
18
46
 
19
- def delete(collection, ids = [])
47
+ def delete_many(collection, ids = [])
20
48
  params = {
21
49
  collection_name: collection,
22
50
  ids: ids.join(',')
@@ -25,17 +53,14 @@ module Stream
25
53
  end
26
54
 
27
55
  def create_reference(collection, id)
28
- "SO:#{collection}:#{id}"
29
- end
30
-
31
- def create_user_reference(id)
32
- create_reference('user', id)
56
+ k = id
57
+ k = id['id'] if id.respond_to?(:keys) && !id['id'].nil?
58
+ "SO:#{collection}:#{k}"
33
59
  end
34
60
 
35
61
  private
36
62
 
37
- def make_collection_request(method, params, data)
38
- endpoint = '/meta/'
63
+ def make_collection_request(method, params, data, endpoint: '/collections/')
39
64
  auth_token = Stream::Signer.create_jwt_token('collections', '*', @api_secret, '*', '*')
40
65
  make_request(method, endpoint, auth_token, params, data)
41
66
  end
@@ -6,16 +6,11 @@ module Stream
6
6
  attr_reader :id
7
7
  attr_reader :slug
8
8
  attr_reader :user_id
9
- attr_reader :token
10
9
 
11
- def initialize(client, feed_slug, user_id, token)
12
- unless valid_feed_slug feed_slug
13
- raise StreamInputData, 'feed_slug can only contain alphanumeric characters plus underscores'
14
- end
10
+ def initialize(client, feed_slug, user_id)
11
+ raise StreamInputData, 'feed_slug can only contain alphanumeric characters plus underscores' unless valid_feed_slug feed_slug
15
12
 
16
- unless valid_user_id user_id
17
- raise StreamInputData, 'user_id can only contain alphanumeric characters plus underscores and dashes'
18
- end
13
+ raise StreamInputData, 'user_id can only contain alphanumeric characters plus underscores and dashes' unless valid_user_id user_id
19
14
 
20
15
  @id = "#{feed_slug}:#{user_id}"
21
16
  @client = client
@@ -23,7 +18,6 @@ module Stream
23
18
  @slug = feed_slug
24
19
  @feed_name = "#{feed_slug}#{user_id}"
25
20
  @feed_url = "#{feed_slug}/#{user_id}"
26
- @token = token
27
21
  end
28
22
 
29
23
  def readonly_token
@@ -39,30 +33,27 @@ module Stream
39
33
  end
40
34
 
41
35
  def get(params = {})
42
- uri = "/feed/#{@feed_url}/"
43
- if params[:mark_read] && params[:mark_read].is_a?(Array)
44
- params[:mark_read] = params[:mark_read].join(',')
45
- end
46
- if params[:mark_seen] && params[:mark_seen].is_a?(Array)
47
- params[:mark_seen] = params[:mark_seen].join(',')
36
+ uri = if params[:enrich] || params[:reactions]
37
+ "/enrich/feed/#{@feed_url}/"
38
+ else
39
+ "/feed/#{@feed_url}/"
40
+ end
41
+ params[:mark_read] = params[:mark_read].join(',') if params[:mark_read]&.is_a?(Array)
42
+ params[:mark_seen] = params[:mark_seen].join(',') if params[:mark_seen]&.is_a?(Array)
43
+ if params[:reactions].respond_to?(:keys)
44
+ params[:withOwnReactions] = true if params[:reactions][:own]
45
+ params[:withRecentReactions] = true if params[:reactions][:recent]
46
+ params[:withReactionCounts] = true if params[:reactions][:counts]
48
47
  end
49
- auth_token = create_jwt_token('feed', 'read')
48
+ %i[enrich reactions].each { |k| params.delete(k) }
50
49
 
50
+ auth_token = create_jwt_token('feed', 'read')
51
51
  @client.make_request(:get, uri, auth_token, params)
52
52
  end
53
53
 
54
- def sign_to_field(to)
55
- to.map do |feed_id|
56
- feed_slug, user_id = feed_id.split(':')
57
- feed = @client.feed(feed_slug, user_id)
58
- "#{feed.id} #{feed.token}"
59
- end
60
- end
61
-
62
54
  def add_activity(activity_data)
63
55
  uri = "/feed/#{@feed_url}/"
64
56
  data = activity_data.clone
65
- data[:to] &&= sign_to_field(data[:to])
66
57
  auth_token = create_jwt_token('feed', 'write')
67
58
 
68
59
  @client.make_request(:post, uri, auth_token, {}, data)
@@ -70,23 +61,20 @@ module Stream
70
61
 
71
62
  def add_activities(activities)
72
63
  uri = "/feed/#{@feed_url}/"
73
- activities.each do |activity|
74
- activity[:to] &&= sign_to_field(activity[:to])
75
- end
76
- data = {:activities => activities}
64
+ data = { activities: activities }
77
65
  auth_token = create_jwt_token('feed', 'write')
78
66
 
79
67
  @client.make_request(:post, uri, auth_token, {}, data)
80
68
  end
81
69
 
82
- def remove(activity_id, foreign_id = false)
70
+ def remove(activity_id, foreign_id: false)
83
71
  remove_activity(activity_id, foreign_id)
84
72
  end
85
73
 
86
- def remove_activity(activity_id, foreign_id = false)
74
+ def remove_activity(activity_id, foreign_id: false)
87
75
  uri = "/feed/#{@feed_url}/#{activity_id}/"
88
76
  params = {}
89
- params = {foreign_id: 1} if foreign_id
77
+ params = { foreign_id: 1 } if foreign_id
90
78
  auth_token = create_jwt_token('feed', 'delete')
91
79
 
92
80
  @client.make_request(:delete, uri, auth_token, params)
@@ -102,15 +90,29 @@ module Stream
102
90
  @client.make_request(:post, '/activities/', auth_token, {}, 'activities' => activities)
103
91
  end
104
92
 
93
+ def update_activity_to_targets(foreign_id, time, new_targets: nil, added_targets: nil, removed_targets: nil)
94
+ uri = "/feed_targets/#{@feed_url}/activity_to_targets/"
95
+ data = {
96
+ 'foreign_id': foreign_id,
97
+ 'time': time
98
+ }
99
+
100
+ data['new_targets'] = new_targets unless new_targets.nil?
101
+ data['added_targets'] = added_targets unless added_targets.nil?
102
+ data['removed_targets'] = removed_targets unless removed_targets.nil?
103
+ auth_token = create_jwt_token('feed_targets', 'write')
104
+
105
+ @client.make_request(:post, uri, auth_token, {}, data)
106
+ end
107
+
105
108
  def follow(target_feed_slug, target_user_id, activity_copy_limit = 300)
106
109
  uri = "/feed/#{@feed_url}/follows/"
107
- activity_copy_limit = 0 if activity_copy_limit < 0
110
+ activity_copy_limit = 0 if activity_copy_limit.negative?
108
111
  activity_copy_limit = 1000 if activity_copy_limit > 1000
109
112
 
110
113
  follow_data = {
111
- target: "#{target_feed_slug}:#{target_user_id}",
112
- target_token: @client.feed(target_feed_slug, target_user_id).token,
113
- activity_copy_limit: activity_copy_limit
114
+ target: "#{target_feed_slug}:#{target_user_id}",
115
+ activity_copy_limit: activity_copy_limit
114
116
  }
115
117
  auth_token = create_jwt_token('follower', 'write')
116
118
 
@@ -120,8 +122,8 @@ module Stream
120
122
  def followers(offset = 0, limit = 25)
121
123
  uri = "/feed/#{@feed_url}/followers/"
122
124
  params = {
123
- offset: offset,
124
- limit: limit
125
+ offset: offset,
126
+ limit: limit
125
127
  }
126
128
  auth_token = create_jwt_token('follower', 'read')
127
129
 
@@ -131,16 +133,16 @@ module Stream
131
133
  def following(offset = 0, limit = 25, filter = [])
132
134
  uri = "/feed/#{@feed_url}/follows/"
133
135
  params = {
134
- offset: offset,
135
- limit: limit,
136
- filter: filter.join(',')
136
+ offset: offset,
137
+ limit: limit,
138
+ filter: filter.join(',')
137
139
  }
138
140
  auth_token = create_jwt_token('follower', 'read')
139
141
 
140
142
  @client.make_request(:get, uri, auth_token, params)
141
143
  end
142
144
 
143
- def unfollow(target_feed_slug, target_user_id, keep_history = false)
145
+ def unfollow(target_feed_slug, target_user_id, keep_history: false)
144
146
  uri = "/feed/#{@feed_url}/follows/#{target_feed_slug}:#{target_user_id}/"
145
147
  auth_token = create_jwt_token('follower', 'delete')
146
148
  params = {}
@@ -0,0 +1,80 @@
1
+ module Stream
2
+ class ReactionsClient < Client
3
+ def add(kind, activity_id, user_id, data: nil, target_feeds: nil)
4
+ data = {
5
+ kind: kind,
6
+ activity_id: activity_id,
7
+ user_id: user_id,
8
+ data: data,
9
+ target_feeds: target_feeds
10
+ }
11
+ make_reaction_request(:post, {}, data)
12
+ end
13
+
14
+ def get(reaction_id)
15
+ uri = "/reaction/#{reaction_id}/"
16
+ make_reaction_request(:get, {}, {}, endpoint: uri)
17
+ end
18
+
19
+ def update(reaction_id, data: nil, target_feeds: nil)
20
+ data = {
21
+ data: data,
22
+ target_feeds: target_feeds
23
+ }
24
+ uri = "/reaction/#{reaction_id}/"
25
+ make_reaction_request(:put, {}, data, endpoint: uri)
26
+ end
27
+
28
+ def delete(reaction_id)
29
+ uri = "/reaction/#{reaction_id}/"
30
+ make_reaction_request(:delete, {}, {}, endpoint: uri)
31
+ end
32
+
33
+ def add_child(kind, parent_id, user_id, data: nil, target_feeds: nil)
34
+ data = {
35
+ kind: kind,
36
+ parent: parent_id,
37
+ user_id: user_id,
38
+ data: data,
39
+ target_feeds: target_feeds
40
+ }
41
+ make_reaction_request(:post, {}, data)
42
+ end
43
+
44
+ def filter(params = {})
45
+ field = ''
46
+ value = ''
47
+ kind = params.fetch(:kind, '')
48
+ if params[:reaction_id]
49
+ field = 'reaction_id'
50
+ value = params[:reaction_id]
51
+ elsif params[:activity_id]
52
+ field = 'activity_id'
53
+ value = params[:activity_id]
54
+ elsif params[:user_id]
55
+ field = 'user_id'
56
+ value = params[:user_id]
57
+ end
58
+ params.delete(field.to_sym) unless field.empty?
59
+ uri = if kind.nil? || kind.empty?
60
+ "/reaction/#{field}/#{value}/"
61
+ else
62
+ "/reaction/#{field}/#{value}/#{kind}/"
63
+ end
64
+ make_reaction_request(:get, params, {}, endpoint: uri)
65
+ end
66
+
67
+ def create_reference(id)
68
+ k = id
69
+ k = id['id'] if id.respond_to?(:keys) && !id['id'].nil?
70
+ "SR:#{k}"
71
+ end
72
+
73
+ private
74
+
75
+ def make_reaction_request(method, params, data, endpoint: '/reaction/')
76
+ auth_token = Stream::Signer.create_jwt_token('reactions', '*', @api_secret, '*', '*')
77
+ make_request(method, endpoint, auth_token, params, data)
78
+ end
79
+ end
80
+ end
@@ -7,27 +7,17 @@ module Stream
7
7
 
8
8
  def initialize(key)
9
9
  @key = key.to_s
10
- @sha1 = OpenSSL::Digest.new('sha1')
11
10
  end
12
11
 
13
- def urlsafe_encodeb64(value)
14
- value.tr('+', '-').tr('/', '_').gsub(/^=+/, '').gsub(/=+$/, '')
15
- end
16
-
17
- def sign_message(message)
18
- key = Digest::SHA1.digest @key.to_s
19
- token = Base64.strict_encode64(OpenSSL::HMAC.digest(@sha1, key, message))
20
- urlsafe_encodeb64(token)
21
- end
22
-
23
- def sign(feed_slug, user_id)
24
- sign_message("#{feed_slug}#{user_id}")
12
+ def self.create_user_token(user_id, payload = {}, api_secret)
13
+ payload['user_id'] = user_id
14
+ JWT.encode(payload, api_secret, 'HS256')
25
15
  end
26
16
 
27
17
  def self.create_jwt_token(resource, action, api_secret, feed_id = nil, user_id = nil)
28
18
  payload = {
29
- resource: resource,
30
- action: action
19
+ resource: resource,
20
+ action: action
31
21
  }
32
22
  payload['feed_id'] = feed_id if feed_id
33
23
  payload['user_id'] = user_id if user_id
@@ -7,10 +7,11 @@ module Stream
7
7
 
8
8
  class APIURLGenerator < URLGenerator
9
9
  def initialize(options)
10
+ super()
10
11
  @options = options
11
12
  location = make_location(options[:location])
12
- location ||= "api"
13
- api_version = options[:api_version] ? options[:api_version] : 'v1.0'
13
+ location ||= 'api'
14
+ api_version = options[:api_version] || 'v1.0'
14
15
  if ENV['STREAM_URL']
15
16
  uri = URI.parse(ENV['STREAM_URL'])
16
17
  scheme = uri.scheme
@@ -48,6 +49,7 @@ module Stream
48
49
 
49
50
  class PersonalizationURLGenerator < URLGenerator
50
51
  def initialize(options)
52
+ super()
51
53
  @options = options
52
54
  host = 'personalization.stream-io-api.com'
53
55
  @base_path = '/personalization/v1.0'
@@ -0,0 +1,45 @@
1
+ module Stream
2
+ class UsersClient < Client
3
+ def add(user_id, data: nil, get_or_create: false)
4
+ data = {
5
+ id: user_id,
6
+ data: data
7
+ }
8
+ params = {
9
+ get_or_create: get_or_create
10
+ }
11
+ make_user_request(:post, params, data)
12
+ end
13
+
14
+ def get(user_id)
15
+ uri = "/user/#{user_id}/"
16
+ make_user_request(:get, {}, {}, endpoint: uri)
17
+ end
18
+
19
+ def update(user_id, data: nil)
20
+ data = {
21
+ data: data
22
+ }
23
+ uri = "/user/#{user_id}/"
24
+ make_user_request(:put, {}, data, endpoint: uri)
25
+ end
26
+
27
+ def delete(user_id)
28
+ uri = "/user/#{user_id}/"
29
+ make_user_request(:delete, {}, {}, endpoint: uri)
30
+ end
31
+
32
+ def create_reference(id)
33
+ k = id
34
+ k = id['id'] if id.respond_to?(:keys) && !id['id'].nil?
35
+ "SU:#{k}"
36
+ end
37
+
38
+ private
39
+
40
+ def make_user_request(method, params, data, endpoint: '/user/')
41
+ auth_token = Stream::Signer.create_jwt_token('users', '*', @api_secret, '*', '*')
42
+ make_request(method, endpoint, auth_token, params, data)
43
+ end
44
+ end
45
+ end
@@ -1,3 +1,3 @@
1
1
  module Stream
2
- VERSION = '2.10.0'.freeze
2
+ VERSION = '4.0.0'.freeze
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: stream-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.10.0
4
+ version: 4.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tommaso Barbugli
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2018-09-06 00:00:00.000000000 Z
13
+ date: 2020-11-19 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: faraday
@@ -32,20 +32,6 @@ dependencies:
32
32
  - - "<"
33
33
  - !ruby/object:Gem::Version
34
34
  version: '1.0'
35
- - !ruby/object:Gem::Dependency
36
- name: http_signatures
37
- requirement: !ruby/object:Gem::Requirement
38
- requirements:
39
- - - "~>"
40
- - !ruby/object:Gem::Version
41
- version: '0'
42
- type: :runtime
43
- prerelease: false
44
- version_requirements: !ruby/object:Gem::Requirement
45
- requirements:
46
- - - "~>"
47
- - !ruby/object:Gem::Version
48
- version: '0'
49
35
  - !ruby/object:Gem::Dependency
50
36
  name: jwt
51
37
  requirement: !ruby/object:Gem::Requirement
@@ -70,44 +56,44 @@ dependencies:
70
56
  name: rake
71
57
  requirement: !ruby/object:Gem::Requirement
72
58
  requirements:
73
- - - "~>"
59
+ - - ">="
74
60
  - !ruby/object:Gem::Version
75
61
  version: '0'
76
62
  type: :development
77
63
  prerelease: false
78
64
  version_requirements: !ruby/object:Gem::Requirement
79
65
  requirements:
80
- - - "~>"
66
+ - - ">="
81
67
  - !ruby/object:Gem::Version
82
68
  version: '0'
83
69
  - !ruby/object:Gem::Dependency
84
70
  name: rspec
85
71
  requirement: !ruby/object:Gem::Requirement
86
72
  requirements:
87
- - - "~>"
73
+ - - ">="
88
74
  - !ruby/object:Gem::Version
89
- version: '2.10'
75
+ version: '0'
90
76
  type: :development
91
77
  prerelease: false
92
78
  version_requirements: !ruby/object:Gem::Requirement
93
79
  requirements:
94
- - - "~>"
80
+ - - ">="
95
81
  - !ruby/object:Gem::Version
96
- version: '2.10'
82
+ version: '0'
97
83
  - !ruby/object:Gem::Dependency
98
84
  name: simplecov
99
85
  requirement: !ruby/object:Gem::Requirement
100
86
  requirements:
101
- - - "~>"
87
+ - - ">="
102
88
  - !ruby/object:Gem::Version
103
- version: '0.7'
89
+ version: '0'
104
90
  type: :development
105
91
  prerelease: false
106
92
  version_requirements: !ruby/object:Gem::Requirement
107
93
  requirements:
108
- - - "~>"
94
+ - - ">="
109
95
  - !ruby/object:Gem::Version
110
- version: '0.7'
96
+ version: '0'
111
97
  description: Ruby client for getstream.io service
112
98
  email: support@getstream.io
113
99
  executables: []
@@ -128,9 +114,10 @@ files:
128
114
  - lib/stream/exceptions.rb
129
115
  - lib/stream/feed.rb
130
116
  - lib/stream/personalization.rb
131
- - lib/stream/signedrequest.rb
117
+ - lib/stream/reactions.rb
132
118
  - lib/stream/signer.rb
133
119
  - lib/stream/url.rb
120
+ - lib/stream/users.rb
134
121
  - lib/stream/version.rb
135
122
  homepage: http://github.com/GetStream/stream-ruby
136
123
  licenses:
@@ -144,15 +131,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
144
131
  requirements:
145
132
  - - ">="
146
133
  - !ruby/object:Gem::Version
147
- version: '0'
134
+ version: 2.5.0
148
135
  required_rubygems_version: !ruby/object:Gem::Requirement
149
136
  requirements:
150
137
  - - ">="
151
138
  - !ruby/object:Gem::Version
152
139
  version: '0'
153
140
  requirements: []
154
- rubyforge_project:
155
- rubygems_version: 2.7.3
141
+ rubygems_version: 3.1.2
156
142
  signing_key:
157
143
  specification_version: 4
158
144
  summary: A gem that provides a client interface for getstream.io
@@ -1,43 +0,0 @@
1
- require 'http_signatures'
2
- require 'net/http'
3
- require 'time'
4
-
5
- module Stream
6
- module SignedRequest
7
- module ClassMethods
8
- def supports_signed_requests;
9
- end
10
- end
11
-
12
- def self.included(klass)
13
- klass.extend ClassMethods
14
- end
15
-
16
- def make_signed_request(method, relative_url, params = {}, data = {})
17
- query_params = make_query_params(params)
18
- context = HttpSignatures::Context.new(
19
- keys: {@api_key => @api_secret},
20
- algorithm: 'hmac-sha256',
21
- headers: %w(date)
22
- )
23
- method_map = {
24
- :get => Net::HTTP::Get,
25
- :delete => Net::HTTP::Delete,
26
- :put => Net::HTTP::Put,
27
- :post => Net::HTTP::Post
28
- }
29
- request_date = Time.now.rfc822
30
- message = method_map[method].new(
31
- "#{get_http_client.base_path}#{relative_url}?#{URI.encode_www_form(query_params)}",
32
- 'date' => request_date
33
- )
34
- context.signer.sign(message)
35
- headers = {
36
- Authorization: message['Signature'],
37
- Date: request_date,
38
- 'X-Api-Key' => api_key
39
- }
40
- get_http_client.make_http_request(method, relative_url, query_params, data, headers)
41
- end
42
- end
43
- end