isomorfeus-data 2.5.5 → 22.9.0.rc2

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,127 +0,0 @@
1
- module Isomorfeus
2
- module Data
3
- module GenericClassApi
4
- if RUBY_ENGINE == 'opal'
5
- def destroy(key:)
6
- promise_destroy(key: key)
7
- true
8
- end
9
-
10
- def promise_destroy(key:)
11
- Isomorfeus::Transport.promise_send_path( 'Isomorfeus::Data::Handler::Generic', self.name, :destroy, key: key).then do |agent|
12
- agent.process do
13
- Isomorfeus.store.dispatch(type: 'DATA_DESTROY', data: [self.name, key])
14
- true
15
- end
16
- end
17
- end
18
-
19
- def load(key:)
20
- instance = self.new(key: key, _loading: true)
21
- promise_load(key: key, instance: instance) unless instance.loaded?
22
- instance
23
- end
24
-
25
- def promise_load(key:, instance: nil)
26
- instance = self.new(key: key, _loading: true) unless instance
27
- if instance.loaded?
28
- Promise.new.resolve(instance)
29
- else
30
- promise_load!(key: key, instance: instance)
31
- end
32
- end
33
-
34
- def load!(key:)
35
- instance = self.new(key: key, _loading: true)
36
- promise_load!(key: key, instance: instance) unless instance.loaded?
37
- instance
38
- end
39
-
40
- def promise_load!(key:, instance: nil)
41
- instance = self.new(key: key, _loading: true) unless instance
42
- Isomorfeus::Transport.promise_send_path( 'Isomorfeus::Data::Handler::Generic', self.name, :load, key: key).then do |agent|
43
- agent.process do
44
- instance._load_from_store!
45
- Isomorfeus.store.dispatch(type: 'DATA_LOAD', data: agent.full_response[:data])
46
- instance
47
- end
48
- end
49
- end
50
-
51
- # execute
52
- def execute_create(_); end
53
- def execute_destroy(_); end
54
- def execute_load(_); end
55
- def execute_save(_); end
56
- else # RUBY_ENGINE
57
- def destroy(key:)
58
- !!instance_exec(key: key, &@_destroy_block)
59
- end
60
-
61
- def promise_destroy(key:)
62
- Promise.new.resolve(destroy(key: key))
63
- end
64
-
65
- def load(key:, _already_loaded: {})
66
- data = if @_load_block.arity == 1
67
- instance_exec(key: key, &@_load_block)
68
- else
69
- instance_exec(key: key, _already_loaded: _already_loaded, &@_load_block)
70
- end
71
- return nil if data.nil?
72
- return data if data.class.to_s == self.to_s
73
- Isomorfeus.raise_error(message: "#{self}: execute_load must return a instance of #{self} or nil. Returned was: #{data.class}.")
74
- end
75
- alias load! load
76
-
77
- def promise_load(key:)
78
- instance = self.load(key: key)
79
- result_promise = Promise.new
80
- result_promise.resolve(instance)
81
- result_promise
82
- end
83
- alias promise_load! promise_load
84
-
85
- def execute_create(&block)
86
- @_create_block = block
87
- end
88
-
89
- def execute_destroy(&block)
90
- @_destroy_block = block
91
- end
92
-
93
- def execute_load(&block)
94
- @_load_block = block
95
- end
96
-
97
- def execute_save(&block)
98
- @_save_block = block
99
- end
100
- end # RUBY_ENGINE
101
-
102
- def gen_ref_s(key)
103
- "---iso-object-reference---#{self.name}---#{key}---"
104
- end
105
-
106
- def gen_sid_s(key)
107
- "[#{self.name}|#{key}]"
108
- end
109
-
110
- def create(key: nil, **things)
111
- new(key: key, **things).create
112
- end
113
-
114
- def promise_create(key: nil, **things)
115
- new(key: key, **things).promise_create
116
- end
117
-
118
- def current_user
119
- Isomorfeus.current_user
120
- end
121
-
122
- def pub_sub_client
123
- Isomorfeus.pub_sub_client
124
- end
125
- end
126
- end
127
- end
@@ -1,171 +0,0 @@
1
- module Isomorfeus
2
- module Data
3
- module GenericInstanceApi
4
- def key
5
- @key
6
- end
7
-
8
- def key=(k)
9
- @key = k.to_s
10
- end
11
-
12
- def changed?
13
- @_changed
14
- end
15
-
16
- def revision
17
- @_revision
18
- end
19
-
20
- def sid
21
- [@class_name, @key]
22
- end
23
-
24
- def sid_s
25
- "[#{@class_name}|#{@key}]"
26
- end
27
-
28
- def ref_s
29
- self.class.gen_ref_s(@key)
30
- end
31
-
32
- if RUBY_ENGINE == 'opal'
33
- def loaded?
34
- Redux.fetch_by_path(*@_store_path) ? true : false
35
- end
36
-
37
- def create
38
- promise_create
39
- self
40
- end
41
-
42
- def promise_create
43
- data_hash = { instance: to_transport }
44
- data_hash.deep_merge!(included_items: included_items_to_transport) if respond_to?(:included_items_to_transport)
45
- class_name = self.class.name
46
- Isomorfeus::Transport.promise_send_path( 'Isomorfeus::Data::Handler::Generic', class_name, :create, data_hash).then do |agent|
47
- agent.process do |agnt|
48
- data = agnt.full_response[:data]
49
- if data.key?(class_name) && data[class_name].key?(@key) && data[class_name][@key].key?('new_key')
50
- @key = data[class_name][@key]['new_key']
51
- @revision = data[class_name][@key]['revision'] if data[class_name][@key].key?('revision')
52
- _update_paths
53
- end
54
- _load_from_store!
55
- Isomorfeus.store.dispatch(type: 'DATA_LOAD', data: data)
56
- self
57
- end
58
- end
59
- end
60
-
61
- def destroy
62
- promise_destroy
63
- nil
64
- end
65
-
66
- def promise_destroy
67
- self.class.promise_destroy(key: @key)
68
- end
69
-
70
- def reload
71
- self.class.promise_load!(key: @key, instance: self)
72
- self
73
- end
74
-
75
- def promise_reload
76
- self.class.promise_load!(key: @key, instance: self)
77
- end
78
-
79
- def save
80
- promise_save
81
- self
82
- end
83
-
84
- def promise_save
85
- data_hash = { instance: to_transport }
86
- data_hash.deep_merge!(included_items: included_items_to_transport) if respond_to?(:included_items_to_transport)
87
- class_name = self.class.name
88
- Isomorfeus::Transport.promise_send_path( 'Isomorfeus::Data::Handler::Generic', class_name, :save, data_hash).then do |agent|
89
- agent.process do |agnt|
90
- data = agnt.full_response[:data]
91
- if data.key?(class_name) && data[class_name].key?(@key) && data[class_name][@key].key?('new_key')
92
- @key = data[class_name][@key]['new_key']
93
- @revision = data[class_name][@key]['revision'] if data[class_name][@key].key?('revision')
94
- _update_paths
95
- end
96
- _load_from_store!
97
- Isomorfeus.store.dispatch(type: 'DATA_LOAD', data: data)
98
- self
99
- end
100
- end
101
- end
102
- else # RUBY_ENGINE
103
- def loaded?
104
- true
105
- end
106
-
107
- def create(_already_saved: {})
108
- previous_key = self.key
109
- create_block = self.class.instance_variable_get(:@_create_block)
110
- instance = if create_block.arity == 0
111
- instance_exec(&create_block)
112
- else
113
- instance_exec(_already_saved: _already_saved, &create_block)
114
- end
115
- return nil unless instance
116
- Isomorfeus.raise_error(message: "#{self.to_s}: execute_create must return self or nil. Returned was: #{instance.class}.") if instance != self
117
- instance_variable_set(:@previous_key, previous_key) if key != previous_key
118
- _unchange!
119
- self
120
- end
121
-
122
- def promise_create
123
- promise = Promise.new
124
- promise.resolve(create)
125
- end
126
-
127
- def destroy
128
- self.class.destroy(key: @key)
129
- end
130
-
131
- def promise_destroy
132
- self.class.promise_destroy(key: @key)
133
- end
134
-
135
- # reload must be implemented by mixin
136
-
137
- def promise_reload
138
- Promise.new.resolve(reload)
139
- end
140
-
141
- def save(_already_saved: {})
142
- previous_key = self.key
143
- save_block = self.class.instance_variable_get(:@_save_block)
144
- instance = if save_block.arity == 0
145
- instance_exec(&save_block)
146
- else
147
- instance_exec(_already_saved: _already_saved, &save_block)
148
- end
149
- return nil unless instance
150
- Isomorfeus.raise_error(message: "#{self.to_s}: execute_save must return self or nil. Returned was: #{instance.class}.") if instance != self
151
- instance_variable_set(:@previous_key, previous_key) if key != previous_key
152
- _unchange!
153
- self
154
- end
155
-
156
- def promise_save
157
- promise = Promise.new
158
- promise.resolve(save)
159
- end
160
- end # RUBY_ENGINE
161
-
162
- def current_user
163
- Isomorfeus.current_user
164
- end
165
-
166
- def pub_sub_client
167
- Isomorfeus.pub_sub_client
168
- end
169
- end
170
- end
171
- end
@@ -1,133 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Isomorfeus
4
- module Data
5
- module Handler
6
- class Generic < LucidHandler::Base
7
- # responsible for loading:
8
- # LucidObject
9
- # LucidFile
10
- # LucidQuery
11
-
12
- def process_request(response_agent)
13
- # promise_send_path('Isomorfeus::Data::Handler::Generic', self.to_s, action, props_hash)
14
- response_agent.request.each_key do |type_class_name|
15
- if Isomorfeus.valid_data_class_name?(type_class_name)
16
- type_class = Isomorfeus.cached_data_class(type_class_name)
17
- if type_class
18
- response_agent.request[type_class_name].each_key do |action|
19
- case action
20
- when 'load' then process_load(response_agent, type_class, type_class_name)
21
- when 'execute' then process_execute(response_agent, type_class, type_class_name)
22
- when 'create' then process_create(response_agent, type_class, type_class_name)
23
- when 'save' then process_save(response_agent, type_class, type_class_name)
24
- when 'destroy' then process_destroy(response_agent, type_class, type_class_name)
25
- else response_agent.error = { error: { action => 'No such thing!' }}
26
- end
27
- end
28
- else response_agent.error = { error: { type_class_name => 'No such class!' }}
29
- end
30
- else response_agent.error = { error: { type_class_name => 'Not a valid LucidData class!' }}
31
- end
32
- end
33
- rescue Exception => e
34
- response_agent.error = { error: "Isomorfeus::Data::Handler::Generic: #{e.message}\n#{e.backtrace.join("\n")}" }
35
- end
36
-
37
- def process_create(response_agent, type_class, type_class_name)
38
- # 'Isomorfeus::Data::Handler::Generic', self.name, :create, data_hash
39
- data = response_agent.request[type_class_name]['create']
40
- instance_data = data['instance']
41
- included_items_data = data.key?('included_items') ? data['included_items'] : nil
42
- if Isomorfeus.current_user.authorized?(type_class, :create, type_class.props_from_data(instance_data))
43
- instance = type_class.instance_from_transport(instance_data, included_items_data)
44
- created_type = instance.create
45
- if created_type
46
- response_agent.outer_result = {} unless response_agent.outer_result
47
- response_agent.outer_result.deep_merge!(data: created_type.to_transport)
48
- if created_type.respond_to?(:included_items_to_transport)
49
- response_agent.outer_result.deep_merge!(data: created_type.included_items_to_transport)
50
- end
51
- response_agent.agent_result = { success: 'ok' }
52
- else response_agent.error = { error: { type_class_name => 'Create returned nothing!' }}
53
- end
54
- else response_agent.error = { error: 'Access denied!' }
55
- end
56
- end
57
-
58
- def process_execute(response_agent, type_class, type_class_name)
59
- # 'Isomorfeus::Data::Handler::Generic', self.name, :execute, props_json
60
- props = response_agent.request[type_class_name]['execute']
61
- props.transform_keys!(&:to_sym)
62
- if Isomorfeus.current_user.authorized?(type_class, :execute, props)
63
- queried_type = type_class.execute(**props)
64
- if queried_type
65
- response_agent.outer_result = {} unless response_agent.outer_result
66
- response_agent.outer_result.deep_merge!(data: queried_type.to_transport)
67
- if queried_type.respond_to?(:included_items_to_transport)
68
- response_agent.outer_result.deep_merge!(data: queried_type.included_items_to_transport)
69
- end
70
- response_agent.agent_result = { success: 'ok' }
71
- else response_agent.error = { error: { type_class_name => 'Query returned nothing!' }}
72
- end
73
- else response_agent.error = { error: 'Access denied!' }
74
- end
75
- end
76
-
77
- def process_load(response_agent, type_class, type_class_name)
78
- # 'Isomorfeus::Data::Handler::Generic', self.name, :load, key: key
79
- props = response_agent.request[type_class_name]['load']
80
- props.transform_keys!(&:to_sym)
81
- if Isomorfeus.current_user.authorized?(type_class, :load, props)
82
- loaded_type = type_class.load(**props)
83
- if loaded_type
84
- response_agent.outer_result = {} unless response_agent.outer_result
85
- response_agent.outer_result.deep_merge!(data: loaded_type.to_transport)
86
- if loaded_type.respond_to?(:included_items_to_transport)
87
- response_agent.outer_result.deep_merge!(data: loaded_type.included_items_to_transport)
88
- end
89
- response_agent.agent_result = { success: 'ok' }
90
- else response_agent.error = { error: { type_class_name => 'Load returned nothing!' }}
91
- end
92
- else response_agent.error = { error: 'Access denied!' }
93
- end
94
- end
95
-
96
- def process_save(response_agent, type_class, type_class_name)
97
- # 'Isomorfeus::Data::Handler::Generic', self.name, :save, data_hash
98
- data = response_agent.request[type_class_name]['save']
99
- instance_data = data['instance']
100
- included_items_data = data.key?('included_items') ? data['included_items'] : nil
101
- if Isomorfeus.current_user.authorized?(type_class, :save, type_class.props_from_data(instance_data))
102
- instance = type_class.instance_from_transport(instance_data, included_items_data)
103
- saved_type = instance.save
104
- if saved_type
105
- response_agent.outer_result = {} unless response_agent.outer_result
106
- response_agent.outer_result.deep_merge!(data: saved_type.to_transport)
107
- if saved_type.respond_to?(:included_items_to_transport)
108
- response_agent.outer_result.deep_merge!(data: saved_type.included_items_to_transport)
109
- end
110
- response_agent.agent_result = { success: 'ok' }
111
- else response_agent.error = { error: { type_class_name => 'Save returned nothing!' }}
112
- end
113
- else response_agent.error = { error: 'Access denied!' }
114
- end
115
- end
116
-
117
- def process_destroy(response_agent, type_class, type_class_name)
118
- props = response_agent.request[type_class_name]['destroy']
119
- props.transform_keys!(&:to_sym)
120
- if Isomorfeus.current_user.authorized?(type_class, :destroy, props)
121
- result = type_class.destroy(**props)
122
- if result
123
- response_agent.agent_result = { success: 'ok' }
124
- else
125
- response_agent.error = { error: { type_class_name => 'Destroy failed!' }}
126
- end
127
- else response_agent.error = { error: 'Access denied!' }
128
- end
129
- end
130
- end
131
- end
132
- end
133
- end
@@ -1,10 +0,0 @@
1
- module LucidFile
2
- class Base
3
- def self.inherited(base)
4
- base.include LucidFile::Mixin
5
- if RUBY_ENGINE != 'opal'
6
- Isomorfeus.add_valid_data_class(base)
7
- end
8
- end
9
- end
10
- end