pusher-chatkit-server 0.1.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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 39d00e64807f8797dac5042a02ad1220cca6ae57
4
+ data.tar.gz: 8f3d02cc7dd79e0fa4f5eafe45418fcb2db5b9b9
5
+ SHA512:
6
+ metadata.gz: ef7029a8b9259ed8aeee7d81690dd7a57560c5aef2bfc71946a1433582ad75348beac2b40f3fbbd0a445e90201ac88413886b2191f1e2f7933a26be3eee4cd45
7
+ data.tar.gz: 2fa2f7bb255c86621065c8690430d709b6c65bf57464b87546c6be2d8207448436fe4ed26c35206e68b1f9178d64e11c8fb7ac96a1f7aaac033245883240b01d
@@ -0,0 +1 @@
1
+ require_relative 'chatkit/client'
@@ -0,0 +1,284 @@
1
+ require 'pusher-platform'
2
+ require 'json'
3
+ require_relative './permissions'
4
+
5
+ module Chatkit
6
+
7
+ class Error < RuntimeError
8
+ end
9
+
10
+ class Client
11
+ attr_accessor :api_instance, :authorizer_instance
12
+
13
+ def initialize(options)
14
+ base_options = {
15
+ instance: options[:instance],
16
+ key: options[:key],
17
+ port: options[:port],
18
+ host: options[:host],
19
+ client: options[:client]
20
+ }
21
+
22
+ @api_instance = Pusher::Instance.new(
23
+ base_options.merge!({
24
+ service_name: 'chatkit',
25
+ service_version: 'v1'
26
+ })
27
+ )
28
+
29
+ @authorizer_instance = Pusher::Instance.new(
30
+ base_options.merge!({
31
+ service_name: 'chatkit_authorizer',
32
+ service_version: 'v1'
33
+ })
34
+ )
35
+ end
36
+
37
+ def authenticate(request, options)
38
+ @api_instance.authenticate(request, options)
39
+ end
40
+
41
+ def generate_access_token(options)
42
+ @api_instance.generate_access_token(options)
43
+ end
44
+
45
+ # User API
46
+
47
+ def create_user(id, name, avatar_url, custom_data)
48
+ body = {
49
+ id: id,
50
+ name: name
51
+ }
52
+
53
+ unless avatar_url.nil?
54
+ body[:avatar_url] = avatar_url
55
+ end
56
+
57
+ unless custom_data.nil?
58
+ body[:custom_data] = custom_data
59
+ end
60
+
61
+ @api_instance.request(
62
+ method: "POST",
63
+ path: "/users",
64
+ headers: {
65
+ "Content-Type": "application/json",
66
+ },
67
+ body: body,
68
+ jwt: generate_access_token(user_id: id, su: true)
69
+ )
70
+ end
71
+
72
+ def delete_user(id)
73
+ @api_instance.request(
74
+ method: "DELETE",
75
+ path: "/users/#{id}",
76
+ jwt: generate_access_token(user_id: id, su: true)
77
+ )
78
+ end
79
+
80
+ def get_users(from_id)
81
+ request_options = {
82
+ method: "GET",
83
+ path: "/users",
84
+ jwt: generate_access_token(su: true)
85
+ }
86
+
87
+ unless from_id == nil && from_id == ""
88
+ request_options.merge!({ query: { from_id: from_id }})
89
+ end
90
+
91
+ @api_instance.request(request_options)
92
+ end
93
+
94
+ def get_users_by_ids(user_ids)
95
+ @api_instance.request(
96
+ method: "GET",
97
+ path: "/users_by_ids",
98
+ query: {
99
+ user_ids: user_ids.join(",")
100
+ },
101
+ jwt: generate_access_token(su: true)
102
+ )
103
+ end
104
+
105
+ # Room API
106
+
107
+ def get_room(room_id)
108
+ @api_instance.request(
109
+ method: "GET",
110
+ path: "/rooms/#{room_id}",
111
+ jwt: generate_access_token(su: true)
112
+ )
113
+ end
114
+
115
+ def get_room_messages(room_id, initial_id, direction, limit)
116
+ query_params = {}
117
+
118
+ query_params[:initial_id] = initial_id unless initial_id.nil?
119
+ query_params[:direction] = direction unless direction.nil?
120
+ query_params[:limit] = limit unless limit.nil?
121
+
122
+ @api_instance.request(
123
+ method: "GET",
124
+ path: "/rooms/#{room_id}/messages",
125
+ query: query_params,
126
+ jwt: @api_instance.generate_access_token(su: true)
127
+ )
128
+ end
129
+
130
+ def get_rooms(from_id)
131
+ request_options = {
132
+ method: "GET",
133
+ path: "/rooms",
134
+ jwt: @api_instance.generate_access_token(su: true)
135
+ }
136
+
137
+ unless from_id == nil && from_id == ""
138
+ request_options.merge!({ query: { from_id: from_id }})
139
+ end
140
+
141
+ @api_instance.request(request_options)
142
+ end
143
+
144
+ # Authorizer API
145
+
146
+ def create_room_role(name, permissions)
147
+ create_role(name, ROOM_SCOPE, permissions)
148
+ end
149
+
150
+ def create_global_role(name, permissions)
151
+ create_role(name, GLOBAL_SCOPE, permissions)
152
+ end
153
+
154
+ def delete_room_role(role_name)
155
+ delete_role(role_name, ROOM_SCOPE)
156
+ end
157
+
158
+ def delete_global_role(role_name)
159
+ delete_role(role_name, GLOBAL_SCOPE)
160
+ end
161
+
162
+ def assign_global_role_to_user(user_id, role_name)
163
+ assign_role_to_user(user_id, role_name, nil)
164
+ end
165
+
166
+ def assign_room_role_to_user(user_id, role_name, room_id)
167
+ assign_role_to_user(user_id, role_name, room_id)
168
+ end
169
+
170
+ def get_roles
171
+ resp = @authorizer_instance.request(
172
+ method: "GET",
173
+ path: "/roles",
174
+ jwt: generate_access_token(su: true)
175
+ )
176
+
177
+ JSON.parse(resp.body)
178
+ end
179
+
180
+ def get_user_roles(user_id)
181
+ resp = @authorizer_instance.request(
182
+ method: "GET",
183
+ path: "/users/#{user_id}/roles",
184
+ jwt: generate_access_token(su: true)
185
+ )
186
+
187
+ JSON.parse(resp.body)
188
+ end
189
+
190
+ def remove_global_role_for_user(user_id)
191
+ remove_role_for_user(user_id, nil)
192
+ end
193
+
194
+ def remove_room_role_for_user(user_id, room_id)
195
+ remove_role_for_user(user_id, room_id)
196
+ end
197
+
198
+ def get_permissions_for_global_role(role_name)
199
+ get_permissions_for_role(role_name, GLOBAL_SCOPE)
200
+ end
201
+
202
+ def get_permissions_for_room_role(role_name)
203
+ get_permissions_for_role(role_name, ROOM_SCOPE)
204
+ end
205
+
206
+ private
207
+
208
+ def create_role(name, scope, permissions)
209
+ permissions.each do |permission|
210
+ unless VALID_PERMISSIONS[scope.to_sym].include?(permission)
211
+ raise Chatkit::Error.new("Permission value #{permission} is invalid")
212
+ end
213
+ end
214
+
215
+ @authorizer_instance.request(
216
+ method: "POST",
217
+ path: "/roles",
218
+ headers: {
219
+ "Content-Type": "application/json"
220
+ },
221
+ body: {
222
+ scope: scope,
223
+ name: name,
224
+ permissions: permissions,
225
+ },
226
+ jwt: generate_access_token(su: true)
227
+ )
228
+ end
229
+
230
+ def delete_role(role_name, scope)
231
+ @authorizer_instance.request(
232
+ method: "DELETE",
233
+ path: "/roles/#{role_name}/scope/#{scope}",
234
+ jwt: generate_access_token(su: true)
235
+ )
236
+ end
237
+
238
+ def assign_role_to_user(user_id, role_name, room_id)
239
+ body = { name: role_name }
240
+
241
+ unless room_id.nil?
242
+ body.merge!(room_id: room_id)
243
+ end
244
+
245
+ @authorizer_instance.request(
246
+ method: "POST",
247
+ path: "/users/#{user_id}/roles",
248
+ headers: {
249
+ "Content-Type": "application/json",
250
+ },
251
+ body: body,
252
+ jwt: generate_access_token(su: true)
253
+ )
254
+ end
255
+
256
+ def remove_role_for_user(user_id, room_id)
257
+ options = {
258
+ method: "PUT",
259
+ path: "/users/#{user_id}/roles",
260
+ headers: {
261
+ "Content-Type": "application/json",
262
+ },
263
+ body: {},
264
+ jwt: generate_access_token(su: true)
265
+ }
266
+
267
+ unless room_id.nil?
268
+ options.merge!(body: { room_id: room_id })
269
+ end
270
+
271
+ @authorizer_instance.request(options)
272
+ end
273
+
274
+ def get_permissions_for_role(role_name, scope)
275
+ resp = @authorizer_instance.request(
276
+ method: "GET",
277
+ path: "/roles/#{role_name}/scope/#{scope}/permissions",
278
+ jwt: generate_access_token(su: true)
279
+ )
280
+
281
+ JSON.parse(resp.body)
282
+ end
283
+ end
284
+ end
@@ -0,0 +1,51 @@
1
+ module Chatkit
2
+ ROOM_SCOPE = "room"
3
+ GLOBAL_SCOPE = "global"
4
+
5
+ JOIN_ROOM = "join_room"
6
+ LEAVE_ROOM = "leave_room"
7
+ ADD_ROOM_MEMBER = "add_room_member"
8
+ REMOVE_ROOM_MEMBER = "remove_room_member"
9
+ CREATE_ROOM = "create_room"
10
+ DELETE_ROOM = "delete_room"
11
+ UPDATE_ROOM = "update_room"
12
+ ADD_MESSAGE = "add_message"
13
+ CREATE_TYPING_EVENT = "create_typing_event"
14
+ SUBSCRIBE_PRESENCE = "subscribe_presence"
15
+ UPDATE_USER = "update_user"
16
+ GET_ROOM_MESSAGES = "get_room_messages"
17
+ GET_USER = "get_user"
18
+ GET_ROOM = "get_room"
19
+ GET_USER_ROOMS = "get_user_rooms"
20
+
21
+ VALID_PERMISSIONS = {
22
+ room: [
23
+ JOIN_ROOM,
24
+ LEAVE_ROOM,
25
+ ADD_ROOM_MEMBER,
26
+ REMOVE_ROOM_MEMBER,
27
+ DELETE_ROOM,
28
+ UPDATE_ROOM,
29
+ ADD_MESSAGE,
30
+ CREATE_TYPING_EVENT,
31
+ GET_ROOM_MESSAGES,
32
+ ],
33
+ global: [
34
+ JOIN_ROOM,
35
+ LEAVE_ROOM,
36
+ ADD_ROOM_MEMBER,
37
+ REMOVE_ROOM_MEMBER,
38
+ CREATE_ROOM,
39
+ DELETE_ROOM,
40
+ UPDATE_ROOM,
41
+ ADD_MESSAGE,
42
+ CREATE_TYPING_EVENT,
43
+ SUBSCRIBE_PRESENCE,
44
+ UPDATE_USER,
45
+ GET_ROOM_MESSAGES,
46
+ GET_USER,
47
+ GET_ROOM,
48
+ GET_USER_ROOMS,
49
+ ]
50
+ }
51
+ end
metadata ADDED
@@ -0,0 +1,60 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: pusher-chatkit-server
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Pusher
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-08-31 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: pusher-platform
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 0.4.3
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 0.4.3
27
+ description:
28
+ email: support@pusher.com
29
+ executables: []
30
+ extensions: []
31
+ extra_rdoc_files: []
32
+ files:
33
+ - lib/chatkit.rb
34
+ - lib/chatkit/client.rb
35
+ - lib/chatkit/permissions.rb
36
+ homepage:
37
+ licenses:
38
+ - MIT
39
+ metadata: {}
40
+ post_install_message:
41
+ rdoc_options: []
42
+ require_paths:
43
+ - lib
44
+ required_ruby_version: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ required_rubygems_version: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ requirements: []
55
+ rubyforge_project:
56
+ rubygems_version: 2.6.12
57
+ signing_key:
58
+ specification_version: 4
59
+ summary: Pusher Chatkit Ruby SDK
60
+ test_files: []