dynamicloud 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,800 @@
1
+ require_relative 'exceptions'
2
+ require_relative 'dynamic_service'
3
+ require_relative 'dynamic_model'
4
+ require_relative '../lib/configuration'
5
+ require 'json'
6
+ require 'rubygems'
7
+ require 'open-uri'
8
+
9
+ module Dynamicloud
10
+ class API
11
+ # This class contains data returned from Dynamicloud servers.
12
+ # @author Eleazar Gomez
13
+ # @version 1.0.0
14
+ # @since 8/26/15
15
+ class RecordResults
16
+ attr_accessor(:records, :total_records, :fast_returned_size)
17
+
18
+ def initialize
19
+ @records = []
20
+ @total_records = 0
21
+ @fast_returned_size = 0
22
+ end
23
+ end
24
+
25
+ class RecordQuery
26
+
27
+ DEFAULT_COUNT = 15
28
+
29
+ def initialize(mid)
30
+ @mid = mid
31
+ @credentials = nil
32
+ @order_by = nil
33
+ @group_by = nil
34
+ #@projection = nil
35
+ @offset = -1
36
+ @count = -1
37
+ @current_callback = nil
38
+ @list_was_called = false
39
+ @conditions = []
40
+ @current_projection = nil
41
+ end
42
+
43
+ # Apply a desc ordering to the current order by object
44
+ # An IllegalStateException will be thrown if orderBy object is nil
45
+ #
46
+ # @return this instance of Query
47
+ def desc
48
+ if @order_by.nil?
49
+ raise Exceptions::IllegalStateException, 'You must call order_by method before call this method'
50
+ end
51
+
52
+ @order_by.asc = false
53
+
54
+ self
55
+ end
56
+
57
+ # Apply a asc ordering to the current order by object
58
+ # An IllegalStateException will be thrown if orderBy object is nil
59
+ #
60
+ # @return this instance of Query
61
+ def asc
62
+ if @order_by.nil?
63
+ raise Exceptions::IllegalStateException, 'You must call order_by method before call this method'
64
+ end
65
+
66
+ @order_by.asc = true
67
+
68
+ self
69
+ end
70
+
71
+ # This method will add a new condition to an AND list of conditions.
72
+ #
73
+ # @param condition new condition to a list of conditions to use
74
+ # @return this instance of Query
75
+ def add(condition)
76
+ @conditions.push(condition)
77
+ self
78
+ end
79
+
80
+ # This method sets the projection to use in this query. The def execution will return those projection.
81
+ # If projection == nil then, this def will returns all model's projection.
82
+ #
83
+ # @param projection projection in this query
84
+ # @return this instance of Query
85
+ #def add_projection(projection)
86
+ # @projection = projection
87
+ #self
88
+ #end
89
+
90
+ # Sets an offset to this query to indicates the page of a big data result.
91
+ #
92
+ # @param offset new offset
93
+ # @return this instance of Query
94
+ def set_offset(offset)
95
+ @offset = offset
96
+ self
97
+ end
98
+
99
+ # Sets how many items per page (offset) this def will fetch
100
+ #
101
+ # @param count how many items
102
+ # @return this instance of Query
103
+ def set_count(count)
104
+ @count = count
105
+ self
106
+ end
107
+
108
+ # Gets the current count
109
+ # If count == 0 then will return default count (DEFAULT_COUNT)
110
+ #
111
+ # @return the current count
112
+ def get_count
113
+ @count <= 0 ? DEFAULT_COUNT : @count;
114
+ end
115
+
116
+ # This method will execute a query and returns a list of records
117
+ # @param projection projection to use in this operation
118
+ def get_results(projection = nil)
119
+ selection = Dynamicloud::API::DynamicloudHelper.build_string(get_conditions, get_group_by, get_order_by,
120
+ (Dynamicloud::API::DynamicloudHelper.build_projection(projection)))
121
+ @current_projection = projection
122
+
123
+ url = Configuration::PROPERTIES.get_property :url
124
+ if projection
125
+ url_get_records = Configuration::PROPERTIES.get_property :url_get_specific_fields
126
+ else
127
+ url_get_records = Configuration::PROPERTIES.get_property :url_get_records
128
+ end
129
+
130
+ url_get_records = url_get_records.gsub '{csk}', URI::encode(@credentials[:csk])
131
+ url_get_records = url_get_records.gsub '{aci}', URI::encode(@credentials[:aci])
132
+ url_get_records = url_get_records.gsub '{mid}', @mid.to_s
133
+ url_get_records = url_get_records.gsub '{count}', get_count.to_s
134
+ url_get_records = url_get_records.gsub '{offset}', get_current_offset.to_s
135
+
136
+ params = {
137
+ :criteria => selection
138
+ }
139
+
140
+ response = DynamicService::ServiceCaller.call_service url + url_get_records, params, 'post'
141
+
142
+ Dynamicloud::API::DynamicloudHelper.build_record_results response
143
+
144
+ end
145
+
146
+ # This method adds an order by condition. The condition will have an asc ordering by default.
147
+ #
148
+ # @param attribute attribute by this query will be ordered.
149
+ # @return this instance of Query
150
+ def order_by(attribute)
151
+ @order_by = OrderByClause.asc(attribute)
152
+ self
153
+ end
154
+
155
+ # This method create a groupBy condition using attribute
156
+ #
157
+ # @param attribute attribute by this query will group.
158
+ # @return this instance of Query
159
+ def group_by(attribute)
160
+ @group_by = GroupByClause.new(attribute)
161
+ self
162
+ end
163
+
164
+ # get the current conditions
165
+ #
166
+ # @return the conditions
167
+ def get_conditions
168
+ @conditions
169
+ end
170
+
171
+ # Gets the current offset so far. This attribute will increase according calls of method next(RecordCallback<T> callback)
172
+ #
173
+ # @return int of current offset
174
+ def get_current_offset
175
+ @offset < 0 ? 0 : @offset
176
+ end
177
+
178
+ # Will execute a list operation with an offset += count and will use the same callback object in list method.
179
+ # This method will return a RecordResults object
180
+ def next
181
+ @offset = get_current_offset + get_count
182
+ get_results @current_projection
183
+ end
184
+
185
+ # Returns the current model id associated to this query
186
+ # @return model id
187
+ def get_model_id
188
+ @mid
189
+ end
190
+
191
+ # Sets the credentials to use
192
+ #
193
+ # @param credentials credentials to execute operations.
194
+ def set_credentials(credentials)
195
+ @credentials = credentials
196
+ end
197
+
198
+ # get the current orderBy condition
199
+ # @return the order by condition
200
+ def get_order_by
201
+ @order_by
202
+ end
203
+
204
+ # get the current groupBy condition
205
+ #
206
+ # @return the group by condition
207
+ def get_group_by
208
+ @group_by
209
+ end
210
+
211
+ # This method create a groupBy condition using projection
212
+ #
213
+ # @param attributes projection by this query will group.
214
+ def set_group_by(attributes)
215
+ @group_by = GroupByClause.new(attributes)
216
+ end
217
+ end
218
+
219
+ # This class represents a record in Dynamicloud
220
+ # @author Eleazar Gomez
221
+ # @version 1.0.0
222
+ # @since 8/24/15
223
+ class RecordImpl
224
+ def initialize
225
+ @map = {}
226
+ end
227
+
228
+ # gets the value paired with attribute
229
+ # @param attribute attribute to use
230
+ # @return the value paired with attribute
231
+ def get_value(attribute)
232
+ obj = @map[attribute]
233
+ if obj
234
+ if obj.is_a?(String)
235
+ return obj.to_s
236
+ end
237
+ end
238
+
239
+ raise IllegalStateException, "The attribute #{attribute} doesn't have a paired string."
240
+ end
241
+
242
+ # get the values paired with attribute
243
+ # @param attribute attribute to use
244
+ # @return the values paired with attribute
245
+ def get_values(attribute)
246
+ obj = @map[attribute]
247
+ if obj
248
+ if obj.respond_to?(:each)
249
+ return obj
250
+ end
251
+ end
252
+
253
+ raise IllegalStateException, "Tha attribute #{attribute} doesn't have a paired string array."
254
+ end
255
+
256
+ # Adds a new value paired with attribute
257
+ # @param attribute attribute to be paired
258
+ # @param value value
259
+ def add_value(attribute, value)
260
+ @map[attribute] = value
261
+ end
262
+ end
263
+
264
+ # This class represents an error from Dynamicloud servers
265
+ # @author Eleazar Gomez
266
+ # @version 1.0.0
267
+ # @since 8/25/15
268
+ class RecordError
269
+ attr_accessor(:message, :code)
270
+
271
+ def initialize
272
+ @message = ''
273
+ @code = ''
274
+ end
275
+ end
276
+
277
+ # This class has two attributes CSK and ACI keys. This information is provided at moment the registration in Dynamicloud.
278
+ # @author Eleazar Gomez
279
+ # @version 1.0.0
280
+ # @since 8/25/15
281
+ class DynamicProvider
282
+ def initialize(credential)
283
+ @credential = credential
284
+ end
285
+
286
+ # This method will load a record using rid and will instantiate a hash with attributes bound to Model's fields.
287
+ # @param rid record id
288
+ # @param mid model id
289
+ # @return a hash with record information
290
+ def load_record(rid, mid)
291
+ url = Configuration::PROPERTIES.get_property :url
292
+ url_get_records = Configuration::PROPERTIES.get_property :url_get_record_info
293
+
294
+ url_get_records = url_get_records.gsub '{csk}', URI::encode(@credential[:csk])
295
+ url_get_records = url_get_records.gsub '{aci}', URI::encode(@credential[:aci])
296
+ url_get_records = url_get_records.gsub '{mid}', mid.to_s
297
+ url_get_records = url_get_records.gsub '{rid}', rid.to_s
298
+
299
+ response = DynamicService::ServiceCaller.call_service url + url_get_records, {}, 'get'
300
+
301
+ json = JSON.parse(response)
302
+ record = json['record']
303
+
304
+ unless record
305
+ raise 'Record key doesn\'t present in response from Dynamicloud server.'
306
+ end
307
+
308
+ Dynamicloud::API::DynamicloudHelper.normalize_record record
309
+ end
310
+
311
+ # This method will call an update operation in Dynamicloud servers
312
+ # using model and data object
313
+ # @param mid model id
314
+ # @param data this hash should contain a key rid (RecordId) otherwise an error will be thrown
315
+ def update_record(mid, data)
316
+ rid = data['rid']
317
+
318
+ unless rid
319
+ raise "rid attribute isn't present in hash data."
320
+ end
321
+
322
+ url = Configuration::PROPERTIES.get_property :url
323
+ url_get_records = Configuration::PROPERTIES.get_property :url_update_record
324
+
325
+ url_get_records = url_get_records.gsub '{csk}', URI::encode(@credential[:csk])
326
+ url_get_records = url_get_records.gsub '{aci}', URI::encode(@credential[:aci])
327
+ url_get_records = url_get_records.gsub '{mid}', mid.to_s
328
+ url_get_records = url_get_records.gsub '{rid}', rid.to_s
329
+
330
+ params = {
331
+ :fields => Dynamicloud::API::DynamicloudHelper.build_fields_json(data)
332
+ }
333
+
334
+ response = DynamicService::ServiceCaller.call_service url + url_get_records, params, 'post'
335
+
336
+ json = JSON.parse(response)
337
+ unless json['status'] == 200
338
+ raise json['message']
339
+ end
340
+ end
341
+
342
+ # This method will call a save operation in DynamiCloud servers
343
+ # using model and BoundInstance object
344
+ # @param mid model id
345
+ # @param data all data needed to save a record in model (mid)
346
+ def save_record(mid, data)
347
+ url = Configuration::PROPERTIES.get_property :url
348
+ url_get_records = Configuration::PROPERTIES.get_property :url_save_record
349
+
350
+ url_get_records = url_get_records.gsub '{csk}', URI::encode(@credential[:csk])
351
+ url_get_records = url_get_records.gsub '{aci}', URI::encode(@credential[:aci])
352
+ url_get_records = url_get_records.gsub '{mid}', mid.to_s
353
+
354
+ params = {
355
+ :fields => Dynamicloud::API::DynamicloudHelper.build_fields_json(data)
356
+ }
357
+
358
+ response = DynamicService::ServiceCaller.call_service url + url_get_records, params, 'post'
359
+
360
+ json = JSON.parse(response)
361
+ unless json['status'] == 200
362
+ raise json['message']
363
+ end
364
+
365
+ data['rid'] = json['rid']
366
+
367
+ data
368
+ end
369
+
370
+ # This method will call a delete operation in DynamiCloud servers
371
+ # using model id and Record id
372
+ # @param mid model id
373
+ # @param rid record id
374
+ def delete_record(mid, rid)
375
+ url = Configuration::PROPERTIES.get_property :url
376
+ url_get_records = Configuration::PROPERTIES.get_property :url_delete_record
377
+
378
+ url_get_records = url_get_records.gsub '{csk}', URI::encode(@credential[:csk])
379
+ url_get_records = url_get_records.gsub '{aci}', URI::encode(@credential[:aci])
380
+ url_get_records = url_get_records.gsub '{mid}', mid.to_s
381
+ url_get_records = url_get_records.gsub '{rid}', rid.to_s
382
+
383
+ response = DynamicService::ServiceCaller.call_service url + url_get_records, {}, 'delete'
384
+
385
+ json = JSON.parse(response)
386
+ unless json['status'] == 200
387
+ raise json['message']
388
+ end
389
+ end
390
+
391
+ # Will create a RecordQuery and sets to this provider
392
+ # @param mid model id to use to execute operations
393
+ # @return this Dynamicloud::API::RecordQuery instance
394
+ def create_query(mid)
395
+ query = Dynamicloud::API::RecordQuery.new mid
396
+ query.set_credentials @credential
397
+
398
+ query
399
+ end
400
+
401
+ # Gets model record information from DynamiCloud servers.
402
+ # @param mid model id in DynamiClod servers
403
+ # @return RecordModel object
404
+ def load_model(mid)
405
+ url = Configuration::PROPERTIES.get_property :url
406
+ url_get_records = Configuration::PROPERTIES.get_property :url_get_model_info
407
+
408
+ url_get_records = url_get_records.gsub '{csk}', URI::encode(@credential[:csk])
409
+ url_get_records = url_get_records.gsub '{aci}', URI::encode(@credential[:aci])
410
+ url_get_records = url_get_records.gsub '{mid}', mid.to_s
411
+
412
+ response = DynamicService::ServiceCaller.call_service url + url_get_records, {}, 'get'
413
+
414
+ json = JSON.parse(response)
415
+ unless json['status'] == 200
416
+ raise json['message']
417
+ end
418
+
419
+ model = Dynamicloud::API::Model::RecordModel.new mid
420
+ model.name = json['name']
421
+ model.description = json['description']
422
+
423
+ model
424
+ end
425
+
426
+ # Loads all models related to CSK and ACI keys in Dynamicloud servers
427
+ # @return list of models
428
+ def load_models
429
+ url = Configuration::PROPERTIES.get_property :url
430
+ url_get_records = Configuration::PROPERTIES.get_property :url_get_models
431
+
432
+ url_get_records = url_get_records.gsub '{csk}', URI::encode(@credential[:csk])
433
+ url_get_records = url_get_records.gsub '{aci}', URI::encode(@credential[:aci])
434
+
435
+ response = DynamicService::ServiceCaller.call_service url + url_get_records, {}, 'get'
436
+
437
+ json = JSON.parse(response)
438
+ unless json['status'] == 200
439
+ raise json['message']
440
+ end
441
+
442
+ models = []
443
+ array = json['models']
444
+ array.each do |item|
445
+ model = Dynamicloud::API::Model::RecordModel.new item['id'].to_i
446
+ model.name = item['name']
447
+ model.description = item['description']
448
+
449
+ models.push model
450
+ end
451
+
452
+ models
453
+ end
454
+
455
+ # Loads all model's fields according ModelID
456
+ # @param mid model id
457
+ # @return list of model's fields.
458
+ def load_fields(mid)
459
+ url = Configuration::PROPERTIES.get_property :url
460
+ url_get_records = Configuration::PROPERTIES.get_property :url_get_fields
461
+
462
+ url_get_records = url_get_records.gsub '{csk}', URI::encode(@credential[:csk])
463
+ url_get_records = url_get_records.gsub '{aci}', URI::encode(@credential[:aci])
464
+ url_get_records = url_get_records.gsub '{mid}', mid.to_s
465
+
466
+ response = DynamicService::ServiceCaller.call_service url + url_get_records, {}, 'get'
467
+
468
+ json = JSON.parse(response)
469
+ unless json['status'] == 200
470
+ raise json['message']
471
+ end
472
+
473
+ fields = []
474
+ fs = json['fields']
475
+ fs.each do |key, jf|
476
+ field = Dynamicloud::API::Model::RecordField.new
477
+ field.id = jf['id'].to_i
478
+ field.identifier = jf['identifier']
479
+ field.label = jf['label']
480
+ field.comment = jf['comment']
481
+ field.uniqueness = jf['uniqueness']
482
+ field.required = jf['required']
483
+ field.type = Dynamicloud::API::Model::RecordFieldType.get_field_type jf['field_type'].to_i
484
+ field.items = Dynamicloud::API::DynamicloudHelper.build_items jf['items']
485
+ field.mid = mid.to_i
486
+
487
+ fields.push field
488
+ end
489
+
490
+ fields
491
+ end
492
+
493
+ # Uploads a file in record <b>rid</b>
494
+ # @param mid owner model id of this record <b>rid<b/>
495
+ # @param rid record id
496
+ # @param field_name fieldName target
497
+ # @param file file to upload
498
+ # @param content_type contentType of this file
499
+ # @param preferred_name preferred name to later downloads
500
+ def upload_file(mid, rid, field_name, file, content_type, preferred_name)
501
+ url = Configuration::PROPERTIES.get_property :url
502
+ url_get_records = Configuration::PROPERTIES.get_property :url_upload_file
503
+
504
+ url_get_records = url_get_records.gsub '{csk}', URI::encode(@credential[:csk])
505
+ url_get_records = url_get_records.gsub '{aci}', URI::encode(@credential[:aci])
506
+ url_get_records = url_get_records.gsub '{mid}', mid.to_s
507
+ url_get_records = url_get_records.gsub '{rid}', rid.to_s
508
+
509
+ params = {
510
+ :pickedFileName => File.basename(file.path),
511
+ :file_type => content_type,
512
+ :file_name => preferred_name,
513
+ :identifier => field_name,
514
+ 'files[]' => file
515
+ }
516
+
517
+ response = DynamicService::ServiceCaller.call_service url + url_get_records, params, 'post'
518
+
519
+ json = JSON.parse(response)
520
+ unless json['status'] == 200
521
+ raise json['message']
522
+ end
523
+ end
524
+
525
+ # This method will make a request to generate a link to download the file related to this recordId and fieldName
526
+ # @param mid model id
527
+ # @param rid record id
528
+ # @param field_name field name
529
+ # @return link to share file
530
+ def share_file(mid, rid, field_name)
531
+ url = Configuration::PROPERTIES.get_property :url
532
+ url_get_records = Configuration::PROPERTIES.get_property :url_share_file
533
+
534
+ url_get_records = url_get_records.gsub '{csk}', URI::encode(@credential[:csk])
535
+ url_get_records = url_get_records.gsub '{aci}', URI::encode(@credential[:aci])
536
+ url_get_records = url_get_records.gsub '{mid}', mid.to_s
537
+ url_get_records = url_get_records.gsub '{rid}', rid.to_s
538
+ url_get_records = url_get_records.gsub '{identifier}', field_name
539
+
540
+ response = DynamicService::ServiceCaller.call_service url + url_get_records, {}, 'get'
541
+
542
+ json = JSON.parse(response)
543
+ unless json['status'] == 200
544
+ raise json['message']
545
+ end
546
+
547
+ json['link']
548
+ end
549
+
550
+ # Downloads a file according <b>rid</b> and <b>fieldName</b>
551
+ # @param mid owner model id of this record <b>rid<b/>
552
+ # @param rid record id
553
+ # @param field_name fieldName target
554
+ # @param file_destiny destiny file. If this file doesn't exist then will be created
555
+ def download_file(mid, rid, field_name, file_destiny)
556
+ url = Configuration::PROPERTIES.get_property :url
557
+ url_get_records = Configuration::PROPERTIES.get_property :url_download_file
558
+
559
+ url_get_records = url_get_records.gsub '{csk}', URI::encode(@credential[:csk])
560
+ url_get_records = url_get_records.gsub '{aci}', URI::encode(@credential[:aci])
561
+ url_get_records = url_get_records.gsub '{mid}', mid.to_s
562
+ url_get_records = url_get_records.gsub '{rid}', rid.to_s
563
+ url_get_records = url_get_records.gsub '{identifier}', field_name
564
+
565
+ DynamicService::ServiceCaller.call_service url + url_get_records, {}, {}, {}, file_destiny
566
+ end
567
+
568
+ # Executes an update using query as a selection and data with values
569
+ # Dynamicloud will normalize the key pair values. That is, will be used field identifiers only.
570
+ # @param data data that will be sent to Dynamicloud servers
571
+ # @param query selection
572
+ def update(query, data = {})
573
+ selection = Dynamicloud::API::DynamicloudHelper.build_string(query.get_conditions, nil, nil, nil)
574
+ fields = '{"updates": ' + Dynamicloud::API::DynamicloudHelper.build_fields_json(data) + '}'
575
+
576
+ url = Configuration::PROPERTIES.get_property :url
577
+ url_get_records = Configuration::PROPERTIES.get_property :url_update_selection
578
+
579
+ url_get_records = url_get_records.gsub '{csk}', URI::encode(@credential[:csk])
580
+ url_get_records = url_get_records.gsub '{aci}', URI::encode(@credential[:aci])
581
+ url_get_records = url_get_records.gsub '{mid}', query.get_model_id.to_s
582
+
583
+ params = {
584
+ :fields => fields,
585
+ :selection => selection
586
+ }
587
+
588
+ response = DynamicService::ServiceCaller.call_service url + url_get_records, params, 'post'
589
+
590
+ json = JSON.parse(response)
591
+ unless json['status'] == 200
592
+ raise json['message']
593
+ end
594
+ end
595
+
596
+ # Executes a delete using query as a selection
597
+ # @param query selection
598
+ # @param mid model id
599
+ def delete(query, mid)
600
+ selection = Dynamicloud::API::DynamicloudHelper.build_string(query.get_conditions, nil, nil, nil)
601
+
602
+ url = Configuration::PROPERTIES.get_property :url
603
+ url_get_records = Configuration::PROPERTIES.get_property :url_delete_selection
604
+
605
+ url_get_records = url_get_records.gsub '{csk}', URI::encode(@credential[:csk])
606
+ url_get_records = url_get_records.gsub '{aci}', URI::encode(@credential[:aci])
607
+ url_get_records = url_get_records.gsub '{mid}', mid.to_s
608
+
609
+ params = {
610
+ :selection => selection
611
+ }
612
+
613
+ response = DynamicService::ServiceCaller.call_service url + url_get_records, params, 'post'
614
+
615
+ json = JSON.parse(response)
616
+ unless json['status'] == 200
617
+ raise json['message']
618
+ end
619
+ end
620
+ end
621
+
622
+ # This is a class with utility methods
623
+ # @author Eleazar Gomez
624
+ # @version 1.0.0
625
+ # @since 8/26/15
626
+ class DynamicloudHelper
627
+ #This method will normalize the response from Dynamicloud servers
628
+ def self.normalize_record(record)
629
+ normalized = {}
630
+ record.each do |key, value|
631
+ if value.is_a?(Hash)
632
+ #This hash has only one key
633
+ value.each do |ik, iv|
634
+ if iv.respond_to?(:each)
635
+ array = []
636
+ iv.each do |item|
637
+ array.push item.to_s
638
+ end
639
+
640
+ normalized[key] = array
641
+ elsif iv.is_a?(String)
642
+ normalized[key] = iv.to_s
643
+ end
644
+
645
+ #This hash has only one key
646
+ break
647
+ end
648
+ else
649
+ normalized[key] = value
650
+ end
651
+ end
652
+
653
+ normalized
654
+ end
655
+
656
+ # Builds a compatible string to update a record.
657
+ # This method will get field name and its value form data hash.
658
+ # @param instance Object where data is extracted
659
+ # @return compatible string
660
+ def self.build_fields_json(data)
661
+ result = data.clone
662
+ data.each do |key, value|
663
+ if value.respond_to?(:each)
664
+ array = ''
665
+ value.each do |item|
666
+ if item
667
+ array = array + (array == '' ? '' : ',') + item.to_s
668
+ end
669
+ end
670
+ result[key] = array
671
+ end
672
+ end
673
+
674
+ result.to_json
675
+ end
676
+
677
+ # Builds an array of RecordFieldItems according JSONArray
678
+ # @param array JSONArray with pair value, text.
679
+ def self.build_items(array)
680
+ items = []
681
+ if array.length > 0
682
+ array.each do |item|
683
+ ri = Dynamicloud::API::Model::RecordFieldItem.new
684
+ ri.text = item['text']
685
+ ri.value = item['value']
686
+
687
+ items.push ri
688
+ end
689
+ end
690
+
691
+ items
692
+ end
693
+
694
+ # Builds a compatible String to use in service executions
695
+ # @return compatible String
696
+ def self.build_string(conditions, group_by, order_by, projection)
697
+ built = '{' + (projection ? projection : '') + '"where": {'
698
+
699
+ if conditions.length > 0
700
+ global = conditions[0]
701
+ if conditions.length > 1
702
+ conditions = conditions[1..conditions.length]
703
+ conditions.each do |condition|
704
+ global = Dynamicloud::API::Criteria::ANDCondition.new global, condition
705
+ end
706
+ end
707
+
708
+ built = built + global.to_record_string(Dynamicloud::API::Criteria::Condition::ROOT)
709
+ end
710
+
711
+ built = built + '}'
712
+
713
+ if group_by
714
+ built = built + ',' + group_by.to_record_string(Dynamicloud::API::Criteria::Condition::ROOT)
715
+ end
716
+
717
+ if order_by
718
+ built = built + ',' + order_by.to_record_string(Dynamicloud::API::Criteria::Condition::ROOT)
719
+ end
720
+
721
+ built + '}'
722
+ end
723
+
724
+ # Build a compatible string using projection
725
+ # @return string using projection
726
+ def self.build_projection(projection)
727
+ unless (projection) && (projection.length > 0)
728
+ return ''
729
+ end
730
+
731
+ columns = '"columns": ['
732
+ cols = ''
733
+ projection.each do |field|
734
+ cols = cols + (cols == '' ? '' : ',') + '"' + field + '"'
735
+ end
736
+
737
+ columns + cols + '], '
738
+ end
739
+
740
+ # This utility will build a RecordResults object
741
+ # @param response ServiceResponse from Dynamicloud servers
742
+ def self.build_record_results(response)
743
+ results = Dynamicloud::API::RecordResults.new
744
+
745
+ json = JSON.parse(response)
746
+
747
+ data = json['records']
748
+
749
+ results.total_records = data['total']
750
+ results.fast_returned_size = data['size']
751
+ results.records = get_record_list(data)
752
+
753
+ results
754
+ end
755
+
756
+ # This method will extract data and Bind each field with attributes in mapper:getInstance method instance
757
+ # @param data json with all data from Dynamicloud servers
758
+ # @return list of records
759
+ def self.get_record_list(data)
760
+ record_list = []
761
+
762
+ records = data['records']
763
+
764
+ records.each do |jr|
765
+ record_list.push(build_record(jr))
766
+ end
767
+
768
+ record_list
769
+ end
770
+
771
+ # Builds the record hash with data from jr JSON object
772
+ def self.build_record(jr)
773
+ record = {}
774
+
775
+ jr.each do |key, value|
776
+ if value.is_a?(Hash)
777
+ value.each do |k, v|
778
+ if v.respond_to?(:each)
779
+ values = []
780
+ v.each do |item|
781
+ values.push(item.to_s)
782
+ end
783
+
784
+ record[key] = values
785
+ else
786
+ record[key] = value
787
+ end
788
+
789
+ break
790
+ end
791
+ else
792
+ record[key] = value
793
+ end
794
+ end
795
+
796
+ record
797
+ end
798
+ end
799
+ end
800
+ end