maestrano-connector-rails 1.3.5 → 1.4.0
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/Gemfile +1 -1
- data/Rakefile +2 -2
- data/VERSION +1 -1
- data/app/models/maestrano/connector/rails/concerns/entity.rb +94 -19
- data/app/models/maestrano/connector/rails/concerns/sub_entity_base.rb +12 -14
- data/lib/generators/connector/templates/example_entity.rb +15 -0
- data/maestrano-connector-rails.gemspec +8 -8
- data/release_notes.md +9 -0
- data/spec/integration/complex_spec.rb +298 -4
- data/spec/integration/connec_to_external_spec.rb +117 -10
- data/spec/models/complex_entity_spec.rb +14 -10
- data/spec/models/entity_spec.rb +87 -72
- data/spec/models/sub_entity_base_spec.rb +33 -21
- metadata +7 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e56b9e6724bd01d1877cdccbafc5e741c70161bf
|
4
|
+
data.tar.gz: c0dd848069ca945053bdfb31b84df0cb4d2a5414
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e6a23959d393239d71a5759f4ee589c916ca8b0f55ec410d50161952b29f516006e342285cd94ae0d32f83c7dc3da8fa59b1cea4f86dd0d4633ac344eca70d05
|
7
|
+
data.tar.gz: 0502316314c93a0d78993339d0caed4f0a3086bd8c20a6acacd53464a18674ce680cd228790aed70e0ebef7adb9be36e9043735a5f775f021fb9d034e77e75d6
|
data/Gemfile
CHANGED
data/Rakefile
CHANGED
@@ -19,8 +19,8 @@ Jeweler::Tasks.new do |gem|
|
|
19
19
|
gem.license = 'MIT'
|
20
20
|
gem.summary = 'Rails framework to build connector with Maestrano'
|
21
21
|
gem.description = 'Maestrano is the next generation marketplace for SME applications. See https://maestrano.com for details.'
|
22
|
-
gem.email = '
|
23
|
-
gem.authors = ['Pierre Berard']
|
22
|
+
gem.email = 'developers@maestrano.com'
|
23
|
+
gem.authors = ['Maestrano', 'Pierre Berard', 'Marco Bagnasco']
|
24
24
|
# dependencies defined in Gemfile
|
25
25
|
end
|
26
26
|
Jeweler::RubygemsDotOrgTasks.new
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.
|
1
|
+
1.4.0
|
@@ -5,6 +5,7 @@ module Maestrano::Connector::Rails::Concerns::Entity
|
|
5
5
|
# ----------------------------------------------
|
6
6
|
# IdMap methods
|
7
7
|
# ----------------------------------------------
|
8
|
+
# Default names hash used for id maps creation and look up
|
8
9
|
def names_hash
|
9
10
|
{
|
10
11
|
connec_entity: connec_entity_name.downcase,
|
@@ -94,12 +95,18 @@ module Maestrano::Connector::Rails::Concerns::Entity
|
|
94
95
|
raise 'Not implemented'
|
95
96
|
end
|
96
97
|
|
98
|
+
# Optional creation only mapper, defaults to main mapper
|
99
|
+
def creation_mapper_class
|
100
|
+
mapper_class
|
101
|
+
end
|
102
|
+
|
97
103
|
# An array of connec fields that are references
|
104
|
+
# Can also be an hash with keys record_references and id_references
|
98
105
|
def references
|
99
106
|
[]
|
100
107
|
end
|
101
108
|
|
102
|
-
# An array of fields for smart merging. See
|
109
|
+
# An array of fields for smart merging. See Connec! documentation
|
103
110
|
def connec_matching_fields
|
104
111
|
nil
|
105
112
|
end
|
@@ -131,14 +138,18 @@ module Maestrano::Connector::Rails::Concerns::Entity
|
|
131
138
|
# ----------------------------------------------
|
132
139
|
# Helper methods
|
133
140
|
# ----------------------------------------------
|
141
|
+
# Returns the count and first element of the array
|
142
|
+
# Used for batch calling during the first synchronization
|
134
143
|
def count_and_first(entities)
|
135
144
|
{count: entities.size, first: entities.first}
|
136
145
|
end
|
137
146
|
|
147
|
+
# For display purposes only
|
138
148
|
def public_connec_entity_name
|
139
149
|
singleton? ? connec_entity_name : connec_entity_name.pluralize
|
140
150
|
end
|
141
151
|
|
152
|
+
# For display purposes only
|
142
153
|
def public_external_entity_name
|
143
154
|
external_entity_name.pluralize
|
144
155
|
end
|
@@ -154,14 +165,26 @@ module Maestrano::Connector::Rails::Concerns::Entity
|
|
154
165
|
# Mapper methods
|
155
166
|
# ----------------------------------------------
|
156
167
|
# Map a Connec! entity to the external model
|
157
|
-
def map_to_external(entity)
|
158
|
-
self.class.
|
168
|
+
def map_to_external(entity, first_time_mapped = nil)
|
169
|
+
mapper = first_time_mapped ? self.class.creation_mapper_class : self.class.mapper_class
|
170
|
+
map_to_external_helper(entity, mapper)
|
171
|
+
end
|
172
|
+
|
173
|
+
def map_to_external_helper(entity, mapper)
|
174
|
+
# instance_values returns a hash with all the instance variables (http://apidock.com/rails/v4.0.2/Object/instance_values)
|
175
|
+
# that includes opts, organization, connec_client, external_client, and all the connector and entity specific variables
|
176
|
+
mapper.normalize(entity, instance_values.with_indifferent_access).with_indifferent_access
|
159
177
|
end
|
160
178
|
|
161
179
|
# Map an external entity to Connec! model
|
162
|
-
def map_to_connec(entity)
|
163
|
-
|
164
|
-
|
180
|
+
def map_to_connec(entity, first_time_mapped = nil)
|
181
|
+
mapper = first_time_mapped ? self.class.creation_mapper_class : self.class.mapper_class
|
182
|
+
map_to_connec_helper(entity, mapper, self.class.references)
|
183
|
+
end
|
184
|
+
|
185
|
+
def map_to_connec_helper(entity, mapper, references)
|
186
|
+
mapped_entity = mapper.denormalize(entity, instance_values.with_indifferent_access).merge(id: self.class.id_from_external_entity_hash(entity))
|
187
|
+
folded_entity = Maestrano::Connector::Rails::ConnecHelper.fold_references(mapped_entity, references, @organization)
|
165
188
|
folded_entity[:opts] = (mapped_entity[:opts] || {}).merge(matching_fields: self.class.connec_matching_fields) if self.class.connec_matching_fields
|
166
189
|
folded_entity
|
167
190
|
end
|
@@ -173,6 +196,9 @@ module Maestrano::Connector::Rails::Concerns::Entity
|
|
173
196
|
# * full_sync
|
174
197
|
# * $filter (see Connec! documentation)
|
175
198
|
# * $orderby (see Connec! documentation)
|
199
|
+
# * __skip_connec for half syncs
|
200
|
+
# * __limit and __skip for batch calls
|
201
|
+
# Returns an array of connec entities
|
176
202
|
def get_connec_entities(last_synchronization_date = nil)
|
177
203
|
return [] if @opts[:__skip_connec] || !self.class.can_read_connec?
|
178
204
|
|
@@ -220,15 +246,22 @@ module Maestrano::Connector::Rails::Concerns::Entity
|
|
220
246
|
entities
|
221
247
|
end
|
222
248
|
|
249
|
+
# Wrapper
|
250
|
+
# TODO, useless?
|
251
|
+
# Can be replace by def push_entities_to_connec_to(mapped_external_entities_with_idmaps, connec_entity_name = self.class.connec_entity_name) ?
|
223
252
|
def push_entities_to_connec(mapped_external_entities_with_idmaps)
|
224
253
|
push_entities_to_connec_to(mapped_external_entities_with_idmaps, self.class.connec_entity_name)
|
225
254
|
end
|
226
255
|
|
256
|
+
# Pushes the external entities to Connec!, and updates the idmaps with either
|
257
|
+
# * connec_id and push timestamp
|
258
|
+
# * error message
|
227
259
|
def push_entities_to_connec_to(mapped_external_entities_with_idmaps, connec_entity_name)
|
228
260
|
return unless self.class.can_write_connec?
|
229
261
|
|
230
262
|
Maestrano::Connector::Rails::ConnectorLogger.log('info', @organization, "Sending #{Maestrano::Connector::Rails::External.external_name} #{self.class.external_entity_name.pluralize} to Connec! #{connec_entity_name.pluralize}")
|
231
263
|
|
264
|
+
# As we're doing only POST, we use the idmaps to filter out updates
|
232
265
|
unless self.class.can_update_connec?
|
233
266
|
mapped_external_entities_with_idmaps.select! { |mapped_external_entity_with_idmap| !mapped_external_entity_with_idmap[:idmap].connec_id }
|
234
267
|
end
|
@@ -237,6 +270,8 @@ module Maestrano::Connector::Rails::Concerns::Entity
|
|
237
270
|
batch_calls(mapped_external_entities_with_idmaps, proc, connec_entity_name)
|
238
271
|
end
|
239
272
|
|
273
|
+
# Helper method to build an op for batch call
|
274
|
+
# See http://maestrano.github.io/connec/#api-|-batch-calls
|
240
275
|
def batch_op(method, mapped_external_entity, id, connec_entity_name)
|
241
276
|
Maestrano::Connector::Rails::ConnectorLogger.log('info', @organization, "Sending #{method.upcase} #{connec_entity_name}: #{mapped_external_entity} to Connec! (Preparing batch request)")
|
242
277
|
{
|
@@ -251,32 +286,42 @@ module Maestrano::Connector::Rails::Concerns::Entity
|
|
251
286
|
# ----------------------------------------------
|
252
287
|
# External methods
|
253
288
|
# ----------------------------------------------
|
289
|
+
# Wrapper to process options and limitations
|
254
290
|
def get_external_entities_wrapper(last_synchronization_date = nil, entity_name = self.class.external_entity_name)
|
255
291
|
return [] if @opts[:__skip_external] || !self.class.can_read_external?
|
256
292
|
get_external_entities(entity_name, last_synchronization_date)
|
257
293
|
end
|
258
294
|
|
295
|
+
# To be implemented in each connector
|
259
296
|
def get_external_entities(external_entity_name, last_synchronization_date = nil)
|
260
297
|
Maestrano::Connector::Rails::ConnectorLogger.log('info', @organization, "Fetching #{Maestrano::Connector::Rails::External.external_name} #{external_entity_name.pluralize}")
|
261
298
|
raise 'Not implemented'
|
262
299
|
end
|
263
300
|
|
301
|
+
# Wrapper
|
302
|
+
# TODO, useless?
|
303
|
+
# Can be replace by def push_entities_to_external_to(mapped_connec_entities_with_idmaps, external_entity_name = self.class.external_entity_name) ?
|
264
304
|
def push_entities_to_external(mapped_connec_entities_with_idmaps)
|
265
305
|
push_entities_to_external_to(mapped_connec_entities_with_idmaps, self.class.external_entity_name)
|
266
306
|
end
|
267
307
|
|
308
|
+
# Pushes connec entities to the external application
|
309
|
+
# Sends new external ids to Connec! (either only the id, or the id + the id references)
|
268
310
|
def push_entities_to_external_to(mapped_connec_entities_with_idmaps, external_entity_name)
|
269
311
|
return unless self.class.can_write_external?
|
270
312
|
|
271
313
|
Maestrano::Connector::Rails::ConnectorLogger.log('info', @organization, "Sending Connec! #{self.class.connec_entity_name.pluralize} to #{Maestrano::Connector::Rails::External.external_name} #{external_entity_name.pluralize}")
|
314
|
+
|
272
315
|
entities_to_send_to_connec = mapped_connec_entities_with_idmaps.map{ |mapped_connec_entity_with_idmap|
|
273
316
|
push_entity_to_external(mapped_connec_entity_with_idmap, external_entity_name)
|
274
317
|
}.compact
|
275
318
|
|
276
|
-
return if entities_to_send_to_connec.empty?
|
277
|
-
|
278
319
|
# Send the external ids to connec if it was a creation
|
279
320
|
# or if there are some sub entities ids to send (completed_hash)
|
321
|
+
return if entities_to_send_to_connec.empty?
|
322
|
+
|
323
|
+
# Build a batch op from an idmap and a competed hash
|
324
|
+
# with either only the id, or the id + id references
|
280
325
|
proc = lambda do |entity|
|
281
326
|
id = {id: [Maestrano::Connector::Rails::ConnecHelper.id_hash(entity[:idmap].external_id, @organization)]}
|
282
327
|
body = entity[:completed_hash] ? entity[:completed_hash].merge(id) : id
|
@@ -285,6 +330,12 @@ module Maestrano::Connector::Rails::Concerns::Entity
|
|
285
330
|
batch_calls(entities_to_send_to_connec, proc, self.class.connec_entity_name, true)
|
286
331
|
end
|
287
332
|
|
333
|
+
# Creates or updates connec entity to external
|
334
|
+
# Returns nil if there is nothing to send back to Connec!
|
335
|
+
# Returns an hash if
|
336
|
+
# - it's a creation: need to send id to Connec! (and potentially id references)
|
337
|
+
# - it's an update but it's the first push of a singleton
|
338
|
+
# - it's an update and there's id references to send to Connec!
|
288
339
|
def push_entity_to_external(mapped_connec_entity_with_idmap, external_entity_name)
|
289
340
|
idmap = mapped_connec_entity_with_idmap[:idmap]
|
290
341
|
mapped_connec_entity = mapped_connec_entity_with_idmap[:entity]
|
@@ -324,36 +375,45 @@ module Maestrano::Connector::Rails::Concerns::Entity
|
|
324
375
|
idmap.update(message: e.message.truncate(255))
|
325
376
|
end
|
326
377
|
end
|
378
|
+
|
379
|
+
# Nothing to send to Connec!
|
327
380
|
nil
|
328
381
|
end
|
329
382
|
|
383
|
+
# To be implemented in each connector
|
330
384
|
def create_external_entity(mapped_connec_entity, external_entity_name)
|
331
385
|
Maestrano::Connector::Rails::ConnectorLogger.log('info', @organization, "Sending create #{external_entity_name}: #{mapped_connec_entity} to #{Maestrano::Connector::Rails::External.external_name}")
|
332
386
|
raise 'Not implemented'
|
333
387
|
end
|
334
388
|
|
389
|
+
# To be implemented in each connector
|
335
390
|
def update_external_entity(mapped_connec_entity, external_id, external_entity_name)
|
336
391
|
Maestrano::Connector::Rails::ConnectorLogger.log('info', @organization, "Sending update #{external_entity_name} (id=#{external_id}): #{mapped_connec_entity} to #{Maestrano::Connector::Rails::External.external_name}")
|
337
392
|
raise 'Not implemented'
|
338
393
|
end
|
339
394
|
|
340
|
-
#
|
395
|
+
# Returns a completed hash containing id_references with both the connec and external ids
|
341
396
|
def map_and_complete_hash_with_connec_ids(external_hash, external_entity_name, connec_hash)
|
342
397
|
return nil if connec_hash.empty?
|
343
398
|
|
344
399
|
mapped_external_hash = map_to_connec(external_hash)
|
345
|
-
|
400
|
+
references = Maestrano::Connector::Rails::ConnecHelper.format_references(self.class.references)
|
346
401
|
|
347
|
-
Maestrano::Connector::Rails::ConnecHelper.merge_id_hashes(connec_hash, mapped_external_hash,
|
402
|
+
Maestrano::Connector::Rails::ConnecHelper.merge_id_hashes(connec_hash, mapped_external_hash, references[:id_references])
|
348
403
|
end
|
349
404
|
|
350
405
|
# ----------------------------------------------
|
351
406
|
# General methods
|
352
407
|
# ----------------------------------------------
|
353
|
-
#
|
354
|
-
# * Discards entities
|
355
|
-
#
|
356
|
-
#
|
408
|
+
# Returns a hash containing the mapped and filtered connec and external entities
|
409
|
+
# * Discards entities that do not need to be pushed because
|
410
|
+
# * they date from before the date filtering limit (historical data)
|
411
|
+
# * they are lacking at least one reference (connec entities only)
|
412
|
+
# * they are inactive in the external application
|
413
|
+
# * they are flagged to not be shared (to_connec, to_external)
|
414
|
+
# * they have not been updated since their last push
|
415
|
+
# * Discards entities from one of the two sources in case of conflict
|
416
|
+
# * Maps not discarded entities and associates them with their idmap, or create one if there is none
|
357
417
|
def consolidate_and_map_data(connec_entities, external_entities)
|
358
418
|
Maestrano::Connector::Rails::ConnectorLogger.log('info', @organization, "Consolidating and mapping #{self.class.external_entity_name}/#{self.class.connec_entity_name}")
|
359
419
|
return consolidate_and_map_singleton(connec_entities, external_entities) if self.class.singleton?
|
@@ -369,28 +429,33 @@ module Maestrano::Connector::Rails::Concerns::Entity
|
|
369
429
|
# Entity has been created before date filtering limit
|
370
430
|
next nil if before_date_filtering_limit?(entity, false) && !@opts[:full_sync]
|
371
431
|
|
432
|
+
# Unfold the id arrays
|
433
|
+
# From that point on, the connec_entity contains only string of external ids
|
372
434
|
unfold_hash = Maestrano::Connector::Rails::ConnecHelper.unfold_references(entity, references, @organization)
|
373
435
|
entity = unfold_hash[:entity]
|
374
|
-
next nil unless entity
|
436
|
+
next nil unless entity # discard if at least one record reference is missing
|
375
437
|
connec_id = unfold_hash[:connec_id]
|
376
438
|
id_refs_only_connec_entity = unfold_hash[:id_refs_only_connec_entity]
|
377
439
|
|
378
440
|
if entity['id'].blank?
|
441
|
+
# Expecting find_or_create to be mostly a create
|
379
442
|
idmap = self.class.find_or_create_idmap(organization_id: @organization.id, name: self.class.object_name_from_connec_entity_hash(entity), external_entity: external_entity_name.downcase, connec_id: connec_id)
|
380
443
|
next map_connec_entity_with_idmap(entity, external_entity_name, idmap, id_refs_only_connec_entity)
|
381
444
|
end
|
382
445
|
|
446
|
+
# Expecting find_or_create to be mostly a find
|
383
447
|
idmap = self.class.find_or_create_idmap(external_id: entity['id'], organization_id: @organization.id, external_entity: external_entity_name.downcase, connec_id: connec_id)
|
384
448
|
idmap.update(name: self.class.object_name_from_connec_entity_hash(entity))
|
385
449
|
|
386
450
|
next nil if idmap.external_inactive || !idmap.to_external || (!@opts[:full_sync] && not_modified_since_last_push_to_external?(idmap, entity))
|
451
|
+
|
387
452
|
# Check for conflict with entities from external
|
388
453
|
solve_conflict(entity, external_entities, external_entity_name, idmap, id_refs_only_connec_entity)
|
389
454
|
}.compact
|
390
455
|
end
|
391
456
|
|
392
457
|
def consolidate_and_map_external_entities(external_entities, connec_entity_name)
|
393
|
-
external_entities.map{|entity|
|
458
|
+
external_entities.map { |entity|
|
394
459
|
# Entity has been created before date filtering limit
|
395
460
|
next nil if before_date_filtering_limit?(entity) && !@opts[:full_sync]
|
396
461
|
|
@@ -447,6 +512,7 @@ module Maestrano::Connector::Rails::Concerns::Entity
|
|
447
512
|
|
448
513
|
# array_with_idmap must be an array of hashes with a key idmap
|
449
514
|
# proc is a lambda to create a batch_op from an element of the array
|
515
|
+
# Perform batch calls on Connec API and parse the response
|
450
516
|
def batch_calls(array_with_idmap, proc, connec_entity_name, id_update_only = false)
|
451
517
|
request_per_call = @opts[:request_per_batch_call] || 100
|
452
518
|
start = 0
|
@@ -468,6 +534,7 @@ module Maestrano::Connector::Rails::Concerns::Entity
|
|
468
534
|
response = JSON.parse(response.body)
|
469
535
|
|
470
536
|
# Parse batch response
|
537
|
+
# Update idmaps with either connec_id and timestamps, or a error message
|
471
538
|
response['results'].each_with_index do |result, index|
|
472
539
|
if result['status'] == 200
|
473
540
|
batch_entities[index][:idmap].update(connec_id: result['body'][self.class.normalize_connec_entity_name(connec_entity_name)]['id'].find { |id| id['provider'] == 'connec' }['id'], last_push_to_connec: Time.now, message: nil) unless id_update_only # id_update_only only apply for 200 as it's doing PUTs
|
@@ -475,9 +542,11 @@ module Maestrano::Connector::Rails::Concerns::Entity
|
|
475
542
|
batch_entities[index][:idmap].update(connec_id: result['body'][self.class.normalize_connec_entity_name(connec_entity_name)]['id'].find { |id| id['provider'] == 'connec' }['id'], last_push_to_connec: Time.now, message: nil)
|
476
543
|
else
|
477
544
|
Maestrano::Connector::Rails::ConnectorLogger.log('error', @organization, "Error while pushing to Connec!: #{result['body']}")
|
545
|
+
# TODO, better error message
|
478
546
|
batch_entities[index][:idmap].update(message: result['body'].to_s.truncate(255))
|
479
547
|
end
|
480
548
|
end
|
549
|
+
|
481
550
|
start += request_per_call
|
482
551
|
end
|
483
552
|
end
|
@@ -502,7 +571,13 @@ module Maestrano::Connector::Rails::Concerns::Entity
|
|
502
571
|
connec_entity['updated_at'] > self.class.last_update_date_from_external_entity_hash(external_entity)
|
503
572
|
end
|
504
573
|
|
574
|
+
# This methods try to find a external entity among all the external entities matching the connec one (same id)
|
575
|
+
# If it does not find any, there is no conflict, and it returns the mapped connec entity
|
576
|
+
# If it finds one, the conflict is solved either with options or using the entities timestamps
|
577
|
+
# If the connec entity is kept, it is returned mapped and the matching external entity is discarded (deleted from the array)
|
578
|
+
# Else the method returns nil, meaning the connec entity is discarded
|
505
579
|
def solve_conflict(connec_entity, external_entities, external_entity_name, idmap, id_refs_only_connec_entity)
|
580
|
+
# Here the connec_entity['id'] is an external id (String) because the entity has been unfolded.
|
506
581
|
external_entity = external_entities.find { |entity| connec_entity['id'] == self.class.id_from_external_entity_hash(entity) }
|
507
582
|
# No conflict
|
508
583
|
return map_connec_entity_with_idmap(connec_entity, external_entity_name, idmap, id_refs_only_connec_entity) unless external_entity
|
@@ -522,11 +597,11 @@ module Maestrano::Connector::Rails::Concerns::Entity
|
|
522
597
|
end
|
523
598
|
|
524
599
|
def map_connec_entity_with_idmap(connec_entity, external_entity_name, idmap, id_refs_only_connec_entity)
|
525
|
-
{entity: map_to_external(connec_entity), idmap: idmap, id_refs_only_connec_entity: id_refs_only_connec_entity}
|
600
|
+
{entity: map_to_external(connec_entity, idmap.last_push_to_external.nil?), idmap: idmap, id_refs_only_connec_entity: id_refs_only_connec_entity}
|
526
601
|
end
|
527
602
|
|
528
603
|
def map_external_entity_with_idmap(external_entity, connec_entity_name, idmap)
|
529
|
-
{entity: map_to_connec(external_entity), idmap: idmap}
|
604
|
+
{entity: map_to_connec(external_entity, idmap.last_push_to_connec.nil?), idmap: idmap}
|
530
605
|
end
|
531
606
|
|
532
607
|
def fetch_connec(uri, page_number)
|
@@ -34,6 +34,12 @@ module Maestrano::Connector::Rails::Concerns::SubEntityBase
|
|
34
34
|
{}
|
35
35
|
end
|
36
36
|
|
37
|
+
# { 'External Entity' => CreationLalaMapper, 'Other external entity' => CreationLiliMapper }
|
38
|
+
# or { 'Connec Entity' => CreationLalaMapper, 'Other connec entity' => CreationLiliMapper }
|
39
|
+
def creation_mapper_classes
|
40
|
+
mapper_classes
|
41
|
+
end
|
42
|
+
|
37
43
|
# {
|
38
44
|
# 'External Entity' => ['organization_id'],
|
39
45
|
# 'Other external entity' => ['an array of the connec reference fields']
|
@@ -43,31 +49,23 @@ module Maestrano::Connector::Rails::Concerns::SubEntityBase
|
|
43
49
|
end
|
44
50
|
end
|
45
51
|
|
46
|
-
def map_to(name, entity)
|
47
|
-
mapper = self.class.mapper_classes[name]
|
52
|
+
def map_to(name, entity, first_time_mapped = nil)
|
53
|
+
mapper = first_time_mapped ? self.class.creation_mapper_classes[name] : self.class.mapper_classes[name]
|
48
54
|
raise "Impossible mapping from #{self.class.entity_name} to #{name}" unless mapper
|
49
55
|
|
50
56
|
if self.class.external?
|
51
|
-
|
52
|
-
folded_entity = Maestrano::Connector::Rails::ConnecHelper.fold_references(mapped_entity, self.class.references[name] || [], @organization)
|
53
|
-
|
54
|
-
if self.class.connec_matching_fields
|
55
|
-
folded_entity[:opts] ||= {}
|
56
|
-
folded_entity[:opts][:matching_fields] = self.class.connec_matching_fields
|
57
|
-
end
|
58
|
-
|
59
|
-
folded_entity
|
57
|
+
map_to_connec_helper(entity, mapper, self.class.references[name] || [])
|
60
58
|
else
|
61
|
-
|
59
|
+
map_to_external_helper(entity, mapper)
|
62
60
|
end
|
63
61
|
end
|
64
62
|
|
65
63
|
def map_connec_entity_with_idmap(connec_entity, external_entity_name, idmap, id_refs_only_connec_entity)
|
66
|
-
{entity: map_to(external_entity_name, connec_entity), idmap: idmap, id_refs_only_connec_entity: id_refs_only_connec_entity}
|
64
|
+
{entity: map_to(external_entity_name, connec_entity, idmap.last_push_to_external.nil?), idmap: idmap, id_refs_only_connec_entity: id_refs_only_connec_entity}
|
67
65
|
end
|
68
66
|
|
69
67
|
def map_external_entity_with_idmap(external_entity, connec_entity_name, idmap)
|
70
|
-
{entity: map_to(connec_entity_name, external_entity), idmap: idmap}
|
68
|
+
{entity: map_to(connec_entity_name, external_entity, idmap.last_push_to_connec.nil?), idmap: idmap}
|
71
69
|
end
|
72
70
|
|
73
71
|
# Maps the entity received from external after a creation or an update and complete the received ids with the connec ones
|
@@ -17,6 +17,14 @@
|
|
17
17
|
# ExampleEntityMapper
|
18
18
|
# end
|
19
19
|
|
20
|
+
# This method is optional. It is needed only if a mandatory field
|
21
|
+
# is missing in Connec! and has to be pushed with a default value on creation.
|
22
|
+
# Refer to the FAQ section for more details.
|
23
|
+
|
24
|
+
# def self.creation_mapper_class
|
25
|
+
# CreationExampleEntityMapper
|
26
|
+
# end
|
27
|
+
|
20
28
|
# def self.object_name_from_connec_entity_hash(entity)
|
21
29
|
# "#{entity['first_name']} #{entity['last_name']}"
|
22
30
|
# end
|
@@ -27,6 +35,13 @@
|
|
27
35
|
|
28
36
|
# end
|
29
37
|
|
38
|
+
# class CreationExampleEntityMapper < ExampleEntityMapper
|
39
|
+
#
|
40
|
+
# after_normalize do |input, output|
|
41
|
+
# output[:missing_connec_field] = "Default Value"
|
42
|
+
# end
|
43
|
+
# end
|
44
|
+
|
30
45
|
# class ExampleEntityMapper
|
31
46
|
# extend HashMapper
|
32
47
|
|
@@ -2,18 +2,18 @@
|
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
3
3
|
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
|
-
# stub: maestrano-connector-rails 1.
|
5
|
+
# stub: maestrano-connector-rails 1.4.0 ruby lib
|
6
6
|
|
7
7
|
Gem::Specification.new do |s|
|
8
8
|
s.name = "maestrano-connector-rails"
|
9
|
-
s.version = "1.
|
9
|
+
s.version = "1.4.0"
|
10
10
|
|
11
11
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
12
12
|
s.require_paths = ["lib"]
|
13
|
-
s.authors = ["Pierre Berard"]
|
14
|
-
s.date = "2016-08-
|
13
|
+
s.authors = ["Maestrano", "Pierre Berard", "Marco Bagnasco"]
|
14
|
+
s.date = "2016-08-24"
|
15
15
|
s.description = "Maestrano is the next generation marketplace for SME applications. See https://maestrano.com for details."
|
16
|
-
s.email = "
|
16
|
+
s.email = "developers@maestrano.com"
|
17
17
|
s.executables = ["rails"]
|
18
18
|
s.extra_rdoc_files = [
|
19
19
|
"LICENSE",
|
@@ -224,7 +224,7 @@ Gem::Specification.new do |s|
|
|
224
224
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
225
225
|
s.add_runtime_dependency(%q<rails>, ["~> 4.2"])
|
226
226
|
s.add_runtime_dependency(%q<maestrano-rails>, [">= 0"])
|
227
|
-
s.add_runtime_dependency(%q<hash_mapper>, [">= 0"])
|
227
|
+
s.add_runtime_dependency(%q<hash_mapper>, [">= 0.2.2"])
|
228
228
|
s.add_runtime_dependency(%q<haml-rails>, [">= 0"])
|
229
229
|
s.add_runtime_dependency(%q<bootstrap-sass>, [">= 0"])
|
230
230
|
s.add_runtime_dependency(%q<autoprefixer-rails>, [">= 0"])
|
@@ -250,7 +250,7 @@ Gem::Specification.new do |s|
|
|
250
250
|
else
|
251
251
|
s.add_dependency(%q<rails>, ["~> 4.2"])
|
252
252
|
s.add_dependency(%q<maestrano-rails>, [">= 0"])
|
253
|
-
s.add_dependency(%q<hash_mapper>, [">= 0"])
|
253
|
+
s.add_dependency(%q<hash_mapper>, [">= 0.2.2"])
|
254
254
|
s.add_dependency(%q<haml-rails>, [">= 0"])
|
255
255
|
s.add_dependency(%q<bootstrap-sass>, [">= 0"])
|
256
256
|
s.add_dependency(%q<autoprefixer-rails>, [">= 0"])
|
@@ -277,7 +277,7 @@ Gem::Specification.new do |s|
|
|
277
277
|
else
|
278
278
|
s.add_dependency(%q<rails>, ["~> 4.2"])
|
279
279
|
s.add_dependency(%q<maestrano-rails>, [">= 0"])
|
280
|
-
s.add_dependency(%q<hash_mapper>, [">= 0"])
|
280
|
+
s.add_dependency(%q<hash_mapper>, [">= 0.2.2"])
|
281
281
|
s.add_dependency(%q<haml-rails>, [">= 0"])
|
282
282
|
s.add_dependency(%q<bootstrap-sass>, [">= 0"])
|
283
283
|
s.add_dependency(%q<autoprefixer-rails>, [">= 0"])
|