trophonius 1.4.3.2 → 1.4.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/trophonius_connection.rb +20 -10
- data/lib/trophonius_error.rb +46 -26
- data/lib/trophonius_model.rb +99 -95
- data/lib/trophonius_query.rb +4 -3
- data/lib/trophonius_record.rb +116 -85
- data/lib/trophonius_request.rb +13 -9
- data/lib/trophonius_single.rb +20 -14
- metadata +13 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1bf03ee96abeebc7cf0bd49e76e0a678f9b083d53b08e1f524406ddfe6d5334d
|
4
|
+
data.tar.gz: 9ffce8e42068d7312fa7aa2be4f55451456a97aa2f99cca90d5e18374721e5cb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7d03bd618f06ee984613254b9885857c78a4048a5fb2b5bb24ca378af44a05955afb4fc9f723bba5786eaede62c04c9ad41600e21f0b3ccd5f8991169bf25e88
|
7
|
+
data.tar.gz: cca1ac1dbcb0a89cb44912591085ebfacdf3a80cf0d681013c14e6c8afd710f1a55b8d76bf258648c668232235c50c9dc3c187abb1844bc32f053bc9be9bf630
|
@@ -13,8 +13,8 @@ module Trophonius
|
|
13
13
|
if Trophonius.config.redis_connection
|
14
14
|
Trophonius::RedisManager.set_key(key: 'token', value: setup_connection)
|
15
15
|
Trophonius::RedisManager.set_key(key: 'last_connection', value: Time.now)
|
16
|
-
|
17
|
-
|
16
|
+
Trophonius::RedisManager.get_key(key: 'token')
|
17
|
+
|
18
18
|
else
|
19
19
|
@token = setup_connection
|
20
20
|
@last_connection = Time.now
|
@@ -36,9 +36,10 @@ module Trophonius
|
|
36
36
|
end
|
37
37
|
ssl_verifyhost = Trophonius.config.local_network ? 0 : 2
|
38
38
|
ssl_verifypeer = !Trophonius.config.local_network
|
39
|
+
uri = URI::RFC2396_Parser.new
|
39
40
|
url =
|
40
41
|
URI(
|
41
|
-
|
42
|
+
uri.escape(
|
42
43
|
"http#{Trophonius.config.ssl == true ? 's' : ''}://#{Trophonius.config.host}/fmi/data/v1/databases/#{Trophonius.config.database}/sessions"
|
43
44
|
)
|
44
45
|
)
|
@@ -69,23 +70,31 @@ module Trophonius
|
|
69
70
|
}
|
70
71
|
)
|
71
72
|
temp = request.run
|
73
|
+
body = temp.response_body
|
74
|
+
headers = temp.headers
|
75
|
+
code = temp.code
|
76
|
+
|
77
|
+
puts "RESPONSE FROM FILEMAKER (CONNECT) WAS #{body}"
|
72
78
|
|
73
79
|
begin
|
74
|
-
parsed = JSON.parse(
|
80
|
+
parsed = JSON.parse(body)
|
75
81
|
rescue Exception => e
|
82
|
+
puts e
|
83
|
+
puts e.backtrace
|
76
84
|
Error.throw_error('1631')
|
77
85
|
end
|
78
86
|
Error.throw_error(parsed['messages'][0]['code']) if parsed['messages'][0]['code'] != '0'
|
79
|
-
|
87
|
+
parsed['response']['token']
|
80
88
|
end
|
81
89
|
|
82
90
|
##
|
83
91
|
# Disconnects from the FileMaker server
|
84
92
|
#
|
85
93
|
def self.disconnect
|
94
|
+
uri = URI::RFC2396_Parser.new
|
86
95
|
url =
|
87
96
|
URI(
|
88
|
-
|
97
|
+
uri.escape(
|
89
98
|
"http#{Trophonius.config.ssl == true ? 's' : ''}://#{Trophonius.config.host}/fmi/data/v1/databases/#{
|
90
99
|
Trophonius.config.database
|
91
100
|
}/sessions/#{Trophonius.config.redis_connection ? Trophonius::RedisManager.get_key(key: 'token') : @token}"
|
@@ -114,14 +123,14 @@ module Trophonius
|
|
114
123
|
Trophonius::RedisManager.disconnect! if Trophonius.config.redis_connection
|
115
124
|
@token = nil
|
116
125
|
@last_connection = nil
|
117
|
-
|
126
|
+
true
|
118
127
|
end
|
119
128
|
|
120
129
|
##
|
121
130
|
# Returns the last received token
|
122
131
|
# @return [String] the last valid *token* used to connect with the FileMaker data api
|
123
132
|
def self.token
|
124
|
-
|
133
|
+
Trophonius.config.redis_connection ? Trophonius::RedisManager.get_key(key: 'token') : @token
|
125
134
|
end
|
126
135
|
|
127
136
|
##
|
@@ -137,9 +146,10 @@ module Trophonius
|
|
137
146
|
# Tests whether the FileMaker token is still valid
|
138
147
|
# @return [Boolean] True if the token is valid False if invalid
|
139
148
|
def self.test_connection
|
149
|
+
uri = URI::RFC2396_Parser.new
|
140
150
|
url =
|
141
151
|
URI(
|
142
|
-
|
152
|
+
uri.escape(
|
143
153
|
"http#{Trophonius.config.ssl == true ? 's' : ''}://#{Trophonius.config.host}/fmi/data/v1/databases/#{
|
144
154
|
Trophonius.config.database
|
145
155
|
}/layouts/#{Trophonius.config.layout_name}/records?_limit=1"
|
@@ -154,7 +164,7 @@ module Trophonius
|
|
154
164
|
temp = request.run
|
155
165
|
JSON.parse(temp.response_body)['messages'][0]['code'] == '0'
|
156
166
|
rescue StandardError
|
157
|
-
|
167
|
+
false
|
158
168
|
end
|
159
169
|
end
|
160
170
|
|
data/lib/trophonius_error.rb
CHANGED
@@ -9,6 +9,7 @@ module Trophonius
|
|
9
9
|
class LayoutUnexistingError < NoMethodError; end # :nodoc:
|
10
10
|
class InvalidTokenError < StandardError; end # :nodoc:
|
11
11
|
class UnauthenticatedError < StandardError; end # :nodoc:
|
12
|
+
class AuthenticationError < StandardError; end # :nodoc:
|
12
13
|
class FieldNotModifiableError < StandardError; end # :nodoc:
|
13
14
|
class ResponseNotYetImplementedError < StandardError; end # :nodoc:
|
14
15
|
class UnknownFileMakerError < StandardError; end # :nodoc:
|
@@ -25,8 +26,12 @@ module Trophonius
|
|
25
26
|
class ValueOutOfRangeError < ValidationError; end # :nodoc:
|
26
27
|
class ValueNotUniqueError < ValidationError; end # :nodoc:
|
27
28
|
class ValueNotExistingError < ValidationError; end # :nodoc:
|
29
|
+
class ValueListNotExistingError < ValidationError; end # :nodoc:
|
28
30
|
class ValueNotInValuelistError < ValidationError; end # :nodoc:
|
29
31
|
class ValueFailedCalculationError < ValidationError; end # :nodoc:
|
32
|
+
class RecordLockedError < ValidationError; end # :nodoc:
|
33
|
+
class EntityLockedError < ValidationError; end # :nodoc:
|
34
|
+
class MissingEntityError < ValidationError; end # :nodoc:
|
30
35
|
|
31
36
|
##
|
32
37
|
# Throws an error corresponding to the error number
|
@@ -55,38 +60,52 @@ module Trophonius
|
|
55
60
|
raise RecordNotFoundError.new, 'Empty result'
|
56
61
|
when '9'
|
57
62
|
raise UnauthenticatedError.new, 'User has insufficient privileges'
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
63
|
+
when '10'
|
64
|
+
raise MissingEntityError.new, 'Requested data is missing'
|
65
|
+
when '11'
|
66
|
+
raise ValidationError.new, 'Name is not valid'
|
67
|
+
when '12'
|
68
|
+
raise ValidationError.new, 'Name already exists'
|
69
|
+
when '13'
|
70
|
+
raise EntityLockedError.new, 'File or object is in use'
|
71
|
+
when '14'
|
72
|
+
raise ValueOutOfRangeError.new, 'Out of range'
|
73
|
+
when '15'
|
74
|
+
raise NumberValueError.new, 'Cant divide by zero'
|
75
|
+
when '16'
|
76
|
+
raise CommandError.new, 'Operation failed; request retry (for example, a user query)'
|
77
|
+
when '17'
|
78
|
+
raise ValidationError.new, 'Attempt to convert foreign character set to UTF-16 failed'
|
79
|
+
when '18'
|
80
|
+
raise AuthenticationError.new, 'Client must provide account information to proceed'
|
81
|
+
when '19'
|
82
|
+
raise ValidationError.new, 'String contains characters other than A-Z, a-z, 0-9 (ASCII)'
|
83
|
+
when '20'
|
84
|
+
raise CommandError.new, 'Command/operation canceled by triggered script'
|
85
|
+
when '21'
|
86
|
+
raise CommandError.new, 'Request not supported (for example, when creating a hard link on a file system that does not support hard links)'
|
87
|
+
when '100'
|
88
|
+
raise MissingEntityError.new, 'File is missing'
|
73
89
|
when '101'
|
74
90
|
raise RecordNotFoundError.new, "Record #{more_info} was not found"
|
75
91
|
when '102'
|
76
|
-
if more_info
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
# when "103"
|
92
|
+
raise FieldUnexistingError.new, 'Field does not exist' if more_info.zero?
|
93
|
+
|
94
|
+
raise FieldUnexistingError.new, "Following field(s) #{more_info} do not exist on layout #{layout_info}"
|
95
|
+
when '103'
|
96
|
+
raise MissingEntityError.new, 'Relationship is missing'
|
82
97
|
when '104'
|
83
98
|
raise ScriptUnexistingError.new, 'Script does not exist'
|
84
99
|
when '105'
|
85
100
|
raise LayoutUnexistingError.new, 'Layout does not exist'
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
101
|
+
when '106'
|
102
|
+
raise MissingEntityError.new, 'Table is missing'
|
103
|
+
when '107'
|
104
|
+
raise MissingEntityError.new, 'Index is missing'
|
105
|
+
when '108'
|
106
|
+
raise ValueListNotExistingError.new, 'ValueList does not exist'
|
107
|
+
when '109'
|
108
|
+
raise MissingEntityError.new, 'Privilege set is missing'
|
90
109
|
# when "110"
|
91
110
|
# when "111"
|
92
111
|
# when "112"
|
@@ -119,7 +138,8 @@ module Trophonius
|
|
119
138
|
# when "217"
|
120
139
|
# when "218"
|
121
140
|
# when "300"
|
122
|
-
|
141
|
+
when '301'
|
142
|
+
raise RecordLockedError.new, 'Record is locked by a FileMaker client'
|
123
143
|
# when "302"
|
124
144
|
# when "303"
|
125
145
|
# when "304"
|
data/lib/trophonius_model.rb
CHANGED
@@ -62,7 +62,7 @@ module Trophonius
|
|
62
62
|
#
|
63
63
|
# @return [Trophonius::Model] Self
|
64
64
|
def self.paginate(page, limit)
|
65
|
-
@offset = ((page * limit - limit) + 1).to_s
|
65
|
+
@offset = (((page * limit) - limit) + 1).to_s
|
66
66
|
@limit = limit.to_s
|
67
67
|
self
|
68
68
|
end
|
@@ -116,16 +116,16 @@ module Trophonius
|
|
116
116
|
field_names = Trophonius::Request.get_layout_field_names(layout_name)
|
117
117
|
field_names.each do |field|
|
118
118
|
@configuration.translations.merge!(
|
119
|
-
{
|
119
|
+
{ ActiveSupport::Inflector.parameterize(ActiveSupport::Inflector.underscore(field.to_s), separator: '_').downcase.to_s => field.to_s }
|
120
120
|
)
|
121
121
|
end
|
122
122
|
else
|
123
|
-
|
123
|
+
first
|
124
124
|
end
|
125
125
|
@configuration.translations
|
126
126
|
end
|
127
127
|
|
128
|
-
def self.method_missing(method, *args
|
128
|
+
def self.method_missing(method, *args)
|
129
129
|
new_instance = Trophonius::Model.new(config: @configuration)
|
130
130
|
new_instance.current_query = Trophonius::Query.new(trophonius_model: self, limit: @limit, offset: @offset)
|
131
131
|
args << new_instance
|
@@ -140,7 +140,7 @@ module Trophonius
|
|
140
140
|
ret_val = @current_query.run_query(method, *args, &block)
|
141
141
|
@limit = ''
|
142
142
|
@offset = ''
|
143
|
-
|
143
|
+
ret_val
|
144
144
|
end
|
145
145
|
end
|
146
146
|
|
@@ -149,10 +149,10 @@ module Trophonius
|
|
149
149
|
# @param [Hash] fieldData: the data to find
|
150
150
|
#
|
151
151
|
# @return [Trophonius::Model] new instance of the model
|
152
|
-
def self.where(
|
152
|
+
def self.where(field_data)
|
153
153
|
new_instance = Trophonius::Model.new(config: @configuration)
|
154
154
|
new_instance.current_query = Trophonius::Query.new(trophonius_model: self, limit: @limit, offset: @offset)
|
155
|
-
new_instance.current_query.build_query[0].merge!(
|
155
|
+
new_instance.current_query.build_query[0].merge!(field_data)
|
156
156
|
new_instance
|
157
157
|
end
|
158
158
|
|
@@ -163,8 +163,8 @@ module Trophonius
|
|
163
163
|
# @param [Hash] fieldData: the data to find
|
164
164
|
#
|
165
165
|
# @return [Trophonius::Model] new instance of the model
|
166
|
-
def where(
|
167
|
-
@current_query.build_query[0].merge!(
|
166
|
+
def where(field_data)
|
167
|
+
@current_query.build_query[0].merge!(field_data)
|
168
168
|
self
|
169
169
|
end
|
170
170
|
|
@@ -175,10 +175,11 @@ module Trophonius
|
|
175
175
|
#
|
176
176
|
# @return [Record] the created record
|
177
177
|
# Model.create(fieldOne: "Data")
|
178
|
-
def self.create(
|
178
|
+
def self.create(field_data, portalData: {})
|
179
|
+
uri = URI::RFC2396_Parser.new
|
179
180
|
url =
|
180
181
|
URI(
|
181
|
-
|
182
|
+
uri.escape(
|
182
183
|
"http#{Trophonius.config.ssl == true ? 's' : ''}://#{Trophonius.config.host}/fmi/data/v1/databases/#{
|
183
184
|
Trophonius.config.database
|
184
185
|
}/layouts/#{layout_name}/records"
|
@@ -186,11 +187,11 @@ module Trophonius
|
|
186
187
|
)
|
187
188
|
new_field_data = {}
|
188
189
|
create_translations if @configuration.translations.keys.empty?
|
189
|
-
|
190
|
+
field_data.keys.each do |k|
|
190
191
|
if @configuration.translations.keys.include?(k.to_s)
|
191
|
-
new_field_data.merge!({
|
192
|
+
new_field_data.merge!({ @configuration.translations[k.to_s].to_s => field_data[k] })
|
192
193
|
else
|
193
|
-
new_field_data.merge!({
|
194
|
+
new_field_data.merge!({ k.to_s => field_data[k] })
|
194
195
|
end
|
195
196
|
end
|
196
197
|
|
@@ -199,37 +200,24 @@ module Trophonius
|
|
199
200
|
new_portal_data.merge!(
|
200
201
|
portal_name =>
|
201
202
|
portal_values.map do |record|
|
202
|
-
record.
|
203
|
+
record.each_with_object({}) do |(key, value), new_hash|
|
203
204
|
new_hash["#{portal_name}::#{key}"] = value
|
204
|
-
new_hash
|
205
205
|
end
|
206
206
|
end
|
207
207
|
)
|
208
208
|
end
|
209
209
|
|
210
210
|
body =
|
211
|
-
if new_portal_data
|
212
|
-
"{\"fieldData\": #{new_field_data.to_json}, \"portalData\": #{new_portal_data.to_json}}"
|
213
|
-
else
|
211
|
+
if new_portal_data == {}
|
214
212
|
"{\"fieldData\": #{new_field_data.to_json} }"
|
213
|
+
else
|
214
|
+
"{\"fieldData\": #{new_field_data.to_json}, \"portalData\": #{new_portal_data.to_json}}"
|
215
215
|
end
|
216
216
|
response = Request.make_request(url, "Bearer #{Request.get_token}", 'post', body)
|
217
|
-
if response['messages'][0]['code']
|
218
|
-
if response['messages'][0]['code'] == '102'
|
219
|
-
results = Request.retrieve_first(layout_name)
|
220
|
-
if results['messages'][0]['code'] != '0'
|
221
|
-
Error.throw_error('102')
|
222
|
-
else
|
223
|
-
r_results = results['response']['data']
|
224
|
-
ret_val = r_results.empty? ? Error.throw_error('102') : r_results[0]['fieldData']
|
225
|
-
Error.throw_error('102', (new_field_data.keys.map(&:downcase) - ret_val.keys.map(&:downcase)).flatten.join(', '), layout_name)
|
226
|
-
end
|
227
|
-
end
|
228
|
-
Error.throw_error(response['messages'][0]['code'])
|
229
|
-
else
|
217
|
+
if response['messages'][0]['code'] == '0'
|
230
218
|
url =
|
231
219
|
URI(
|
232
|
-
|
220
|
+
uri.escape(
|
233
221
|
"http#{Trophonius.config.ssl == true ? 's' : ''}://#{Trophonius.config.host}/fmi/data/v1/databases/#{
|
234
222
|
Trophonius.config.database
|
235
223
|
}/layouts/#{layout_name}/records/#{response['response']['recordId']}"
|
@@ -237,7 +225,19 @@ module Trophonius
|
|
237
225
|
)
|
238
226
|
ret_val = build_result(Request.make_request(url, "Bearer #{Request.get_token}", 'get', '{}')['response']['data'][0])
|
239
227
|
ret_val.send(:define_singleton_method, 'result_count') { 1 }
|
240
|
-
|
228
|
+
ret_val
|
229
|
+
else
|
230
|
+
if response['messages'][0]['code'] == '102'
|
231
|
+
results = Request.retrieve_first(layout_name)
|
232
|
+
if results['messages'][0]['code'] == '0'
|
233
|
+
r_results = results['response']['data']
|
234
|
+
ret_val = r_results.empty? ? Error.throw_error('102') : r_results[0]['fieldData']
|
235
|
+
Error.throw_error('102', (new_field_data.keys.map(&:downcase) - ret_val.keys.map(&:downcase)).flatten.join(', '), layout_name)
|
236
|
+
else
|
237
|
+
Error.throw_error('102')
|
238
|
+
end
|
239
|
+
end
|
240
|
+
Error.throw_error(response['messages'][0]['code'])
|
241
241
|
end
|
242
242
|
end
|
243
243
|
|
@@ -248,40 +248,42 @@ module Trophonius
|
|
248
248
|
#
|
249
249
|
# @return [Record] a Record object that correspond to FileMaker record fitting the find request
|
250
250
|
# Model.find_by(fieldOne: "Data")
|
251
|
-
def self.find_by(
|
251
|
+
def self.find_by(field_data)
|
252
|
+
uri = URI::RFC2396_Parser.new
|
252
253
|
url =
|
253
254
|
URI(
|
254
|
-
|
255
|
+
uri.escape(
|
255
256
|
"http#{Trophonius.config.ssl == true ? 's' : ''}://#{Trophonius.config.host}/fmi/data/v1/databases/#{
|
256
257
|
Trophonius.config.database
|
257
|
-
}/layouts/#{
|
258
|
+
}/layouts/#{layout_name}/_find?_limit=1"
|
258
259
|
)
|
259
260
|
)
|
260
261
|
new_field_data = {}
|
261
262
|
create_translations if @configuration.translations.keys.empty?
|
262
|
-
|
263
|
+
field_data.keys.each do |k|
|
263
264
|
if @configuration.translations.keys.include?(k.to_s)
|
264
|
-
new_field_data.merge!({
|
265
|
+
new_field_data.merge!({ @configuration.translations[k.to_s].to_s => field_data[k] })
|
265
266
|
else
|
266
|
-
new_field_data.merge!({
|
267
|
+
new_field_data.merge!({ k.to_s => field_data[k] })
|
267
268
|
end
|
268
269
|
end
|
269
270
|
body = { query: [new_field_data], limit: '100000' }.to_json
|
270
271
|
response = Request.make_request(url, "Bearer #{Request.get_token}", 'post', body)
|
271
272
|
|
272
|
-
if response['messages'][0]['code']
|
273
|
-
if response['messages'][0]['code'] == '101' || response['messages'][0]['code'] == '401'
|
274
|
-
return RecordSet.new(self.layout_name, self.non_modifiable_fields)
|
275
|
-
end
|
276
|
-
Error.throw_error(response['messages'][0]['code'])
|
277
|
-
else
|
273
|
+
if response['messages'][0]['code'] == '0'
|
278
274
|
r_results = response['response']['data']
|
279
|
-
ret_val = RecordSet.new(
|
275
|
+
ret_val = RecordSet.new(layout_name, non_modifiable_fields)
|
280
276
|
r_results.each do |r|
|
281
277
|
hash = build_result(r)
|
282
278
|
ret_val << hash
|
283
279
|
end
|
284
|
-
|
280
|
+
ret_val.first
|
281
|
+
else
|
282
|
+
if response['messages'][0]['code'] == '101' || response['messages'][0]['code'] == '401'
|
283
|
+
return RecordSet.new(layout_name, non_modifiable_fields)
|
284
|
+
end
|
285
|
+
|
286
|
+
Error.throw_error(response['messages'][0]['code'])
|
285
287
|
end
|
286
288
|
end
|
287
289
|
|
@@ -292,21 +294,22 @@ module Trophonius
|
|
292
294
|
#
|
293
295
|
# @return [Record] the record
|
294
296
|
def self.find(record_id)
|
297
|
+
uri = URI::RFC2396_Parser.new
|
295
298
|
url =
|
296
299
|
URI(
|
297
|
-
|
300
|
+
uri.escape(
|
298
301
|
"http#{Trophonius.config.ssl == true ? 's' : ''}://#{Trophonius.config.host}/fmi/data/v1/databases/#{
|
299
302
|
Trophonius.config.database
|
300
303
|
}/layouts/#{layout_name}/records/#{record_id}"
|
301
304
|
)
|
302
305
|
)
|
303
306
|
response = Request.make_request(url, "Bearer #{Request.get_token}", 'get', '{}')
|
304
|
-
if response['messages'][0]['code']
|
305
|
-
Error.throw_error(response['messages'][0]['code'], record_id)
|
306
|
-
else
|
307
|
+
if response['messages'][0]['code'] == '0'
|
307
308
|
ret_val = build_result(response['response']['data'][0])
|
308
309
|
ret_val.send(:define_singleton_method, 'result_count') { 1 }
|
309
|
-
|
310
|
+
ret_val
|
311
|
+
else
|
312
|
+
Error.throw_error(response['messages'][0]['code'], record_id)
|
310
313
|
end
|
311
314
|
end
|
312
315
|
|
@@ -317,19 +320,20 @@ module Trophonius
|
|
317
320
|
#
|
318
321
|
# @return [Boolean] True if the delete was successful
|
319
322
|
def self.delete(record_id)
|
323
|
+
uri = URI::RFC2396_Parser.new
|
320
324
|
url =
|
321
325
|
URI(
|
322
|
-
|
326
|
+
uri.escape(
|
323
327
|
"http#{Trophonius.config.ssl == true ? 's' : ''}://#{Trophonius.config.host}/fmi/data/v1/databases/#{
|
324
328
|
Trophonius.config.database
|
325
329
|
}/layouts/#{layout_name}/records/#{record_id}"
|
326
330
|
)
|
327
331
|
)
|
328
332
|
response = Request.make_request(url, "Bearer #{Request.get_token}", 'delete', '{}')
|
329
|
-
if response['messages'][0]['code']
|
330
|
-
|
333
|
+
if response['messages'][0]['code'] == '0'
|
334
|
+
true
|
331
335
|
else
|
332
|
-
|
336
|
+
Error.throw_error(response['messages'][0]['code'])
|
333
337
|
end
|
334
338
|
end
|
335
339
|
|
@@ -341,10 +345,11 @@ module Trophonius
|
|
341
345
|
# @param [Hash] fieldData: A hash containing the fields to edit and the new data to fill them with
|
342
346
|
#
|
343
347
|
# @return [Boolean] True if the delete was successful
|
344
|
-
def self.edit(record_id,
|
348
|
+
def self.edit(record_id, field_data)
|
349
|
+
uri = URI::RFC2396_Parser.new
|
345
350
|
url =
|
346
351
|
URI(
|
347
|
-
|
352
|
+
uri.escape(
|
348
353
|
"http#{Trophonius.config.ssl == true ? 's' : ''}://#{Trophonius.config.host}/fmi/data/v1/databases/#{
|
349
354
|
Trophonius.config.database
|
350
355
|
}/layouts/#{layout_name}/records/#{record_id}"
|
@@ -352,16 +357,16 @@ module Trophonius
|
|
352
357
|
)
|
353
358
|
new_field_data = {}
|
354
359
|
create_translations if @configuration.translations.keys.empty?
|
355
|
-
|
360
|
+
field_data.keys.each do |k|
|
356
361
|
if @configuration.translations.keys.include?(k.to_s)
|
357
|
-
new_field_data.merge!({
|
362
|
+
new_field_data.merge!({ @configuration.translations[k.to_s].to_s => field_data[k] })
|
358
363
|
else
|
359
|
-
new_field_data.merge!({
|
364
|
+
new_field_data.merge!({ k.to_s => field_data[k] })
|
360
365
|
end
|
361
366
|
end
|
362
367
|
body = "{\"fieldData\": #{new_field_data.to_json}}"
|
363
368
|
response = Request.make_request(url, "Bearer #{Request.get_token}", 'patch', body)
|
364
|
-
response['messages'][0]['code']
|
369
|
+
response['messages'][0]['code'] == '0' ? true : Error.throw_error(response['messages'][0]['code'])
|
365
370
|
end
|
366
371
|
|
367
372
|
##
|
@@ -371,7 +376,7 @@ module Trophonius
|
|
371
376
|
#
|
372
377
|
# @return [Record] A Record with singleton_methods for the fields where possible
|
373
378
|
def self.build_result(result)
|
374
|
-
hash = Trophonius::Record.new
|
379
|
+
hash = Trophonius::Record.new(name)
|
375
380
|
hash.record_id = result['recordId']
|
376
381
|
hash.layout_name = layout_name
|
377
382
|
hash.model_name = name
|
@@ -379,7 +384,7 @@ module Trophonius
|
|
379
384
|
result['fieldData'].keys.each do |key|
|
380
385
|
# unless key[/\s/] || key[/\W/]
|
381
386
|
@configuration.translations.merge!(
|
382
|
-
{
|
387
|
+
{ ActiveSupport::Inflector.parameterize(ActiveSupport::Inflector.underscore(key.to_s), separator: '_').downcase.to_s => key.to_s }
|
383
388
|
)
|
384
389
|
hash.send(:define_singleton_method, ActiveSupport::Inflector.parameterize(ActiveSupport::Inflector.underscore(key.to_s), separator: '_')) do
|
385
390
|
hash[key]
|
@@ -408,7 +413,7 @@ module Trophonius
|
|
408
413
|
hash[key]
|
409
414
|
end
|
410
415
|
end
|
411
|
-
result['portalData'][key].
|
416
|
+
result['portalData'][key].each do |inner_hash|
|
412
417
|
inner_hash.keys.each do |inner_key|
|
413
418
|
inner_method =
|
414
419
|
ActiveSupport::Inflector.parameterize(ActiveSupport::Inflector.underscore(inner_key.gsub(/\w+::/, '').to_s), separator: '_')
|
@@ -420,7 +425,7 @@ module Trophonius
|
|
420
425
|
end
|
421
426
|
hash.merge!({ key => result['portalData'][key] })
|
422
427
|
end
|
423
|
-
|
428
|
+
hash
|
424
429
|
end
|
425
430
|
|
426
431
|
##
|
@@ -429,13 +434,13 @@ module Trophonius
|
|
429
434
|
# @return [Record]: a Record corresponding to the FileMaker record.
|
430
435
|
def self.first
|
431
436
|
results = Request.retrieve_first(layout_name)
|
432
|
-
if results['messages'][0]['code']
|
433
|
-
Error.throw_error(results['messages'][0]['code'])
|
434
|
-
else
|
437
|
+
if results['messages'][0]['code'] == '0'
|
435
438
|
r_results = results['response']['data']
|
436
439
|
ret_val = r_results.empty? ? Trophonius::Record.new : build_result(r_results[0])
|
437
440
|
ret_val.send(:define_singleton_method, 'result_count') { r_results.empty? ? 0 : 1 }
|
438
|
-
|
441
|
+
ret_val
|
442
|
+
else
|
443
|
+
Error.throw_error(results['messages'][0]['code'])
|
439
444
|
end
|
440
445
|
end
|
441
446
|
|
@@ -454,8 +459,8 @@ module Trophonius
|
|
454
459
|
elsif result['response']['scriptResult'] == '403'
|
455
460
|
Error.throw_error(403)
|
456
461
|
else
|
457
|
-
|
458
|
-
|
462
|
+
result['response']['scriptResult']
|
463
|
+
|
459
464
|
end
|
460
465
|
end
|
461
466
|
|
@@ -466,41 +471,40 @@ module Trophonius
|
|
466
471
|
#
|
467
472
|
# @return [RecordSet]: a RecordSet containing all the Record objects that correspond to the FileMaker records.
|
468
473
|
def self.all(sort: {})
|
474
|
+
uri = URI::RFC2396_Parser.new
|
469
475
|
results = Request.retrieve_all(layout_name, sort)
|
470
476
|
count = results['response']['scriptResult'].to_i
|
471
|
-
|
472
|
-
|
473
|
-
|
474
|
-
|
475
|
-
"http#{Trophonius.config.ssl == true ? 's' : ''}://#{Trophonius.config.host}/fmi/data/v1/databases/#{
|
476
|
-
Trophonius.config.database
|
477
|
-
}/layouts/#{layout_name}/records?_offset=#{@offset}&_limit=#{@limit}"
|
478
|
-
)
|
479
|
-
)
|
480
|
-
else
|
481
|
-
url =
|
482
|
-
URI(
|
483
|
-
URI.escape(
|
484
|
-
"http#{Trophonius.config.ssl == true ? 's' : ''}://#{Trophonius.config.host}/fmi/data/v1/databases/#{
|
477
|
+
url = if @limit.empty? || @offset.empty?
|
478
|
+
URI(
|
479
|
+
uri.escape(
|
480
|
+
"http#{Trophonius.config.ssl == true ? 's' : ''}://#{Trophonius.config.host}/fmi/data/v1/databases/#{
|
485
481
|
Trophonius.config.database
|
486
482
|
}/layouts/#{layout_name}/records?_limit=#{count == 0 ? 1_000_000 : count}"
|
487
|
-
|
488
|
-
|
489
|
-
|
483
|
+
)
|
484
|
+
)
|
485
|
+
else
|
486
|
+
URI(
|
487
|
+
uri.escape(
|
488
|
+
"http#{Trophonius.config.ssl == true ? 's' : ''}://#{Trophonius.config.host}/fmi/data/v1/databases/#{
|
489
|
+
Trophonius.config.database
|
490
|
+
}/layouts/#{layout_name}/records?_offset=#{@offset}&_limit=#{@limit}"
|
491
|
+
)
|
492
|
+
)
|
493
|
+
end
|
490
494
|
@limit = ''
|
491
495
|
@offset = ''
|
492
496
|
results = Request.make_request(url, "Bearer #{Request.get_token}", 'get', '{}')
|
493
|
-
if results['messages'][0]['code']
|
494
|
-
Error.throw_error(results['messages'][0]['code'])
|
495
|
-
else
|
497
|
+
if results['messages'][0]['code'] == '0'
|
496
498
|
r_results = results['response']['data']
|
497
|
-
ret_val = RecordSet.new(
|
499
|
+
ret_val = RecordSet.new(layout_name, non_modifiable_fields)
|
498
500
|
r_results.each do |r|
|
499
501
|
hash = build_result(r)
|
500
502
|
ret_val << hash
|
501
503
|
end
|
502
504
|
ret_val.result_count = count
|
503
|
-
|
505
|
+
ret_val
|
506
|
+
else
|
507
|
+
Error.throw_error(results['messages'][0]['code'])
|
504
508
|
end
|
505
509
|
end
|
506
510
|
end
|
data/lib/trophonius_query.rb
CHANGED
@@ -184,9 +184,10 @@ module Trophonius
|
|
184
184
|
#
|
185
185
|
# @return Response of the called method
|
186
186
|
def run_query(method, *args, &block)
|
187
|
+
uri = URI::RFC2396_Parser.new
|
187
188
|
url =
|
188
189
|
URI(
|
189
|
-
|
190
|
+
uri.escape(
|
190
191
|
"http#{Trophonius.config.ssl == true ? 's' : ''}://#{Trophonius.config.host}/fmi/data/v1/databases/#{
|
191
192
|
Trophonius.config.database
|
192
193
|
}/layouts/#{@trophonius_model.layout_name}/_find"
|
@@ -221,12 +222,12 @@ module Trophonius
|
|
221
222
|
end
|
222
223
|
|
223
224
|
if @prerequest_script.present?
|
224
|
-
body.merge!(script
|
225
|
+
body.merge!("script.prerequest" => @prerequest_script)
|
225
226
|
body.merge!('script.prerequest.param' => @prerequest_scriptparam) if @prerequest_scriptparam.present?
|
226
227
|
end
|
227
228
|
|
228
229
|
if @presort_script.present?
|
229
|
-
body.merge!(script
|
230
|
+
body.merge!("script.presort" => @presort_script)
|
230
231
|
body.merge!('script.presort.param' => @presort_scriptparam) if @presort_scriptparam.present?
|
231
232
|
end
|
232
233
|
|
data/lib/trophonius_record.rb
CHANGED
@@ -12,9 +12,13 @@ module Trophonius
|
|
12
12
|
|
13
13
|
##
|
14
14
|
# Initializes a new Record
|
15
|
-
def initialize
|
15
|
+
def initialize(model = '')
|
16
16
|
@modifiable_fields = {}
|
17
17
|
@modified_fields = {}
|
18
|
+
model_name = model
|
19
|
+
@model = ActiveSupport::Inflector.constantize(ActiveSupport::Inflector.classify(ActiveSupport::Inflector.singularize(model_name)))
|
20
|
+
|
21
|
+
super
|
18
22
|
end
|
19
23
|
|
20
24
|
def []=(field, new_val)
|
@@ -32,49 +36,32 @@ module Trophonius
|
|
32
36
|
layout = model.layout_name
|
33
37
|
model.create_translations if model.translations.keys.empty?
|
34
38
|
|
39
|
+
uri = URI::RFC2396_Parser.new
|
35
40
|
url =
|
36
41
|
URI(
|
37
|
-
|
42
|
+
uri.escape(
|
38
43
|
"http#{Trophonius.config.ssl == true ? 's' : ''}://#{Trophonius.config.host}/fmi/data/v1/databases/#{
|
39
44
|
Trophonius.config.database
|
40
45
|
}/layouts/#{layout}/_find"
|
41
46
|
)
|
42
47
|
)
|
43
48
|
|
44
|
-
if model.translations.key?(relation[:foreign_key])
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
+
foreign_key_field = if model.translations.key?(relation[:foreign_key])
|
50
|
+
model.translations[relation[:foreign_key]].to_s
|
51
|
+
else
|
52
|
+
relation[:foreign_key].to_s
|
53
|
+
end
|
49
54
|
|
50
|
-
if pk_model.translations.key?(relation[:primary_key])
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
+
primary_key_field = if pk_model.translations.key?(relation[:primary_key])
|
56
|
+
pk_model.translations[relation[:primary_key]].to_s
|
57
|
+
else
|
58
|
+
relation[:primary_key].to_s
|
59
|
+
end
|
55
60
|
|
56
61
|
body = { query: [{ foreign_key_field => self[primary_key_field].to_s }], limit: 100_000 }.to_json
|
57
62
|
response = Request.make_request(url, "Bearer #{Request.get_token}", 'post', body)
|
58
63
|
|
59
|
-
if response['messages'][0]['code']
|
60
|
-
if response['messages'][0]['code'] == '101' || response['messages'][0]['code'] == '401'
|
61
|
-
resp = RecordSet.new(layout, model.non_modifiable_fields)
|
62
|
-
return resp
|
63
|
-
else
|
64
|
-
if response['messages'][0]['code'] == '102'
|
65
|
-
results = Request.retrieve_first(layout)
|
66
|
-
if results['messages'][0]['code'] != '0'
|
67
|
-
Error.throw_error('102')
|
68
|
-
else
|
69
|
-
r_results = results['response']['data']
|
70
|
-
ret_val = r_results.empty? ? Error.throw_error('102') : r_results[0]['fieldData']
|
71
|
-
query_keys = [foreign_key_field]
|
72
|
-
Error.throw_error('102', (query_keys - ret_val.keys.map(&:downcase)).flatten.join(', '), layout)
|
73
|
-
end
|
74
|
-
end
|
75
|
-
Error.throw_error(response['messages'][0]['code'])
|
76
|
-
end
|
77
|
-
else
|
64
|
+
if response['messages'][0]['code'] == '0'
|
78
65
|
r_results = response['response']['data']
|
79
66
|
ret_val = RecordSet.new(layout, model.non_modifiable_fields)
|
80
67
|
r_results.each do |r|
|
@@ -82,7 +69,23 @@ module Trophonius
|
|
82
69
|
ret_val << hash
|
83
70
|
end
|
84
71
|
@response = ret_val
|
85
|
-
|
72
|
+
@response
|
73
|
+
elsif response['messages'][0]['code'] == '101' || response['messages'][0]['code'] == '401'
|
74
|
+
RecordSet.new(layout, model.non_modifiable_fields)
|
75
|
+
|
76
|
+
else
|
77
|
+
if response['messages'][0]['code'] == '102'
|
78
|
+
results = Request.retrieve_first(layout)
|
79
|
+
if results['messages'][0]['code'] == '0'
|
80
|
+
r_results = results['response']['data']
|
81
|
+
ret_val = r_results.empty? ? Error.throw_error('102') : r_results[0]['fieldData']
|
82
|
+
query_keys = [foreign_key_field]
|
83
|
+
Error.throw_error('102', (query_keys - ret_val.keys.map(&:downcase)).flatten.join(', '), layout)
|
84
|
+
else
|
85
|
+
Error.throw_error('102')
|
86
|
+
end
|
87
|
+
end
|
88
|
+
Error.throw_error(response['messages'][0]['code'])
|
86
89
|
end
|
87
90
|
end
|
88
91
|
elsif ActiveSupport::Inflector.constantize(ActiveSupport::Inflector.classify(ActiveSupport::Inflector.singularize(method))).respond_to?('first')
|
@@ -94,49 +97,32 @@ module Trophonius
|
|
94
97
|
layout = pk_model.layout_name
|
95
98
|
pk_model.create_translations if pk_model.translations.keys.empty?
|
96
99
|
|
100
|
+
uri = URI::RFC2396_Parser.new
|
97
101
|
url =
|
98
102
|
URI(
|
99
|
-
|
103
|
+
uri.escape(
|
100
104
|
"http#{Trophonius.config.ssl == true ? 's' : ''}://#{Trophonius.config.host}/fmi/data/v1/databases/#{
|
101
105
|
Trophonius.config.database
|
102
106
|
}/layouts/#{layout}/_find"
|
103
107
|
)
|
104
108
|
)
|
105
109
|
|
106
|
-
if fk_model.translations.key?(relation[:foreign_key])
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
110
|
+
foreign_key_field = if fk_model.translations.key?(relation[:foreign_key])
|
111
|
+
fk_model.translations[relation[:foreign_key]].to_s
|
112
|
+
else
|
113
|
+
relation[:foreign_key].to_s
|
114
|
+
end
|
111
115
|
|
112
|
-
if pk_model.translations.key?(relation[:primary_key])
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
116
|
+
primary_key_field = if pk_model.translations.key?(relation[:primary_key])
|
117
|
+
pk_model.translations[relation[:primary_key]].to_s
|
118
|
+
else
|
119
|
+
relation[:primary_key].to_s
|
120
|
+
end
|
117
121
|
|
118
122
|
body = { query: [{ primary_key_field => self[foreign_key_field].to_s }], limit: 1 }.to_json
|
119
123
|
|
120
124
|
response = Request.make_request(url, "Bearer #{Request.get_token}", 'post', body)
|
121
|
-
if response['messages'][0]['code']
|
122
|
-
if response['messages'][0]['code'] == '101' || response['messages'][0]['code'] == '401'
|
123
|
-
resp = RecordSet.new(layout, pk_model.non_modifiable_fields)
|
124
|
-
return resp
|
125
|
-
else
|
126
|
-
if response['messages'][0]['code'] == '102'
|
127
|
-
results = Request.retrieve_first(layout)
|
128
|
-
if results['messages'][0]['code'] != '0'
|
129
|
-
Error.throw_error('102')
|
130
|
-
else
|
131
|
-
r_results = results['response']['data']
|
132
|
-
ret_val = r_results.empty? ? Error.throw_error('102') : r_results[0]['fieldData']
|
133
|
-
query_keys = [primary_key_field]
|
134
|
-
Error.throw_error('102', (query_keys - ret_val.keys.map(&:downcase)).flatten.join(', '), layout)
|
135
|
-
end
|
136
|
-
end
|
137
|
-
Error.throw_error(response['messages'][0]['code'])
|
138
|
-
end
|
139
|
-
else
|
125
|
+
if response['messages'][0]['code'] == '0'
|
140
126
|
r_results = response['response']['data']
|
141
127
|
ret_val = RecordSet.new(layout, pk_model.non_modifiable_fields)
|
142
128
|
r_results.each do |r|
|
@@ -144,7 +130,23 @@ module Trophonius
|
|
144
130
|
ret_val << hash
|
145
131
|
end
|
146
132
|
@response = ret_val
|
147
|
-
|
133
|
+
@response.first
|
134
|
+
elsif response['messages'][0]['code'] == '101' || response['messages'][0]['code'] == '401'
|
135
|
+
RecordSet.new(layout, pk_model.non_modifiable_fields)
|
136
|
+
|
137
|
+
else
|
138
|
+
if response['messages'][0]['code'] == '102'
|
139
|
+
results = Request.retrieve_first(layout)
|
140
|
+
if results['messages'][0]['code'] == '0'
|
141
|
+
r_results = results['response']['data']
|
142
|
+
ret_val = r_results.empty? ? Error.throw_error('102') : r_results[0]['fieldData']
|
143
|
+
query_keys = [primary_key_field]
|
144
|
+
Error.throw_error('102', (query_keys - ret_val.keys.map(&:downcase)).flatten.join(', '), layout)
|
145
|
+
else
|
146
|
+
Error.throw_error('102')
|
147
|
+
end
|
148
|
+
end
|
149
|
+
Error.throw_error(response['messages'][0]['code'])
|
148
150
|
end
|
149
151
|
end
|
150
152
|
else
|
@@ -167,9 +169,10 @@ module Trophonius
|
|
167
169
|
#
|
168
170
|
# @return [String]: string representing the script result returned by FileMaker
|
169
171
|
def run_script(script: '', scriptparameter: '')
|
172
|
+
uri = URI::RFC2396_Parser.new
|
170
173
|
url =
|
171
174
|
URI(
|
172
|
-
|
175
|
+
uri.escape(
|
173
176
|
"http#{Trophonius.config.ssl == true ? 's' : ''}://#{Trophonius.config.host}/fmi/data/v1/databases/#{
|
174
177
|
Trophonius.config.database
|
175
178
|
}/layouts/#{layout_name}/records/#{record_id}?script=#{script}&script.param=#{scriptparameter}"
|
@@ -184,7 +187,7 @@ module Trophonius
|
|
184
187
|
Error.throw_error(403)
|
185
188
|
else
|
186
189
|
ret_val = result['response']['scriptResult']
|
187
|
-
|
190
|
+
ret_val || true
|
188
191
|
end
|
189
192
|
end
|
190
193
|
|
@@ -194,9 +197,10 @@ module Trophonius
|
|
194
197
|
#
|
195
198
|
# @return [True] if successful
|
196
199
|
def save
|
200
|
+
uri = URI::RFC2396_Parser.new
|
197
201
|
url =
|
198
202
|
URI(
|
199
|
-
|
203
|
+
uri.escape(
|
200
204
|
"http#{Trophonius.config.ssl == true ? 's' : ''}://#{Trophonius.config.host}/fmi/data/v1/databases/#{
|
201
205
|
Trophonius.config.database
|
202
206
|
}/layouts/#{layout_name}/records/#{record_id}"
|
@@ -204,7 +208,7 @@ module Trophonius
|
|
204
208
|
)
|
205
209
|
body = "{\"fieldData\": #{modified_fields.to_json}}"
|
206
210
|
response = Request.make_request(url, "Bearer #{Request.get_token}", 'patch', body)
|
207
|
-
response['messages'][0]['code']
|
211
|
+
response['messages'][0]['code'] == '0' ? true : Error.throw_error(response['messages'][0]['code'])
|
208
212
|
end
|
209
213
|
|
210
214
|
##
|
@@ -213,51 +217,77 @@ module Trophonius
|
|
213
217
|
#
|
214
218
|
# @return [True] if successful
|
215
219
|
def delete
|
220
|
+
uri = URI::RFC2396_Parser.new
|
216
221
|
url =
|
217
222
|
URI(
|
218
|
-
|
223
|
+
uri.escape(
|
219
224
|
"http#{Trophonius.config.ssl == true ? 's' : ''}://#{Trophonius.config.host}/fmi/data/v1/databases/#{
|
220
225
|
Trophonius.config.database
|
221
226
|
}/layouts/#{layout_name}/records/#{record_id}"
|
222
227
|
)
|
223
228
|
)
|
224
229
|
response = Request.make_request(url, "Bearer #{Request.get_token}", 'delete', '{}')
|
225
|
-
response['messages'][0]['code']
|
230
|
+
response['messages'][0]['code'] == '0' ? true : Error.throw_error(response['messages'][0]['code'])
|
226
231
|
end
|
227
232
|
|
228
233
|
##
|
229
234
|
# Changes and saves the corresponding record in FileMaker
|
230
235
|
# Throws a FileMaker error if save failed
|
231
236
|
#
|
232
|
-
# @param [Hash]
|
237
|
+
# @param [Hash] field_data: Fields to be changed and data to fill the fields with
|
233
238
|
#
|
234
239
|
# @return [True] if successful
|
235
|
-
def update(
|
240
|
+
def update(field_data, portal_data: {})
|
241
|
+
uri = URI::RFC2396_Parser.new
|
236
242
|
url =
|
237
243
|
URI(
|
238
|
-
|
244
|
+
uri.escape(
|
239
245
|
"http#{Trophonius.config.ssl == true ? 's' : ''}://#{Trophonius.config.host}/fmi/data/v1/databases/#{
|
240
246
|
Trophonius.config.database
|
241
247
|
}/layouts/#{layout_name}/records/#{record_id}"
|
242
248
|
)
|
243
249
|
)
|
244
|
-
|
245
|
-
|
250
|
+
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
|
272
|
+
|
273
|
+
puts "BODY SENT TO FILEMAKER WAS: #{body}"
|
246
274
|
response = Request.make_request(url, "Bearer #{Request.get_token}", 'patch', body)
|
247
|
-
|
275
|
+
puts "RESPONSE FROM FILEMAKER WAS: #{response}"
|
276
|
+
if response['messages'][0]['code'] == '0'
|
277
|
+
true
|
278
|
+
else
|
248
279
|
if response['messages'][0]['code'] == '102'
|
249
280
|
results = Request.retrieve_first(layout_name)
|
250
|
-
if results['messages'][0]['code']
|
251
|
-
Error.throw_error('102')
|
252
|
-
else
|
281
|
+
if results['messages'][0]['code'] == '0'
|
253
282
|
r_results = results['response']['data']
|
254
|
-
|
255
|
-
|
283
|
+
Error.throw_error('102') if r_results.empty?
|
284
|
+
ret_val = r_results[0]['fieldData']
|
285
|
+
Error.throw_error('102', (field_data.keys.map { |key| key.to_s.downcase } - ret_val.keys.map(&:downcase)).flatten.join(', '), layout_name)
|
286
|
+
else
|
287
|
+
Error.throw_error('102')
|
256
288
|
end
|
257
289
|
end
|
258
290
|
Error.throw_error(response['messages'][0]['code'])
|
259
|
-
else
|
260
|
-
true
|
261
291
|
end
|
262
292
|
end
|
263
293
|
|
@@ -270,10 +300,11 @@ module Trophonius
|
|
270
300
|
# @param [Tempfile or File] file: File to upload
|
271
301
|
#
|
272
302
|
# @return [True] if successful
|
273
|
-
def upload(container_name:, container_repetition: 1
|
303
|
+
def upload(container_name:, file:, container_repetition: 1)
|
304
|
+
uri = URI::RFC2396_Parser.new
|
274
305
|
url =
|
275
306
|
URI(
|
276
|
-
|
307
|
+
uri.escape(
|
277
308
|
"http#{Trophonius.config.ssl == true ? 's' : ''}://#{Trophonius.config.host}/fmi/data/v1/databases/#{
|
278
309
|
Trophonius.config.database
|
279
310
|
}/layouts/#{layout_name}/records/#{record_id}/containers/#{container_name}/#{container_repetition}"
|
@@ -281,7 +312,7 @@ module Trophonius
|
|
281
312
|
)
|
282
313
|
|
283
314
|
response = Request.upload_file_request(url, "Bearer #{Request.get_token}", file)
|
284
|
-
response['messages'][0]['code']
|
315
|
+
response['messages'][0]['code'] == '0' ? true : Error.throw_error(response['messages'][0]['code'])
|
285
316
|
end
|
286
317
|
end
|
287
318
|
end
|
data/lib/trophonius_request.rb
CHANGED
@@ -83,9 +83,10 @@ module Trophonius
|
|
83
83
|
#
|
84
84
|
# @return [JSON] The first record from FileMaker
|
85
85
|
def self.retrieve_first(layout_name)
|
86
|
+
uri = URI::RFC2396_Parser.new
|
86
87
|
url =
|
87
88
|
URI(
|
88
|
-
|
89
|
+
uri.escape(
|
89
90
|
"http#{Trophonius.config.ssl == true ? 's' : ''}://#{Trophonius.config.host}/fmi/data/v1/databases/#{
|
90
91
|
Trophonius.config.database
|
91
92
|
}/layouts/#{layout_name}/records?_limit=1"
|
@@ -99,9 +100,10 @@ module Trophonius
|
|
99
100
|
#
|
100
101
|
# @return [JSON] The fieldnames of a layout
|
101
102
|
def self.get_layout_field_names(layout_name)
|
103
|
+
uri = URI::RFC2396_Parser.new
|
102
104
|
url =
|
103
105
|
URI(
|
104
|
-
|
106
|
+
uri.escape(
|
105
107
|
"http#{Trophonius.config.ssl == true ? 's' : ''}://#{Trophonius.config.host}/fmi/data/v1/databases/#{
|
106
108
|
Trophonius.config.database
|
107
109
|
}/layouts/#{layout_name}"
|
@@ -119,9 +121,10 @@ module Trophonius
|
|
119
121
|
#
|
120
122
|
# @return [JSON] The script result from FileMaker
|
121
123
|
def self.run_script(script, scriptparameter, layout_name)
|
124
|
+
uri = URI::RFC2396_Parser.new
|
122
125
|
url =
|
123
126
|
URI(
|
124
|
-
|
127
|
+
uri.escape(
|
125
128
|
"http#{Trophonius.config.ssl == true ? 's' : ''}://#{Trophonius.config.host}/fmi/data/v1/databases/#{
|
126
129
|
Trophonius.config.database
|
127
130
|
}/layouts/#{layout_name}/records?_limit=1&script=#{script}&script.param=#{scriptparameter}"
|
@@ -135,25 +138,26 @@ module Trophonius
|
|
135
138
|
#
|
136
139
|
# @return [JSON] The first 10000000 records from FileMaker
|
137
140
|
def self.retrieve_all(layout_name, sort)
|
138
|
-
|
139
|
-
|
141
|
+
uri = URI::RFC2396_Parser.new
|
142
|
+
if sort.empty?
|
140
143
|
url =
|
141
144
|
URI(
|
142
|
-
|
145
|
+
uri.escape(
|
143
146
|
"http#{Trophonius.config.ssl == true ? 's' : ''}://#{Trophonius.config.host}/fmi/data/v1/databases/#{
|
144
147
|
Trophonius.config.database
|
145
|
-
}/layouts/#{layout_name}/records?_limit=
|
148
|
+
}/layouts/#{layout_name}/records?_limit=10000000#{
|
146
149
|
Trophonius.config.count_result_script == '' ? '' : "&script=#{Trophonius.config.count_result_script}"
|
147
150
|
}"
|
148
151
|
)
|
149
152
|
)
|
150
153
|
else
|
154
|
+
sort_order = sort.to_json.to_s
|
151
155
|
url =
|
152
156
|
URI(
|
153
|
-
|
157
|
+
uri.escape(
|
154
158
|
"http#{Trophonius.config.ssl == true ? 's' : ''}://#{Trophonius.config.host}/fmi/data/v1/databases/#{
|
155
159
|
Trophonius.config.database
|
156
|
-
}/layouts/#{layout_name}/records?_limit=10000000#{
|
160
|
+
}/layouts/#{layout_name}/records?_limit=10000000&_sort=#{sort_order}#{
|
157
161
|
Trophonius.config.count_result_script == '' ? '' : "&script=#{Trophonius.config.count_result_script}"
|
158
162
|
}"
|
159
163
|
)
|
data/lib/trophonius_single.rb
CHANGED
@@ -7,6 +7,7 @@ require 'trophonius_recordset'
|
|
7
7
|
module Trophonius
|
8
8
|
class Trophonius::Single
|
9
9
|
attr_reader :query
|
10
|
+
|
10
11
|
def initialize(config:)
|
11
12
|
@config = config
|
12
13
|
@query = {}
|
@@ -15,9 +16,10 @@ module Trophonius
|
|
15
16
|
end
|
16
17
|
|
17
18
|
def where(fieldData)
|
19
|
+
uri = URI::RFC2396_Parser.new
|
18
20
|
url =
|
19
21
|
URI(
|
20
|
-
|
22
|
+
uri.escape(
|
21
23
|
"http#{@config[:ssl] == true ? 's' : ''}://#{@config[:host]}/fmi/data/v1/databases/#{@config[:database]}/layouts/#{
|
22
24
|
@config[:layout_name]
|
23
25
|
}/_find"
|
@@ -45,13 +47,14 @@ module Trophonius
|
|
45
47
|
@query = {}
|
46
48
|
close_connection(token)
|
47
49
|
|
48
|
-
|
50
|
+
ret_val
|
49
51
|
end
|
50
52
|
|
51
53
|
def first
|
54
|
+
uri = URI::RFC2396_Parser.new
|
52
55
|
url =
|
53
56
|
URI(
|
54
|
-
|
57
|
+
uri.escape(
|
55
58
|
"http#{@config[:ssl] == true ? 's' : ''}://#{@config[:host]}/fmi/data/v1/databases/#{@config[:database]}/layouts/#{
|
56
59
|
@config[:layout_name]
|
57
60
|
}/records?_limit=1"
|
@@ -77,13 +80,14 @@ module Trophonius
|
|
77
80
|
end
|
78
81
|
close_connection(token)
|
79
82
|
|
80
|
-
|
83
|
+
ret_val
|
81
84
|
end
|
82
85
|
|
83
86
|
def run_script(script:, scriptparameter:)
|
87
|
+
uri = URI::RFC2396_Parser.new
|
84
88
|
url =
|
85
89
|
URI(
|
86
|
-
|
90
|
+
uri.escape(
|
87
91
|
"http#{@config[:ssl] == true ? 's' : ''}://#{@config[:host]}/fmi/data/v1/databases/#{@config[:database]}/layouts/#{
|
88
92
|
@config[:layout_name]
|
89
93
|
}/records?_limit=1&script=#{script}&script.param=#{scriptparameter}"
|
@@ -91,7 +95,7 @@ module Trophonius
|
|
91
95
|
)
|
92
96
|
|
93
97
|
token = setup_connection
|
94
|
-
result = make_request(url,
|
98
|
+
result = make_request(url, token.to_s, 'get', '{}')
|
95
99
|
ret_val = ''
|
96
100
|
|
97
101
|
if result['messages'][0]['code'] != '0'
|
@@ -106,7 +110,7 @@ module Trophonius
|
|
106
110
|
|
107
111
|
close_connection(token)
|
108
112
|
|
109
|
-
|
113
|
+
ret_val
|
110
114
|
end
|
111
115
|
|
112
116
|
private
|
@@ -120,7 +124,7 @@ module Trophonius
|
|
120
124
|
result['fieldData'].keys.each do |key|
|
121
125
|
# unless key[/\s/] || key[/\W/]
|
122
126
|
@translations.merge!(
|
123
|
-
{
|
127
|
+
{ ActiveSupport::Inflector.parameterize(ActiveSupport::Inflector.underscore(key.to_s), separator: '_').downcase.to_s => key.to_s }
|
124
128
|
)
|
125
129
|
hash.send(:define_singleton_method, ActiveSupport::Inflector.parameterize(ActiveSupport::Inflector.underscore(key.to_s), separator: '_')) do
|
126
130
|
hash[key]
|
@@ -149,7 +153,7 @@ module Trophonius
|
|
149
153
|
hash[key]
|
150
154
|
end
|
151
155
|
end
|
152
|
-
result['portalData'][key].
|
156
|
+
result['portalData'][key].each do |inner_hash|
|
153
157
|
inner_hash.keys.each do |inner_key|
|
154
158
|
inner_method =
|
155
159
|
ActiveSupport::Inflector.parameterize(ActiveSupport::Inflector.underscore(inner_key.gsub(/\w+::/, '').to_s), separator: '_')
|
@@ -161,7 +165,7 @@ module Trophonius
|
|
161
165
|
end
|
162
166
|
hash.merge!({ key => result['portalData'][key] })
|
163
167
|
end
|
164
|
-
|
168
|
+
hash
|
165
169
|
end
|
166
170
|
|
167
171
|
def make_request(url_param, token, method, body, params = '')
|
@@ -189,7 +193,8 @@ module Trophonius
|
|
189
193
|
def setup_connection
|
190
194
|
ssl_verifyhost = @config[:local_network] ? 0 : 2
|
191
195
|
ssl_verifypeer = !@config[:local_network]
|
192
|
-
|
196
|
+
uri = URI::RFC2396_Parser.new
|
197
|
+
url = URI(uri.escape("http#{@config[:ssl] == true ? 's' : ''}://#{@config[:host]}/fmi/data/v1/databases/#{@config[:database]}/sessions"))
|
193
198
|
request =
|
194
199
|
Typhoeus::Request.new(
|
195
200
|
url,
|
@@ -216,12 +221,13 @@ module Trophonius
|
|
216
221
|
Error.throw_error('1631')
|
217
222
|
end
|
218
223
|
Error.throw_error(parsed['messages'][0]['code']) if parsed['messages'][0]['code'] != '0'
|
219
|
-
|
224
|
+
parsed['response']['token']
|
220
225
|
end
|
221
226
|
|
222
227
|
def close_connection(token)
|
228
|
+
uri = URI::RFC2396_Parser.new
|
223
229
|
url =
|
224
|
-
URI(
|
230
|
+
URI(uri.escape("http#{@config[:ssl] == true ? 's' : ''}://#{@config[:host]}/fmi/data/v1/databases/#{@config[:database]}/sessions/#{token}"))
|
225
231
|
ssl_verifyhost = @config[:local_network] ? 0 : 2
|
226
232
|
ssl_verifypeer = !@config[:local_network]
|
227
233
|
|
@@ -242,7 +248,7 @@ module Trophonius
|
|
242
248
|
Error.throw_error('1631')
|
243
249
|
end
|
244
250
|
Error.throw_error(parsed['messages'][0]['code']) if parsed['messages'][0]['code'] != '0'
|
245
|
-
|
251
|
+
true
|
246
252
|
end
|
247
253
|
end
|
248
254
|
end
|
metadata
CHANGED
@@ -1,57 +1,57 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: trophonius
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.4.
|
4
|
+
version: 1.4.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kempen Automatisering
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-06-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: redis
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '4.0'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '4.0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: typhoeus
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '1.3'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '1.3'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: activesupport
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
47
|
+
version: '7.0'
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
54
|
+
version: '7.0'
|
55
55
|
description: A lightweight, easy to use link between Ruby (on Rails) and FileMaker
|
56
56
|
using the FileMaker Data-API.
|
57
57
|
email:
|
@@ -78,7 +78,8 @@ files:
|
|
78
78
|
homepage: https://github.com/Willem-Jan/Trophonius
|
79
79
|
licenses:
|
80
80
|
- MIT
|
81
|
-
metadata:
|
81
|
+
metadata:
|
82
|
+
rubygems_mfa_required: 'true'
|
82
83
|
post_install_message:
|
83
84
|
rdoc_options: []
|
84
85
|
require_paths:
|
@@ -94,7 +95,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
94
95
|
- !ruby/object:Gem::Version
|
95
96
|
version: '0'
|
96
97
|
requirements: []
|
97
|
-
rubygems_version: 3.0.
|
98
|
+
rubygems_version: 3.0.9
|
98
99
|
signing_key:
|
99
100
|
specification_version: 4
|
100
101
|
summary: Link between Ruby (on Rails) and FileMaker.
|