Skip to content

Commit bb61762

Browse files
committed
feat(here-now): add limit and offset parameters
Add 'limit' and 'offset' parameters for 'here_now' for pagination support. BREAKING CHANGES: `here_now` by default will return `1000` users at once.
1 parent 4ebf4d8 commit bb61762

7 files changed

Lines changed: 374 additions & 16 deletions

File tree

fixtures/vcr_cassettes/examples/here_now/36.yml

Lines changed: 39 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

fixtures/vcr_cassettes/examples/here_now/37.yml

Lines changed: 39 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

fixtures/vcr_cassettes/examples/here_now/38.yml

Lines changed: 111 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/pubnub/constants.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ module Constants
2222
DEFAULT_USE_RANDOM_IV = true
2323
DEFAULT_SSL = false
2424
REQUEST_MESSAGE_COUNT_THRESHOLD = 0
25+
MAXIMUM_HERE_NOW_COUNT = 1000
2526

2627
# Envelope values
2728
# Errors

lib/pubnub/event.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ def create_variables_from_options(options)
173173
crypto_module secret_key auth_key publish_key subscribe_key timetoken
174174
action_timetoken message_timetoken open_timeout read_timeout idle_timeout
175175
heartbeat group action read write delete manage ttl presence start end count
176-
limit max reverse presence_callback store skip_validate state channel_group
176+
offset limit max reverse presence_callback store skip_validate state channel_group
177177
channel_groups compressed meta customs custom_message_type include_token
178178
include_custom_message_type include_message_actions include_message_type
179179
replicate with_presence cipher_key_selector include_meta include_uuid join

lib/pubnub/events/here_now.rb

Lines changed: 43 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -50,26 +50,56 @@ def global_path
5050
def parameters(*_args)
5151
parameters = super
5252
parameters['channel-group'] = @group.join(',') unless @group.blank?
53+
54+
if current_operation == Pubnub::Constants::OPERATION_HERE_NOW
55+
@limit = if !@limit&.positive?
56+
Pubnub::Constants::MAXIMUM_HERE_NOW_COUNT
57+
else
58+
[Pubnub::Constants::MAXIMUM_HERE_NOW_COUNT, @limit].min
59+
end
60+
@offset = 0 if @offset.nil?
61+
62+
parameters['limit'] = @limit
63+
parameters['offset'] = @offset if @offset&.positive?
64+
end
65+
5366
parameters
5467
end
5568

5669
def valid_envelope(parsed_response, req_res_objects)
70+
occupancy = parsed_response['payload'] ? parsed_response['payload']['total_occupancy'] : parsed_response['occupancy']
71+
limit_reached = false
72+
73+
result = {
74+
code: req_res_objects[:response].code,
75+
operation: get_operation,
76+
client_request: req_res_objects[:request],
77+
server_response: req_res_objects[:response],
78+
data: {
79+
uuids: parsed_response['uuids'],
80+
occupancy: occupancy,
81+
total_occupancy: (parsed_response['payload'] ? parsed_response['payload']['total_occupancy'] : nil),
82+
total_channels: (parsed_response['payload'] ? parsed_response['payload']['total_channels'] : nil),
83+
channels: (parsed_response['payload'] ? parsed_response['payload']['channels'] : nil)
84+
}
85+
}
86+
87+
if occupancy >= @limit
88+
if !parsed_response.include?('payload')
89+
limit_reached = result[:data][:uuids].length == @limit
90+
else
91+
result[:data][:channels].values.each do |channel|
92+
limit_reached = channel['uuids'].length == @limit
93+
break if limit_reached
94+
end
95+
end
96+
end
97+
result[:data][:nextOffset] = limit_reached ? @offset + @limit : nil
98+
5799
Pubnub::Envelope.new(
58100
event: @event,
59101
event_options: @given_options,
60-
result: {
61-
code: req_res_objects[:response].code,
62-
operation: get_operation,
63-
client_request: req_res_objects[:request],
64-
server_response: req_res_objects[:response],
65-
data: {
66-
uuids: parsed_response['uuids'],
67-
occupancy: parsed_response['occupancy'],
68-
total_occupancy: (parsed_response['payload'] ? parsed_response['payload']['total_occupancy'] : nil),
69-
total_channels: (parsed_response['payload'] ? parsed_response['payload']['total_channels'] : nil),
70-
channels: (parsed_response['payload'] ? parsed_response['payload']['channels'] : nil)
71-
}
72-
},
102+
result: result,
73103
status: {
74104
code: req_res_objects[:response].code,
75105
client_request: req_res_objects[:request],

0 commit comments

Comments
 (0)