isomorfeus-data 2.5.5 → 22.9.0.rc1

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.
@@ -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