trophonius 1.4.5.5 → 2.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,28 +1,37 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ # require 'time'
4
+ # require 'date_time'
5
+ # require 'date'
6
+ require 'active_support/inflector'
3
7
  require 'json'
4
- require 'trophonius_config'
8
+ require 'config'
9
+ require 'translator'
5
10
 
6
11
  module Trophonius
7
12
  # This class will hold a singular record
8
13
  #
9
14
  # A Record is contained in a RecordSet and has methods to retrieve data from the fields inside the Record-hash
10
- class Trophonius::Record < Hash
15
+ class Record < Hash
16
+ include Trophonius::Translator
11
17
  attr_accessor :record_id, :model_name, :layout_name, :modifiable_fields, :modified_fields
12
18
 
13
19
  ##
14
20
  # Initializes a new Record
15
- def initialize(model = '')
21
+ def initialize(fm_record = {}, model = '')
16
22
  @modifiable_fields = {}
17
23
  @modified_fields = {}
18
- model_name = model
24
+ @model_name = model
19
25
  @model = ActiveSupport::Inflector.constantize(ActiveSupport::Inflector.classify(ActiveSupport::Inflector.singularize(model_name)))
20
-
21
- super
26
+ @layout_name = @model.layout_name
27
+ define_field_methods(fm_record)
28
+ define_portal_methods(fm_record)
29
+ super()
22
30
  end
23
31
 
24
32
  def []=(field, new_val)
25
33
  modifiable_fields[field] = new_val
34
+ modified_fields[field] = new_val
26
35
  super
27
36
  end
28
37
 
@@ -36,16 +45,7 @@ module Trophonius
36
45
  layout = model.layout_name
37
46
  model.create_translations if model.translations.keys.empty?
38
47
 
39
- uri = URI::RFC2396_Parser.new
40
- url =
41
- URI(
42
- uri.escape(
43
- "http#{Trophonius.config.ssl == true ? 's' : ''}://#{Trophonius.config.host}/fmi/data/v1/databases/#{
44
- Trophonius.config.database
45
- }/layouts/#{layout}/_find"
46
- )
47
- )
48
-
48
+ url = "/layouts/#{layout}/_find"
49
49
  foreign_key_field = if model.translations.key?(relation[:foreign_key])
50
50
  model.translations[relation[:foreign_key]].to_s
51
51
  else
@@ -59,7 +59,7 @@ module Trophonius
59
59
  end
60
60
 
61
61
  body = { query: [{ foreign_key_field => self[primary_key_field].to_s }], limit: 100_000 }.to_json
62
- response = Request.make_request(url, "Bearer #{Request.get_token}", 'post', body)
62
+ response = DatabaseRequest.make_request(url, 'post', body)
63
63
 
64
64
  if response['messages'][0]['code'] == '0'
65
65
  r_results = response['response']['data']
@@ -75,7 +75,7 @@ module Trophonius
75
75
 
76
76
  else
77
77
  if response['messages'][0]['code'] == '102'
78
- results = Request.retrieve_first(layout)
78
+ results = DatabaseRequest.retrieve_first(layout)
79
79
  if results['messages'][0]['code'] == '0'
80
80
  r_results = results['response']['data']
81
81
  ret_val = r_results.empty? ? Error.throw_error('102') : r_results[0]['fieldData']
@@ -97,15 +97,7 @@ module Trophonius
97
97
  layout = pk_model.layout_name
98
98
  pk_model.create_translations if pk_model.translations.keys.empty?
99
99
 
100
- uri = URI::RFC2396_Parser.new
101
- url =
102
- URI(
103
- uri.escape(
104
- "http#{Trophonius.config.ssl == true ? 's' : ''}://#{Trophonius.config.host}/fmi/data/v1/databases/#{
105
- Trophonius.config.database
106
- }/layouts/#{layout}/_find"
107
- )
108
- )
100
+ url = "/layouts/#{layout}/_find"
109
101
 
110
102
  foreign_key_field = if fk_model.translations.key?(relation[:foreign_key])
111
103
  fk_model.translations[relation[:foreign_key]].to_s
@@ -121,7 +113,7 @@ module Trophonius
121
113
 
122
114
  body = { query: [{ primary_key_field => self[foreign_key_field].to_s }], limit: 1 }.to_json
123
115
 
124
- response = Request.make_request(url, "Bearer #{Request.get_token}", 'post', body)
116
+ response = DatabaseRequest.make_request(url, 'post', body)
125
117
  if response['messages'][0]['code'] == '0'
126
118
  r_results = response['response']['data']
127
119
  ret_val = RecordSet.new(layout, pk_model.non_modifiable_fields)
@@ -136,7 +128,7 @@ module Trophonius
136
128
 
137
129
  else
138
130
  if response['messages'][0]['code'] == '102'
139
- results = Request.retrieve_first(layout)
131
+ results = DatabaseRequest.retrieve_first(layout)
140
132
  if results['messages'][0]['code'] == '0'
141
133
  r_results = results['response']['data']
142
134
  ret_val = r_results.empty? ? Error.throw_error('102') : r_results[0]['fieldData']
@@ -169,17 +161,8 @@ module Trophonius
169
161
  #
170
162
  # @return [String]: string representing the script result returned by FileMaker
171
163
  def run_script(script: '', scriptparameter: '')
172
- uri = URI::RFC2396_Parser.new
173
- url =
174
- URI(
175
- uri.escape(
176
- "http#{Trophonius.config.ssl == true ? 's' : ''}://#{Trophonius.config.host}/fmi/data/v1/databases/#{
177
- Trophonius.config.database
178
- }/layouts/#{layout_name}/records/#{record_id}?script=#{script}&script.param=#{scriptparameter}"
179
- )
180
- )
181
-
182
- result = Request.make_request(url, "Bearer #{Request.get_token}", 'get', '{}')
164
+ url = "layouts/#{layout_name}/records/#{record_id}?script=#{script}&script.param=#{scriptparameter}"
165
+ result = DatabaseRequest.make_request(url, 'get', '{}')
183
166
 
184
167
  if result['messages'][0]['code'] != '0'
185
168
  Error.throw_error(result['messages'][0]['code'])
@@ -197,17 +180,10 @@ module Trophonius
197
180
  #
198
181
  # @return [True] if successful
199
182
  def save
200
- uri = URI::RFC2396_Parser.new
201
- url =
202
- URI(
203
- uri.escape(
204
- "http#{Trophonius.config.ssl == true ? 's' : ''}://#{Trophonius.config.host}/fmi/data/v1/databases/#{
205
- Trophonius.config.database
206
- }/layouts/#{layout_name}/records/#{record_id}"
207
- )
208
- )
183
+ url = "layouts/#{layout_name}/records/#{record_id}"
184
+
209
185
  body = "{\"fieldData\": #{modified_fields.to_json}}"
210
- response = Request.make_request(url, "Bearer #{Request.get_token}", 'patch', body)
186
+ response = DatabaseRequest.make_request(url, 'patch', body)
211
187
  response['messages'][0]['code'] == '0' ? true : Error.throw_error(response['messages'][0]['code'])
212
188
  end
213
189
 
@@ -217,16 +193,9 @@ module Trophonius
217
193
  #
218
194
  # @return [True] if successful
219
195
  def delete
220
- uri = URI::RFC2396_Parser.new
221
- url =
222
- URI(
223
- uri.escape(
224
- "http#{Trophonius.config.ssl == true ? 's' : ''}://#{Trophonius.config.host}/fmi/data/v1/databases/#{
225
- Trophonius.config.database
226
- }/layouts/#{layout_name}/records/#{record_id}"
227
- )
228
- )
229
- response = Request.make_request(url, "Bearer #{Request.get_token}", 'delete', '{}')
196
+ url = "layouts/#{layout_name}/records/#{record_id}"
197
+
198
+ response = DatabaseRequest.make_request(url, 'delete', '{}')
230
199
  response['messages'][0]['code'] == '0' ? true : Error.throw_error(response['messages'][0]['code'])
231
200
  end
232
201
 
@@ -238,56 +207,32 @@ module Trophonius
238
207
  #
239
208
  # @return [True] if successful
240
209
  def update(field_data, portal_data: {})
241
- uri = URI::RFC2396_Parser.new
242
- url =
243
- URI(
244
- uri.escape(
245
- "http#{Trophonius.config.ssl == true ? 's' : ''}://#{Trophonius.config.host}/fmi/data/v1/databases/#{
246
- Trophonius.config.database
247
- }/layouts/#{layout_name}/records/#{record_id}"
248
- )
249
- )
210
+ url = "layouts/#{layout_name}/records/#{record_id}"
250
211
  field_data.each_key { |field| modifiable_fields[field] = field_data[field] }
251
- new_portal_data = {}
252
- portal_data.each do |portal_name, portal_values|
253
- new_portal_data.merge!(
254
- portal_name =>
255
- portal_values.map do |record|
256
- record.each_with_object({}) do |(key, value), new_hash|
257
- if key.to_s.downcase.include?('id') && key.to_s.downcase.include?('record')
258
- new_hash['recordId'] = value
259
- else
260
- new_hash["#{portal_name}::#{key}"] = value
261
- end
262
- end
263
- end
264
- )
265
- end
266
- body =
267
- if new_portal_data == {}
268
- "{\"fieldData\": #{field_data.to_json} }"
269
- else
270
- "{\"fieldData\": #{field_data.to_json}, \"portalData\": #{new_portal_data.to_json}}"
271
- end
212
+ field_data.transform_keys! { |k| (@model.translations[k.to_s] || k).to_s }
272
213
 
273
- puts "BODY SENT TO FILEMAKER WAS: #{body}"
274
- response = Request.make_request(url, "Bearer #{Request.get_token}", 'patch', body)
275
- if response['messages'][0]['code'] == '0'
276
- true
277
- else
278
- if response['messages'][0]['code'] == '102'
279
- results = Request.retrieve_first(layout_name)
280
- if results['messages'][0]['code'] == '0'
281
- r_results = results['response']['data']
282
- Error.throw_error('102') if r_results.empty?
283
- ret_val = r_results[0]['fieldData']
284
- Error.throw_error('102', (field_data.keys.map { |key| key.to_s.downcase } - ret_val.keys.map(&:downcase)).flatten.join(', '), layout_name)
285
- else
286
- Error.throw_error('102')
214
+ portal_data.each do |portal_name, values|
215
+ values.map do |record|
216
+ record.transform_keys! do |k|
217
+ if k.to_s.downcase.include?('id') && k.to_s.downcase.include?('record')
218
+ 'recordId'
219
+ else
220
+ "#{portal_name}::#{k}"
221
+ end
287
222
  end
288
223
  end
289
- Error.throw_error(response['messages'][0]['code'])
290
224
  end
225
+
226
+ body = { fieldData: field_data }
227
+ body.merge!({ portalData: portal_data }) if portal_data.present?
228
+
229
+ response = DatabaseRequest.make_request(url, 'patch', body.to_json)
230
+ code = response['messages'][0]['code']
231
+
232
+ return throw_field_missing(field_data) if code == '102'
233
+ return Error.throw_error(code) if code != '0'
234
+
235
+ true
291
236
  end
292
237
 
293
238
  ##
@@ -300,18 +245,61 @@ module Trophonius
300
245
  #
301
246
  # @return [True] if successful
302
247
  def upload(container_name:, file:, container_repetition: 1)
303
- uri = URI::RFC2396_Parser.new
304
- url =
305
- URI(
306
- uri.escape(
307
- "http#{Trophonius.config.ssl == true ? 's' : ''}://#{Trophonius.config.host}/fmi/data/v1/databases/#{
308
- Trophonius.config.database
309
- }/layouts/#{layout_name}/records/#{record_id}/containers/#{container_name}/#{container_repetition}"
310
- )
311
- )
312
-
313
- response = Request.upload_file_request(url, "Bearer #{Request.get_token}", file)
248
+ url = "layouts/#{layout_name}/records/#{record_id}/containers/#{container_name}/#{container_repetition}"
249
+
250
+ response = DatabaseRequest.upload_file_request(url, file)
314
251
  response['messages'][0]['code'] == '0' ? true : Error.throw_error(response['messages'][0]['code'])
315
252
  end
253
+
254
+ private
255
+
256
+ def define_field_assignment(field_name, key)
257
+ define_singleton_method("#{field_name}=") do |new_val|
258
+ self[key] = new_val
259
+ modifiable_fields[key] = new_val
260
+ modified_fields[key] = new_val
261
+ end
262
+ end
263
+
264
+ def define_field_methods(fm_record)
265
+ @record_id = fm_record['recordId']
266
+
267
+ fm_record['fieldData'].each_key do |key|
268
+ method_name = methodize_field(key)
269
+ define_singleton_method(method_name) { self[key] }
270
+ merge!({ key => fm_record['fieldData'][key] })
271
+
272
+ next if @model.non_modifiable_fields.include?(key)
273
+
274
+ modifiable_fields.merge!({ key => fm_record['fieldData'][key] })
275
+ define_field_assignment(method_name, key)
276
+ end
277
+ end
278
+
279
+ def define_portal_methods(fm_record)
280
+ fm_record['portalData'].each_key do |key|
281
+ method_name = methodize_field(key)
282
+ define_singleton_method(method_name) { self[key] }
283
+ fm_record['portalData'][key].each do |portal_record|
284
+ portal_record.each_key do |inner_key|
285
+ inner_method = methodize_portal_field(inner_key)
286
+ portal_record.send(:define_singleton_method, inner_method.to_s) { portal_record[inner_key] }
287
+ portal_record.send(:define_singleton_method, 'record_id') { portal_record['recordId'] }
288
+ end
289
+ end
290
+ merge!({ key => fm_record['portalData'][key] })
291
+ end
292
+ end
293
+
294
+ def throw_field_missing(field_data)
295
+ results = DatabaseRequest.retrieve_first(layout_name)
296
+ if results['messages'][0]['code'] == '0' && !results['response']['data'].empty?
297
+ r_results = results['response']['data']
298
+ ret_val = r_results[0]['fieldData']
299
+ Error.throw_error('102', (field_data.keys.map(&:downcase) - ret_val.keys.map(&:downcase)).flatten.join(', '), layout_name)
300
+ else
301
+ Error.throw_error('102')
302
+ end
303
+ end
316
304
  end
317
305
  end
@@ -1,11 +1,11 @@
1
1
  require 'json'
2
- require 'trophonius_config'
3
- require 'trophonius_model'
4
- require 'trophonius_connection'
2
+ require 'config'
3
+ require 'model'
4
+ require 'connectors/connection'
5
5
 
6
6
  module Trophonius
7
7
  # A RecordSet contains all records, as Record, retrieved from the FileMaker database
8
- class Trophonius::RecordSet < Array
8
+ class RecordSet < Array
9
9
  attr_accessor :result_count, :layout_name, :non_modifiable_fields, :records
10
10
 
11
11
  class EmptyParameterError < ArgumentError; end # :nodoc:
@@ -38,8 +38,7 @@ module Trophonius
38
38
 
39
39
  temp = Trophonius::Model
40
40
  temp.config layout_name: layout_name, non_modifiable_fields: non_modifiable_fields
41
- retval = temp.where(fielddata)
42
- retval
41
+ temp.where(fielddata)
43
42
  end
44
43
 
45
44
  ##
@@ -1,11 +1,9 @@
1
- require 'trophonius_date'
2
- require 'trophonius_time'
3
- require 'trophonius_error'
4
- require 'trophonius_record'
5
- require 'trophonius_recordset'
1
+ require 'error'
2
+ require 'record'
3
+ require 'recordset'
6
4
 
7
5
  module Trophonius
8
- class Trophonius::Single
6
+ class Single
9
7
  attr_reader :query
10
8
 
11
9
  def initialize(config:)
@@ -116,56 +114,9 @@ module Trophonius
116
114
  private
117
115
 
118
116
  def build_result(result)
119
- hash = Trophonius::Record.new
120
- hash.record_id = result['recordId']
121
- hash.layout_name = @config[:layout_name]
122
- hash.model_name = 'Single'
123
-
124
- result['fieldData'].keys.each do |key|
125
- # unless key[/\s/] || key[/\W/]
126
- @translations.merge!(
127
- { ActiveSupport::Inflector.parameterize(ActiveSupport::Inflector.underscore(key.to_s), separator: '_').downcase.to_s => key.to_s }
128
- )
129
- hash.send(:define_singleton_method, ActiveSupport::Inflector.parameterize(ActiveSupport::Inflector.underscore(key.to_s), separator: '_')) do
130
- hash[key]
131
- end
132
- unless @config[:non_modifiable_fields]&.include?(key)
133
- @all_fields.merge!(
134
- ActiveSupport::Inflector.parameterize(ActiveSupport::Inflector.underscore(key.to_s), separator: '_').downcase =>
135
- ActiveSupport::Inflector.parameterize(ActiveSupport::Inflector.underscore(key.to_s), separator: '_')
136
- )
137
- hash.send(
138
- :define_singleton_method,
139
- "#{ActiveSupport::Inflector.parameterize(ActiveSupport::Inflector.underscore(key.to_s), separator: '_')}="
140
- ) do |new_val|
141
- hash[key] = new_val
142
- hash.modifiable_fields[key] = new_val
143
- hash.modified_fields[key] = new_val
144
- end
145
- end
146
- # end
147
- hash.merge!({ key => result['fieldData'][key] })
148
- hash.modifiable_fields.merge!({ key => result['fieldData'][key] }) unless @config[:non_modifiable_fields]&.include?(key)
149
- end
150
- result['portalData'].keys.each do |key|
151
- unless key[/\s/] || key[/\W/]
152
- hash.send(:define_singleton_method, ActiveSupport::Inflector.parameterize(ActiveSupport::Inflector.underscore(key.to_s), separator: '_')) do
153
- hash[key]
154
- end
155
- end
156
- result['portalData'][key].each do |inner_hash|
157
- inner_hash.keys.each do |inner_key|
158
- inner_method =
159
- ActiveSupport::Inflector.parameterize(ActiveSupport::Inflector.underscore(inner_key.gsub(/\w+::/, '').to_s), separator: '_')
160
- unless inner_method[/\s/] || inner_method[/\W/]
161
- inner_hash.send(:define_singleton_method, inner_method.to_s) { inner_hash[inner_key] }
162
- inner_hash.send(:define_singleton_method, 'record_id') { inner_hash['recordId'] }
163
- end
164
- end
165
- end
166
- hash.merge!({ key => result['portalData'][key] })
167
- end
168
- hash
117
+ hash = Trophonius::Record.new(result, 'Single')
118
+ record.layout_name = @config[:layout_name]
119
+ record
169
120
  end
170
121
 
171
122
  def make_request(url_param, token, method, body, params = '')
@@ -184,7 +135,8 @@ module Trophonius
184
135
  temp = request.run
185
136
  begin
186
137
  JSON.parse(temp.response_body)
187
- rescue Exception => e
138
+ rescue StandardError => e
139
+ puts e
188
140
  close_connection(token)
189
141
  Error.throw_error('1631')
190
142
  end
@@ -217,7 +169,8 @@ module Trophonius
217
169
  temp = request.run
218
170
  begin
219
171
  parsed = JSON.parse(temp.response_body)
220
- rescue Exception => e
172
+ rescue StandardError => e
173
+ puts e
221
174
  Error.throw_error('1631')
222
175
  end
223
176
  Error.throw_error(parsed['messages'][0]['code']) if parsed['messages'][0]['code'] != '0'
@@ -244,7 +197,8 @@ module Trophonius
244
197
 
245
198
  begin
246
199
  parsed = JSON.parse(temp.response_body)
247
- rescue Exception => e
200
+ rescue StandardError => e
201
+ puts e
248
202
  Error.throw_error('1631')
249
203
  end
250
204
  Error.throw_error(parsed['messages'][0]['code']) if parsed['messages'][0]['code'] != '0'
data/lib/translator.rb ADDED
@@ -0,0 +1,15 @@
1
+ # require 'time'
2
+ # require 'date_time'
3
+ # require 'date'
4
+ require 'active_support/inflector'
5
+ module Trophonius
6
+ module Translator
7
+ def methodize_field(field_name)
8
+ ActiveSupport::Inflector.parameterize(ActiveSupport::Inflector.underscore(field_name), separator: '_').downcase
9
+ end
10
+
11
+ def methodize_portal_field(field_name)
12
+ ActiveSupport::Inflector.parameterize(ActiveSupport::Inflector.underscore(field_name.gsub(/\w+::/, '').to_s), separator: '_')
13
+ end
14
+ end
15
+ end
data/lib/trophonius.rb CHANGED
@@ -1,9 +1,11 @@
1
- require 'trophonius_request'
2
- require 'trophonius_model'
3
- require 'trophonius_config'
4
- require 'trophonius_date'
5
- require 'trophonius_time'
6
- require 'trophonius_date_time'
1
+ require 'fm_time'
2
+ require 'fm_date_time'
3
+ require 'fm_date'
4
+
5
+ require 'connectors/database_request'
6
+ require 'connectors/connection_manager'
7
+ require 'model'
8
+ require 'config'
7
9
 
8
10
  module Trophonius # :nodoc:
9
11
  def self.configuration
@@ -13,11 +15,15 @@ module Trophonius # :nodoc:
13
15
 
14
16
  def self.configure
15
17
  yield configuration
18
+ @connection_manager ||= ConnectionManager.new
19
+ @configuration
20
+ end
21
+
22
+ def self.connection_manager
23
+ @connection_manager
16
24
  end
17
25
 
18
26
  def self.config
19
27
  @configuration
20
28
  end
21
-
22
- private
23
29
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: trophonius
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.5.5
4
+ version: '2.1'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kempen Automatisering
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-12-19 00:00:00.000000000 Z
11
+ date: 2023-08-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: redis
@@ -59,22 +59,25 @@ executables: []
59
59
  extensions: []
60
60
  extra_rdoc_files: []
61
61
  files:
62
+ - lib/config.rb
63
+ - lib/connectors/connection.rb
64
+ - lib/connectors/connection_manager.rb
65
+ - lib/connectors/database_request.rb
66
+ - lib/connectors/redis_manager.rb
67
+ - lib/debug_printer.rb
68
+ - lib/error.rb
69
+ - lib/fm_date.rb
70
+ - lib/fm_date_time.rb
71
+ - lib/fm_time.rb
62
72
  - lib/generators/trophonius_generator.rb
63
73
  - lib/generators/trophonius_model_generator.rb
74
+ - lib/model.rb
75
+ - lib/query.rb
76
+ - lib/record.rb
77
+ - lib/recordset.rb
78
+ - lib/single.rb
79
+ - lib/translator.rb
64
80
  - lib/trophonius.rb
65
- - lib/trophonius_config.rb
66
- - lib/trophonius_connection.rb
67
- - lib/trophonius_date.rb
68
- - lib/trophonius_date_time.rb
69
- - lib/trophonius_error.rb
70
- - lib/trophonius_model.rb
71
- - lib/trophonius_query.rb
72
- - lib/trophonius_record.rb
73
- - lib/trophonius_recordset.rb
74
- - lib/trophonius_redis_manager.rb
75
- - lib/trophonius_request.rb
76
- - lib/trophonius_single.rb
77
- - lib/trophonius_time.rb
78
81
  homepage: https://github.com/Willem-Jan/Trophonius
79
82
  licenses:
80
83
  - MIT
@@ -95,7 +98,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
95
98
  - !ruby/object:Gem::Version
96
99
  version: '0'
97
100
  requirements: []
98
- rubygems_version: 3.3.16
101
+ rubygems_version: 3.4.7
99
102
  signing_key:
100
103
  specification_version: 4
101
104
  summary: Link between Ruby (on Rails) and FileMaker.