trophonius 1.2.3 → 1.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/trophonius_error.rb +227 -227
- data/lib/trophonius_model.rb +138 -106
- data/lib/trophonius_query.rb +64 -13
- data/lib/trophonius_redis_manager.rb +26 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a314aa079b0dc7fca08f9796cfed19723f93006d2fef258b59517e9b20dd8c7a
|
4
|
+
data.tar.gz: f75dccd8b89ef66f69f15289f41e0389d946a9c25a96fdc7a19391eb296aa19f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 88e13826eb573c46ad06bc4b6eb63a23769231a5a1134820b3b3a5c6e8ca208a5c7c95756eaf549d5a8c4e44e6be5f5a1fa2a3fdec86b3d80cdc60fab34c237b
|
7
|
+
data.tar.gz: cde2425883080994637eda7c571f3bfa4196c65118d798630e55bc1b7108d45a74a37dafe8f23dc7906becae35bcd39b36635ea4459fa125316655df8d0807b2
|
data/lib/trophonius_error.rb
CHANGED
@@ -47,258 +47,258 @@ module Trophonius
|
|
47
47
|
raise RecordNotFoundError.new, 'Empty result'
|
48
48
|
when '9'
|
49
49
|
raise UnauthenticatedError.new, 'User has insufficient privileges'
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
50
|
+
# when "10"
|
51
|
+
# when "11"
|
52
|
+
# when "12"
|
53
|
+
# when "13"
|
54
|
+
# when "14"
|
55
|
+
# when "15"
|
56
|
+
# when "16"
|
57
|
+
# when "17"
|
58
|
+
# when "16"
|
59
|
+
# when "18"
|
60
|
+
# when "19"
|
61
|
+
# when "09"
|
62
|
+
# when "20"
|
63
|
+
# when "21"
|
64
|
+
# when "100"
|
65
65
|
when '101'
|
66
|
-
raise RecordNotFoundError.new,
|
66
|
+
raise RecordNotFoundError.new, "Record #{more_info} was not found"
|
67
67
|
when '102'
|
68
68
|
if more_info != 0
|
69
69
|
raise FieldUnexistingError.new, "Following field(s) #{more_info} do not exist on layout #{layout_info}"
|
70
70
|
else
|
71
71
|
raise FieldUnexistingError.new, 'Field does not exist'
|
72
72
|
end
|
73
|
-
|
73
|
+
# when "103"
|
74
74
|
when '104'
|
75
75
|
raise ScriptUnexistingError.new, 'Script does not exist'
|
76
76
|
when '105'
|
77
77
|
raise LayoutUnexistingError.new, 'Layout does not exist'
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
78
|
+
# when "106"
|
79
|
+
# when "107"
|
80
|
+
# when "108"
|
81
|
+
# when "109"
|
82
|
+
# when "110"
|
83
|
+
# when "111"
|
84
|
+
# when "112"
|
85
|
+
# when "113"
|
86
|
+
# when "114"
|
87
|
+
# when "115"
|
88
|
+
# when "116"
|
89
|
+
# when "117"
|
90
|
+
# when "118"
|
91
|
+
# when "130"
|
92
|
+
# when "131"
|
93
|
+
# when "200"
|
94
94
|
when '201'
|
95
95
|
raise FieldNotModifiableError.new, 'Trying to write to a read-only field'
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
96
|
+
# when "202"
|
97
|
+
# when "203"
|
98
|
+
# when "204"
|
99
|
+
# when "205"
|
100
|
+
# when "206"
|
101
|
+
# when "207"
|
102
|
+
# when "208"
|
103
|
+
# when "209"
|
104
|
+
# when "210"
|
105
|
+
# when "211"
|
106
|
+
# when "212"
|
107
|
+
# when "213"
|
108
|
+
# when "214"
|
109
|
+
# when "215"
|
110
|
+
# when "216"
|
111
|
+
# when "217"
|
112
|
+
# when "218"
|
113
|
+
# when "300"
|
114
|
+
# when "301"
|
115
|
+
# when "302"
|
116
|
+
# when "303"
|
117
|
+
# when "304"
|
118
|
+
# when "306"
|
119
|
+
# when "307"
|
120
|
+
# when "308"
|
121
121
|
when '400'
|
122
122
|
raise EmptyFindError.new, ' Find criteria are empty'
|
123
123
|
when '401'
|
124
|
-
raise RecordNotFoundError.new,
|
125
|
-
|
124
|
+
raise RecordNotFoundError.new, "Record #{more_info} was not found"
|
125
|
+
# when "402"
|
126
126
|
when '403'
|
127
127
|
raise UnauthenticatedError.new, 'You are unauthenticated to perform this request'
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
128
|
+
# when "404"
|
129
|
+
# when "405"
|
130
|
+
# when "406"
|
131
|
+
# when "407"
|
132
|
+
# when "408"
|
133
|
+
# when "409"
|
134
|
+
# when "410"
|
135
|
+
# when "412"
|
136
|
+
# when "413"
|
137
|
+
# when "414"
|
138
|
+
# when "415"
|
139
|
+
# when "416"
|
140
|
+
# when "417"
|
141
|
+
# when "418"
|
142
142
|
when '500'
|
143
143
|
raise ValidationError.new, 'Data value does not meet validation entry options (hint make sure your date values are formatted as MM/DD/YYYY)'
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
144
|
+
# when "501"
|
145
|
+
# when "502"
|
146
|
+
# when "503"
|
147
|
+
# when "504"
|
148
|
+
# when "505"
|
149
|
+
# when "506"
|
150
|
+
# when "507"
|
151
|
+
# when "508"
|
152
|
+
# when "509"
|
153
|
+
# when "510"
|
154
|
+
# when "511"
|
155
|
+
# when "512"
|
156
|
+
# when "513"
|
157
|
+
# when "600"
|
158
|
+
# when "601"
|
159
|
+
# when "602"
|
160
|
+
# when "603"
|
161
|
+
# when "700"
|
162
|
+
# when "706"
|
163
|
+
# when "707"
|
164
|
+
# when "708"
|
165
|
+
# when "711"
|
166
|
+
# when "714"
|
167
|
+
# when "715"
|
168
|
+
# when "716"
|
169
|
+
# when "717"
|
170
|
+
# when "718"
|
171
|
+
# when "719"
|
172
|
+
# when "720"
|
173
|
+
# when "721"
|
174
|
+
# when "722"
|
175
|
+
# when "723"
|
176
|
+
# when "724"
|
177
|
+
# when "725"
|
178
|
+
# when "726"
|
179
|
+
# when "727"
|
180
|
+
# when "729"
|
181
|
+
# when "730"
|
182
|
+
# when "731"
|
183
|
+
# when "732"
|
184
|
+
# when "733"
|
185
|
+
# when "734"
|
186
|
+
# when "735"
|
187
|
+
# when "736"
|
188
|
+
# when "738"
|
189
|
+
# when "800"
|
190
|
+
# when "801"
|
191
|
+
# when "802"
|
192
|
+
# when "803"
|
193
|
+
# when "804"
|
194
|
+
# when "805"
|
195
|
+
# when "806"
|
196
|
+
# when "807"
|
197
|
+
# when "808"
|
198
|
+
# when "809"
|
199
|
+
# when "810"
|
200
|
+
# when "811"
|
201
|
+
# when "812"
|
202
|
+
# when "813"
|
203
|
+
# when "814"
|
204
|
+
# when "815"
|
205
|
+
# when "816"
|
206
|
+
# when "817"
|
207
|
+
# when "819"
|
208
|
+
# when "820"
|
209
|
+
# when "821"
|
210
|
+
# when "822"
|
211
|
+
# when "823"
|
212
|
+
# when "824"
|
213
|
+
# when "825"
|
214
|
+
# when "826"
|
215
|
+
# when "827"
|
216
|
+
# when "850"
|
217
|
+
# when "851"
|
218
|
+
# when "852"
|
219
|
+
# when "853"
|
220
|
+
# when "900"
|
221
|
+
# when "901"
|
222
|
+
# when "902"
|
223
|
+
# when "903"
|
224
|
+
# when "905"
|
225
|
+
# when "906"
|
226
|
+
# when "920"
|
227
|
+
# when "921"
|
228
|
+
# when "922"
|
229
|
+
# when "923"
|
230
|
+
# when "951"
|
231
231
|
when '952'
|
232
232
|
raise InvalidTokenError.new, 'Could not retrieve a valid token from FileMaker, check your FileMaker server'
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
233
|
+
# when "954"
|
234
|
+
# when "955"
|
235
|
+
# when "956"
|
236
|
+
# when "957"
|
237
|
+
# when "958"
|
238
|
+
# when "959"
|
239
|
+
# when "960"
|
240
|
+
# when "1200"
|
241
|
+
# when "1201"
|
242
|
+
# when "1202"
|
243
|
+
# when "1203"
|
244
|
+
# when "1204"
|
245
|
+
# when "1205"
|
246
|
+
# when "1206"
|
247
|
+
# when "1207"
|
248
|
+
# when "1208"
|
249
|
+
# when "1209"
|
250
|
+
# when "1210"
|
251
|
+
# when "1211"
|
252
|
+
# when "1212"
|
253
|
+
# when "1213"
|
254
|
+
# when "1214"
|
255
|
+
# when "1215"
|
256
|
+
# when "1216"
|
257
|
+
# when "1217"
|
258
|
+
# when "1218"
|
259
|
+
# when "1219"
|
260
|
+
# when "1220"
|
261
|
+
# when "1221"
|
262
|
+
# when "1222"
|
263
|
+
# when "1223"
|
264
|
+
# when "1224"
|
265
|
+
# when "1225"
|
266
|
+
# when "1300"
|
267
|
+
# when "1301"
|
268
|
+
# when "1400"
|
269
|
+
# when "1401"
|
270
|
+
# when "1402"
|
271
|
+
# when "1403"
|
272
|
+
# when "1404"
|
273
|
+
# when "1405"
|
274
|
+
# when "1406"
|
275
|
+
# when "1407"
|
276
|
+
# when "1408"
|
277
|
+
# when "1409"
|
278
|
+
# when "1413"
|
279
|
+
# when "1414"
|
280
|
+
# when "1450"
|
281
|
+
# when "1451"
|
282
|
+
# when "1501"
|
283
|
+
# when "1502"
|
284
|
+
# when "1503"
|
285
|
+
# when "1504"
|
286
|
+
# when "1505"
|
287
|
+
# when "1506"
|
288
|
+
# when "1507"
|
289
|
+
# when "1550"
|
290
|
+
# when "1551"
|
291
|
+
# when "1626"
|
292
|
+
# when "1627"
|
293
|
+
# when "1628"
|
294
|
+
# when "1629"
|
295
|
+
# when "1630"
|
296
296
|
when '1631'
|
297
297
|
raise ConnectionError.new, 'An error occurred while attempting to connect to the FileMaker server'
|
298
|
-
|
299
|
-
|
298
|
+
# when "1632"
|
299
|
+
# when "1633"
|
300
300
|
else
|
301
|
-
raise ResponseNotYetImplementedError.new,
|
301
|
+
raise ResponseNotYetImplementedError.new, "An unknown error has been encountered: err_no was #{error_id}"
|
302
302
|
end
|
303
303
|
end
|
304
304
|
end
|
data/lib/trophonius_model.rb
CHANGED
@@ -1,9 +1,9 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require
|
1
|
+
require 'json'
|
2
|
+
require 'trophonius_config'
|
3
|
+
require 'trophonius_record'
|
4
|
+
require 'trophonius_recordset'
|
5
|
+
require 'trophonius_query'
|
6
|
+
require 'trophonius_error'
|
7
7
|
|
8
8
|
module Trophonius
|
9
9
|
# This class will retrieve the records from the FileMaker database and build a RecordSet filled with Record objects. One Record object represents a record in FileMaker.
|
@@ -13,10 +13,10 @@ module Trophonius
|
|
13
13
|
|
14
14
|
def initialize(config:)
|
15
15
|
@configuration = config
|
16
|
-
@offset =
|
17
|
-
@limit =
|
16
|
+
@offset = ''
|
17
|
+
@limit = ''
|
18
18
|
end
|
19
|
-
|
19
|
+
|
20
20
|
##
|
21
21
|
# Sets up the configuration for the model.
|
22
22
|
#
|
@@ -28,8 +28,8 @@ module Trophonius
|
|
28
28
|
@configuration.non_modifiable_fields = configuration[:non_modifiable_fields]
|
29
29
|
@configuration.all_fields = {}
|
30
30
|
@configuration.translations = {}
|
31
|
-
@offset =
|
32
|
-
@limit =
|
31
|
+
@offset = ''
|
32
|
+
@limit = ''
|
33
33
|
end
|
34
34
|
|
35
35
|
##
|
@@ -80,11 +80,9 @@ module Trophonius
|
|
80
80
|
|
81
81
|
def self.method_missing(method, *args, &block)
|
82
82
|
new_instance = Trophonius::Model.new(config: @configuration)
|
83
|
-
new_instance.current_query = Trophonius::Query.new(trophonius_model: self, limit: @limit, offset: @offset
|
83
|
+
new_instance.current_query = Trophonius::Query.new(trophonius_model: self, limit: @limit, offset: @offset)
|
84
84
|
args << new_instance
|
85
|
-
if new_instance.current_query.respond_to?(method)
|
86
|
-
new_instance.current_query.send(method, args)
|
87
|
-
end
|
85
|
+
new_instance.current_query.send(method, args) if new_instance.current_query.respond_to?(method)
|
88
86
|
end
|
89
87
|
|
90
88
|
def method_missing(method, *args, &block)
|
@@ -106,7 +104,7 @@ module Trophonius
|
|
106
104
|
# @return [Trophonius::Model] new instance of the model
|
107
105
|
def self.where(fieldData)
|
108
106
|
new_instance = Trophonius::Model.new(config: @configuration)
|
109
|
-
new_instance.current_query = Trophonius::Query.new(trophonius_model: self, limit: @limit, offset: @offset
|
107
|
+
new_instance.current_query = Trophonius::Query.new(trophonius_model: self, limit: @limit, offset: @offset)
|
110
108
|
new_instance.current_query.build_query[0].merge!(fieldData)
|
111
109
|
new_instance
|
112
110
|
end
|
@@ -131,38 +129,44 @@ module Trophonius
|
|
131
129
|
# @return [Record] the created record
|
132
130
|
# Model.create(fieldOne: "Data")
|
133
131
|
def self.create(fieldData)
|
134
|
-
url =
|
132
|
+
url =
|
133
|
+
URI(
|
134
|
+
"http#{Trophonius.config.ssl == true ? 's' : ''}://#{Trophonius.config.host}/fmi/data/v1/databases/#{Trophonius.config.database}/layouts/#{
|
135
|
+
layout_name
|
136
|
+
}/records"
|
137
|
+
)
|
135
138
|
new_field_data = {}
|
136
|
-
if @configuration.translations.keys.empty?
|
137
|
-
create_translations
|
138
|
-
end
|
139
|
+
create_translations if @configuration.translations.keys.empty?
|
139
140
|
fieldData.keys.each do |k|
|
140
141
|
if @configuration.translations.keys.include?(k.to_s)
|
141
|
-
new_field_data.merge!({"#{@configuration.translations[k.to_s]}" => fieldData[k]})
|
142
|
+
new_field_data.merge!({ "#{@configuration.translations[k.to_s]}" => fieldData[k] })
|
142
143
|
else
|
143
|
-
new_field_data.merge!({"#{k}" => fieldData[k]})
|
144
|
+
new_field_data.merge!({ "#{k}" => fieldData[k] })
|
144
145
|
end
|
145
146
|
end
|
146
147
|
body = "{\"fieldData\": #{new_field_data.to_json}}"
|
147
|
-
response = Request.make_request(url, "Bearer #{Request.get_token}",
|
148
|
-
if response[
|
149
|
-
if response[
|
148
|
+
response = Request.make_request(url, "Bearer #{Request.get_token}", 'post', body)
|
149
|
+
if response['messages'][0]['code'] != '0'
|
150
|
+
if response['messages'][0]['code'] == '102'
|
150
151
|
results = Request.retrieve_first(layout_name)
|
151
|
-
if results[
|
152
|
-
Error.throw_error(
|
152
|
+
if results['messages'][0]['code'] != '0'
|
153
|
+
Error.throw_error('102')
|
153
154
|
else
|
154
|
-
r_results = results[
|
155
|
-
ret_val = r_results.empty? ? Error.throw_error(
|
156
|
-
Error.throw_error(
|
155
|
+
r_results = results['response']['data']
|
156
|
+
ret_val = r_results.empty? ? Error.throw_error('102') : r_results[0]['fieldData']
|
157
|
+
Error.throw_error('102', (new_field_data.keys.map(&:downcase) - ret_val.keys.map(&:downcase)).flatten.join(', '), layout_name)
|
157
158
|
end
|
158
159
|
end
|
159
|
-
Error.throw_error(response[
|
160
|
+
Error.throw_error(response['messages'][0]['code'])
|
160
161
|
else
|
161
|
-
url =
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
162
|
+
url =
|
163
|
+
URI(
|
164
|
+
"http#{Trophonius.config.ssl == true ? 's' : ''}://#{Trophonius.config.host}/fmi/data/v1/databases/#{
|
165
|
+
Trophonius.config.database
|
166
|
+
}/layouts/#{layout_name}/records/#{response['response']['recordId']}"
|
167
|
+
)
|
168
|
+
ret_val = build_result(Request.make_request(url, "Bearer #{Request.get_token}", 'get', '{}')['response']['data'][0])
|
169
|
+
ret_val.send(:define_singleton_method, 'result_count') { 1 }
|
166
170
|
return ret_val
|
167
171
|
end
|
168
172
|
end
|
@@ -175,25 +179,31 @@ module Trophonius
|
|
175
179
|
# @return [Record] a Record object that correspond to FileMaker record fitting the find request
|
176
180
|
# Model.find_by(fieldOne: "Data")
|
177
181
|
def self.find_by(fieldData)
|
178
|
-
url =
|
182
|
+
url =
|
183
|
+
URI(
|
184
|
+
"http#{Trophonius.config.ssl == true ? 's' : ''}://#{Trophonius.config.host}/fmi/data/v1/databases/#{Trophonius.config.database}/layouts/#{
|
185
|
+
self.layout_name
|
186
|
+
}/_find?_limit=1"
|
187
|
+
)
|
179
188
|
new_field_data = {}
|
180
|
-
if @configuration.translations.keys.empty?
|
181
|
-
create_translations
|
182
|
-
end
|
189
|
+
create_translations if @configuration.translations.keys.empty?
|
183
190
|
fieldData.keys.each do |k|
|
184
191
|
if @configuration.translations.keys.include?(k.to_s)
|
185
|
-
new_field_data.merge!({"#{@configuration.translations[k.to_s]}" => fieldData[k]})
|
192
|
+
new_field_data.merge!({ "#{@configuration.translations[k.to_s]}" => fieldData[k] })
|
186
193
|
else
|
187
|
-
new_field_data.merge!({"#{k}" => fieldData[k]})
|
194
|
+
new_field_data.merge!({ "#{k}" => fieldData[k] })
|
188
195
|
end
|
189
196
|
end
|
190
|
-
body = {query: [new_field_data], limit:
|
191
|
-
response = Request.make_request(url, "Bearer #{Request.get_token}",
|
192
|
-
|
193
|
-
|
194
|
-
|
197
|
+
body = { query: [new_field_data], limit: '100000' }.to_json
|
198
|
+
response = Request.make_request(url, "Bearer #{Request.get_token}", 'post', body)
|
199
|
+
|
200
|
+
if response['messages'][0]['code'] != '0'
|
201
|
+
if response['messages'][0]['code'] == '101' || response['messages'][0]['code'] == '401'
|
202
|
+
return RecordSet.new(self.layout_name, self.non_modifiable_fields)
|
203
|
+
end
|
204
|
+
Error.throw_error(response['messages'][0]['code'])
|
195
205
|
else
|
196
|
-
r_results = response[
|
206
|
+
r_results = response['response']['data']
|
197
207
|
ret_val = RecordSet.new(self.layout_name, self.non_modifiable_fields)
|
198
208
|
r_results.each do |r|
|
199
209
|
hash = build_result(r)
|
@@ -210,15 +220,18 @@ module Trophonius
|
|
210
220
|
#
|
211
221
|
# @return [Record] the record
|
212
222
|
def self.find(record_id)
|
213
|
-
url =
|
214
|
-
|
215
|
-
|
216
|
-
|
223
|
+
url =
|
224
|
+
URI(
|
225
|
+
"http#{Trophonius.config.ssl == true ? 's' : ''}://#{Trophonius.config.host}/fmi/data/v1/databases/#{Trophonius.config.database}/layouts/#{
|
226
|
+
layout_name
|
227
|
+
}/records/#{record_id}"
|
228
|
+
)
|
229
|
+
response = Request.make_request(url, "Bearer #{Request.get_token}", 'get', '{}')
|
230
|
+
if response['messages'][0]['code'] != '0'
|
231
|
+
Error.throw_error(response['messages'][0]['code'], record_id)
|
217
232
|
else
|
218
|
-
ret_val = build_result(response[
|
219
|
-
ret_val.send(:define_singleton_method,
|
220
|
-
1
|
221
|
-
end
|
233
|
+
ret_val = build_result(response['response']['data'][0])
|
234
|
+
ret_val.send(:define_singleton_method, 'result_count') { 1 }
|
222
235
|
return ret_val
|
223
236
|
end
|
224
237
|
end
|
@@ -230,10 +243,15 @@ module Trophonius
|
|
230
243
|
#
|
231
244
|
# @return [Boolean] True if the delete was successful
|
232
245
|
def self.delete(record_id)
|
233
|
-
url =
|
234
|
-
|
235
|
-
|
236
|
-
|
246
|
+
url =
|
247
|
+
URI(
|
248
|
+
"http#{Trophonius.config.ssl == true ? 's' : ''}://#{Trophonius.config.host}/fmi/data/v1/databases/#{Trophonius.config.database}/layouts/#{
|
249
|
+
layout_name
|
250
|
+
}/records/#{record_id}"
|
251
|
+
)
|
252
|
+
response = Request.make_request(url, "Bearer #{Request.get_token}", 'delete', '{}')
|
253
|
+
if response['messages'][0]['code'] != '0'
|
254
|
+
Error.throw_error(response['messages'][0]['code'])
|
237
255
|
else
|
238
256
|
return true
|
239
257
|
end
|
@@ -248,25 +266,24 @@ module Trophonius
|
|
248
266
|
#
|
249
267
|
# @return [Boolean] True if the delete was successful
|
250
268
|
def self.edit(record_id, fieldData)
|
251
|
-
url =
|
269
|
+
url =
|
270
|
+
URI(
|
271
|
+
"http#{Trophonius.config.ssl == true ? 's' : ''}://#{Trophonius.config.host}/fmi/data/v1/databases/#{Trophonius.config.database}/layouts/#{
|
272
|
+
layout_name
|
273
|
+
}/records/#{record_id}"
|
274
|
+
)
|
252
275
|
new_field_data = {}
|
253
|
-
if @configuration.translations.keys.empty?
|
254
|
-
create_translations
|
255
|
-
end
|
276
|
+
create_translations if @configuration.translations.keys.empty?
|
256
277
|
fieldData.keys.each do |k|
|
257
278
|
if @configuration.translations.keys.include?(k.to_s)
|
258
|
-
new_field_data.merge!({"#{@configuration.translations[k.to_s]}" => fieldData[k]})
|
279
|
+
new_field_data.merge!({ "#{@configuration.translations[k.to_s]}" => fieldData[k] })
|
259
280
|
else
|
260
|
-
new_field_data.merge!({"#{k}" => fieldData[k]})
|
281
|
+
new_field_data.merge!({ "#{k}" => fieldData[k] })
|
261
282
|
end
|
262
283
|
end
|
263
284
|
body = "{\"fieldData\": #{new_field_data.to_json}}"
|
264
|
-
response = Request.make_request(url, "Bearer #{Request.get_token}",
|
265
|
-
|
266
|
-
Error.throw_error(response["messages"][0]["code"])
|
267
|
-
else
|
268
|
-
true
|
269
|
-
end
|
285
|
+
response = Request.make_request(url, "Bearer #{Request.get_token}", 'patch', body)
|
286
|
+
response['messages'][0]['code'] != '0' ? Error.throw_error(response['messages'][0]['code']) : true
|
270
287
|
end
|
271
288
|
|
272
289
|
##
|
@@ -276,45 +293,52 @@ module Trophonius
|
|
276
293
|
#
|
277
294
|
# @return [Record] A Record with singleton_methods for the fields where possible
|
278
295
|
def self.build_result(result)
|
279
|
-
hash = Trophonius::Record.new
|
280
|
-
hash.record_id = result[
|
296
|
+
hash = Trophonius::Record.new
|
297
|
+
hash.record_id = result['recordId']
|
281
298
|
hash.layout_name = layout_name
|
282
|
-
result[
|
299
|
+
result['fieldData'].keys.each do |key|
|
283
300
|
# unless key[/\s/] || key[/\W/]
|
284
|
-
@configuration.translations.merge!(
|
301
|
+
@configuration.translations.merge!(
|
302
|
+
{ "#{ActiveSupport::Inflector.parameterize(ActiveSupport::Inflector.underscore(key.to_s), separator: '_').downcase}" => "#{key}" }
|
303
|
+
)
|
285
304
|
hash.send(:define_singleton_method, ActiveSupport::Inflector.parameterize(ActiveSupport::Inflector.underscore(key.to_s), separator: '_')) do
|
286
305
|
hash[key]
|
287
306
|
end
|
288
307
|
unless non_modifiable_fields&.include?(key)
|
289
|
-
@configuration.all_fields.merge!(
|
290
|
-
|
308
|
+
@configuration.all_fields.merge!(
|
309
|
+
ActiveSupport::Inflector.parameterize(ActiveSupport::Inflector.underscore(key.to_s), separator: '_').downcase =>
|
310
|
+
ActiveSupport::Inflector.parameterize(ActiveSupport::Inflector.underscore(key.to_s), separator: '_')
|
311
|
+
)
|
312
|
+
hash.send(
|
313
|
+
:define_singleton_method,
|
314
|
+
"#{ActiveSupport::Inflector.parameterize(ActiveSupport::Inflector.underscore(key.to_s), separator: '_')}="
|
315
|
+
) do |new_val|
|
291
316
|
hash[key] = new_val
|
292
317
|
hash.modifiable_fields[key] = new_val
|
293
318
|
hash.modified_fields[key] = new_val
|
294
319
|
end
|
295
320
|
end
|
296
321
|
# end
|
297
|
-
hash.merge!({key => result[
|
298
|
-
unless non_modifiable_fields&.include?(key)
|
299
|
-
hash.modifiable_fields.merge!({key => result["fieldData"][key]})
|
300
|
-
end
|
322
|
+
hash.merge!({ key => result['fieldData'][key] })
|
323
|
+
hash.modifiable_fields.merge!({ key => result['fieldData'][key] }) unless non_modifiable_fields&.include?(key)
|
301
324
|
end
|
302
|
-
result[
|
325
|
+
result['portalData'].keys.each do |key|
|
303
326
|
unless key[/\s/] || key[/\W/]
|
304
327
|
hash.send(:define_singleton_method, ActiveSupport::Inflector.parameterize(ActiveSupport::Inflector.underscore(key.to_s), separator: '_')) do
|
305
328
|
hash[key]
|
306
329
|
end
|
307
330
|
end
|
308
|
-
result[
|
331
|
+
result['portalData'][key].each_with_index do |inner_hash|
|
309
332
|
inner_hash.keys.each do |inner_key|
|
310
|
-
inner_method =
|
333
|
+
inner_method =
|
334
|
+
ActiveSupport::Inflector.parameterize(ActiveSupport::Inflector.underscore(inner_key.gsub(/\w+::/, '').to_s), separator: '_')
|
311
335
|
unless inner_method[/\s/] || inner_method[/\W/]
|
312
336
|
inner_hash.send(:define_singleton_method, inner_method.to_s) { inner_hash[inner_key] }
|
313
|
-
inner_hash.send(:define_singleton_method,
|
337
|
+
inner_hash.send(:define_singleton_method, 'record_id') { inner_hash['recordId'] }
|
314
338
|
end
|
315
339
|
end
|
316
340
|
end
|
317
|
-
hash.merge!({key => result[
|
341
|
+
hash.merge!({ key => result['portalData'][key] })
|
318
342
|
end
|
319
343
|
return hash
|
320
344
|
end
|
@@ -325,14 +349,12 @@ module Trophonius
|
|
325
349
|
# @return [Record]: a Record corresponding to the FileMaker record.
|
326
350
|
def self.first
|
327
351
|
results = Request.retrieve_first(layout_name)
|
328
|
-
if results[
|
329
|
-
Error.throw_error(results[
|
352
|
+
if results['messages'][0]['code'] != '0'
|
353
|
+
Error.throw_error(results['messages'][0]['code'])
|
330
354
|
else
|
331
|
-
r_results = results[
|
332
|
-
ret_val = r_results.empty? ? Trophonius::Record.new
|
333
|
-
ret_val.send(:define_singleton_method,
|
334
|
-
r_results.empty? ? 0 : 1
|
335
|
-
end
|
355
|
+
r_results = results['response']['data']
|
356
|
+
ret_val = r_results.empty? ? Trophonius::Record.new : build_result(r_results[0])
|
357
|
+
ret_val.send(:define_singleton_method, 'result_count') { r_results.empty? ? 0 : 1 }
|
336
358
|
return ret_val
|
337
359
|
end
|
338
360
|
end
|
@@ -345,14 +367,14 @@ module Trophonius
|
|
345
367
|
# @param [String] scriptparameter: the parameter required by the FileMaker script
|
346
368
|
#
|
347
369
|
# @return [String]: string representing the script result returned by FileMaker
|
348
|
-
def self.run_script(script:
|
370
|
+
def self.run_script(script: '', scriptparameter: '')
|
349
371
|
result = Request.run_script(script, scriptparameter, layout_name)
|
350
|
-
if result[
|
351
|
-
Error.throw_error(result[
|
352
|
-
elsif result[
|
372
|
+
if result['messages'][0]['code'] != '0'
|
373
|
+
Error.throw_error(result['messages'][0]['code'])
|
374
|
+
elsif result['response']['scriptResult'] == '403'
|
353
375
|
Error.throw_error(403)
|
354
376
|
else
|
355
|
-
ret_val = result[
|
377
|
+
ret_val = result['response']['scriptResult']
|
356
378
|
return ret_val
|
357
379
|
end
|
358
380
|
end
|
@@ -365,19 +387,29 @@ module Trophonius
|
|
365
387
|
# @return [RecordSet]: a RecordSet containing all the Record objects that correspond to the FileMaker records.
|
366
388
|
def self.all(sort: {})
|
367
389
|
results = Request.retrieve_all(layout_name, sort)
|
368
|
-
count = results[
|
390
|
+
count = results['response']['scriptResult'].to_i
|
369
391
|
unless @limit.empty? || @offset.empty?
|
370
|
-
url =
|
392
|
+
url =
|
393
|
+
URI(
|
394
|
+
"http#{Trophonius.config.ssl == true ? 's' : ''}://#{Trophonius.config.host}/fmi/data/v1/databases/#{
|
395
|
+
Trophonius.config.database
|
396
|
+
}/layouts/#{layout_name}/records?_offset=#{@offset}&_limit=#{@limit}"
|
397
|
+
)
|
371
398
|
else
|
372
|
-
url =
|
399
|
+
url =
|
400
|
+
URI(
|
401
|
+
"http#{Trophonius.config.ssl == true ? 's' : ''}://#{Trophonius.config.host}/fmi/data/v1/databases/#{
|
402
|
+
Trophonius.config.database
|
403
|
+
}/layouts/#{layout_name}/records?_limit=#{count == 0 ? 1_000_000 : count}"
|
404
|
+
)
|
373
405
|
end
|
374
406
|
@limit = ''
|
375
407
|
@offset = ''
|
376
|
-
results = Request.make_request(url, "Bearer #{Request.get_token}",
|
377
|
-
if results[
|
378
|
-
Error.throw_error(results[
|
408
|
+
results = Request.make_request(url, "Bearer #{Request.get_token}", 'get', '{}')
|
409
|
+
if results['messages'][0]['code'] != '0'
|
410
|
+
Error.throw_error(results['messages'][0]['code'])
|
379
411
|
else
|
380
|
-
r_results = results[
|
412
|
+
r_results = results['response']['data']
|
381
413
|
ret_val = RecordSet.new(self.layout_name, self.non_modifiable_fields)
|
382
414
|
r_results.each do |r|
|
383
415
|
hash = build_result(r)
|
data/lib/trophonius_query.rb
CHANGED
@@ -30,6 +30,14 @@ module Trophonius
|
|
30
30
|
@current_query ||= [{}]
|
31
31
|
end
|
32
32
|
|
33
|
+
##
|
34
|
+
# Returns the current sort order, creates an empty sort order if no current sort order exists
|
35
|
+
#
|
36
|
+
# @return [Array[Hash]] array representing the FileMaker sort request
|
37
|
+
def build_sort
|
38
|
+
@current_sort ||= []
|
39
|
+
end
|
40
|
+
|
33
41
|
def inspect
|
34
42
|
@current_query
|
35
43
|
end
|
@@ -54,6 +62,34 @@ module Trophonius
|
|
54
62
|
args[1]
|
55
63
|
end
|
56
64
|
|
65
|
+
##
|
66
|
+
# Sets or updates the limit and offset for a query
|
67
|
+
#
|
68
|
+
# @param [args] arguments containing the limit and offset
|
69
|
+
# @return [Trophonius::Model] updated base model
|
70
|
+
def paginate(args)
|
71
|
+
@offset = args[0]
|
72
|
+
@limit = args[1]
|
73
|
+
args[2]
|
74
|
+
end
|
75
|
+
|
76
|
+
##
|
77
|
+
# Adds a sort request to the original query, resulting in an "sorted" query
|
78
|
+
#
|
79
|
+
# @param [args] arguments containing a Hash containing the FileMaker sort request, and the base model object for the query
|
80
|
+
# @return [Trophonius::Model] updated base model
|
81
|
+
def sort(args)
|
82
|
+
@trophonius_model.create_translations if @trophonius_model.translations.keys.empty?
|
83
|
+
args[0].each do |key, value|
|
84
|
+
if @trophonius_model.translations.key?(key.to_s)
|
85
|
+
args[1].current_query.build_sort << { fieldName: "#{@trophonius_model.translations[key.to_s]}", sortOrder: "#{value}" }
|
86
|
+
else
|
87
|
+
args[1].current_query.build_sort << { fieldName: "#{key}", sortOrder: "#{value}" }
|
88
|
+
end
|
89
|
+
end
|
90
|
+
args[1]
|
91
|
+
end
|
92
|
+
|
57
93
|
##
|
58
94
|
# Performs the query in FileMaker
|
59
95
|
#
|
@@ -63,11 +99,15 @@ module Trophonius
|
|
63
99
|
#
|
64
100
|
# @return Response of the called method
|
65
101
|
def run_query(method, *args, &block)
|
66
|
-
url =
|
102
|
+
url =
|
103
|
+
URI(
|
104
|
+
"http#{Trophonius.config.ssl == true ? 's' : ''}://#{Trophonius.config.host}/fmi/data/v1/databases/#{Trophonius.config.database}/layouts/#{
|
105
|
+
@trophonius_model.layout_name
|
106
|
+
}/_find"
|
107
|
+
)
|
67
108
|
new_field_data = @current_query.map { |_q| {} }
|
68
|
-
|
69
|
-
|
70
|
-
end
|
109
|
+
|
110
|
+
@trophonius_model.create_translations if @trophonius_model.translations.keys.empty?
|
71
111
|
@current_query.each_with_index do |query, index|
|
72
112
|
query.keys.each do |k|
|
73
113
|
if @trophonius_model.translations.key?(k.to_s)
|
@@ -77,26 +117,37 @@ module Trophonius
|
|
77
117
|
end
|
78
118
|
end
|
79
119
|
end
|
80
|
-
if @offset.
|
81
|
-
body =
|
120
|
+
if @offset.nil? || @limit.nil? || @offset == '' || @limit == '' || @offset == 0 || @limit == 0
|
121
|
+
body =
|
122
|
+
if @current_sort.nil?
|
123
|
+
{ query: new_field_data, limit: '100000' }.to_json
|
124
|
+
else
|
125
|
+
{ query: new_field_data, sort: @current_sort, limit: '100000' }.to_json
|
126
|
+
end
|
82
127
|
else
|
83
|
-
body =
|
128
|
+
body =
|
129
|
+
if @current_sort.nil?
|
130
|
+
{ query: new_field_data, limit: @limit.to_s, offset: @offset.to_s }.to_json
|
131
|
+
else
|
132
|
+
{ query: new_field_data, sort: @current_sort, limit: @limit.to_s, offset: @offset.to_s }.to_json
|
133
|
+
end
|
84
134
|
end
|
135
|
+
|
85
136
|
response = Request.make_request(url, "Bearer #{Request.get_token}", 'post', body)
|
86
137
|
if response['messages'][0]['code'] != '0'
|
87
138
|
if response['messages'][0]['code'] == '101' || response['messages'][0]['code'] == '401'
|
88
139
|
RecordSet.new(@trophonius_model.layout_name, @trophonius_model.non_modifiable_fields).send(method, *args, &block)
|
89
140
|
return
|
90
141
|
else
|
91
|
-
if response[
|
142
|
+
if response['messages'][0]['code'] == '102'
|
92
143
|
results = Request.retrieve_first(@trophonius_model.layout_name)
|
93
|
-
if results[
|
94
|
-
Error.throw_error(
|
144
|
+
if results['messages'][0]['code'] != '0'
|
145
|
+
Error.throw_error('102')
|
95
146
|
else
|
96
|
-
r_results = results[
|
97
|
-
ret_val = r_results.empty? ? Error.throw_error(
|
147
|
+
r_results = results['response']['data']
|
148
|
+
ret_val = r_results.empty? ? Error.throw_error('102') : r_results[0]['fieldData']
|
98
149
|
query_keys = new_field_data.map { |q| q.keys.map(&:downcase) }.uniq
|
99
|
-
Error.throw_error(
|
150
|
+
Error.throw_error('102', (query_keys - ret_val.keys.map(&:downcase)).flatten.join(', '), @trophonius_model.layout_name)
|
100
151
|
end
|
101
152
|
end
|
102
153
|
Error.throw_error(response['messages'][0]['code'])
|
@@ -1,4 +1,5 @@
|
|
1
1
|
module Trophonius
|
2
|
+
# the RedisManager module is used to create a (single) connection to a redis store.
|
2
3
|
module Trophonius::RedisManager
|
3
4
|
def self.connect
|
4
5
|
if ENV['REDIS_URL'] && ENV['REDIS_URL'] != ''
|
@@ -6,27 +7,52 @@ module Trophonius
|
|
6
7
|
else
|
7
8
|
@redis ||= Redis.new
|
8
9
|
end
|
10
|
+
return nil
|
9
11
|
end
|
10
12
|
|
13
|
+
##
|
14
|
+
# Checks whether the given key exists
|
15
|
+
#
|
16
|
+
# @param [String] key: the key to check
|
17
|
+
# @return [Boolean] true or false depending on whether the key exists in the redis store or not
|
11
18
|
def self.key_exists?(key:)
|
12
19
|
connect unless connected?
|
13
20
|
!(@redis.get(key).nil? || @redis.get(key).empty?)
|
14
21
|
end
|
15
22
|
|
23
|
+
##
|
24
|
+
# Get the value corresponding with the key
|
25
|
+
#
|
26
|
+
# @param [String] key: the key to find
|
27
|
+
# @return [String] the value corresponding with the key
|
16
28
|
def self.get_key(key:)
|
17
29
|
connect unless connected?
|
18
30
|
@redis.get(key)
|
19
31
|
end
|
20
32
|
|
33
|
+
##
|
34
|
+
# Set the value corresponding with a key
|
35
|
+
#
|
36
|
+
# @param [String] key: the key to store in redis
|
37
|
+
# @param [any] value: the value for the key
|
38
|
+
# @return [String] the value corresponding with the key
|
21
39
|
def self.set_key(key:, value:)
|
22
40
|
connect unless connected?
|
23
41
|
@redis.set(key, value)
|
24
42
|
end
|
25
43
|
|
44
|
+
##
|
45
|
+
# Checks whether we are connected to redis
|
46
|
+
#
|
47
|
+
# @return [Boolean] true or false depending on whether a connection to redis has been established
|
26
48
|
def self.connected?
|
27
49
|
@redis.nil? == false && @redis.connected?
|
28
50
|
end
|
29
51
|
|
52
|
+
##
|
53
|
+
# Disconnects from redis as quickly and as silently as possible
|
54
|
+
#
|
55
|
+
# @return [NilClass] nil
|
30
56
|
def self.disconnect
|
31
57
|
@redis.disconnect!
|
32
58
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: trophonius
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.2.
|
4
|
+
version: 1.2.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kempen Automatisering
|
@@ -88,7 +88,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
88
88
|
- !ruby/object:Gem::Version
|
89
89
|
version: '0'
|
90
90
|
requirements: []
|
91
|
-
rubygems_version: 3.
|
91
|
+
rubygems_version: 3.0.0
|
92
92
|
signing_key:
|
93
93
|
specification_version: 4
|
94
94
|
summary: Link between Ruby (on Rails) and FileMaker.
|