hyper-resource 1.0.0.lap58 → 1.0.0.lap62

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: 9bcbeaa04a6654be3f24e097ea9d2f2f73b9579857a66e1c6ceee03c49013073
4
- data.tar.gz: 38bc971a2d049850bafc340cce9545f42953f4fac8eb0ef944217d2dacd6bde8
3
+ metadata.gz: 1b68ab98c8c4f86ae7f9ef65df1e9fce88f1cf4d769f5f043da7d8798415abc9
4
+ data.tar.gz: aff99ed6aa6fc953e8e003ee98728f414ca796644cfeadd9d4ca729ba365cb69
5
5
  SHA512:
6
- metadata.gz: 0d502dd12afec243680c27aad39b8998ccb180b6e8783a0ececc989163d47f84aca92909ef9a73cfc99a9e19c11ab32c7e76eb77bdfaec879230ba0845169dbf
7
- data.tar.gz: 6dc999b8179e2d0a990a52d528f467fc158b4fbb338b7b439db0308cb34fa76a0146e15d0092a429a53c751dcd39cb537b4da35e02a472a76d62eb47b8c23331
6
+ metadata.gz: 6f8c4c16583165457179a7175d00f69a98d1a3f081dbd1b87f5fff42a4a68cf4125f65eb8f7c28262160b2ab31a7af0077b9ed7ba9a612f40296947b2f3557db
7
+ data.tar.gz: d947709f378d8add9359dc2970fe7e05446dbd4e08cf9c9cfdcee55932a4ab346b8f992e6e1de5256c62c76ec1b4fa6510479141e1bb0a8c66d115b17ec40774
@@ -5,7 +5,7 @@ module HyperRecord
5
5
  if record_hash.has_key?(:id)
6
6
  record = _record_cache[record_hash[:id].to_s]
7
7
  if record
8
- record.instance_variable_get(:@properties_hash).merge!(record_hash)
8
+ record.instance_variable_get(:@properties).merge!(record_hash)
9
9
  return record
10
10
  end
11
11
  end
@@ -309,15 +309,15 @@ module HyperRecord
309
309
  _property_options[name] = options
310
310
  define_method(name) do
311
311
  _register_observer
312
- if @properties_hash[:id]
313
- if @changed_properties_hash.has_key?(name)
314
- @changed_properties_hash[name]
312
+ if @properties[:id]
313
+ if @changed_properties.has_key?(name)
314
+ @changed_properties[name]
315
315
  else
316
- @properties_hash[name]
316
+ @properties[name]
317
317
  end
318
318
  else
319
319
  # record has not been fetched or is new and not yet saved
320
- if @properties_hash[name].nil?
320
+ if @properties[name].nil?
321
321
  # TODO move default to initializer?
322
322
  if self.class._property_options[name].has_key?(:default)
323
323
  self.class._property_options[name][:default]
@@ -327,13 +327,13 @@ module HyperRecord
327
327
  HyperRecord::DummyValue.new(NilClass)
328
328
  end
329
329
  else
330
- @properties_hash[name]
330
+ @properties[name]
331
331
  end
332
332
  end
333
333
  end
334
334
  define_method("#{name}=") do |value|
335
335
  _register_observer
336
- @changed_properties_hash[name] = value
336
+ @changed_properties[name] = value
337
337
  end
338
338
  end
339
339
 
@@ -342,47 +342,48 @@ module HyperRecord
342
342
  end
343
343
 
344
344
  def rest_class_method(name, options = { default_result: '...' })
345
- rest_methods[name] = options
346
- rest_methods[name][:class_method] = true
347
- singleton_class.send(:define_method, "promise_#{name}") do |*args|
345
+ rest_class_methods[name] = options
346
+ define_singleton_method("promise_#{name}") do |*args|
347
+ name_args = _name_args(name, *args)
348
+ _class_fetch_states[name_args] = 'i'
349
+ rest_class_methods[name_args] = { result: options[:default_result] } unless rest_class_methods.has_key?(name_args)
348
350
  _promise_get_or_patch("#{resource_base_uri}/methods/#{name}.json?timestamp=#{`Date.now() + Math.random()`}", *args).then do |response_json|
349
- rest_methods[name][:result] = response_json[:result] # result is parsed json
351
+ rest_class_methods[name_args][:result] = response_json[:result] # result is parsed json
352
+ _class_fetch_states[name_args] = 'f'
350
353
  _notify_class_observers
351
- rest_methods[name][:result]
354
+ rest_class_methods[name_args][:result]
352
355
  end.fail do |response|
353
356
  error_message = "#{self.to_s}.#{name}, a rest_method, failed to execute!"
354
357
  `console.error(error_message)`
355
358
  response
356
359
  end
357
360
  end
358
- singleton_class.send(:define_method, name) do |*args|
361
+ define_singleton_method(name) do |*args|
362
+ name_args = _name_args(name, *args)
359
363
  _register_class_observer
360
- if rest_methods[name][:force] || !rest_methods[name].has_key?(:result)
364
+ rest_class_methods[name_args] = { result: options[:default_result] } unless rest_methods.has_key?(name_args)
365
+ unless 'fi'.include?(_class_fetch_states[name_args])
361
366
  self.send("promise_#{name}", *args)
362
367
  end
363
- if rest_methods[name].has_key?(:result)
364
- rest_methods[name][:result]
365
- else
366
- rest_methods[name][:default_result]
367
- end
368
+ rest_class_methods[name_args][:result]
369
+ end
370
+ define_singleton_method("update_#{name}") do |*args|
371
+ _class_fetch_states[_name_args(name, *args)] = 'u'
368
372
  end
369
- end
370
-
371
- def rest_class_method_force_updates(method_name)
372
- rest_methods[method_name][:force] = true
373
- end
374
-
375
- def rest_class_method_unforce_updates(method_name)
376
- rest_methods[method_name][:force] = false
377
373
  end
378
374
 
379
375
  def rest_method(name, options = { default_result: '...' })
380
- rest_methods[name] = options
381
376
  define_method("promise_#{name}") do |*args|
377
+ name_args = self.class._name_args(name, *args)
378
+ @fetch_states[name_args] = 'i'
379
+ @rest_methods[name] = options unless @rest_methods.has_key?(name)
380
+ @rest_methods[name_args] = { result: options[:default_result] } unless @rest_methods.has_key?(name_args)
381
+ raise "#{self.class.to_s}[_no_id_].#{name}, can't execute instance rest_method without id!" unless self.id
382
382
  self.class._promise_get_or_patch("#{resource_base_uri}/#{self.id}/methods/#{name}.json?timestamp=#{`Date.now() + Math.random()`}", *args).then do |response_json|
383
- @rest_methods_hash[name][:result] = response_json[:result] # result is parsed json
383
+ @rest_methods[name_args][:result] = response_json[:result] # result is parsed json
384
+ @fetch_states[name_args] = 'f'
384
385
  _notify_observers
385
- @rest_methods_hash[name][:result]
386
+ @rest_methods[name_args][:result]
386
387
  end.fail do |response|
387
388
  error_message = "#{self.class.to_s}[#{self.id}].#{name}, a rest_method, failed to execute!"
388
389
  `console.error(error_message)`
@@ -391,19 +392,21 @@ module HyperRecord
391
392
  end
392
393
  define_method(name) do |*args|
393
394
  _register_observer
394
- if self.id && (self.class.rest_methods[name][:force] || @rest_methods_hash[name][:force] || !@rest_methods_hash[name].has_key?(:result))
395
+ name_args = self.class._name_args(name, *args)
396
+ @rest_methods[name] = options unless @rest_methods.has_key?(name)
397
+ @rest_methods[name_args] = { result: options[:default_result] } unless @rest_methods.has_key?(name_args)
398
+ unless 'fi'.include?(@fetch_states[name_args])
395
399
  self.send("promise_#{name}", *args)
396
400
  end
397
- if @rest_methods_hash[name].has_key?(:result)
398
- @rest_methods_hash[name][:result]
399
- else
400
- self.class.rest_methods[name][:default_result]
401
- end
401
+ @rest_methods[name_args][:result]
402
+ end
403
+ define_method("update_#{name}") do |*args|
404
+ @fetch_states[self.class._name_args(name, *args)] = 'u'
402
405
  end
403
406
  end
404
407
 
405
- def rest_methods
406
- @rest_methods_hash ||= {}
408
+ def rest_class_methods
409
+ @rest_class_methods ||= {}
407
410
  end
408
411
 
409
412
  def resource_base_uri
@@ -412,11 +415,7 @@ module HyperRecord
412
415
 
413
416
  def scope(name, options)
414
417
  define_singleton_method("promise_#{name}") do |*args|
415
- name_args = if args.size > 0
416
- "#{name}_#{args.to_json}"
417
- else
418
- name
419
- end
418
+ name_args = _name_args(name, *args)
420
419
  _class_fetch_states[name_args] = 'i'
421
420
  self._promise_get_or_patch("#{resource_base_uri}/scopes/#{name}.json", *args).then do |response_json|
422
421
  scopes[name_args] = _convert_array_to_collection(response_json[self.to_s.underscore][name])
@@ -430,27 +429,16 @@ module HyperRecord
430
429
  end
431
430
  end
432
431
  define_singleton_method(name) do |*args|
433
- name_args = if args.size > 0
434
- "#{name}_#{args.to_json}"
435
- else
436
- name
437
- end
432
+ name_args = _name_args(name, *args)
438
433
  scopes[name_args] = HyperRecord::Collection.new unless scopes.has_key?(name_args)
439
- if _class_fetch_states.has_key?(name_args) && 'fi'.include?(_class_fetch_states[name_args])
440
- scopes[name_args]
441
- else
442
- _register_class_observer
434
+ _register_class_observer
435
+ unless 'fi'.include?(_class_fetch_states[name_args])
443
436
  self.send("promise_#{name}", *args)
444
- scopes[name_args]
445
437
  end
438
+ scopes[name_args]
446
439
  end
447
440
  define_singleton_method("update_#{name}") do |*args|
448
- name_args = if args.size > 0
449
- "#{name}_#{args.to_json}"
450
- else
451
- name
452
- end
453
- _class_fetch_states[name_args] = 'u'
441
+ _class_fetch_states[_name_args(name, *args)] = 'u'
454
442
  end
455
443
  end
456
444
 
@@ -502,6 +490,14 @@ module HyperRecord
502
490
  @_class_state_key
503
491
  end
504
492
 
493
+ def _name_args(name, *args)
494
+ if args.size > 0
495
+ "#{name}_#{args.to_json}"
496
+ else
497
+ name
498
+ end
499
+ end
500
+
505
501
  def _promise_find(id, record_in_progress)
506
502
  _class_fetch_states["record_#{id}"] = 'i'
507
503
  _promise_get("#{resource_base_uri}/#{id}.json").then do |response|
@@ -4,13 +4,16 @@ module HyperRecord
4
4
  def initialize(record_hash = {})
5
5
  # initalize internal data structures
6
6
  record_hash = {} if record_hash.nil?
7
- @properties_hash = {}
8
- @changed_properties_hash = {}
7
+ @properties = {}
8
+ @changed_properties = {}
9
9
  @relations = {}
10
- @rest_methods_hash = {}
11
- self.class.rest_methods.keys.each { |method| @rest_methods_hash[method] = {} }
10
+ @rest_methods = {}
12
11
  @destroyed = false
13
- # for reactivity
12
+ # for reactivity, possible @fetch_states:
13
+ # n - not fetched
14
+ # f - fetched
15
+ # i - fetch in progress
16
+ # u - update needed, fetch on next usage
14
17
  @fetch_states = {}
15
18
  @state_key = "#{self.class.to_s}_#{self.object_id}"
16
19
  @observers = Set.new
@@ -42,19 +45,16 @@ module HyperRecord
42
45
  else
43
46
  @relations[relation] = nil
44
47
  end
45
- @fetch_states[relation] = 'n' # not fetched
48
+ @fetch_states[relation] = 'n'
46
49
  end
47
50
  end
48
51
  record_hash.delete(relation)
49
52
  end
50
53
 
51
- @properties_hash = record_hash
52
-
53
- # change state
54
- _mutate_state
54
+ @properties = record_hash
55
55
 
56
56
  # cache in global cache
57
- self.class._record_cache[@properties_hash[:id].to_s] = self if @properties_hash.has_key?(:id)
57
+ self.class._record_cache[@properties[:id].to_s] = self if @properties.has_key?(:id)
58
58
  end
59
59
 
60
60
  ### reactive api
@@ -79,12 +79,12 @@ module HyperRecord
79
79
  def method_missing(method, arg)
80
80
  _register_observer
81
81
  if method.end_with?('=')
82
- @changed_properties_hash[method.chop] = arg
82
+ @changed_properties[method.chop] = arg
83
83
  else
84
- if @changed_properties_hash.has_key?(method)
85
- @changed_properties_hash[method]
84
+ if @changed_properties.has_key?(method)
85
+ @changed_properties[method]
86
86
  else
87
- @properties_hash[method]
87
+ @properties[method]
88
88
  end
89
89
  end
90
90
  end
@@ -95,21 +95,13 @@ module HyperRecord
95
95
 
96
96
  def reset
97
97
  _register_observer
98
- @changed_properties_hash = {}
98
+ @changed_properties = {}
99
99
  end
100
100
 
101
101
  def resource_base_uri
102
102
  self.class.resource_base_uri
103
103
  end
104
104
 
105
- def rest_method_force_updates(method_name)
106
- @rest_methods_hash[method_name][:force] = true
107
- end
108
-
109
- def rest_method_unforce_updates(method_name)
110
- @rest_methods_hash[method_name][:force] = false
111
- end
112
-
113
105
  def save
114
106
  _register_observer
115
107
  promise_save.then do
@@ -120,14 +112,14 @@ module HyperRecord
120
112
 
121
113
  def to_hash
122
114
  _register_observer
123
- res = @properties_hash.dup
124
- res.merge!(@changed_properties_hash)
115
+ res = @properties.dup
116
+ res.merge!(@changed_properties)
125
117
  res
126
118
  end
127
119
 
128
120
  def to_s
129
121
  _register_observer
130
- @properties_hash.to_s
122
+ @properties.to_s
131
123
  end
132
124
 
133
125
  def unlink(other_record)
@@ -142,7 +134,7 @@ module HyperRecord
142
134
 
143
135
  def promise_destroy
144
136
  _local_destroy
145
- self.class._promise_delete("#{resource_base_uri}/#{@properties_hash[:id]}").then do |response|
137
+ self.class._promise_delete("#{resource_base_uri}/#{@properties[:id]}").then do |response|
146
138
  self
147
139
  end.fail do |response|
148
140
  error_message = "Destroying record #{self} failed!"
@@ -155,15 +147,15 @@ module HyperRecord
155
147
  called_from_collection = relation_name ? true : false
156
148
  relation_name = other_record.class.to_s.underscore.pluralize unless relation_name
157
149
  if reflections.has_key?(relation_name)
158
- self.send(relation_name).push(other_record) unless called_from_collection
150
+ @relations[relation_name].push(other_record) if !called_from_collection && @fetch_states[relation_name] == 'f'
159
151
  else
160
152
  relation_name = other_record.class.to_s.underscore
161
153
  raise "No collection for record of type #{other_record.class}" unless reflections.has_key?(relation_name)
162
- self.send("#{relation_name}=", other_record) unless called_from_collection
154
+ @relations[relation_name].push(other_record) if !called_from_collection && @fetch_states[relation_name] == 'f'
163
155
  end
164
156
  payload_hash = other_record.to_hash
165
157
  self.class._promise_post("#{resource_base_uri}/#{self.id}/relations/#{relation_name}.json", { data: payload_hash }).then do |response|
166
- other_record.instance_variable_get(:@properties_hash).merge!(response.json[other_record.class.to_s.underscore])
158
+ other_record.instance_variable_get(:@properties).merge!(response.json[other_record.class.to_s.underscore])
167
159
  self
168
160
  end.fail do |response|
169
161
  error_message = "Linking record #{other_record} to #{self} failed!"
@@ -173,14 +165,14 @@ module HyperRecord
173
165
  end
174
166
 
175
167
  def promise_save
176
- payload_hash = @properties_hash.merge(@changed_properties_hash) # copy hash, because we need to delete some keys
168
+ payload_hash = @properties.merge(@changed_properties) # copy hash, because we need to delete some keys
177
169
  (%i[id created_at updated_at] + reflections.keys).each do |key|
178
170
  payload_hash.delete(key)
179
171
  end
180
- if @properties_hash[:id] && ! (@changed_properties_hash.has_key?(:id) && @changed_properties_hash[:id].nil?)
172
+ if @properties[:id] && ! (@changed_properties.has_key?(:id) && @changed_properties[:id].nil?)
181
173
  reset
182
- self.class._promise_patch("#{resource_base_uri}/#{@properties_hash[:id]}", { data: payload_hash }).then do |response|
183
- @properties_hash.merge!(response.json[self.class.to_s.underscore])
174
+ self.class._promise_patch("#{resource_base_uri}/#{@properties[:id]}", { data: payload_hash }).then do |response|
175
+ @properties.merge!(response.json[self.class.to_s.underscore])
184
176
  self
185
177
  end.fail do |response|
186
178
  error_message = "Saving record #{self} failed!"
@@ -190,7 +182,7 @@ module HyperRecord
190
182
  else
191
183
  reset
192
184
  self.class._promise_post(resource_base_uri, { data: payload_hash }).then do |response|
193
- @properties_hash.merge!(response.json[self.class.to_s.underscore])
185
+ @properties.merge!(response.json[self.class.to_s.underscore])
194
186
  self
195
187
  end.fail do |response|
196
188
  error_message = "Creating record #{self} failed!"
@@ -204,8 +196,8 @@ module HyperRecord
204
196
  called_from_collection = collection_name ? true : false
205
197
  relation_name = other_record.class.to_s.underscore.pluralize unless relation_name
206
198
  raise "No relation for record of type #{other_record.class}" unless reflections.has_key?(relation_name)
207
- self.send(relation_name).delete_if { |cr| cr == other_record } unless called_from_collection
208
- self.class._promise_delete("#{resource_base_uri}/#{@properties_hash[:id]}/relations/#{relation_name}.json?record_id=#{other_record.id}").then do |response|
199
+ @relations[relation_name].delete_if { |cr| cr == other_record } if !called_from_collection && @fetch_states[relation_name] == 'f'
200
+ self.class._promise_delete("#{resource_base_uri}/#{@properties[:id]}/relations/#{relation_name}.json?record_id=#{other_record.id}").then do |response|
209
201
  self
210
202
  end.fail do |response|
211
203
  error_message = "Unlinking #{other_record} from #{self} failed!"
@@ -219,7 +211,7 @@ module HyperRecord
219
211
  def _local_destroy
220
212
  _register_observer
221
213
  @destroyed = true
222
- self.class._record_cache.delete(@properties_hash[:id].to_s)
214
+ self.class._record_cache.delete(@properties[:id].to_s)
223
215
  @registered_collections.dup.each do |collection|
224
216
  collection.delete(self)
225
217
  end
@@ -267,7 +259,7 @@ module HyperRecord
267
259
  end
268
260
  if `Date.parse(#{c_record.updated_at}) >= Date.parse(#{data[:cause][:updated_at]})`
269
261
  if @fetch_states[data[:relation]] == 'f'
270
- if send(data[:relation]).include?(c_record)
262
+ if @relations[data[:relation]].include?(c_record)
271
263
  return unless data[:cause][:destroyed]
272
264
  end
273
265
  end
@@ -275,7 +267,17 @@ module HyperRecord
275
267
  end
276
268
  end
277
269
  @fetch_states[data[:relation]] = 'u'
278
- send(data[:relation])
270
+ send("prommise_#{data[:relation]}").then do |collection|
271
+ _notify_observers
272
+ end.fail do |response|
273
+ error_message = "#{self}[#{self.id}].#{data[:relation]} failed to update!"
274
+ `console.error(error_message)`
275
+ end
276
+ return
277
+ end
278
+ if data.has_key?(:rest_method)
279
+ @fetch_states[data[:rest_method]] = 'u'
280
+ _notify_observers
279
281
  return
280
282
  end
281
283
  if data[:destroyed]
@@ -284,18 +286,16 @@ module HyperRecord
284
286
  _local_destroy
285
287
  return
286
288
  end
287
- if @properties_hash[:updated_at] && data[:updated_at]
288
- return if `Date.parse(#{@properties_hash[:updated_at]}) >= Date.parse(#{data[:updated_at]})`
289
+ if @properties[:updated_at] && data[:updated_at]
290
+ return if `Date.parse(#{@properties[:updated_at]}) >= Date.parse(#{data[:updated_at]})`
289
291
  end
290
- self.class._promise_get("#{resource_base_uri}/#{@properties_hash[:id]}.json").then do |response|
291
- klass_key = self.class.to_s.underscore
292
- self._initialize_from_hash(response.json[klass_key]) if response.json[klass_key]
292
+ self.class._class_fetch_states["record_#{id}"] = 'u'
293
+ self.class._promise_find(@properties[:id], self).then do |record|
293
294
  _notify_observers
294
295
  self
295
296
  end.fail do |response|
296
297
  error_message = "#{self} failed to update!"
297
298
  `console.error(error_message)`
298
- response
299
299
  end
300
300
  end
301
301
  end
@@ -1,10 +1,14 @@
1
1
  module HyperRecord
2
2
  module PubSub
3
3
  def self.included(base)
4
+ attr_accessor :current_rest_method_params
5
+
4
6
  base.extend(HyperRecord::PubSub::ClassMethods)
5
7
  end
6
8
 
7
9
  module ClassMethods
10
+ attr_accessor :current_rest_method_params
11
+
8
12
  def _pusher_client
9
13
  Hyperloop.pusher_instance ||= Pusher::Client.new(
10
14
  app_id: Hyperloop.pusher[:app_id],
@@ -70,6 +74,45 @@ module HyperRecord
70
74
  Hyperloop.redis_instance.del("HRPS__#{record.class}__#{record.id}") if record.destroyed?
71
75
  end
72
76
 
77
+ def publish_rest_class_method(record_class, rest_class_method_name)
78
+ subscribers = Hyperloop.redis_instance.hgetall("HRPS__#{record_class}__rest_class_method__#{rest_class_method_name}")
79
+ time_now = Time.now.to_f
80
+ scrub_time = time_now - 24.hours.to_f
81
+ subscribers.each do |session_id, last_requested|
82
+ if last_requested.to_f < scrub_time
83
+ Hyperloop.redis_instance.hdel("HRPS__#{record_class}__rest_class_method__#{rest_class_method_name}", session_id)
84
+ next
85
+ end
86
+ message = {
87
+ record_type: record_class.to_s,
88
+ rest_class_method: rest_class_method_name
89
+ }
90
+ if Hyperloop.resource_transport == :pusher
91
+ _pusher_client.trigger("hyper-record-update-channel-#{session_id}", 'update', message)
92
+ end
93
+ end
94
+ end
95
+
96
+ def publish_rest_method(record, method_name)
97
+ subscribers = Hyperloop.redis_instance.hgetall("HRPS__#{record.class}__#{record.id}__rest_method__#{method_name}")
98
+ time_now = Time.now.to_f
99
+ scrub_time = time_now - 24.hours.to_f
100
+ subscribers.each do |session_id, last_requested|
101
+ if last_requested.to_f < scrub_time
102
+ Hyperloop.redis_instance.hdel("HRPS__#{record.class}__#{record.id}__rest_method__#{method_name}", session_id)
103
+ next
104
+ end
105
+ message = {
106
+ record_type: record_class.to_s,
107
+ id: record.id,
108
+ rest_method: method_name
109
+ }
110
+ if Hyperloop.resource_transport == :pusher
111
+ _pusher_client.trigger("hyper-record-update-channel-#{session_id}", 'update', message)
112
+ end
113
+ end
114
+ end
115
+
73
116
  def publish_scope(record_class, scope_name)
74
117
  subscribers = Hyperloop.redis_instance.hgetall("HRPS__#{record_class}__scope__#{scope_name}")
75
118
  time_now = Time.now.to_f
@@ -112,6 +155,22 @@ module HyperRecord
112
155
  Hyperloop.redis_instance.hset "HRPS__#{record.class}__#{record.id}", session.id.to_s, Time.now.to_f.to_s
113
156
  end
114
157
 
158
+ def subscribe_rest_class_method(record_class, rest_class_method_name)
159
+ return unless session.id
160
+ time_now = Time.now.to_f.to_s
161
+ session_id = session.id.to_s
162
+ Hyperloop.redis_instance.pipelined do
163
+ Hyperloop.redis_instance.hset("HRPS__#{record_class}__rest_class_method_name__#{rest_class_method_name}", session_id, time_now)
164
+ end
165
+ end
166
+
167
+ def subscribe_rest_method(record, rest_method_name)
168
+ return unless session.id
169
+ time_now = Time.now.to_f.to_s
170
+ session_id = session.id.to_s
171
+ Hyperloop.redis_instance.hset("HRPS__#{record.class}__#{record.id}__rest_method__#{rest_method_name}", session_id, time_now)
172
+ end
173
+
115
174
  def subscribe_scope(collection, record_class = nil, scope_name = nil)
116
175
  return unless session.id
117
176
  time_now = Time.now.to_f.to_s
@@ -136,6 +195,16 @@ module HyperRecord
136
195
  publish_record(record)
137
196
  end
138
197
 
198
+ def pub_sub_rest_class_method(record_class, rest_class_method_name)
199
+ subscribe_rest_class_method(record_class, rest_class_method_name)
200
+ publish_rest_class_method(record_class, rest_class_method_name)
201
+ end
202
+
203
+ def pub_sub_rest_method(record, rest_method_name)
204
+ subscribe_rest_method(record, rest_method_name)
205
+ publish_rest_method(record, rest_method_name)
206
+ end
207
+
139
208
  def pub_sub_scope(collection, record_class, scope_name)
140
209
  subscribe_scope(collection, record_class, scope_name)
141
210
  publish_scope(record_class, scope_name)
@@ -26,7 +26,7 @@ module HyperRecord
26
26
  end
27
27
 
28
28
  def rest_methods
29
- @rest_methods_hash ||= {}
29
+ @rest_methods ||= {}
30
30
  end
31
31
 
32
32
  def resource_scopes
@@ -97,11 +97,24 @@ module Hyperloop
97
97
  if scope_params
98
98
  scope_params = '[' + scope_params
99
99
  record_class._class_fetch_states[data[:scope]] = 'u'
100
- record_class.send(scope_name, *JSON.parse(scope_params))
100
+ record_class.send("promise_#{scope_name}", *JSON.parse(scope_params)).then do |collection|
101
+ record_class._notify_class_observers
102
+ end.fail do |response|
103
+ error_message = "#{record_class}.#{scope_name}(#{scope_params}), a scope failed to update!"
104
+ `console.error(error_message)`
105
+ end
101
106
  else
102
107
  record_class._class_fetch_states[data[:scope]] = 'u'
103
- record_class.send(data[:scope])
108
+ record_class.send(data[:scope]).then do |collection|
109
+ record_class._notify_class_observers
110
+ end.fail do |response|
111
+ error_message = "#{record_class}.#{scope_name}, a scope failed to update!"
112
+ `console.error(error_message)`
113
+ end
104
114
  end
115
+ elsif data[:rest_class_method]
116
+ record_class._class_fetch_states[data[:rest_class_method]] = 'u'
117
+ record_class._notify_class_observers
105
118
  elsif record_class.record_cached?(data[:id])
106
119
  record = record_class.find(data[:id])
107
120
  record._update_record(data)
@@ -1,5 +1,5 @@
1
1
  module Hyperloop
2
2
  module Resource
3
- VERSION = '1.0.0.lap58'
3
+ VERSION = '1.0.0.lap62'
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hyper-resource
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0.lap58
4
+ version: 1.0.0.lap62
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jan Biedermann
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-04-26 00:00:00.000000000 Z
11
+ date: 2018-04-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: opal