qismo 0.12.1 → 0.13.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cb55e3c23efa55080a8c65449b619f5d1016d9f3ef72b0692413654687e98e38
4
- data.tar.gz: 610b16a6507bd54a017602146ce5866111e0bb89a0c36f491ec1898057ffb51d
3
+ metadata.gz: 3a661003cb31406d91ff9af0717d796b4bf4e425d395fa16304fb871f6174c3f
4
+ data.tar.gz: d46b28c74af1561c93f12d23e291fcc8d1e8a865f072f10ffacbc608a7eda1fa
5
5
  SHA512:
6
- metadata.gz: 522f77e9e507001a0e6f07834c0e048c88716a93f810a8cdff7dafb38bb31d8faa50d4d2165878468fdbe3ab13bbc7916a63509293e798da99bd4c73582115ae
7
- data.tar.gz: 76e9cead4064ad7f28c3b04144976356c1f46d62f11ec71029820d1043c9e728f71980c389e52be4d215cdd36916652de43544bc56f23ca62ce6362d36866e48
6
+ metadata.gz: b74ceea740b566d0e24c61929af9f2697ca8a1c961625853a6ee999f53d67cc6ddf4e0334e0b5f39e4856a243167ca1b39e94abf2347fa6ef242a7c399ffc21e
7
+ data.tar.gz: 55035df4c8ca13362e43b82e434c88389bc62d5aa7263fb5cb45031569a897b6d2dac2709bf29d9743061c52acd9ad95d1abcb85491f17a143f4235cd2d50835
data/Gemfile CHANGED
@@ -10,6 +10,5 @@ group :development do
10
10
  gem "byebug", "~> 11.1"
11
11
  gem "rake", "~> 13.0"
12
12
  gem "rspec", "~> 3.0"
13
- gem "solargraph", "~> 0.47.2"
14
13
  gem "standard", ">= 1"
15
14
  end
data/README.md CHANGED
@@ -12,57 +12,73 @@ bundle add qismo
12
12
 
13
13
  ## Usage
14
14
 
15
- ### Initialize and make request
16
-
17
- To start using Qismo ruby, you must get your account's `App ID` and `Qiscus Secret Key` which can be checked in your admin dashboard's [settings page](https://omnichannel.qiscus.com/settings). After getting these data, you can start initialize the client.
18
-
19
15
  ```ruby
16
+ # config/initializers/qismo.rb
17
+
20
18
  Qismo.configure do |client|
21
- client.app_id = "YOU_ACCOUNT_APP_ID"
22
- client.secret_key = "YOUR_ACCOUNT_SECRET_KEY"
23
-
24
- ## Optional
25
- client.url = "https://qismo.qiscus.com"
26
- client.logger = { logger: Logger.new($stdout) }
27
- client.instrumentation = { instrumenter: ActiveSupport::Notifications.instrumenter }
28
- client.timeout = { connect: 5, write: 2, read: 5 }
29
- client.proxy = ["proxy-hostname.local", 8080, "username", "password"]
19
+ client.app_id = ENV["QISCUS_APP_ID"]
20
+ client.secret_key = ENV["QISCUS_SECRET_KEY"]
30
21
  end
31
22
  ```
32
23
 
33
- Then, start requesting to any endpoint yg want
24
+ Then, start requesting to available endpoint
34
25
 
35
26
  ```ruby
36
27
  params = {
37
- channel: { id: 12345, source: "wa" },
28
+ channel: { channel_id: 12345, source: "wa" },
38
29
  status: "unresolved",
39
30
  serve_status: "served",
40
- is_handled_by_bot: false,
31
+ is_handled_by_bot: true,
41
32
  }
42
33
 
34
+ # List rooms
43
35
  rooms = Qismo.rooms(params)
44
- ```
45
36
 
46
- If your app manage multiple app id, you initialize the client like below
47
-
48
- ```ruby
49
- client = Qismo::Client.new(app_id: "YOUR_ACCOUNT_APP_ID", secret_key: "YOUR_ACCOUNT_SECRET_KEY")
37
+ puts rooms
38
+ # [
39
+ # #<Qismo::SingleObject
40
+ # channel_id=6171,
41
+ # contact_id=71716,
42
+ # id=181917,
43
+ # is_handled_by_bot=true,
44
+ # is_resolved=false,
45
+ # is_waiting=false,
46
+ # last_comment_sender="admin@qismo.com",
47
+ # last_comment_sender_type="system",
48
+ # last_comment_text="Agent joined this conversation",
49
+ # last_comment_timestamp="2022-12-09T04:25:55Z",
50
+ # last_customer_comment_text=nil,
51
+ # last_customer_timestamp="2022-11-28T09:03:08Z",
52
+ # name="Customer - Yogyakarta",
53
+ # room_badge="https://multichannel.qiscus.com/img/whatsapp_badge.svg",
54
+ # room_id="8191816171",
55
+ # room_type="individual",
56
+ # source="wa",
57
+ # user_avatar_url="https://multichannel.qiscus.com/img/default_avatar.svg",
58
+ # user_id="628155555711"
59
+ # >
60
+ # ]
50
61
  ```
51
62
 
52
- Then, start requesting to an endpoint using that `client` variable
63
+ ## Multiple app id client initialization
53
64
 
54
65
  ```ruby
66
+ client = Qismo::Client.new(app_id: "QISCUS_APP_ID", secret_key: "QISCUS_SECRET_KEY")
67
+
55
68
  params = {
56
- channel: { id: 12345, source: "wa" },
69
+ channel: { channel_id: 12345, source: "wa" },
57
70
  status: "unresolved",
58
71
  serve_status: "served",
59
- is_handled_by_bot: false,
72
+ is_handled_by_bot: true,
60
73
  }
61
74
 
62
- rooms = client.rooms(params)
75
+ # This will produce same result as explained before
76
+ client.rooms(params)
63
77
  ```
64
78
 
65
- ### Client configuration
79
+ ## Client optional configuration
80
+
81
+ Qismo ruby also provide some optional configuration that you can pass, they are:
66
82
 
67
83
  **url**
68
84
 
@@ -130,7 +146,7 @@ Proxy needs authentication?
130
146
  client.proxy = ["proxy-hostname.local", 8080, "username", "password"]
131
147
  ```
132
148
 
133
- ### Handling pagination
149
+ ## Handling pagination
134
150
 
135
151
  Some of the Qiscus Omnichannel API will return list of data with pagination. To handle the pagination, you can to that like this example:
136
152
 
@@ -145,7 +161,7 @@ while rooms.has_next_page?
145
161
  end
146
162
  ```
147
163
 
148
- ### Handling error
164
+ ## Handling error
149
165
 
150
166
  Qismo ruby raise error while getting non successful http code from Qiscus Omnichannel API. To handle it, you follow this example:
151
167
 
@@ -158,3 +174,87 @@ rescue Qismo::HTTPRequestError => e
158
174
  e.response_body
159
175
  end
160
176
  ```
177
+
178
+ ## Handle incoming webhook request
179
+
180
+ Qiscus Omnichannel provide webhooks that triggered from various action on your account. Qismo ruby gem provide convenient way to handle the request.
181
+
182
+ ```ruby
183
+ class QiscusWebhooksController < ApplicationController
184
+ skip_before_action :verify_authenticity_token
185
+
186
+ def handle_agent_allocation_webhook
187
+ webhook = Qismo::WebhookRequests::OnAgentAllocationNeeded.new(JSON.parse(request.raw_body))
188
+
189
+ # Do any action you want using payload that has been objectified
190
+ if webhook.candidate_agent.present?
191
+ Qismo.assign_agent(
192
+ webhook.room_id,
193
+ webhook.candidate_agent.id
194
+ )
195
+ end
196
+ end
197
+
198
+ def handle_custom_button_webhook
199
+ webhook = Qismo::WebhookRequests::OnCustomButtonClicked.new(JSON.parse(request.raw_body))
200
+
201
+ # Do any action you want using payload that has been objectified. The
202
+ # following example assuming you want to create Zendesk ticket
203
+ # everytime your agent click custom button "Create Ticket". We are
204
+ # assuming, you have setup Zendesk ruby client
205
+ zendesk_ticket_subject = webhook.additional_info.find do |info|
206
+ info.key == "Zendesk Ticket Subject"
207
+ end
208
+
209
+ if zendesk_ticket_subject.present?
210
+ ZendeskAPI::Ticket.create!(
211
+ zendesk_client,
212
+ subject: zendesk_ticket_subject.value,
213
+ submitter_id: webhook.agent.email,
214
+ priority: "urgent"
215
+ )
216
+ end
217
+ end
218
+
219
+ def handle_custom_channel_webhook
220
+ webhook = Qismo::WebhookRequests::OnCustomChannelMessageSent.new(JSON.parse(request.raw_body))
221
+
222
+ # Do any action you want
223
+ # The following example assuming you want to reply customer's message from Twitter
224
+ # Assuming that you have installed and setup twitter ruby client
225
+
226
+ # Fetch customer from room participants
227
+ customer = webhook.payload.room.participants.find { |participant| participant.email.start_with?("twitter_customer_") }
228
+ if customer.present?
229
+ twitter_rest_client.create_direct_message(webhook.payload.rooms, webhook.payload.message.text)
230
+ end
231
+ end
232
+
233
+ def handle_bot_webhook
234
+ webhook = Qismo::WebhookRequests::OnMessageForBotSent.new(JSON.parse(request.raw_body))
235
+
236
+ # Do any action you want. The following example assuming you want to use
237
+ # Dialogflow as bot engine
238
+
239
+ # Detect intent for customer's message
240
+ response = dialogflow_client.detect_intent(
241
+ session: "session_#{webhook.payload.room.id}",
242
+ query_input: {
243
+ text: {
244
+ text: webhook.payload.message.text,
245
+ language_code: "en-US"
246
+ }
247
+ }
248
+ )
249
+
250
+ # Parse bot message which will be sent back to customer
251
+ bot_message = response.query_result.fulfillment_text
252
+
253
+ # Send message to Qismo room
254
+ Qismo.send_bot_message(
255
+ webhook.payload.room.id,
256
+ message: bot_message
257
+ )
258
+ end
259
+ end
260
+ ```
data/lib/qismo/api.rb CHANGED
@@ -7,7 +7,18 @@ module Qismo
7
7
  # List customer rooms
8
8
  #
9
9
  # @see https://s.id/list-customer-rooms
10
- # @param options [Hash]
10
+ # @param [Hash] options
11
+ # @option options [String] :status Filter by room status. Valid values are "resolved", "unresolved", "expired", or "almost_expired"
12
+ # @option options [String] :serve_status Filter by room serve status. Valid values are "served" or "unserved"
13
+ # @option options [Array<Hash>] :channels Filter by channels. Example: [{ source: "wa", channel_id: 716171 }]
14
+ # @option options [TrueClass,FalseClass] :is_handled_by_bot Filter by bot handling status
15
+ # @option options [String] :name Filter by customer name
16
+ # @option options [Integer] :limit Number of data returned in one page. Default is 50
17
+ # @option options [String] :order Order data by timestamp. Can be ordered "asc" or "desc". Default is "desc"
18
+ # @option options [String] :cursor_after Next page cursor. If you are on last page, the cursor returned will be nil
19
+ # @option options [String] :cursor_before Previous page cursor. If you are on first page, the cursor returned will be nil
20
+ # @option options [Array<Integer>] :tag_ids Filter by tags
21
+ # @option options [Array<Integer>] :user_ids Filter by agent who handled or assigned to the room
11
22
  # @return [Qismo::CollectionObject]
12
23
  def rooms(options = {})
13
24
  body = post("/api/v2/customer_rooms", options)
@@ -463,7 +474,8 @@ module Qismo
463
474
  # @see https://documenter.getpostman.com/view/8259884/TVsuCSeT#bb77c653-5daa-4e1c-a866-43bca7c494fc
464
475
  # @param options [Hash]
465
476
  # @return [TrueClass]
466
- def send_bot_message(options = {})
477
+ def send_bot_message(room_id, options = {})
478
+ options = options.merge(room_id: room_id.to_s, sender_email: admin_email)
467
479
  post("#{app_id}/bot", options)
468
480
  true
469
481
  end
data/lib/qismo/client.rb CHANGED
@@ -25,6 +25,7 @@ module Qismo
25
25
  }
26
26
 
27
27
  attr_accessor(*DEFAULT_OPTIONS.keys)
28
+ attr_reader :admin_email
28
29
 
29
30
  # Initialize client
30
31
  #
@@ -33,6 +34,8 @@ module Qismo
33
34
  DEFAULT_OPTIONS.merge(options).each do |key, value|
34
35
  instance_variable_set("@#{key}", value)
35
36
  end
37
+
38
+ @admin_email = "#{@app_id}_admin@qismo.com"
36
39
  end
37
40
 
38
41
  # Send http request with post method
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dry-struct"
4
+
5
+ module Qismo
6
+ module Models
7
+ include Qismo::Types
8
+
9
+ class Base < Dry::Struct
10
+ transform_keys(&:to_sym)
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,6 @@
1
+ module Qismo
2
+ module Models
3
+ class CustomerRoom < Base
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,10 @@
1
+ module Qismo
2
+ module Types
3
+ include Dry.Types()
4
+
5
+ Int = Params::Integer
6
+ String = Params::String
7
+ Bool = Params::Bool
8
+ Hash = Params::Hash
9
+ end
10
+ end
data/lib/qismo/version.rb CHANGED
@@ -2,5 +2,5 @@
2
2
 
3
3
  module Qismo
4
4
  # @return [String]
5
- VERSION = "0.12.1"
5
+ VERSION = "0.13.0"
6
6
  end
@@ -0,0 +1,75 @@
1
+ module Qismo
2
+ module WebhookRequests
3
+ class OnAgentAllocationNeeded < Qismo::Models::Base
4
+ # @!attribute [r] avatar_url
5
+ # @return [String]
6
+ # @!attribute [r] created_at
7
+ # @return [String]
8
+ # @!attribute [r] email
9
+ # @return [String]
10
+ # @!attribute [r] force_offline
11
+ # @return [TrueClass,FalseClass]
12
+ # @!attribute [r] id
13
+ # @return [Integer]
14
+ # @!attribute [r] is_available
15
+ # @return [TrueClass,FalseClass]
16
+ # @!attribute [r] is_verified
17
+ # @return [TrueClass,FalseClass]
18
+ # @!attribute [r] last_login
19
+ # @return [String]
20
+ # @!attribute [r] name
21
+ # @return [String]
22
+ # @!attribute [r] sdk_email
23
+ # @return [String]
24
+ # @!attribute [r] sdk_key
25
+ # @return [String]
26
+ # @!attribute [r] updated_at
27
+ # @return [String]
28
+ class CandidateAgent < Qismo::Models::Base
29
+ attribute? :avatar_url, Types::String.optional
30
+ attribute? :created_at, Types::String.optional
31
+ attribute? :email, Types::String.optional
32
+ attribute? :force_offline, Types::Bool.optional
33
+ attribute? :id, Types::Int.optional
34
+ attribute? :is_available, Types::Bool.optional
35
+ attribute? :is_verified, Types::Bool.optional
36
+ attribute? :last_login, Types::String.optional
37
+ attribute? :name, Types::String.optional
38
+ attribute? :sdk_email, Types::String.optional
39
+ attribute? :sdk_key, Types::String.optional
40
+ attribute? :updated_at, Types::String.optional
41
+ end
42
+
43
+ # @!attribute [r] app_id
44
+ # @return [String]
45
+ # @!attribute [r] avatar_url
46
+ # @return [String]
47
+ # @!attribute [r] candidate_agent
48
+ # @return [CandidateAgent]
49
+ # @!attribute [r] email
50
+ # @return [String]
51
+ # @!attribute [r] extras
52
+ # @return [String]
53
+ # @!attribute [r] is_new_session
54
+ # @return [TrueClass,FalseClass]
55
+ # @!attribute [r] is_resolved
56
+ # @return [TrueClass,FalseClass]
57
+ # @!attribute [r] name
58
+ # @return [String]
59
+ # @!attribute [r] room_id
60
+ # @return [String]
61
+ # @!attribute [r] source
62
+ # @return [String]
63
+ attribute? :app_id, Types::String.optional
64
+ attribute? :avatar_url, Types::String.optional
65
+ attribute? :candidate_agent, CandidateAgent
66
+ attribute? :email, Types::String.optional
67
+ attribute? :extras, Types::String.optional
68
+ attribute? :is_new_session, Types::Bool.optional
69
+ attribute? :is_resolved, Types::Bool.optional
70
+ attribute? :name, Types::String.optional
71
+ attribute? :room_id, Types::String.optional
72
+ attribute? :source, Types::String.optional
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,86 @@
1
+ module Qismo
2
+ module WebhookRequests
3
+ # @!attribute [r] additional_info
4
+ # @return [Array<AdditionalInfo>]
5
+ # @!attribute [r] agent
6
+ # @return [Agent]
7
+ # @!attribute [r] channel_id
8
+ # @return [Integer]
9
+ # @!attribute [r] channel_name
10
+ # @return [String]
11
+ # @!attribute [r] channel_type
12
+ # @return [String]
13
+ # @!attribute [r] customer
14
+ # @return [Customer]
15
+ # @!attribute [r] notes
16
+ # @return [String]
17
+ # @!attribute [r] room_id
18
+ # @return [Integer]
19
+ # @!attribute [r] tag
20
+ # @return [Array<Tag>]
21
+ class OnCustomButtonClicked < Qismo::Models::Base
22
+ # @!parse include Qismo::Models
23
+
24
+ # @!attribute [r] key
25
+ # @return [String]
26
+ # @!attribute [r] value
27
+ # @return [String,Integer,TrueClass,FalseClass]
28
+ class AdditionalInfo < Qismo::Models::Base
29
+ attribute? :key, Types::String.optional
30
+ attribute? :value, (Types::String.optional | Types::Int.optional | Types::Params::Bool.optional)
31
+ end
32
+
33
+ # @!attribute [r] email
34
+ # @return [String]
35
+ # @!attribute [r] name
36
+ # @return [String]
37
+ # @!attribute [r] type
38
+ # @return [String]
39
+ class Agent < Qismo::Models::Base
40
+ attribute? :email, Types::String.optional
41
+ attribute? :name, Types::String.optional
42
+ attribute? :type, Types::String.optional
43
+ end
44
+
45
+ # @!attribute [r] avatar
46
+ # @return [String]
47
+ # @!attribute [r] name
48
+ # @return [String]
49
+ # @!attribute [r] user_id
50
+ # @return [String]
51
+ class Customer < Qismo::Models::Base
52
+ attribute? :avatar, Types::String.optional
53
+ attribute? :name, Types::String.optional
54
+ attribute? :user_id, Types::String.optional
55
+ end
56
+
57
+ # @!attribute [r] id
58
+ # @return [Integer]
59
+ # @!attribute [r] name
60
+ # @return [String]
61
+ # @!attribute [r] created_at
62
+ # @return [String]
63
+ # @!attribute [r] updated_at
64
+ # @return [String]
65
+ # @!attribute [r] room_tag_created_at
66
+ # @return [String]
67
+ class Tag < Qismo::Models::Base
68
+ attribute? :id, Types::Int.optional
69
+ attribute? :name, Types::String.optional
70
+ attribute? :created_at, Types::String.optional
71
+ attribute? :updated_at, Types::String.optional
72
+ attribute? :room_tag_created, Types::String.optional
73
+ end
74
+
75
+ attribute? :additional_info, Types.Array(AdditionalInfo.optional).optional
76
+ attribute? :agent, Agent.optional
77
+ attribute? :channel_id, Types::Int.optional
78
+ attribute? :channel_name, Types::String.optional
79
+ attribute? :channel_type, Types::String.optional
80
+ attribute? :customer, Customer.optional
81
+ attribute? :notes, Types::String.optional
82
+ attribute? :room_id, Types::Int.optional
83
+ attribute? :tag, Types.Array(Tag.optional).optional
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,95 @@
1
+ module Qismo
2
+ module WebhookRequests
3
+ # @!attribute [r] payload
4
+ # @return [Payload]
5
+ class OnCustomChannelMessageSent < Qismo::Models::Base
6
+ # @!attribute [r] avatar_url
7
+ # @return [String]
8
+ # @!attribute [r] email
9
+ # @return [String]
10
+ # @!attribute [r] id
11
+ # @return [Integer]
12
+ # @!attribute [r] name
13
+ # @return [String]
14
+ class From < Qismo::Models::Base
15
+ attribute? :avatar_url, Types::String.optional
16
+ attribute? :email, Types::String.optional
17
+ attribute? :id, Types::Int.optional
18
+ attribute? :name, Types::String.optional
19
+ end
20
+
21
+ # @!attribute [r] comment_before_id
22
+ # @return [Integer]
23
+ # @!attribute [r] created_at
24
+ # @return [String]
25
+ # @!attribute [r] id
26
+ # @return [Integer]
27
+ # @!attribute [r] payload
28
+ # @return [Hash]
29
+ # @!attribute [r] text
30
+ # @return [String]
31
+ # @!attribute [r] timestamp
32
+ # @return [String]
33
+ # @!attribute [r] type
34
+ # @return [String]
35
+ # @!attribute [r] unique_temp_id
36
+ # @return [String]
37
+ # @!attribute [r] unix_nano_timestamp
38
+ # @return [String]
39
+ # @!attribute [r] unix_timestamp
40
+ # @return [String]
41
+ class Message < Qismo::Models::Base
42
+ attribute? :comment_before_id, Types::Int.optional
43
+ attribute? :created_at, Types::String.optional
44
+ attribute? :id, Types::Int.optional
45
+ attribute? :payload, Types::Hash.optional
46
+ attribute? :text, Types::String.optional
47
+ attribute? :timestamp, Types::String.optional
48
+ attribute? :type, Types::String.optional
49
+ attribute? :unique_temp_id, Types::String.optional
50
+ attribute? :unix_nano_timestamp, Types::String.optional
51
+ attribute? :unix_timestamp, Types::String.optional
52
+ end
53
+
54
+ # @!attribute [r] email
55
+ # @return [String]
56
+ class Participant < Qismo::Models::Base
57
+ attribute? :email, Types::String.optional
58
+ end
59
+
60
+ # @!attribute [r] id
61
+ # @return [String]
62
+ # @!attribute [r] name
63
+ # @return [String]
64
+ # @!attribute [r] options
65
+ # @return [String]
66
+ # @!attribute [r] participants
67
+ # @return [Array<Participant>]
68
+ # @!attribute [r] room_avatar
69
+ # @return [String]
70
+ class Room < Qismo::Models::Base
71
+ attribute? :id, Types::String.optional
72
+ attribute? :name, Types::String.optional
73
+ attribute? :options, Types::String.optional
74
+ attribute? :participants, Types.Array(Participant.optional).optional
75
+ attribute? :room_avatar, Types::String.optional
76
+ end
77
+
78
+ # @!attribute [r] from
79
+ # @return [From]
80
+ # @!attribute [r] message
81
+ # @return [Message]
82
+ # @!attribute [r] room
83
+ # @return [Room]
84
+ # @!attribute [r] type
85
+ # @return [String]
86
+ class Payload < Qismo::Models::Base
87
+ attribute? :from, From.optional
88
+ attribute? :message, Message.optional
89
+ attribute? :room, Room.optional
90
+ end
91
+
92
+ attribute? :payload, Payload.optional
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,95 @@
1
+ module Qismo
2
+ module WebhookRequests
3
+ class OnMessageForBotSent < Qismo::Models::Base
4
+ # @!attribute [r] avatar_url
5
+ # @return [String]
6
+ # @!attribute [r] email
7
+ # @return [String]
8
+ # @!attribute [r] id
9
+ # @return [Integer]
10
+ # @!attribute [r] name
11
+ # @return [String]
12
+ class From < Qismo::Models::Base
13
+ attribute? :avatar_url, Types::String.optional
14
+ attribute? :email, Types::String.optional
15
+ attribute? :id, Types::Int.optional
16
+ attribute? :name, Types::String.optional
17
+ end
18
+
19
+ # @!attribute [r] comment_before_id
20
+ # @return [Integer]
21
+ # @!attribute [r] created_at
22
+ # @return [String]
23
+ # @!attribute [r] id
24
+ # @return [Integer]
25
+ # @!attribute [r] payload
26
+ # @return [Hash]
27
+ # @!attribute [r] text
28
+ # @return [String]
29
+ # @!attribute [r] timestamp
30
+ # @return [String]
31
+ # @!attribute [r] type
32
+ # @return [String]
33
+ # @!attribute [r] unique_temp_id
34
+ # @return [String]
35
+ # @!attribute [r] unix_nano_timestamp
36
+ # @return [String]
37
+ # @!attribute [r] unix_timestamp
38
+ # @return [String]
39
+ class Message < Qismo::Models::Base
40
+ attribute? :comment_before_id, Types::Int.optional
41
+ attribute? :created_at, Types::String.optional
42
+ attribute? :id, Types::Int.optional
43
+ attribute? :payload, Types::Hash.optional
44
+ attribute? :text, Types::String.optional
45
+ attribute? :timestamp, Types::String.optional
46
+ attribute? :type, Types::String.optional
47
+ attribute? :unique_temp_id, Types::String.optional
48
+ attribute? :unix_nano_timestamp, Types::String.optional
49
+ attribute? :unix_timestamp, Types::String.optional
50
+ end
51
+
52
+ # @!attribute [r] email
53
+ # @return [String]
54
+ class Participant < Qismo::Models::Base
55
+ attribute? :email, Types::String.optional
56
+ end
57
+
58
+ # @!attribute [r] id
59
+ # @return [String]
60
+ # @!attribute [r] name
61
+ # @return [String]
62
+ # @!attribute [r] options
63
+ # @return [String]
64
+ # @!attribute [r] participants
65
+ # @return [Array<Participant>]
66
+ # @!attribute [r] room_avatar
67
+ # @return [String]
68
+ class Room < Qismo::Models::Base
69
+ attribute? :id, Types::String.optional
70
+ attribute? :name, Types::String.optional
71
+ attribute? :options, Types::String.optional
72
+ attribute? :participants, Types.Array(Participant.optional).optional
73
+ attribute? :room_avatar, Types::String.optional
74
+ end
75
+
76
+ # @!attribute [r] from
77
+ # @return [From]
78
+ # @!attribute [r] message
79
+ # @return [Message]
80
+ # @!attribute [r] room
81
+ # @return [Room]
82
+ # @!attribute [r] type
83
+ # @return [String]
84
+ class Payload < Qismo::Models::Base
85
+ attribute? :from, From.optional
86
+ attribute? :message, Message.optional
87
+ attribute? :room, Room.optional
88
+ end
89
+
90
+ # @!attribute [r] payload
91
+ # @return [Payload]
92
+ attribute? :payload, Payload.optional
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,170 @@
1
+ module Qismo
2
+ module WebhookRequests
3
+ # @!attribute [r] is_new_session
4
+ # @return [TrueClass,FalseClass]
5
+ # @!attribute [r] payload
6
+ # @return [Payload]
7
+ # @!attribute [r] room_log
8
+ # @return [RoomLog]
9
+ class OnNewSessionInitiated < Qismo::Models::Base
10
+ # @!attribute [r] avatar_url
11
+ # @return [String]
12
+ # @!attribute [r] email
13
+ # @return [String]
14
+ # @!attribute [r] id
15
+ # @return [Integer]
16
+ # @!attribute [r] name
17
+ # @return [String]
18
+ class From < Qismo::Models::Base
19
+ attribute? :avatar_url, Types::String.optional
20
+ attribute? :email, Types::String.optional
21
+ attribute? :id, Types::Int.optional
22
+ attribute? :name, Types::String.optional
23
+ end
24
+
25
+ # @!attribute [r] comment_before_id
26
+ # @return [Integer]
27
+ # @!attribute [r] created_at
28
+ # @return [String]
29
+ # @!attribute [r] id
30
+ # @return [Integer]
31
+ # @!attribute [r] payload
32
+ # @return [Hash]
33
+ # @!attribute [r] text
34
+ # @return [String]
35
+ # @!attribute [r] timestamp
36
+ # @return [String]
37
+ # @!attribute [r] type
38
+ # @return [String]
39
+ # @!attribute [r] unique_temp_id
40
+ # @return [String]
41
+ # @!attribute [r] unix_nano_timestamp
42
+ # @return [String]
43
+ # @!attribute [r] unix_timestamp
44
+ # @return [String]
45
+ class Message < Qismo::Models::Base
46
+ attribute? :comment_before_id, Types::Int.optional
47
+ attribute? :created_at, Types::String.optional
48
+ attribute? :id, Types::Int.optional
49
+ attribute? :payload, Types::Hash.optional
50
+ attribute? :text, Types::String.optional
51
+ attribute? :timestamp, Types::String.optional
52
+ attribute? :type, Types::String.optional
53
+ attribute? :unique_temp_id, Types::String.optional
54
+ attribute? :unix_nano_timestamp, Types::String.optional
55
+ attribute? :unix_timestamp, Types::String.optional
56
+ end
57
+
58
+ # @!attribute [r] email
59
+ # @return [String]
60
+ class Participant < Qismo::Models::Base
61
+ attribute? :email, Types::String.optional
62
+ end
63
+
64
+ # @!attribute [r] id
65
+ # @return [String]
66
+ # @!attribute [r] name
67
+ # @return [String]
68
+ # @!attribute [r] options
69
+ # @return [String]
70
+ # @!attribute [r] participants
71
+ # @return [Array<Participant>]
72
+ # @!attribute [r] room_avatar
73
+ # @return [String]
74
+ class Room < Qismo::Models::Base
75
+ attribute? :id, Types::String.optional
76
+ attribute? :name, Types::String.optional
77
+ attribute? :options, Types::String.optional
78
+ attribute? :participants, Types.Array(Participant.optional).optional
79
+ attribute? :room_avatar, Types::String.optional
80
+ end
81
+
82
+ # @!attribute [r] from
83
+ # @return [From]
84
+ # @!attribute [r] message
85
+ # @return [Message]
86
+ # @!attribute [r] room
87
+ # @return [Room]
88
+ # @!attribute [r] type
89
+ # @return [String]
90
+ class Payload < Qismo::Models::Base
91
+ attribute? :from, From.optional
92
+ attribute? :message, Message.optional
93
+ attribute? :room, Room.optional
94
+ end
95
+
96
+ # @!attribute [r] key
97
+ # @return [String]
98
+ # @!attribute [r] value
99
+ # @return [String,Integer,TrueClass,FalseClass]
100
+ class UserProperty < Qismo::Models::Base
101
+ attribute? :key, Types::String.optional
102
+ attribute? :value, (Types::String.optional | Types::Int.optional | Types::Params::Bool.optional)
103
+ end
104
+
105
+ # @!attribute [r] timezone_offset
106
+ # @return [String]
107
+ class AdditionalExtras < Qismo::Models::Base
108
+ attribute? :timezone_offset, Types::String
109
+ end
110
+
111
+ # @!attribute [r] additional_extras
112
+ # @return [AdditionalExtras]
113
+ # @!attribute [r] notes
114
+ # @return [String]
115
+ # @!attribute [r] timezone_offset
116
+ # @return [String]
117
+ # @!attribute [r] user_properties
118
+ # @return [Array<UserProperty>]
119
+ class Extras < Qismo::Models::Base
120
+ attribute? :additional_extras, AdditionalExtras.optional
121
+ attribute? :notes, Types::String
122
+ attribute? :timezone_offset, Types::String
123
+ attribute? :user_properties, Types.Array(UserProperty.optional).optional
124
+ end
125
+
126
+ # @!attribute [r] channel_id
127
+ # @return [Integer]
128
+ # @!attribute [r] created_at
129
+ # @return [String]
130
+ # @!attribute [r] extras
131
+ # @return [String]
132
+ # @!attribute [r] has_no_message
133
+ # @return [TrueClass,FalseClass]
134
+ # @!attribute [r] is_waiting
135
+ # @return [TrueClass,FalseClass]
136
+ # @!attribute [r] name
137
+ # @return [String]
138
+ # @!attribute [r] resolved
139
+ # @return [TrueClass,FalseClass]
140
+ # @!attribute [r] room_badge
141
+ # @return [String]
142
+ # @!attribute [r] room_id
143
+ # @return [String]
144
+ # @!attribute [r] source
145
+ # @return [String]
146
+ # @!attribute [r] user_avatar_url
147
+ # @return [String]
148
+ # @!attribute [r] user_id
149
+ # @return [String]
150
+ class RoomLog < Qismo::Models::Base
151
+ attribute? :channel_id, Types::Int
152
+ attribute? :created_at, Types::String
153
+ attribute? :extras, Extras
154
+ attribute? :has_no_message, Types::Bool
155
+ attribute? :is_waiting, Types::Nil
156
+ attribute? :name, Types::String
157
+ attribute? :resolved, Types::Bool
158
+ attribute? :room_badge, Types::String
159
+ attribute? :room_id, Types::String
160
+ attribute? :source, Types::String
161
+ attribute? :user_avatar_url, Types::String
162
+ attribute? :user_id, Types::String
163
+ end
164
+
165
+ attribute? :is_new_session, Types::Bool
166
+ attribute? :payload, Payload
167
+ attribute? :room_log, RoomLog
168
+ end
169
+ end
170
+ end
@@ -0,0 +1,81 @@
1
+ module Qismo
2
+ module WebhookRequests
3
+ # @!attribute [r] customer
4
+ # @return [Customer]
5
+ # @!attribute [r] resolved_by
6
+ # @return [ResolvedBy]
7
+ # @!attribute [r] service
8
+ # @return [Service]
9
+ class OnRoomResolved < Qismo::Models::Base
10
+ # @!attribute [r] key
11
+ # @return [String]
12
+ # @!attribute [r] value
13
+ # @return [String,Integer,TrueClass,FalseClass]
14
+ class AdditionalInfo < Qismo::Models::Base
15
+ attribute? :key, Types::String.optional
16
+ attribute? :value, (Types::String.optional | Types::Int.optional | Types::Params::Bool.optional)
17
+ end
18
+
19
+ # @!attribute [r] additional_info
20
+ # @return [Array<AdditionalInfo>]
21
+ # @!attribute [r] avatar
22
+ # @return [String]
23
+ # @!attribute [r] name
24
+ # @return [String]
25
+ # @!attribute [r] user_id
26
+ # @return [String]
27
+ class Customer < Qismo::Models::Base
28
+ attribute? :additional_info, Types.Array(AdditionalInfo.optional).optional
29
+ attribute? :avatar, Types::String.optional
30
+ attribute? :name, Types::String.optional
31
+ attribute? :user_id, Types::String.optional
32
+ end
33
+
34
+ # @!attribute [r] email
35
+ # @return [String]
36
+ # @!attribute [r] id
37
+ # @return [Integer]
38
+ # @!attribute [r] is_available
39
+ # @return [TrueClass,FalseClass]
40
+ # @!attribute [r] name
41
+ # @return [String]
42
+ # @!attribute [r] type
43
+ # @return [String]
44
+ class ResolvedBy < Qismo::Models::Base
45
+ attribute? :email, Types::String.optional
46
+ attribute? :id, Types::Int.optional
47
+ attribute? :is_available, Types::Bool.optional
48
+ attribute? :name, Types::String.optional
49
+ attribute? :type, Types::String.optional
50
+ end
51
+
52
+ # @!attribute [r] first_comment_id
53
+ # @return [String]
54
+ # @!attribute [r] last_comment_id
55
+ # @return [String]
56
+ # @!attribute [r] id
57
+ # @return [Integer]
58
+ # @!attribute [r] is_resolved
59
+ # @return [TrueClass,FalseClass]
60
+ # @!attribute [r] notes
61
+ # @return [String]
62
+ # @!attribute [r] room_id
63
+ # @return [String]
64
+ # @!attribute [r] source
65
+ # @return [String]
66
+ class Service < Qismo::Models::Base
67
+ attribute? :first_comment_id, Types::String.optional
68
+ attribute? :last_comment_id, Types::String.optional
69
+ attribute? :id, Types::Int.optional
70
+ attribute? :is_resolved, Types::Bool.optional
71
+ attribute? :notes, Types::String.optional
72
+ attribute? :room_id, Types::String.optional
73
+ attribute? :source, Types::String.optional
74
+ end
75
+
76
+ attribute? :customer, Customer
77
+ attribute? :resolved_by, ResolvedBy
78
+ attribute? :service, Service
79
+ end
80
+ end
81
+ end
data/lib/qismo.rb CHANGED
@@ -1,19 +1,31 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "active_support/all"
4
+ require "dry-struct"
4
5
  require "http"
5
6
 
6
- require "qismo/util"
7
7
  require "qismo/version"
8
+ require "qismo/types"
9
+ require "qismo/util"
10
+
11
+ require "qismo/models/base"
12
+
13
+ require "qismo/webhook_requests/on_agent_allocation_needed"
14
+ require "qismo/webhook_requests/on_custom_button_clicked"
15
+ require "qismo/webhook_requests/on_custom_channel_message_sent"
16
+ require "qismo/webhook_requests/on_message_for_bot_sent"
17
+ require "qismo/webhook_requests/on_new_session_initiated"
18
+ require "qismo/webhook_requests/on_room_resolved"
19
+
8
20
  require "qismo/error"
9
21
  require "qismo/model"
10
22
  require "qismo/api"
11
23
  require "qismo/client"
12
24
 
13
25
  module Qismo
14
- # @!parse extend Qismo::Api
15
-
16
26
  class << self
27
+ # @!parse extend Qismo::Api
28
+
17
29
  def configure
18
30
  yield client
19
31
 
data/qismo.gemspec CHANGED
@@ -43,4 +43,5 @@ Gem::Specification.new do |spec|
43
43
 
44
44
  spec.add_runtime_dependency("activesupport")
45
45
  spec.add_runtime_dependency("http")
46
+ spec.add_runtime_dependency("dry-struct", "~> 1.6")
46
47
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: qismo
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.12.1
4
+ version: 0.13.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Qiscus Integration
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-12-08 00:00:00.000000000 Z
11
+ date: 2022-12-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -38,6 +38,20 @@ dependencies:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: dry-struct
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.6'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.6'
41
55
  description: Ruby wrapper for Qiscus Omnichannel public API
42
56
  email:
43
57
  - developer@qiscus.net
@@ -53,8 +67,17 @@ files:
53
67
  - lib/qismo/client.rb
54
68
  - lib/qismo/error.rb
55
69
  - lib/qismo/model.rb
70
+ - lib/qismo/models/base.rb
71
+ - lib/qismo/models/customer_room.rb
72
+ - lib/qismo/types.rb
56
73
  - lib/qismo/util.rb
57
74
  - lib/qismo/version.rb
75
+ - lib/qismo/webhook_requests/on_agent_allocation_needed.rb
76
+ - lib/qismo/webhook_requests/on_custom_button_clicked.rb
77
+ - lib/qismo/webhook_requests/on_custom_channel_message_sent.rb
78
+ - lib/qismo/webhook_requests/on_message_for_bot_sent.rb
79
+ - lib/qismo/webhook_requests/on_new_session_initiated.rb
80
+ - lib/qismo/webhook_requests/on_room_resolved.rb
58
81
  - qismo.gemspec
59
82
  homepage: https://bitbucket.org/qiscus/qismo-rb
60
83
  licenses: