jason-rails 0.6.4 → 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.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +38 -0
  3. data/Gemfile.lock +7 -2
  4. data/README.md +4 -12
  5. data/app/controllers/jason/{api_controller.rb → jason_controller.rb} +1 -1
  6. data/app/controllers/jason/{api/pusher_controller.rb → pusher_controller.rb} +1 -1
  7. data/app/workers/jason/outbound_message_queue_worker.rb +21 -0
  8. data/client/lib/addRelations.d.ts +1 -0
  9. data/client/lib/addRelations.js +39 -0
  10. data/client/lib/createJasonReducers.js +4 -2
  11. data/client/lib/createOptDis.d.ts +1 -1
  12. data/client/lib/createOptDis.js +9 -8
  13. data/client/lib/createServerActionQueue.d.ts +3 -2
  14. data/client/lib/createServerActionQueue.js +32 -6
  15. data/client/lib/createServerActionQueue.test.js +61 -6
  16. data/client/lib/createThenable.d.ts +1 -0
  17. data/client/lib/createThenable.js +5 -0
  18. data/client/lib/transportAdapters/actionCableAdapter.js +24 -4
  19. data/client/lib/transportAdapters/pusherAdapter.js +1 -1
  20. data/client/lib/useDraft.d.ts +1 -0
  21. data/client/lib/useDraft.js +13 -0
  22. data/client/lib/useEager.d.ts +1 -1
  23. data/client/lib/useEager.js +10 -5
  24. data/client/lib/useJason.js +2 -4
  25. data/client/package.json +1 -1
  26. data/client/src/addRelations.ts +33 -0
  27. data/client/src/createJasonReducers.ts +4 -2
  28. data/client/src/createOptDis.ts +10 -8
  29. data/client/src/createServerActionQueue.test.ts +60 -6
  30. data/client/src/createServerActionQueue.ts +41 -6
  31. data/client/src/transportAdapters/actionCableAdapter.ts +24 -5
  32. data/client/src/transportAdapters/pusherAdapter.ts +1 -2
  33. data/client/src/useDraft.ts +17 -0
  34. data/client/src/useEager.ts +9 -6
  35. data/client/src/useJason.ts +1 -4
  36. data/config/routes.rb +6 -6
  37. data/jason-rails.gemspec +1 -0
  38. data/lib/jason.rb +7 -3
  39. data/lib/jason/api_model.rb +0 -4
  40. data/lib/jason/broadcaster.rb +2 -1
  41. data/lib/jason/channel.rb +0 -7
  42. data/lib/jason/conditions_matcher.rb +88 -0
  43. data/lib/jason/consistency_checker.rb +61 -0
  44. data/lib/jason/graph_helper.rb +19 -4
  45. data/lib/jason/publisher.rb +40 -7
  46. data/lib/jason/subscription.rb +77 -17
  47. data/lib/jason/version.rb +1 -1
  48. metadata +30 -5
  49. data/client/src/makeEager.ts +0 -46
@@ -48,15 +48,31 @@ class Jason::Subscription
48
48
  end
49
49
  end
50
50
 
51
+ def self.all_for_model(model_name)
52
+ $redis_jason.smembers("jason:models:#{model_name}:all:subscriptions")
53
+ end
54
+
51
55
  def self.for_instance(model_name, id, include_all = true)
52
56
  subs = $redis_jason.smembers("jason:models:#{model_name}:#{id}:subscriptions")
53
57
  if include_all
54
- subs += $redis_jason.smembers("jason:models:#{model_name}:all:subscriptions")
58
+ subs += all_for_model(model_name)
55
59
  end
56
-
57
60
  subs
58
61
  end
59
62
 
63
+ # returns [
64
+ # { condition: { post_id: 123 }, subscription_ids: [] }
65
+ # ]
66
+ def self.conditions_for_model(model_name)
67
+ rows = $redis_jason.smembers("jason:models:#{model_name}:conditions").map do |row|
68
+ JSON.parse(row)
69
+ end
70
+ conditions = rows.group_by { |row| row['conditions'] }
71
+ conditions.map do |conditions, rows|
72
+ { 'conditions' => conditions, 'subscription_ids' => rows.map { |row| row['subscription_id'] } }
73
+ end
74
+ end
75
+
60
76
  def self.for_model(model_name)
61
77
 
62
78
  end
@@ -163,10 +179,14 @@ class Jason::Subscription
163
179
  subscription.apply_id_changeset(id_changeset)
164
180
  subscription.broadcast_id_changeset(id_changeset)
165
181
  end
182
+
183
+ #########
184
+ # ---> Join the community
185
+ # Subs where changed is parent + parent is an _all_ or _condition_ subscription
186
+
166
187
  end
167
188
 
168
189
  def self.remove_ids(model_name, ids)
169
- # td: finish this
170
190
  ids.each do |instance_id|
171
191
  for_instance(model_name, instance_id, false).each do |sub_id|
172
192
  subscription = find_by_id(sub_id)
@@ -176,11 +196,13 @@ class Jason::Subscription
176
196
  subscription.broadcast_id_changeset(id_changeset)
177
197
  end
178
198
  end
179
- end
180
-
181
- # Add ID to any _all_ subscriptions
182
- def self.add_id(model_name, id)
183
199
 
200
+ all_for_model(model_name).each do |sub_id|
201
+ subscription = find_by_id(sub_id)
202
+ ids.each do |id|
203
+ subscription.destroy(model_name, id)
204
+ end
205
+ end
184
206
  end
185
207
 
186
208
  def self.all
@@ -203,6 +225,28 @@ class Jason::Subscription
203
225
  end
204
226
  end
205
227
 
228
+ def remove_id(model_name, id)
229
+ id_changeset = graph_helper.apply_remove_node("#{model_name}:#{id}")
230
+ apply_id_changeset(id_changeset)
231
+ broadcast_id_changeset(id_changeset)
232
+ end
233
+
234
+ def add_id(model_name, id)
235
+ id_changeset = graph_helper.apply_update({
236
+ add: [
237
+ {
238
+ model_names: [model_name],
239
+ instance_ids: [[id]]
240
+ },
241
+ # Add IDs of child models
242
+ load_ids_for_sub_models(model_name, id)
243
+ ]
244
+ })
245
+
246
+ apply_id_changeset(id_changeset)
247
+ broadcast_id_changeset(id_changeset)
248
+ end
249
+
206
250
  def remove_ids(model_name, ids)
207
251
  $redis_jason.srem("jason:subscriptions:#{id}:ids:#{model_name}", ids)
208
252
  ids.each do |instance_id|
@@ -238,13 +282,18 @@ class Jason::Subscription
238
282
  all_models = includes_helper.all_models(model_name)
239
283
 
240
284
  relation = model_name.classify.constantize.all.eager_load(includes_tree)
241
-
242
285
  if model_name == model
243
286
  if conditions.blank?
244
287
  $redis_jason.sadd("jason:models:#{model_name}:all:subscriptions", id)
245
288
  all_models -= [model_name]
246
- else
289
+ elsif conditions.keys == ['id']
247
290
  relation = relation.where(conditions)
291
+ else
292
+ $redis_jason.sadd("jason:models:#{model_name}:conditions", {
293
+ 'conditions' => conditions,
294
+ 'subscription_id' => self.id
295
+ }.to_json)
296
+ relation = Jason::ConditionsMatcher.new(relation.klass).apply_conditions(relation, conditions)
248
297
  end
249
298
  else
250
299
  raise "Must supply IDs for sub models" if ids.nil?
@@ -257,7 +306,7 @@ class Jason::Subscription
257
306
 
258
307
  # pluck returns only a 1D array if only 1 arg passed
259
308
  if all_models.size == 1
260
- instance_ids = [instance_ids]
309
+ instance_ids = instance_ids.map { |id| [id] }
261
310
  end
262
311
 
263
312
  return { model_names: all_models, instance_ids: instance_ids }
@@ -266,11 +315,12 @@ class Jason::Subscription
266
315
  # 'posts', [post#1, post#2,...]
267
316
  def set_ids_for_sub_models(model_name = model, ids = nil, enforce: false)
268
317
  edge_set = load_ids_for_sub_models(model_name, ids)
269
-
270
318
  # Build the tree
271
319
  id_changeset = graph_helper.apply_update({
272
- add: [edge_set]
320
+ add: [edge_set],
321
+ enforce: enforce
273
322
  })
323
+
274
324
  apply_id_changeset(id_changeset)
275
325
  end
276
326
 
@@ -286,6 +336,7 @@ class Jason::Subscription
286
336
  end
287
337
  $redis_jason.del("jason:subscriptions:#{id}:ids:#{model_name}")
288
338
  end
339
+ $redis_jason.del("jason:subscriptions:#{id}:graph")
289
340
  end
290
341
 
291
342
  def ids(model_name = model)
@@ -320,17 +371,13 @@ class Jason::Subscription
320
371
  $redis_jason.hset("jason:consumers", consumer_id, Time.now.utc)
321
372
 
322
373
  if before_consumer_count == 0
323
- set_ids_for_sub_models
374
+ set_ids_for_sub_models(enforce: true)
324
375
  end
325
376
  end
326
377
 
327
378
  def remove_consumer(consumer_id)
328
379
  $redis_jason.srem("jason:subscriptions:#{id}:consumers", consumer_id)
329
380
  $redis_jason.hdel("jason:consumers", consumer_id)
330
-
331
- if consumer_count == 0
332
- clear_all_ids
333
- end
334
381
  end
335
382
 
336
383
  def consumer_count
@@ -375,6 +422,19 @@ class Jason::Subscription
375
422
  }
376
423
  end
377
424
 
425
+ # To be used as a fallback when some corruption of the subscription has taken place
426
+ def reset!(hard: false)
427
+ # Remove subscription state
428
+ if hard
429
+ clear_all_ids
430
+ end
431
+
432
+ set_ids_for_sub_models(enforce: true)
433
+ includes_helper.all_models.each do |model_name|
434
+ broadcaster.broadcast(get_for_model(model_name))
435
+ end
436
+ end
437
+
378
438
  def add(model_name, instance_id)
379
439
  idx = $redis_jason.incr("jason:subscription:#{id}:#{model_name}:idx")
380
440
  payload = JSON.parse($redis_jason.hget("jason:cache:#{model_name}", instance_id) || '{}')
data/lib/jason/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Jason
2
- VERSION = "0.6.4"
2
+ VERSION = "0.7.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jason-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.4
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Rees
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-02-17 00:00:00.000000000 Z
11
+ date: 2021-04-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -108,6 +108,20 @@ dependencies:
108
108
  - - ">="
109
109
  - !ruby/object:Gem::Version
110
110
  version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: sidekiq
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
111
125
  description:
112
126
  email:
113
127
  - jarees@gmail.com
@@ -119,14 +133,16 @@ files:
119
133
  - ".rspec"
120
134
  - ".ruby-version"
121
135
  - ".travis.yml"
136
+ - CHANGELOG.md
122
137
  - CODE_OF_CONDUCT.md
123
138
  - Gemfile
124
139
  - Gemfile.lock
125
140
  - LICENSE.txt
126
141
  - README.md
127
142
  - Rakefile
128
- - app/controllers/jason/api/pusher_controller.rb
129
- - app/controllers/jason/api_controller.rb
143
+ - app/controllers/jason/jason_controller.rb
144
+ - app/controllers/jason/pusher_controller.rb
145
+ - app/workers/jason/outbound_message_queue_worker.rb
130
146
  - bin/console
131
147
  - bin/setup
132
148
  - client/babel.config.js
@@ -136,6 +152,8 @@ files:
136
152
  - client/lib/JasonProvider.js
137
153
  - client/lib/actionFactory.d.ts
138
154
  - client/lib/actionFactory.js
155
+ - client/lib/addRelations.d.ts
156
+ - client/lib/addRelations.js
139
157
  - client/lib/createActions.d.ts
140
158
  - client/lib/createActions.js
141
159
  - client/lib/createJasonReducers.d.ts
@@ -148,6 +166,8 @@ files:
148
166
  - client/lib/createServerActionQueue.js
149
167
  - client/lib/createServerActionQueue.test.d.ts
150
168
  - client/lib/createServerActionQueue.test.js
169
+ - client/lib/createThenable.d.ts
170
+ - client/lib/createThenable.js
151
171
  - client/lib/createTransportAdapter.d.ts
152
172
  - client/lib/createTransportAdapter.js
153
173
  - client/lib/deepCamelizeKeys.d.ts
@@ -168,6 +188,8 @@ files:
168
188
  - client/lib/transportAdapters/pusherAdapter.js
169
189
  - client/lib/useAct.d.ts
170
190
  - client/lib/useAct.js
191
+ - client/lib/useDraft.d.ts
192
+ - client/lib/useDraft.js
171
193
  - client/lib/useEager.d.ts
172
194
  - client/lib/useEager.js
173
195
  - client/lib/useJason.d.ts
@@ -180,6 +202,7 @@ files:
180
202
  - client/src/JasonContext.ts
181
203
  - client/src/JasonProvider.tsx
182
204
  - client/src/actionFactory.ts
205
+ - client/src/addRelations.ts
183
206
  - client/src/createActions.ts
184
207
  - client/src/createJasonReducers.ts
185
208
  - client/src/createOptDis.ts
@@ -190,12 +213,12 @@ files:
190
213
  - client/src/deepCamelizeKeys.test.ts
191
214
  - client/src/deepCamelizeKeys.ts
192
215
  - client/src/index.ts
193
- - client/src/makeEager.ts
194
216
  - client/src/pruneIdsMiddleware.ts
195
217
  - client/src/restClient.ts
196
218
  - client/src/transportAdapters/actionCableAdapter.ts
197
219
  - client/src/transportAdapters/pusherAdapter.ts
198
220
  - client/src/useAct.ts
221
+ - client/src/useDraft.ts
199
222
  - client/src/useEager.ts
200
223
  - client/src/useJason.test.ts
201
224
  - client/src/useJason.ts
@@ -208,6 +231,8 @@ files:
208
231
  - lib/jason/api_model.rb
209
232
  - lib/jason/broadcaster.rb
210
233
  - lib/jason/channel.rb
234
+ - lib/jason/conditions_matcher.rb
235
+ - lib/jason/consistency_checker.rb
211
236
  - lib/jason/engine.rb
212
237
  - lib/jason/graph_helper.rb
213
238
  - lib/jason/includes_helper.rb
@@ -1,46 +0,0 @@
1
- import pluralize from 'pluralize'
2
- import _ from 'lodash'
3
- import { useSelector } from 'react-redux'
4
-
5
- export default function (schema) {
6
- function addRelations(s, objects, objectType, relations) {
7
- // first find out relation name
8
- if (_.isArray(relations)) {
9
- relations.forEach(relation => {
10
- objects = addRelations(s, objects, objectType, relation)
11
- })
12
- } else if (typeof(relations) === 'object') {
13
- const relation = Object.keys(relations)[0]
14
- const subRelations = relations[relation]
15
-
16
- objects = addRelations(s, objects, objectType, relation)
17
- objects[relation] = addRelations(s, objects[relation], pluralize(relation), subRelations)
18
- // #
19
- } else if (typeof(relations) === 'string') {
20
- const relation = relations
21
- if (_.isArray(objects)) {
22
- objects = objects.map(obj => addRelations(s, obj, objectType, relation))
23
- } else {
24
- const relatedObjects = _.values(s[pluralize(relation)].entities)
25
-
26
- if(pluralize.isSingular(relation)) {
27
- objects = { ...objects, [relation]: _.find(relatedObjects, { id: objects[relation + 'Id'] }) }
28
- } else {
29
- objects = { ...objects, [relation]: relatedObjects.filter(e => e[pluralize.singular(objectType) + 'Id'] === objects.id) }
30
- }
31
- }
32
- }
33
-
34
- return objects
35
- }
36
-
37
- function useEager(entity, id = null, relations = []) {
38
- if (id) {
39
- return useSelector(s => addRelations(s, { ...s[entity].entities[String(id)] }, entity, relations), _.isEqual)
40
- } else {
41
- return useSelector(s => addRelations(s, _.values(s[entity].entities), entity, relations), _.isEqual)
42
- }
43
- }
44
-
45
- return useEager
46
- }