jason-rails 0.6.4 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
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
- }