qismo 0.5.0 → 0.7.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: 835aca8c69a0b94f348930cefdc3454d2d90c131718bc1d825960e928ca43c3b
4
- data.tar.gz: '0240594c5422307db61e8dc208cef8ac06513c76bde7fda0ba649920bf4a400c'
3
+ metadata.gz: be7d855a466237baededa8d61cbf42a88a52ff245c82b3a3ee2ecce2dd5ded47
4
+ data.tar.gz: 190f309eed38161f7718ce842e02a6e1e3d2c0e961096263b2ac003ca7216a29
5
5
  SHA512:
6
- metadata.gz: 57b4ebebb1efea8ea65f47b53cab0d8057864afd45ee5df75a05e0fd9c36ad7d4ee68d591d8e5d5e30d869787d22eb93a90a2da4a973dde5f7f0613215aff99d
7
- data.tar.gz: 305fa3917126e9abccdf3ed2c517e8a305675b6ad3aa46d3adb91a42fc0219d38da49bb57a2f391e6ba8b2393982a78d4d3a0022b1211dc46feb71c71e2d726d
6
+ metadata.gz: d9ac3a4baa95ae52792801be684cac5d6d9de3c6bc271e50d2788fab62f243dafe9c8e05721d04d1004a02de22f89406b67e1bed8414315506d331a900738e95
7
+ data.tar.gz: 7ec9a32d43b4025809ada7d61af3e7dedcb9439c5ef074961e31e7714d1122c1a854e45126b8171af9d45c2b77ca364b4cd1032cd71ed1bfd43fc323b1d764ac
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- qismo (0.1.0)
4
+ qismo (0.6.0)
5
5
  activesupport
6
6
  http
7
7
 
data/lib/qismo/api.rb CHANGED
@@ -8,22 +8,10 @@ module Qismo
8
8
  body = post("/api/v2/customer_rooms", opt)
9
9
  Collection.new(
10
10
  body.data.customer_rooms,
11
- prev_page: body.meta.cursor_before,
12
- next_page: body.meta.cursor_after,
13
- prev_func: -> do
14
- if body.meta.cursor_before.nil? || body.meta.cursor_before.empty?
15
- Collection.new([])
16
- else
17
- rooms(opt.merge(cursor_before: body.meta.cursor_before))
18
- end
19
- end,
20
- next_func: -> do
21
- if body.meta.cursor_after.nil? || body.meta.cursor_after.empty?
22
- Collection.new([])
23
- else
24
- rooms(opt.merge(cursor_after: body.meta.cursor_after))
25
- end
26
- end,
11
+ prev_page: body.meta&.cursor_before,
12
+ next_page: body.meta&.cursor_after,
13
+ prev_func: -> { rooms(opt.merge(cursor_before: body.meta&.cursor_before)) },
14
+ next_func: -> { rooms(opt.merge(cursor_after: body.meta&.cursor_after)) },
27
15
  )
28
16
  end
29
17
 
@@ -50,7 +38,17 @@ module Qismo
50
38
 
51
39
  def room_broadcast_history(room_id, **opt)
52
40
  body = get("/api/v2/customer_rooms/#{room_id}/broadcast_history", opt)
53
- Collection.new(body.data.broadcast_logs, body.data.meta)
41
+
42
+ next_page = body.meta.page < body.meta.total_page ? (body.meta.page + 1) : nil
43
+ prev_page = body.meta.page > 1 ? (body.meta.page - 1) : nil
44
+
45
+ Collection.new(
46
+ body.data.broadcast_logs,
47
+ next_page: next_page,
48
+ prev_page: prev_page,
49
+ next_func: -> { room_broadcast_history(opt.merge(page: next_page)) },
50
+ prev_func: -> { room_broadcast_history(opt.merge(page: prev_page)) },
51
+ )
54
52
  end
55
53
 
56
54
  def assign_agent(room_id, agent_id, **opt)
@@ -81,12 +79,24 @@ module Qismo
81
79
 
82
80
  def other_agents(room_id, **opt)
83
81
  body = get("/api/v2/admin/service/other_agents", opt.merge(room_id: room_id))
84
- Collection.new(body.data.agents, body.meta)
82
+ Collection.new(
83
+ body.data.agents,
84
+ prev_page: body.meta&.cursor_before,
85
+ next_page: body.meta&.cursor_after,
86
+ prev_func: -> { other_agents(opt.merge(cursor_before: body.meta&.cursor_before)) },
87
+ next_func: -> { other_agents(opt.merge(cursor_after: body.meta&.cursor_after)) },
88
+ )
85
89
  end
86
90
 
87
91
  def available_agents(room_id, **opt)
88
92
  body = get("/api/v2/admin/service/available_agents", opt.merge(room_id: room_id))
89
- Collection.new(body.data.agents, body.meta)
93
+ Collection.new(
94
+ body.data.agents,
95
+ prev_page: body.meta&.cursor_before,
96
+ next_page: body.meta&.cursor_after,
97
+ prev_func: -> { available_agents(opt.merge(cursor_before: body.meta&.cursor_before)) },
98
+ next_func: -> { available_agents(opt.merge(cursor_after: body.meta&.cursor_after)) },
99
+ )
90
100
  end
91
101
 
92
102
  def new_session_webhook
@@ -114,16 +124,42 @@ module Qismo
114
124
  end
115
125
 
116
126
  def agents(**opt)
127
+ if opt[:page].nil? || opt[:page].empty?
128
+ opt[:page] = 1
129
+ end
130
+
117
131
  body = get("/api/v2/admin/agents", opt)
118
- [body.data.agents, body.meta]
132
+
133
+ total_page = (body.meta.total_count.to_f / body.meta.per_page.to_f).ceil
134
+ next_page = opt[:page] < total_page ? (opt[:page] + 1) : nil
135
+ prev_page = opt[:page] > 1 ? (opt[:page] - 1) : nil
136
+
137
+ Collection.new(
138
+ body.data.agents,
139
+ next_page: next_page,
140
+ prev_page: prev_page,
141
+ next_func: -> { agents(opt.merge(page: next_page)) },
142
+ prev_func: -> { agents(opt.merge(page: prev_page)) },
143
+ )
119
144
  end
120
145
 
121
146
  def agents_by_ids(*ids)
122
- get("/api/v1/admin/agents/get_by_ids", ids: ids).data
147
+ get("/api/v1/admin/agents/get_by_ids", **{ "ids[]": ids }).data
123
148
  end
124
149
 
125
- def agent_by_divisions(*division_ids, **opt)
126
- get("/api/v2/admin/agents/by_division", opt.merge(division_ids: division_ids)).data
150
+ def agents_by_divisions(*division_ids, **opt)
151
+ body = get("/api/v2/admin/agents/by_division", opt.merge({ "division_ids[]": division_ids }))
152
+
153
+ next_page = body.meta.page < body.meta.total_page ? (body.meta.page + 1) : nil
154
+ prev_page = body.meta.page > 1 ? (body.meta.page - 1) : nil
155
+
156
+ Collection.new(
157
+ body.data,
158
+ next_page: next_page,
159
+ prev_page: prev_page,
160
+ next_func: -> { agents_by_divisions(opt.merge(page: next_page)) },
161
+ prev_func: -> { agents_by_divisions(opt.merge(page: prev_page)) },
162
+ )
127
163
  end
128
164
 
129
165
  def agent(agent_id)
@@ -131,12 +167,27 @@ module Qismo
131
167
  end
132
168
 
133
169
  def office_hours
134
- get("/api/v1/admin/office_hours").data
170
+ data = get("/api/v1/admin/office_hours").data
171
+ data_hash = data.as_json
172
+ data_hash["is_in_office_hour"] = Util.in_office_hour?(data)
173
+
174
+ DataObject.new(data_hash)
135
175
  end
136
176
 
137
177
  def wa_broadcast_templates(**opt)
138
- body = get("/api/v2/admin/hsm", opt)
139
- [body.data.hsm_templates, body.meta]
178
+ body = get("/api/v3/admin/hsm", opt)
179
+
180
+ meta = body.meta
181
+ next_page = meta.page < meta.total_page ? (meta.page + 1) : nil
182
+ prev_page = meta.page > 1 ? (meta.page - 1) : nil
183
+
184
+ Collection.new(
185
+ body.data.hsm_templates,
186
+ next_page: next_page,
187
+ prev_page: prev_page,
188
+ next_func: -> { wa_broadcast_templates(opt.merge(page: next_page)) },
189
+ prev_func: -> { wa_broadcast_templates(opt.merge(page: prev_page)) },
190
+ )
140
191
  end
141
192
 
142
193
  def send_wa_outbound(**opt)
data/lib/qismo/client.rb CHANGED
@@ -28,13 +28,13 @@ module Qismo
28
28
  end
29
29
 
30
30
  def get(path, **params)
31
- request(:get, path, params)
31
+ request(:get, path, params: params)
32
32
  end
33
33
 
34
34
  def request(method, path, **opt)
35
35
  res = connection.request(method, @url + path, opt.compact)
36
36
  if res.status.success?
37
- return JSON.parse(res.to_s, object_class: Data)
37
+ return DataObject.new(JSON.parse(res.to_s))
38
38
  end
39
39
 
40
40
  if res.status.server_error?
@@ -42,9 +42,10 @@ module Qismo
42
42
  end
43
43
 
44
44
  if res.status.client_error?
45
- body = JSON.parse(res.to_s, object_class: Data)
45
+ body = DataObject.new(JSON.parse(res.to_s))
46
+
46
47
  error = body.errors
47
- error = error.message if error.is_a?(Hash)
48
+ error = error.message if error.is_a?(DataObject)
48
49
 
49
50
  error_klass_map = {
50
51
  400 => BadRequestError,
data/lib/qismo/model.rb CHANGED
@@ -1,48 +1,80 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Qismo
4
- module Model
5
- class Data < OpenStruct # rubocop:disable Style/OpenStructUse
4
+ class DataObject
5
+ def initialize(opt = {})
6
+ opt.each do |key, value|
7
+ value = if value.is_a?(Array)
8
+ handle_array(value)
9
+ # instance_variable_set("@#{key}", handle_array(value))
10
+ elsif value.is_a?(Hash)
11
+ self.class.new(value)
12
+ # instance_variable_set("@#{key}", self.class.new(value))
13
+ else
14
+ value
15
+ # instance_variable_set("@#{key}", value)
16
+ end
17
+
18
+ self.class.attr_reader(key.to_sym)
19
+ instance_variable_set("@#{key}", value)
20
+ end
6
21
  end
7
22
 
8
- class Collection < Array
9
- def initialize(data, prev_page: nil, next_page: nil, prev_func: -> { nil }, next_func: -> { nil })
10
- super(data)
23
+ def inspect
24
+ inspected_func ||= -> do
25
+ attributes = instance_variables.map do |iv|
26
+ "#{iv.to_s.delete_prefix("@")}=#{instance_variable_get(iv).inspect}"
27
+ end
11
28
 
12
- @prev_page = prev_page
13
- @next_page = next_page
14
- @prev_func = prev_func
15
- @next_func = next_func
29
+ "#<#{self.class.name} #{attributes.join(", ")}>"
16
30
  end
17
31
 
18
- def has_next_page?
19
- @next_page != nil
20
- end
32
+ inspected_func.call
33
+ end
21
34
 
22
- alias_method :next_page?, :has_next_page?
35
+ alias_method :to_s, :inspect
23
36
 
24
- def has_prev_page?
25
- @prev_page != nil
37
+ private
38
+
39
+ def handle_array(values)
40
+ values.map do |value|
41
+ if value.is_a?(Hash)
42
+ self.class.new(value)
43
+ else
44
+ value
45
+ end
26
46
  end
47
+ end
48
+ end
27
49
 
28
- alias_method :prev_page?, :has_prev_page?
50
+ class Collection < Array
51
+ def initialize(data, prev_page: nil, next_page: nil, prev_func: -> { nil }, next_func: -> { nil })
52
+ super(data)
29
53
 
30
- def next_page
31
- @next_func.call
32
- end
54
+ @prev_page = prev_page
55
+ @next_page = next_page
56
+ @prev_func = prev_func
57
+ @next_func = next_func
58
+ end
33
59
 
34
- def prev_page
35
- @prev_func.call
36
- end
60
+ def has_next_page?
61
+ @next_page != nil
37
62
  end
38
63
 
39
- class Response
40
- attr_reader :data, :meta
64
+ alias_method :next_page?, :has_next_page?
41
65
 
42
- def initialize(data, meta = {})
43
- @data = data
44
- @meta = meta
45
- end
66
+ def has_prev_page?
67
+ @prev_page != nil
68
+ end
69
+
70
+ alias_method :prev_page?, :has_prev_page?
71
+
72
+ def next_page
73
+ @next_func.call if has_next_page?
74
+ end
75
+
76
+ def prev_page
77
+ @prev_func.call if has_prev_page?
46
78
  end
47
79
  end
48
80
  end
data/lib/qismo/util.rb ADDED
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Qismo
4
+ class Util
5
+ class << self
6
+ def in_office_hour?(data)
7
+ return false if data.timezone.blank?
8
+
9
+ offset = Time.zone_offset(data.timezone)
10
+ tz_current = Time.current.getlocal(offset)
11
+
12
+ today_office_hour = data.office_hours.find { |oh| oh.day == tz_current.strftime("%u").to_i }
13
+ return false if today_office_hour.nil?
14
+
15
+ start_hour = today_office_hour.starttime
16
+ end_hour = today_office_hour.endtime
17
+
18
+ start_time = Time.parse("#{tz_current.year}-#{tz_current.month}-#{tz_current.day} #{start_hour} #{data.timezone}")
19
+ end_time = Time.parse("#{tz_current.year}-#{tz_current.month}-#{tz_current.day} #{end_hour} #{data.timezone}")
20
+
21
+ tz_current.between?(start_time, end_time)
22
+ end
23
+ end
24
+ end
25
+ end
data/lib/qismo/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Qismo
4
- VERSION = "0.5.0"
4
+ VERSION = "0.7.0"
5
5
  end
data/lib/qismo.rb CHANGED
@@ -1,7 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "active_support/all"
3
4
  require "http"
4
5
 
6
+ require "qismo/util"
5
7
  require "qismo/version"
6
8
  require "qismo/error"
7
9
  require "qismo/model"
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.5.0
4
+ version: 0.7.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-04 00:00:00.000000000 Z
11
+ date: 2022-12-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -127,6 +127,7 @@ files:
127
127
  - lib/qismo/client.rb
128
128
  - lib/qismo/error.rb
129
129
  - lib/qismo/model.rb
130
+ - lib/qismo/util.rb
130
131
  - lib/qismo/version.rb
131
132
  homepage: https://qiscus.com
132
133
  licenses: