pusher-chatkit-server 1.1.0 → 1.2.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
- SHA1:
3
- metadata.gz: e70875d940a106dfbf2fbc0bc25aaad3b77250c5
4
- data.tar.gz: 1964d162f71ad76702585857fac6554e9f3e2881
2
+ SHA256:
3
+ metadata.gz: f132c6890c4c1b9c7ca4230ba21170ec33279c8dddc1d8a8536bf7210e5f4bcb
4
+ data.tar.gz: 4fa2791c7b84d65494cd71554dfda3bff2d2eec030cda828bc6dd1647d235a16
5
5
  SHA512:
6
- metadata.gz: 54ca178a9cf6477f6e7e211f777d159ba665c6ab9f1e05d5007bf3f9d30b6504f4f3210bde47551dc603e79e382d5b03d0d5bdb192b7a467adfc55d38597aff8
7
- data.tar.gz: e739b131e772e32a34d2bcf8e331dfcd4772eeb8e7490604a5ff19275cbbbc5d9e05ae49c2891b49673a19971b28fedf8c91aeb9720e3d2079dc4f52d3736bfa
6
+ metadata.gz: 60220ad10c2e728fc8e2cf7fb902c79226707a992c5ccabcc1ade0387af24accdaa9787ae3b020116f762d8d82d33ffc6dfb3b21f21716c493d78345d2a1e185
7
+ data.tar.gz: c3c01e8ed88377b3b0fc494bc3ddc12f13b63479b043675906b61b46a495e1b2307f61c3d54e09e314b9c781e5187fb77dc8cfabc7b70caf3d367e37d580f268
@@ -1,10 +1,12 @@
1
1
  require 'pusher-platform'
2
2
  require 'json'
3
3
  require 'cgi'
4
+ require 'excon'
4
5
 
5
6
  require_relative './error'
6
7
  require_relative './missing_parameter_error'
7
8
  require_relative './response_error'
9
+ require_relative './upload_error'
8
10
 
9
11
  module Chatkit
10
12
 
@@ -12,7 +14,10 @@ module Chatkit
12
14
  GLOBAL_SCOPE = "global"
13
15
 
14
16
  class Client
15
- attr_accessor :api_instance, :authorizer_instance, :cursors_instance
17
+ attr_accessor :api_instance,
18
+ :api_v2_instance,
19
+ :authorizer_instance,
20
+ :cursors_instance
16
21
 
17
22
  def initialize(options)
18
23
  base_options = {
@@ -27,13 +32,20 @@ module Chatkit
27
32
  })
28
33
  }
29
34
 
30
- @api_instance = PusherPlatform::Instance.new(
35
+ @api_v2_instance = PusherPlatform::Instance.new(
31
36
  base_options.merge({
32
37
  service_name: 'chatkit',
33
38
  service_version: 'v2'
34
39
  })
35
40
  )
36
41
 
42
+ @api_instance = PusherPlatform::Instance.new(
43
+ base_options.merge({
44
+ service_name: 'chatkit',
45
+ service_version: 'v3'
46
+ })
47
+ )
48
+
37
49
  @authorizer_instance = PusherPlatform::Instance.new(
38
50
  base_options.merge({
39
51
  service_name: 'chatkit_authorizer',
@@ -206,7 +218,7 @@ module Chatkit
206
218
  name: options[:name],
207
219
  private: options[:private] || false
208
220
  }
209
-
221
+
210
222
  body[:custom_data] = options[:custom_data] unless options[:custom_data].nil?
211
223
 
212
224
  unless options[:user_ids].nil?
@@ -328,6 +340,26 @@ module Chatkit
328
340
 
329
341
  # Messages API
330
342
 
343
+ def fetch_multipart_messages(options)
344
+ verify({
345
+ room_id: "You must provide the ID of the room to send the message to",
346
+ }, options)
347
+
348
+ if !options[:limit].nil? and options[:limit] <= 0
349
+ raise Chatkit::MissingParameterError.new("Limit must be greater than 0")
350
+ end
351
+
352
+ optional_params = [:initial_id, :direction, :limit]
353
+ query_params = options.select { |key,_| optional_params.include? key }
354
+
355
+ api_request({
356
+ method: "GET",
357
+ path: "/rooms/#{CGI::escape options[:room_id]}/messages",
358
+ query: query_params,
359
+ jwt: generate_su_token[:token]
360
+ })
361
+ end
362
+
331
363
  def get_room_messages(options)
332
364
  if options[:room_id].nil?
333
365
  raise Chatkit::MissingParameterError.new("You must provide the ID of the room to fetch messages from")
@@ -338,7 +370,7 @@ module Chatkit
338
370
  query_params[:direction] = options[:direction] unless options[:direction].nil?
339
371
  query_params[:limit] = options[:limit] unless options[:limit].nil?
340
372
 
341
- api_request({
373
+ api_v2_request({
342
374
  method: "GET",
343
375
  path: "/rooms/#{CGI::escape options[:room_id]}/messages",
344
376
  query: query_params,
@@ -346,6 +378,65 @@ module Chatkit
346
378
  })
347
379
  end
348
380
 
381
+ def send_simple_message(options)
382
+ verify({text: "You must provide some text for the message",
383
+ }, options)
384
+
385
+ options[:parts] = [{type: "text/plain",
386
+ content: options[:text]
387
+ }]
388
+
389
+ send_multipart_message(options)
390
+ end
391
+
392
+ def send_multipart_message(options)
393
+ verify({
394
+ room_id: "You must provide the ID of the room to send the message to",
395
+ sender_id: "You must provide the ID of the user sending the message",
396
+ parts: "You must provide a parts array",
397
+ }, options)
398
+
399
+ if not options[:parts].length > 0
400
+ raise Chatkit::MissingParameterError.new("parts array must have at least one item")
401
+ end
402
+
403
+ # this assumes the token lives long enough to finish all S3 uploads
404
+ token = generate_su_token({ user_id: options[:sender_id] })[:token]
405
+
406
+ request_parts = options[:parts].map { |part|
407
+ verify({type: "Each part must define a type"}, part)
408
+
409
+ if !part[:content].nil?
410
+ {
411
+ type: part[:type],
412
+ content: part[:content]
413
+ }
414
+ elsif !part[:url].nil?
415
+ {
416
+ type: part[:type],
417
+ url: part[:url]
418
+ }
419
+ elsif !part[:file].nil?
420
+ attachment_id = upload_attachment(token, options[:room_id], part)
421
+ {
422
+ type: part[:type],
423
+ attachment: {id: attachment_id},
424
+ name: part[:name],
425
+ customData: part[:customData]
426
+ }.reject{ |_,v| v.nil? }
427
+ else
428
+ raise Chatkit::MissingParameterError.new("Each part must have one of :file, :content or :url")
429
+ end
430
+ }
431
+
432
+ api_request({
433
+ method: "POST",
434
+ path: "/rooms/#{CGI::escape options[:room_id]}/messages",
435
+ body: {parts: request_parts},
436
+ jwt: token
437
+ })
438
+ end
439
+
349
440
  def send_message(options)
350
441
  if options[:room_id].nil?
351
442
  raise Chatkit::MissingParameterError.new("You must provide the ID of the room to send the message to")
@@ -380,7 +471,7 @@ module Chatkit
380
471
  attachment: options[:attachment]
381
472
  }
382
473
 
383
- api_request({
474
+ api_v2_request({
384
475
  method: "POST",
385
476
  path: "/rooms/#{CGI::escape options[:room_id]}/messages",
386
477
  body: payload,
@@ -551,6 +642,10 @@ module Chatkit
551
642
 
552
643
  # Service-specific helpers
553
644
 
645
+ def api_v2_request(options)
646
+ make_request(@api_v2_instance, options)
647
+ end
648
+
554
649
  def api_request(options)
555
650
  make_request(@api_instance, options)
556
651
  end
@@ -713,5 +808,54 @@ module Chatkit
713
808
  jwt: generate_su_token[:token]
714
809
  })
715
810
  end
811
+
812
+ def upload_attachment(token, room_id, part)
813
+ body = part[:file]
814
+ content_length = body.length
815
+ content_type = part[:type]
816
+
817
+ if content_length <= 0
818
+ raise Chatkit::MissingParameterError.new("File contents size must be greater than 0")
819
+ end
820
+
821
+ attachment_req = {
822
+ content_type: content_type,
823
+ content_length: content_length
824
+ }
825
+
826
+ attachment_response = api_request({
827
+ method: "POST",
828
+ path: "/rooms/#{CGI::escape room_id}/attachments",
829
+ body: attachment_req,
830
+ jwt: token
831
+ })
832
+
833
+ url = attachment_response[:body][:upload_url]
834
+ connection = Excon.new(url, :omit_default_port => true)
835
+ upload_response = connection.put(
836
+ :body => body,
837
+ :headers => {
838
+ "Content-Type" => content_type,
839
+ "Content-Length" => content_length
840
+ }
841
+ )
842
+
843
+ if upload_response.status != 200
844
+ error = {message: "Failed to upload attachment",
845
+ response_object: upload_response
846
+ }
847
+ raise Chatkit::UploadError.new(error)
848
+ end
849
+
850
+ attachment_response[:body][:attachment_id]
851
+ end
852
+
853
+ def verify(required, options)
854
+ required.each { |field_name, message|
855
+ if options[field_name].nil?
856
+ raise Chatkit::MissingParameterError.new(message)
857
+ end
858
+ }
859
+ end
716
860
  end
717
861
  end
@@ -0,0 +1,17 @@
1
+ require_relative './error'
2
+
3
+ module Chatkit
4
+ class UploadError < Chatkit::Error
5
+ attr_accessor :message, :response_object
6
+
7
+ def initialize(error)
8
+ @message = error[:message]
9
+ @response_object = error[:response_object]
10
+ end
11
+
12
+ def to_s
13
+ "Chatkit::MissingParameterError - #{@message}"
14
+ end
15
+
16
+ end
17
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pusher-chatkit-server
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pusher
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-11-12 00:00:00.000000000 Z
11
+ date: 2019-03-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: pusher-platform
@@ -35,6 +35,7 @@ files:
35
35
  - lib/chatkit/error.rb
36
36
  - lib/chatkit/missing_parameter_error.rb
37
37
  - lib/chatkit/response_error.rb
38
+ - lib/chatkit/upload_error.rb
38
39
  homepage:
39
40
  licenses:
40
41
  - MIT
@@ -55,7 +56,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
55
56
  version: '0'
56
57
  requirements: []
57
58
  rubyforge_project:
58
- rubygems_version: 2.6.12
59
+ rubygems_version: 2.7.6
59
60
  signing_key:
60
61
  specification_version: 4
61
62
  summary: Pusher Chatkit Ruby SDK