jason-rails 0.6.8 → 0.7.5
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 +4 -4
- data/CHANGELOG.md +34 -0
- data/Gemfile.lock +5 -3
- data/README.md +20 -14
- data/app/controllers/jason/jason_controller.rb +26 -4
- data/app/workers/jason/outbound_message_queue_worker.rb +1 -1
- data/client/lib/JasonProvider.d.ts +3 -1
- data/client/lib/JasonProvider.js +2 -2
- data/client/lib/addRelations.d.ts +1 -0
- data/client/lib/addRelations.js +39 -0
- data/client/lib/createJasonReducers.js +4 -2
- data/client/lib/createOptDis.d.ts +1 -1
- data/client/lib/createOptDis.js +9 -8
- data/client/lib/createServerActionQueue.d.ts +3 -2
- data/client/lib/createServerActionQueue.js +32 -6
- data/client/lib/createServerActionQueue.test.js +61 -6
- data/client/lib/createThenable.d.ts +1 -0
- data/client/lib/createThenable.js +5 -0
- data/client/lib/createTransportAdapter.d.ts +1 -1
- data/client/lib/createTransportAdapter.js +2 -2
- data/client/lib/index.d.ts +8 -1
- data/client/lib/index.js +3 -1
- data/client/lib/transportAdapters/actionCableAdapter.d.ts +1 -1
- data/client/lib/transportAdapters/actionCableAdapter.js +27 -6
- data/client/lib/transportAdapters/pusherAdapter.js +1 -1
- data/client/lib/useDraft.d.ts +1 -0
- data/client/lib/useDraft.js +13 -0
- data/client/lib/useEager.d.ts +1 -1
- data/client/lib/useEager.js +10 -5
- data/client/lib/useJason.d.ts +3 -1
- data/client/lib/useJason.js +4 -7
- data/client/package.json +1 -1
- data/client/src/JasonProvider.tsx +2 -2
- data/client/src/addRelations.ts +33 -0
- data/client/src/createJasonReducers.ts +4 -2
- data/client/src/createOptDis.ts +10 -8
- data/client/src/createServerActionQueue.test.ts +60 -6
- data/client/src/createServerActionQueue.ts +41 -6
- data/client/src/createTransportAdapter.ts +2 -2
- data/client/src/index.ts +2 -0
- data/client/src/transportAdapters/actionCableAdapter.ts +28 -7
- data/client/src/transportAdapters/pusherAdapter.ts +1 -2
- data/client/src/useDraft.ts +17 -0
- data/client/src/useEager.ts +9 -6
- data/client/src/useJason.ts +10 -7
- data/lib/jason.rb +9 -2
- data/lib/jason/api_model.rb +0 -4
- data/lib/jason/channel.rb +0 -7
- data/lib/jason/conditions_matcher.rb +88 -0
- data/lib/jason/consistency_checker.rb +65 -0
- data/lib/jason/graph_helper.rb +4 -0
- data/lib/jason/publisher.rb +36 -36
- data/lib/jason/subscription.rb +51 -15
- data/lib/jason/version.rb +1 -1
- metadata +12 -5
- data/client/src/makeEager.ts +0 -46
- data/lib/jason/publisher_old.rb +0 -112
- data/lib/jason/subscription_old.rb +0 -171
data/lib/jason/graph_helper.rb
CHANGED
@@ -26,6 +26,10 @@ class Jason::GraphHelper
|
|
26
26
|
$redis_jason.srem("jason:subscriptions:#{id}:graph", edges)
|
27
27
|
end
|
28
28
|
|
29
|
+
def apply_add_node_at_root(node)
|
30
|
+
diff_edges_from_graph(add_edges: ["root/#{node}"])
|
31
|
+
end
|
32
|
+
|
29
33
|
def apply_remove_node(node)
|
30
34
|
edges = $redis_jason.smembers("jason:subscriptions:#{id}:graph")
|
31
35
|
edges = find_edges_with_node(edges, node)
|
data/lib/jason/publisher.rb
CHANGED
@@ -16,7 +16,7 @@ module Jason::Publisher
|
|
16
16
|
|
17
17
|
# Exists
|
18
18
|
if self.persisted? && (scope.blank? || self.class.unscoped.send(scope).exists?(self.id))
|
19
|
-
payload = self.
|
19
|
+
payload = self.as_json(as_json_config)
|
20
20
|
gidx = Jason::LuaGenerator.new.cache_json(self.class.name.underscore, self.id, payload)
|
21
21
|
return [payload, gidx]
|
22
22
|
# Has been destroyed
|
@@ -73,13 +73,38 @@ module Jason::Publisher
|
|
73
73
|
)
|
74
74
|
end
|
75
75
|
|
76
|
-
# - An instance is created where it belongs_to an _all_ subscription
|
77
|
-
if previous_changes['id'].present?
|
78
|
-
Jason::Subscription.add_id(self.class.name.underscore, id)
|
79
|
-
end
|
80
|
-
|
81
76
|
if persisted?
|
77
|
+
applied_sub_ids = []
|
78
|
+
|
79
|
+
jason_conditions.each do |row|
|
80
|
+
matches = row['conditions'].map do |key, rules|
|
81
|
+
Jason::ConditionsMatcher.new(self.class).test_match(key, rules, previous_changes)
|
82
|
+
end
|
83
|
+
next if matches.all? { |m| m.nil? } # None of the keys were in previous changes - therefore this condition does not apply
|
84
|
+
in_sub = matches.all? { |m| m }
|
85
|
+
|
86
|
+
if in_sub
|
87
|
+
row['subscription_ids'].each do |sub_id|
|
88
|
+
Jason::Subscription.find_by_id(sub_id).add_id(self.class.name.underscore, self.id)
|
89
|
+
applied_sub_ids.push(sub_id)
|
90
|
+
end
|
91
|
+
else
|
92
|
+
row['subscription_ids'].each do |sub_id|
|
93
|
+
jason_subscriptions.each do |already_sub_id|
|
94
|
+
# If this sub ID already has this instance, remove it
|
95
|
+
if already_sub_id == sub_id
|
96
|
+
sub = Jason::Subscription.find_by_id(already_sub_id)
|
97
|
+
sub.remove_id(self.class.name.underscore, self.id)
|
98
|
+
applied_sub_ids.push(already_sub_id)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
82
105
|
jason_subscriptions.each do |sub_id|
|
106
|
+
next if applied_sub_ids.include?(sub_id)
|
107
|
+
|
83
108
|
Jason::Subscription.new(id: sub_id).update(self.class.name.underscore, id, payload, gidx)
|
84
109
|
end
|
85
110
|
end
|
@@ -94,13 +119,17 @@ module Jason::Publisher
|
|
94
119
|
Jason::Subscription.for_instance(self.class.name.underscore, id)
|
95
120
|
end
|
96
121
|
|
122
|
+
def jason_conditions
|
123
|
+
Jason::Subscription.conditions_for_model(self.class.name.underscore)
|
124
|
+
end
|
125
|
+
|
97
126
|
def jason_cached_value
|
98
127
|
JSON.parse($redis_jason.hget("jason:cache:#{self.class.name.underscore}", id) || '{}')
|
99
128
|
end
|
100
129
|
|
101
130
|
class_methods do
|
102
131
|
def cache_all
|
103
|
-
all.
|
132
|
+
all.find_each(&:cache_json)
|
104
133
|
end
|
105
134
|
|
106
135
|
def has_jason?
|
@@ -121,35 +150,6 @@ module Jason::Publisher
|
|
121
150
|
self.after_commit :force_publish_json, on: [:create, :destroy]
|
122
151
|
self.after_commit :publish_json_if_changed, on: [:update]
|
123
152
|
end
|
124
|
-
|
125
|
-
def find_or_create_by_id(params)
|
126
|
-
object = find_by(id: params[:id])
|
127
|
-
|
128
|
-
if object
|
129
|
-
object.update(params)
|
130
|
-
elsif params[:hidden]
|
131
|
-
return false ## If an object is passed with hidden = true but didn't already exist, it's safe to never create it
|
132
|
-
else
|
133
|
-
object = create!(params)
|
134
|
-
end
|
135
|
-
|
136
|
-
object
|
137
|
-
end
|
138
|
-
|
139
|
-
def find_or_create_by_id!(params)
|
140
|
-
object = find_by(id: params[:id])
|
141
|
-
|
142
|
-
if object
|
143
|
-
object.update!(params)
|
144
|
-
elsif params[:hidden]
|
145
|
-
## TODO: We're diverging from semantics of the Rails bang! methods here, which would normally either raise or return an object. Find a way to make this better.
|
146
|
-
return false ## If an object is passed with hidden = true but didn't already exist, it's safe to never create it
|
147
|
-
else
|
148
|
-
object = create!(params)
|
149
|
-
end
|
150
|
-
|
151
|
-
object
|
152
|
-
end
|
153
153
|
end
|
154
154
|
|
155
155
|
included do
|
data/lib/jason/subscription.rb
CHANGED
@@ -60,6 +60,19 @@ class Jason::Subscription
|
|
60
60
|
subs
|
61
61
|
end
|
62
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
|
+
|
63
76
|
def self.for_model(model_name)
|
64
77
|
|
65
78
|
end
|
@@ -166,10 +179,14 @@ class Jason::Subscription
|
|
166
179
|
subscription.apply_id_changeset(id_changeset)
|
167
180
|
subscription.broadcast_id_changeset(id_changeset)
|
168
181
|
end
|
182
|
+
|
183
|
+
#########
|
184
|
+
# ---> Join the community
|
185
|
+
# Subs where changed is parent + parent is an _all_ or _condition_ subscription
|
186
|
+
|
169
187
|
end
|
170
188
|
|
171
189
|
def self.remove_ids(model_name, ids)
|
172
|
-
# td: finish this
|
173
190
|
ids.each do |instance_id|
|
174
191
|
for_instance(model_name, instance_id, false).each do |sub_id|
|
175
192
|
subscription = find_by_id(sub_id)
|
@@ -188,11 +205,6 @@ class Jason::Subscription
|
|
188
205
|
end
|
189
206
|
end
|
190
207
|
|
191
|
-
# Add ID to any _all_ subscriptions
|
192
|
-
def self.add_id(model_name, id)
|
193
|
-
|
194
|
-
end
|
195
|
-
|
196
208
|
def self.all
|
197
209
|
$redis_jason.smembers('jason:subscriptions').map { |id| Jason::Subscription.find_by_id(id) }
|
198
210
|
end
|
@@ -213,6 +225,28 @@ class Jason::Subscription
|
|
213
225
|
end
|
214
226
|
end
|
215
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
|
+
|
216
250
|
def remove_ids(model_name, ids)
|
217
251
|
$redis_jason.srem("jason:subscriptions:#{id}:ids:#{model_name}", ids)
|
218
252
|
ids.each do |instance_id|
|
@@ -252,8 +286,14 @@ class Jason::Subscription
|
|
252
286
|
if conditions.blank?
|
253
287
|
$redis_jason.sadd("jason:models:#{model_name}:all:subscriptions", id)
|
254
288
|
all_models -= [model_name]
|
255
|
-
|
289
|
+
elsif conditions.keys == ['id']
|
256
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)
|
257
297
|
end
|
258
298
|
else
|
259
299
|
raise "Must supply IDs for sub models" if ids.nil?
|
@@ -266,7 +306,7 @@ class Jason::Subscription
|
|
266
306
|
|
267
307
|
# pluck returns only a 1D array if only 1 arg passed
|
268
308
|
if all_models.size == 1
|
269
|
-
instance_ids = [
|
309
|
+
instance_ids = instance_ids.map { |id| [id] }
|
270
310
|
end
|
271
311
|
|
272
312
|
return { model_names: all_models, instance_ids: instance_ids }
|
@@ -275,12 +315,12 @@ class Jason::Subscription
|
|
275
315
|
# 'posts', [post#1, post#2,...]
|
276
316
|
def set_ids_for_sub_models(model_name = model, ids = nil, enforce: false)
|
277
317
|
edge_set = load_ids_for_sub_models(model_name, ids)
|
278
|
-
|
279
318
|
# Build the tree
|
280
319
|
id_changeset = graph_helper.apply_update({
|
281
320
|
add: [edge_set],
|
282
321
|
enforce: enforce
|
283
322
|
})
|
323
|
+
|
284
324
|
apply_id_changeset(id_changeset)
|
285
325
|
end
|
286
326
|
|
@@ -338,10 +378,6 @@ class Jason::Subscription
|
|
338
378
|
def remove_consumer(consumer_id)
|
339
379
|
$redis_jason.srem("jason:subscriptions:#{id}:consumers", consumer_id)
|
340
380
|
$redis_jason.hdel("jason:consumers", consumer_id)
|
341
|
-
|
342
|
-
if consumer_count == 0
|
343
|
-
clear_all_ids
|
344
|
-
end
|
345
381
|
end
|
346
382
|
|
347
383
|
def consumer_count
|
@@ -354,8 +390,8 @@ class Jason::Subscription
|
|
354
390
|
|
355
391
|
def user_can_access?(user)
|
356
392
|
# td: implement the authorization logic here
|
357
|
-
return true if Jason.
|
358
|
-
Jason.
|
393
|
+
return true if Jason.subscription_authorization_service.blank?
|
394
|
+
Jason.subscription_authorization_service.call(user, model, conditions, includes_helper.all_models - [model])
|
359
395
|
end
|
360
396
|
|
361
397
|
def get
|
data/lib/jason/version.rb
CHANGED
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.
|
4
|
+
version: 0.7.5
|
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-
|
11
|
+
date: 2021-06-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -152,6 +152,8 @@ files:
|
|
152
152
|
- client/lib/JasonProvider.js
|
153
153
|
- client/lib/actionFactory.d.ts
|
154
154
|
- client/lib/actionFactory.js
|
155
|
+
- client/lib/addRelations.d.ts
|
156
|
+
- client/lib/addRelations.js
|
155
157
|
- client/lib/createActions.d.ts
|
156
158
|
- client/lib/createActions.js
|
157
159
|
- client/lib/createJasonReducers.d.ts
|
@@ -164,6 +166,8 @@ files:
|
|
164
166
|
- client/lib/createServerActionQueue.js
|
165
167
|
- client/lib/createServerActionQueue.test.d.ts
|
166
168
|
- client/lib/createServerActionQueue.test.js
|
169
|
+
- client/lib/createThenable.d.ts
|
170
|
+
- client/lib/createThenable.js
|
167
171
|
- client/lib/createTransportAdapter.d.ts
|
168
172
|
- client/lib/createTransportAdapter.js
|
169
173
|
- client/lib/deepCamelizeKeys.d.ts
|
@@ -184,6 +188,8 @@ files:
|
|
184
188
|
- client/lib/transportAdapters/pusherAdapter.js
|
185
189
|
- client/lib/useAct.d.ts
|
186
190
|
- client/lib/useAct.js
|
191
|
+
- client/lib/useDraft.d.ts
|
192
|
+
- client/lib/useDraft.js
|
187
193
|
- client/lib/useEager.d.ts
|
188
194
|
- client/lib/useEager.js
|
189
195
|
- client/lib/useJason.d.ts
|
@@ -196,6 +202,7 @@ files:
|
|
196
202
|
- client/src/JasonContext.ts
|
197
203
|
- client/src/JasonProvider.tsx
|
198
204
|
- client/src/actionFactory.ts
|
205
|
+
- client/src/addRelations.ts
|
199
206
|
- client/src/createActions.ts
|
200
207
|
- client/src/createJasonReducers.ts
|
201
208
|
- client/src/createOptDis.ts
|
@@ -206,12 +213,12 @@ files:
|
|
206
213
|
- client/src/deepCamelizeKeys.test.ts
|
207
214
|
- client/src/deepCamelizeKeys.ts
|
208
215
|
- client/src/index.ts
|
209
|
-
- client/src/makeEager.ts
|
210
216
|
- client/src/pruneIdsMiddleware.ts
|
211
217
|
- client/src/restClient.ts
|
212
218
|
- client/src/transportAdapters/actionCableAdapter.ts
|
213
219
|
- client/src/transportAdapters/pusherAdapter.ts
|
214
220
|
- client/src/useAct.ts
|
221
|
+
- client/src/useDraft.ts
|
215
222
|
- client/src/useEager.ts
|
216
223
|
- client/src/useJason.test.ts
|
217
224
|
- client/src/useJason.ts
|
@@ -224,14 +231,14 @@ files:
|
|
224
231
|
- lib/jason/api_model.rb
|
225
232
|
- lib/jason/broadcaster.rb
|
226
233
|
- lib/jason/channel.rb
|
234
|
+
- lib/jason/conditions_matcher.rb
|
235
|
+
- lib/jason/consistency_checker.rb
|
227
236
|
- lib/jason/engine.rb
|
228
237
|
- lib/jason/graph_helper.rb
|
229
238
|
- lib/jason/includes_helper.rb
|
230
239
|
- lib/jason/lua_generator.rb
|
231
240
|
- lib/jason/publisher.rb
|
232
|
-
- lib/jason/publisher_old.rb
|
233
241
|
- lib/jason/subscription.rb
|
234
|
-
- lib/jason/subscription_old.rb
|
235
242
|
- lib/jason/version.rb
|
236
243
|
homepage: https://github.com/jamesr2323/jason
|
237
244
|
licenses:
|
data/client/src/makeEager.ts
DELETED
@@ -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
|
-
}
|
data/lib/jason/publisher_old.rb
DELETED
@@ -1,112 +0,0 @@
|
|
1
|
-
module Jason::PublisherOld
|
2
|
-
extend ActiveSupport::Concern
|
3
|
-
|
4
|
-
def cache_json
|
5
|
-
as_json_config = api_model.as_json_config
|
6
|
-
scope = api_model.scope
|
7
|
-
|
8
|
-
if self.persisted? && (scope.blank? || self.class.unscoped.send(scope).exists?(self.id))
|
9
|
-
payload = self.reload.as_json(as_json_config)
|
10
|
-
$redis_jason.hset("jason:#{self.class.name.underscore}:cache", self.id, payload.to_json)
|
11
|
-
else
|
12
|
-
$redis_jason.hdel("jason:#{self.class.name.underscore}:cache", self.id)
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
def publish_json
|
17
|
-
cache_json
|
18
|
-
return if skip_publish_json
|
19
|
-
|
20
|
-
self.class.jason_subscriptions.each do |id, config_json|
|
21
|
-
config = JSON.parse(config_json)
|
22
|
-
|
23
|
-
if (config['conditions'] || {}).all? { |field, value| self.send(field) == value }
|
24
|
-
Jason::Subscription.new(id: id).update(self.class.name.underscore)
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
def publish_json_if_changed
|
30
|
-
subscribed_fields = api_model.subscribed_fields
|
31
|
-
publish_json if (self.previous_changes.keys.map(&:to_sym) & subscribed_fields).present? || !self.persisted?
|
32
|
-
end
|
33
|
-
|
34
|
-
class_methods do
|
35
|
-
def subscriptions
|
36
|
-
$redis_jason.hgetall("jason:#{self.name.underscore}:subscriptions")
|
37
|
-
end
|
38
|
-
|
39
|
-
def jason_subscriptions
|
40
|
-
$redis_jason.hgetall("jason:#{self.name.underscore}:subscriptions")
|
41
|
-
end
|
42
|
-
|
43
|
-
def publish_all(instances)
|
44
|
-
instances.each(&:cache_json)
|
45
|
-
|
46
|
-
subscriptions.each do |id, config_json|
|
47
|
-
Jason::Subscription.new(id: id).update(self.name.underscore)
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
def flush_cache
|
52
|
-
$redis_jason.del("jason:#{self.name.underscore}:cache")
|
53
|
-
end
|
54
|
-
|
55
|
-
def setup_json
|
56
|
-
self.after_initialize -> {
|
57
|
-
@api_model = Jason::ApiModel.new(self.class.name.underscore)
|
58
|
-
}
|
59
|
-
self.after_commit :publish_json_if_changed
|
60
|
-
|
61
|
-
include_models = Jason::ApiModel.new(self.name.underscore).include_models
|
62
|
-
|
63
|
-
include_models.map do |assoc|
|
64
|
-
puts assoc
|
65
|
-
reflection = self.reflect_on_association(assoc.to_sym)
|
66
|
-
reflection.klass.after_commit -> {
|
67
|
-
subscribed_fields = Jason::ApiModel.new(self.class.name.underscore).subscribed_fields
|
68
|
-
puts subscribed_fields.inspect
|
69
|
-
|
70
|
-
if (self.previous_changes.keys.map(&:to_sym) & subscribed_fields).present?
|
71
|
-
self.send(reflection.inverse_of.name)&.publish_json
|
72
|
-
end
|
73
|
-
}
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
|
-
def find_or_create_by_id(params)
|
78
|
-
object = find_by(id: params[:id])
|
79
|
-
|
80
|
-
if object
|
81
|
-
object.update(params)
|
82
|
-
elsif params[:hidden]
|
83
|
-
return false ## If an object is passed with hidden = true but didn't already exist, it's safe to never create it
|
84
|
-
else
|
85
|
-
object = create!(params)
|
86
|
-
end
|
87
|
-
|
88
|
-
object
|
89
|
-
end
|
90
|
-
|
91
|
-
def find_or_create_by_id!(params)
|
92
|
-
object = find_by(id: params[:id])
|
93
|
-
|
94
|
-
if object
|
95
|
-
object.update!(params)
|
96
|
-
elsif params[:hidden]
|
97
|
-
## TODO: We're diverging from semantics of the Rails bang! methods here, which would normally either raise or return an object. Find a way to make this better.
|
98
|
-
return false ## If an object is passed with hidden = true but didn't already exist, it's safe to never create it
|
99
|
-
else
|
100
|
-
object = create!(params)
|
101
|
-
end
|
102
|
-
|
103
|
-
object
|
104
|
-
end
|
105
|
-
end
|
106
|
-
|
107
|
-
included do
|
108
|
-
attr_accessor :skip_publish_json, :api_model
|
109
|
-
|
110
|
-
setup_json
|
111
|
-
end
|
112
|
-
end
|