maestrano-connector-rails 0.2.18 → 0.2.19
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/VERSION +1 -1
- data/app/models/maestrano/connector/rails/complex_entity.rb +1 -154
- data/app/models/maestrano/connector/rails/concerns/complex_entity.rb +157 -0
- data/app/models/maestrano/connector/rails/concerns/connector_logger.rb +9 -0
- data/app/models/maestrano/connector/rails/concerns/entity.rb +1 -1
- data/app/models/maestrano/connector/rails/concerns/sub_entity_base.rb +71 -0
- data/app/models/maestrano/connector/rails/connector_logger.rb +1 -5
- data/app/models/maestrano/connector/rails/sub_entity_base.rb +1 -68
- data/lib/generators/connector/templates/entity.rb +2 -2
- data/lib/generators/connector/templates/home_controller_spec.rb +4 -21
- data/lib/generators/connector/templates/layouts.haml +1 -1
- data/lib/generators/connector/templates/shared_entities_controller_spec.rb +1 -1
- data/lib/generators/connector/templates/{sychronizations_controller_spec.rb → synchronizations_controller_spec.rb} +0 -0
- data/maestrano-connector-rails.gemspec +7 -4
- data/template/maestrano-connector-template.rb +7 -2
- metadata +6 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 84ed969991a93b3632339f112511a4baa3848ae9
|
4
|
+
data.tar.gz: 133ac31a7b246b0d5f7f7aa096fdd859ab2b7e19
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 14cbd5436d31186f909ce2c66b01b10e027a5b31fb6f932e2387eabb754aa349f170679d523af24327c79e659a4fad5333e4dd51bbf43a74c468ec0f938add90
|
7
|
+
data.tar.gz: 5befbf8603f56588e5501bc16594266d3a592ac775c27ebc3c39b4647ce26fb409e96b4fd7dbb384f26e00575c8628217cc79c9d52e6b0ed4d189416993497a4
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.2.
|
1
|
+
0.2.19
|
@@ -1,158 +1,5 @@
|
|
1
1
|
module Maestrano::Connector::Rails
|
2
2
|
class ComplexEntity
|
3
|
-
|
4
|
-
@@external_name = External.external_name
|
5
|
-
|
6
|
-
# -------------------------------------------------------------
|
7
|
-
# Complex specific methods
|
8
|
-
# Those methods needs to be implemented in each complex entity
|
9
|
-
# -------------------------------------------------------------
|
10
|
-
def connec_entities_names
|
11
|
-
raise "Not implemented"
|
12
|
-
end
|
13
|
-
|
14
|
-
def external_entities_names
|
15
|
-
raise "Not implemented"
|
16
|
-
end
|
17
|
-
|
18
|
-
# input : {
|
19
|
-
# connec_entities_names[0]: [unmapped_connec_entitiy1, unmapped_connec_entitiy2],
|
20
|
-
# connec_entities_names[1]: [unmapped_connec_entitiy3, unmapped_connec_entitiy4]
|
21
|
-
# }
|
22
|
-
# output : {
|
23
|
-
# connec_entities_names[0]: {
|
24
|
-
# external_entities_names[0]: [unmapped_connec_entitiy1, unmapped_connec_entitiy2]
|
25
|
-
# },
|
26
|
-
# connec_entities_names[1]: {
|
27
|
-
# external_entities_names[0]: [unmapped_connec_entitiy3],
|
28
|
-
# external_entities_names[1]: [unmapped_connec_entitiy4]
|
29
|
-
# }
|
30
|
-
# }
|
31
|
-
def connec_model_to_external_model(connec_hash_of_entities)
|
32
|
-
raise "Not implemented"
|
33
|
-
end
|
34
|
-
|
35
|
-
# input : {
|
36
|
-
# external_entities_names[0]: [unmapped_external_entity1}, unmapped_external_entity2],
|
37
|
-
# external_entities_names[1]: [unmapped_external_entity3}, unmapped_external_entity4]
|
38
|
-
# }
|
39
|
-
# output : {
|
40
|
-
# external_entities_names[0]: {
|
41
|
-
# connec_entities_names[0]: [unmapped_external_entity1],
|
42
|
-
# connec_entities_names[1]: [unmapped_external_entity2]
|
43
|
-
# },
|
44
|
-
# external_entities_names[1]: {
|
45
|
-
# connec_entities_names[0]: [unmapped_external_entity3, unmapped_external_entity4]
|
46
|
-
# }
|
47
|
-
# }
|
48
|
-
def external_model_to_connec_model(external_hash_of_entities)
|
49
|
-
raise "Not implemented"
|
50
|
-
end
|
51
|
-
|
52
|
-
# -------------------------------------------------------------
|
53
|
-
# General methods
|
54
|
-
# -------------------------------------------------------------
|
55
|
-
def map_to_external_with_idmap(entity, organization, external_entity_name, sub_entity_instance)
|
56
|
-
idmap = sub_entity_instance.find_idmap({connec_id: entity['id'], external_entity: external_entity_name, organization_id: organization.id})
|
57
|
-
|
58
|
-
if idmap && ((!idmap.to_external) || idmap.last_push_to_external && idmap.last_push_to_external > entity['updated_at'])
|
59
|
-
ConnectorLogger.log('info', organization, "Discard Connec! #{sub_entity_instance.entity_name} : #{entity}")
|
60
|
-
nil
|
61
|
-
else
|
62
|
-
{entity: sub_entity_instance.map_to(external_entity_name, entity, organization), idmap: idmap || sub_entity_instance.create_idmap_from_connec_entity(entity, external_entity_name, organization)}
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
# -------------------------------------------------------------
|
67
|
-
# Entity equivalent methods
|
68
|
-
# -------------------------------------------------------------
|
69
|
-
def get_connec_entities(client, last_synchronization, organization, opts={})
|
70
|
-
entities = ActiveSupport::HashWithIndifferentAccess.new
|
71
|
-
|
72
|
-
self.connec_entities_names.each do |connec_entity_name|
|
73
|
-
sub_entity_instance = "Entities::SubEntities::#{connec_entity_name.titleize.split.join}".constantize.new
|
74
|
-
entities[connec_entity_name] = sub_entity_instance.get_connec_entities(client, last_synchronization, organization, opts)
|
75
|
-
end
|
76
|
-
entities
|
77
|
-
end
|
78
|
-
|
79
|
-
def get_external_entities(client, last_synchronization, organization, opts={})
|
80
|
-
entities = ActiveSupport::HashWithIndifferentAccess.new
|
81
|
-
|
82
|
-
self.external_entities_names.each do |external_entity_name|
|
83
|
-
sub_entity_instance = "Entities::SubEntities::#{external_entity_name.titleize.split.join}".constantize.new
|
84
|
-
entities[external_entity_name] = sub_entity_instance.get_external_entities(client, last_synchronization, organization, opts)
|
85
|
-
end
|
86
|
-
entities
|
87
|
-
end
|
88
|
-
|
89
|
-
def consolidate_and_map_data(connec_entities, external_entities, organization, opts)
|
90
|
-
modeled_external_entities = external_model_to_connec_model(external_entities)
|
91
|
-
modeled_connec_entities = connec_model_to_external_model(connec_entities)
|
92
|
-
|
93
|
-
modeled_external_entities.each do |external_entity_name, entities_in_connec_model|
|
94
|
-
entities_in_connec_model.each do |connec_entity_name, entities|
|
95
|
-
sub_entity_instance = "Entities::SubEntities::#{external_entity_name.titleize.split.join}".constantize.new
|
96
|
-
|
97
|
-
entities.map!{|entity|
|
98
|
-
idmap = sub_entity_instance.find_idmap(external_id: sub_entity_instance.get_id_from_external_entity_hash(entity), connec_entity: connec_entity_name, organization_id: organization.id)
|
99
|
-
|
100
|
-
# No idmap: creating one, nothing else to do
|
101
|
-
unless idmap
|
102
|
-
next {entity: sub_entity_instance.map_to(connec_entity_name, entity, organization), idmap: sub_entity_instance.create_idmap_from_external_entity(entity, connec_entity_name, organization)}
|
103
|
-
end
|
104
|
-
|
105
|
-
# Not pushing entity to Connec!
|
106
|
-
next nil unless idmap.to_connec
|
107
|
-
|
108
|
-
# Entity has not been modified since its last push to connec!
|
109
|
-
next nil if Maestrano::Connector::Rails::Entity.not_modified_since_last_push_to_connec(idmap, entity, sub_entity_instance, organization)
|
110
|
-
|
111
|
-
# Check for conflict with entities from connec!
|
112
|
-
equivalent_connec_entities = modeled_connec_entities[connec_entity_name][external_entity_name] || []
|
113
|
-
Maestrano::Connector::Rails::Entity.solve_conflict(entity, sub_entity_instance, equivalent_connec_entities, connec_entity_name, idmap, organization, opts)
|
114
|
-
}.compact!
|
115
|
-
end
|
116
|
-
end
|
117
|
-
|
118
|
-
modeled_connec_entities.each do |connec_entity_name, entities_in_external_model|
|
119
|
-
entities_in_external_model.each do |external_entity_name, entities|
|
120
|
-
sub_entity_instance = "Entities::SubEntities::#{connec_entity_name.titleize.split.join}".constantize.new
|
121
|
-
entities.map!{|entity|
|
122
|
-
self.map_to_external_with_idmap(entity, organization, external_entity_name, sub_entity_instance)
|
123
|
-
}.compact!
|
124
|
-
end
|
125
|
-
end
|
126
|
-
|
127
|
-
return {connec_entities: modeled_connec_entities, external_entities: modeled_external_entities}
|
128
|
-
end
|
129
|
-
|
130
|
-
# input : {
|
131
|
-
# external_entities_names[0]: {
|
132
|
-
# connec_entities_names[0]: [mapped_external_entity1],
|
133
|
-
# connec_entities_names[1]: [mapped_external_entity2]
|
134
|
-
# },
|
135
|
-
# external_entities_names[1]: {
|
136
|
-
# connec_entities_names[0]: [mapped_external_entity3, mapped_external_entity4]
|
137
|
-
# }
|
138
|
-
# }
|
139
|
-
def push_entities_to_connec(connec_client, mapped_external_entities_with_idmaps, organization)
|
140
|
-
mapped_external_entities_with_idmaps.each do |external_entity_name, entities_in_connec_model|
|
141
|
-
sub_entity_instance = "Entities::SubEntities::#{external_entity_name.titleize.split.join}".constantize.new
|
142
|
-
entities_in_connec_model.each do |connec_entity_name, mapped_entities_with_idmaps|
|
143
|
-
sub_entity_instance.push_entities_to_connec_to(connec_client, mapped_entities_with_idmaps, connec_entity_name, organization)
|
144
|
-
end
|
145
|
-
end
|
146
|
-
end
|
147
|
-
|
148
|
-
|
149
|
-
def push_entities_to_external(external_client, mapped_connec_entities_with_idmaps, organization)
|
150
|
-
mapped_connec_entities_with_idmaps.each do |connec_entity_name, entities_in_external_model|
|
151
|
-
sub_entity_instance = "Entities::SubEntities::#{connec_entity_name.titleize.split.join}".constantize.new
|
152
|
-
entities_in_external_model.each do |external_entity_name, mapped_entities_with_idmaps|
|
153
|
-
sub_entity_instance.push_entities_to_external_to(external_client, mapped_entities_with_idmaps, external_entity_name, organization)
|
154
|
-
end
|
155
|
-
end
|
156
|
-
end
|
3
|
+
include Maestrano::Connector::Rails::Concerns::ComplexEntity
|
157
4
|
end
|
158
5
|
end
|
@@ -0,0 +1,157 @@
|
|
1
|
+
module Maestrano::Connector::Rails::Concerns::ComplexEntity
|
2
|
+
extend ActiveSupport::Concern
|
3
|
+
|
4
|
+
@@external_name = Maestrano::Connector::Rails::External.external_name
|
5
|
+
|
6
|
+
# -------------------------------------------------------------
|
7
|
+
# Complex specific methods
|
8
|
+
# Those methods needs to be implemented in each complex entity
|
9
|
+
# -------------------------------------------------------------
|
10
|
+
def connec_entities_names
|
11
|
+
raise "Not implemented"
|
12
|
+
end
|
13
|
+
|
14
|
+
def external_entities_names
|
15
|
+
raise "Not implemented"
|
16
|
+
end
|
17
|
+
|
18
|
+
# input : {
|
19
|
+
# connec_entities_names[0]: [unmapped_connec_entitiy1, unmapped_connec_entitiy2],
|
20
|
+
# connec_entities_names[1]: [unmapped_connec_entitiy3, unmapped_connec_entitiy4]
|
21
|
+
# }
|
22
|
+
# output : {
|
23
|
+
# connec_entities_names[0]: {
|
24
|
+
# external_entities_names[0]: [unmapped_connec_entitiy1, unmapped_connec_entitiy2]
|
25
|
+
# },
|
26
|
+
# connec_entities_names[1]: {
|
27
|
+
# external_entities_names[0]: [unmapped_connec_entitiy3],
|
28
|
+
# external_entities_names[1]: [unmapped_connec_entitiy4]
|
29
|
+
# }
|
30
|
+
# }
|
31
|
+
def connec_model_to_external_model(connec_hash_of_entities)
|
32
|
+
raise "Not implemented"
|
33
|
+
end
|
34
|
+
|
35
|
+
# input : {
|
36
|
+
# external_entities_names[0]: [unmapped_external_entity1}, unmapped_external_entity2],
|
37
|
+
# external_entities_names[1]: [unmapped_external_entity3}, unmapped_external_entity4]
|
38
|
+
# }
|
39
|
+
# output : {
|
40
|
+
# external_entities_names[0]: {
|
41
|
+
# connec_entities_names[0]: [unmapped_external_entity1],
|
42
|
+
# connec_entities_names[1]: [unmapped_external_entity2]
|
43
|
+
# },
|
44
|
+
# external_entities_names[1]: {
|
45
|
+
# connec_entities_names[0]: [unmapped_external_entity3, unmapped_external_entity4]
|
46
|
+
# }
|
47
|
+
# }
|
48
|
+
def external_model_to_connec_model(external_hash_of_entities)
|
49
|
+
raise "Not implemented"
|
50
|
+
end
|
51
|
+
|
52
|
+
# -------------------------------------------------------------
|
53
|
+
# General methods
|
54
|
+
# -------------------------------------------------------------
|
55
|
+
def map_to_external_with_idmap(entity, organization, external_entity_name, sub_entity_instance)
|
56
|
+
idmap = sub_entity_instance.find_idmap({connec_id: entity['id'], external_entity: external_entity_name, organization_id: organization.id})
|
57
|
+
|
58
|
+
if idmap && ((!idmap.to_external) || idmap.last_push_to_external && idmap.last_push_to_external > entity['updated_at'])
|
59
|
+
Maestrano::Connector::Rails::ConnectorLogger.log('info', organization, "Discard Connec! #{sub_entity_instance.entity_name} : #{entity}")
|
60
|
+
nil
|
61
|
+
else
|
62
|
+
{entity: sub_entity_instance.map_to(external_entity_name, entity, organization), idmap: idmap || sub_entity_instance.create_idmap_from_connec_entity(entity, external_entity_name, organization)}
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
# -------------------------------------------------------------
|
67
|
+
# Entity equivalent methods
|
68
|
+
# -------------------------------------------------------------
|
69
|
+
def get_connec_entities(client, last_synchronization, organization, opts={})
|
70
|
+
entities = ActiveSupport::HashWithIndifferentAccess.new
|
71
|
+
|
72
|
+
self.connec_entities_names.each do |connec_entity_name|
|
73
|
+
sub_entity_instance = "Entities::SubEntities::#{connec_entity_name.titleize.split.join}".constantize.new
|
74
|
+
entities[connec_entity_name] = sub_entity_instance.get_connec_entities(client, last_synchronization, organization, opts)
|
75
|
+
end
|
76
|
+
entities
|
77
|
+
end
|
78
|
+
|
79
|
+
def get_external_entities(client, last_synchronization, organization, opts={})
|
80
|
+
entities = ActiveSupport::HashWithIndifferentAccess.new
|
81
|
+
|
82
|
+
self.external_entities_names.each do |external_entity_name|
|
83
|
+
sub_entity_instance = "Entities::SubEntities::#{external_entity_name.titleize.split.join}".constantize.new
|
84
|
+
entities[external_entity_name] = sub_entity_instance.get_external_entities(client, last_synchronization, organization, opts)
|
85
|
+
end
|
86
|
+
entities
|
87
|
+
end
|
88
|
+
|
89
|
+
def consolidate_and_map_data(connec_entities, external_entities, organization, opts={})
|
90
|
+
modeled_external_entities = external_model_to_connec_model(external_entities)
|
91
|
+
modeled_connec_entities = connec_model_to_external_model(connec_entities)
|
92
|
+
|
93
|
+
modeled_external_entities.each do |external_entity_name, entities_in_connec_model|
|
94
|
+
entities_in_connec_model.each do |connec_entity_name, entities|
|
95
|
+
sub_entity_instance = "Entities::SubEntities::#{external_entity_name.titleize.split.join}".constantize.new
|
96
|
+
|
97
|
+
entities.map!{|entity|
|
98
|
+
idmap = sub_entity_instance.find_idmap(external_id: sub_entity_instance.get_id_from_external_entity_hash(entity), connec_entity: connec_entity_name, organization_id: organization.id)
|
99
|
+
|
100
|
+
# No idmap: creating one, nothing else to do
|
101
|
+
unless idmap
|
102
|
+
next {entity: sub_entity_instance.map_to(connec_entity_name, entity, organization), idmap: sub_entity_instance.create_idmap_from_external_entity(entity, connec_entity_name, organization)}
|
103
|
+
end
|
104
|
+
|
105
|
+
# Not pushing entity to Connec!
|
106
|
+
next nil unless idmap.to_connec
|
107
|
+
|
108
|
+
# Entity has not been modified since its last push to connec!
|
109
|
+
next nil if Maestrano::Connector::Rails::Entity.not_modified_since_last_push_to_connec(idmap, entity, sub_entity_instance, organization)
|
110
|
+
|
111
|
+
# Check for conflict with entities from connec!
|
112
|
+
equivalent_connec_entities = modeled_connec_entities[connec_entity_name][external_entity_name] || []
|
113
|
+
Maestrano::Connector::Rails::Entity.solve_conflict(entity, sub_entity_instance, equivalent_connec_entities, connec_entity_name, idmap, organization, opts)
|
114
|
+
}.compact!
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
modeled_connec_entities.each do |connec_entity_name, entities_in_external_model|
|
119
|
+
entities_in_external_model.each do |external_entity_name, entities|
|
120
|
+
sub_entity_instance = "Entities::SubEntities::#{connec_entity_name.titleize.split.join}".constantize.new
|
121
|
+
entities.map!{|entity|
|
122
|
+
self.map_to_external_with_idmap(entity, organization, external_entity_name, sub_entity_instance)
|
123
|
+
}.compact!
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
return {connec_entities: modeled_connec_entities, external_entities: modeled_external_entities}
|
128
|
+
end
|
129
|
+
|
130
|
+
# input : {
|
131
|
+
# external_entities_names[0]: {
|
132
|
+
# connec_entities_names[0]: [mapped_external_entity1],
|
133
|
+
# connec_entities_names[1]: [mapped_external_entity2]
|
134
|
+
# },
|
135
|
+
# external_entities_names[1]: {
|
136
|
+
# connec_entities_names[0]: [mapped_external_entity3, mapped_external_entity4]
|
137
|
+
# }
|
138
|
+
# }
|
139
|
+
def push_entities_to_connec(connec_client, mapped_external_entities_with_idmaps, organization)
|
140
|
+
mapped_external_entities_with_idmaps.each do |external_entity_name, entities_in_connec_model|
|
141
|
+
sub_entity_instance = "Entities::SubEntities::#{external_entity_name.titleize.split.join}".constantize.new
|
142
|
+
entities_in_connec_model.each do |connec_entity_name, mapped_entities_with_idmaps|
|
143
|
+
sub_entity_instance.push_entities_to_connec_to(connec_client, mapped_entities_with_idmaps, connec_entity_name, organization)
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
|
149
|
+
def push_entities_to_external(external_client, mapped_connec_entities_with_idmaps, organization)
|
150
|
+
mapped_connec_entities_with_idmaps.each do |connec_entity_name, entities_in_external_model|
|
151
|
+
sub_entity_instance = "Entities::SubEntities::#{connec_entity_name.titleize.split.join}".constantize.new
|
152
|
+
entities_in_external_model.each do |external_entity_name, mapped_entities_with_idmaps|
|
153
|
+
sub_entity_instance.push_entities_to_external_to(external_client, mapped_entities_with_idmaps, external_entity_name, organization)
|
154
|
+
end
|
155
|
+
end
|
156
|
+
end
|
157
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
module Maestrano::Connector::Rails::Concerns::ConnectorLogger
|
2
|
+
extend ActiveSupport::Concern
|
3
|
+
|
4
|
+
module ClassMethods
|
5
|
+
def log(level, organization, msg)
|
6
|
+
Rails.logger.method(level).call("org: #{organization.uid} (#{organization.tenant}). Msg: #{msg}")
|
7
|
+
end
|
8
|
+
end
|
9
|
+
end
|
@@ -332,7 +332,7 @@ module Maestrano::Connector::Rails::Concerns::Entity
|
|
332
332
|
module ClassMethods
|
333
333
|
def not_modified_since_last_push_to_connec(idmap, entity, entity_instance, organization)
|
334
334
|
result = idmap.last_push_to_connec && idmap.last_push_to_connec > entity_instance.get_last_update_date_from_external_entity_hash(entity)
|
335
|
-
Maestrano::Connector::Rails::ConnectorLogger.log('info', organization, "Discard #{entity_instance.external_entity_name} : #{entity}")
|
335
|
+
Maestrano::Connector::Rails::ConnectorLogger.log('info', organization, "Discard #{entity_instance.external_entity_name} : #{entity}") if result
|
336
336
|
result
|
337
337
|
end
|
338
338
|
|
@@ -0,0 +1,71 @@
|
|
1
|
+
module Maestrano::Connector::Rails::Concerns::SubEntityBase
|
2
|
+
extend ActiveSupport::Concern
|
3
|
+
|
4
|
+
def external?
|
5
|
+
raise "Not implemented"
|
6
|
+
end
|
7
|
+
|
8
|
+
def entity_name
|
9
|
+
raise "Not implemented"
|
10
|
+
end
|
11
|
+
|
12
|
+
def map_to(name, entity, organization)
|
13
|
+
raise "Not implemented"
|
14
|
+
end
|
15
|
+
|
16
|
+
def external_entity_name
|
17
|
+
if external?
|
18
|
+
entity_name
|
19
|
+
else
|
20
|
+
raise "Forbidden call: cannot call external_entity_name for a connec entity"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def connec_entity_name
|
25
|
+
if external?
|
26
|
+
raise "Forbidden call: cannot call connec_entity_name for an external entity"
|
27
|
+
else
|
28
|
+
entity_name
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def names_hash
|
33
|
+
if external?
|
34
|
+
{external_entity: entity_name.downcase}
|
35
|
+
else
|
36
|
+
{connec_entity: entity_name.downcase}
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def create_idmap_from_external_entity(entity, connec_entity_name, organization)
|
41
|
+
if external?
|
42
|
+
h = names_hash.merge({
|
43
|
+
external_id: get_id_from_external_entity_hash(entity),
|
44
|
+
name: object_name_from_external_entity_hash(entity),
|
45
|
+
connec_entity: connec_entity_name.downcase,
|
46
|
+
organization_id: organization.id
|
47
|
+
})
|
48
|
+
Maestrano::Connector::Rails::IdMap.create(h)
|
49
|
+
else
|
50
|
+
raise 'Forbidden call: cannot call create_idmap_from_external_entity for a connec entity'
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def create_idmap_from_connec_entity(entity, external_entity_name, organization)
|
55
|
+
if external?
|
56
|
+
raise 'Forbidden call: cannot call create_idmap_from_connec_entity for an external entity'
|
57
|
+
else
|
58
|
+
h = names_hash.merge({
|
59
|
+
connec_id: entity['id'],
|
60
|
+
name: object_name_from_connec_entity_hash(entity),
|
61
|
+
external_entity: external_entity_name.downcase,
|
62
|
+
organization_id: organization.id
|
63
|
+
})
|
64
|
+
Maestrano::Connector::Rails::IdMap.create(h)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def map_external_entity_with_idmap(external_entity, connec_entity_name, idmap, organization)
|
69
|
+
{entity: map_to(connec_entity_name, external_entity, organization), idmap: idmap}
|
70
|
+
end
|
71
|
+
end
|
@@ -1,9 +1,5 @@
|
|
1
1
|
module Maestrano::Connector::Rails
|
2
2
|
class ConnectorLogger
|
3
|
-
|
4
|
-
def self.log(level, organization, msg)
|
5
|
-
Rails.logger.method(level).call("org: #{organization.uid} (#{organization.tenant}). Msg: #{msg}")
|
6
|
-
end
|
7
|
-
|
3
|
+
include Maestrano::Connector::Rails::Concerns::ConnectorLogger
|
8
4
|
end
|
9
5
|
end
|
@@ -1,72 +1,5 @@
|
|
1
1
|
module Maestrano::Connector::Rails
|
2
2
|
class SubEntityBase < Entity
|
3
|
-
|
4
|
-
def external?
|
5
|
-
raise "Not implemented"
|
6
|
-
end
|
7
|
-
|
8
|
-
def entity_name
|
9
|
-
raise "Not implemented"
|
10
|
-
end
|
11
|
-
|
12
|
-
def map_to(name, entity, organization)
|
13
|
-
raise "Not implemented"
|
14
|
-
end
|
15
|
-
|
16
|
-
def external_entity_name
|
17
|
-
if external?
|
18
|
-
entity_name
|
19
|
-
else
|
20
|
-
raise "Forbidden call: cannot call external_entity_name for a connec entity"
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
def connec_entity_name
|
25
|
-
if external?
|
26
|
-
raise "Forbidden call: cannot call connec_entity_name for an external entity"
|
27
|
-
else
|
28
|
-
entity_name
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
def names_hash
|
33
|
-
if external?
|
34
|
-
{external_entity: entity_name.downcase}
|
35
|
-
else
|
36
|
-
{connec_entity: entity_name.downcase}
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
def create_idmap_from_external_entity(entity, connec_entity_name, organization)
|
41
|
-
if external?
|
42
|
-
h = names_hash.merge({
|
43
|
-
external_id: get_id_from_external_entity_hash(entity),
|
44
|
-
name: object_name_from_external_entity_hash(entity),
|
45
|
-
connec_entity: connec_entity_name.downcase,
|
46
|
-
organization_id: organization.id
|
47
|
-
})
|
48
|
-
Maestrano::Connector::Rails::IdMap.create(h)
|
49
|
-
else
|
50
|
-
raise 'Forbidden call: cannot call create_idmap_from_external_entity for a connec entity'
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
def create_idmap_from_connec_entity(entity, external_entity_name, organization)
|
55
|
-
if external?
|
56
|
-
raise 'Forbidden call: cannot call create_idmap_from_connec_entity for an external entity'
|
57
|
-
else
|
58
|
-
h = names_hash.merge({
|
59
|
-
connec_id: entity['id'],
|
60
|
-
name: object_name_from_connec_entity_hash(entity),
|
61
|
-
external_entity: external_entity_name.downcase,
|
62
|
-
organization_id: organization.id
|
63
|
-
})
|
64
|
-
Maestrano::Connector::Rails::IdMap.create(h)
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
def map_external_entity_with_idmap(external_entity, connec_entity_name, idmap, organization)
|
69
|
-
{entity: map_to(connec_entity_name, external_entity, organization), idmap: idmap}
|
70
|
-
end
|
3
|
+
include Maestrano::Connector::Rails::Concerns::SubEntityBase
|
71
4
|
end
|
72
5
|
end
|
@@ -21,13 +21,13 @@ class Maestrano::Connector::Rails::Entity
|
|
21
21
|
# Maestrano::Connector::Rails::ConnectorLogger.log('info', organization, "Received data: Source=#{@@external_name}, Entity=#{self.external_entity_name}, Response=#{entities}")
|
22
22
|
end
|
23
23
|
|
24
|
-
def
|
24
|
+
def create_external_entity(client, mapped_connec_entity, external_entity_name, organization)
|
25
25
|
Maestrano::Connector::Rails::ConnectorLogger.log('info', organization, "Sending create #{external_entity_name}: #{mapped_connec_entity} to #{@@external_name}")
|
26
26
|
# TODO
|
27
27
|
# This method creates the entity in the external app and returns the external id
|
28
28
|
end
|
29
29
|
|
30
|
-
def
|
30
|
+
def update_external_entity(client, mapped_connec_entity, external_id, external_entity_name, organization)
|
31
31
|
Maestrano::Connector::Rails::ConnectorLogger.log('info', organization, "Sending update #{external_entity_name} (id=#{external_id}): #{mapped_connec_entity} to #{@@external_name}")
|
32
32
|
# TODO
|
33
33
|
# This method updates the entity with the given id in the external app
|
@@ -49,7 +49,7 @@ describe HomeController, :type => :controller do
|
|
49
49
|
|
50
50
|
context 'when user is not admin' do
|
51
51
|
before {
|
52
|
-
allow_any_instance_of(
|
52
|
+
allow_any_instance_of(Maestrano::Connector::Rails::SessionHelper).to receive(:is_admin).and_return(false)
|
53
53
|
}
|
54
54
|
|
55
55
|
it { expect(subject).to redirect_to back_path }
|
@@ -62,7 +62,7 @@ describe HomeController, :type => :controller do
|
|
62
62
|
|
63
63
|
context 'when user is admin' do
|
64
64
|
before {
|
65
|
-
allow_any_instance_of(
|
65
|
+
allow_any_instance_of(Maestrano::Connector::Rails::SessionHelper).to receive(:is_admin).and_return(true)
|
66
66
|
}
|
67
67
|
|
68
68
|
it { expect(subject).to redirect_to back_path }
|
@@ -95,7 +95,7 @@ describe HomeController, :type => :controller do
|
|
95
95
|
|
96
96
|
context 'when user is not an admin' do
|
97
97
|
before {
|
98
|
-
allow_any_instance_of(
|
98
|
+
allow_any_instance_of(Maestrano::Connector::Rails::SessionHelper).to receive(:is_admin).and_return(false)
|
99
99
|
}
|
100
100
|
it { expect(subject).to redirect_to back_path }
|
101
101
|
|
@@ -106,7 +106,7 @@ describe HomeController, :type => :controller do
|
|
106
106
|
|
107
107
|
context 'when user is admin' do
|
108
108
|
before {
|
109
|
-
allow_any_instance_of(
|
109
|
+
allow_any_instance_of(Maestrano::Connector::Rails::SessionHelper).to receive(:is_admin).and_return(true)
|
110
110
|
}
|
111
111
|
it { expect(subject).to redirect_to back_path }
|
112
112
|
|
@@ -121,21 +121,4 @@ describe HomeController, :type => :controller do
|
|
121
121
|
end
|
122
122
|
end
|
123
123
|
end
|
124
|
-
|
125
|
-
describe 'redirect_to_external' do
|
126
|
-
subject { get :redirect_to_external }
|
127
|
-
|
128
|
-
context 'when organization has a redirect url' do
|
129
|
-
let(:organization) { create(:organization, instance_url: 'url') }
|
130
|
-
before {
|
131
|
-
allow_any_instance_of(Maestrano::Connector::Rails::SessionHelper).to receive(:current_organization).and_return(organization)
|
132
|
-
}
|
133
|
-
|
134
|
-
it {expect(subject).to redirect_to('url')}
|
135
|
-
end
|
136
|
-
|
137
|
-
context 'otherwise' do
|
138
|
-
it {expect(subject).to redirect_to('https://login.salesforce.com')}
|
139
|
-
end
|
140
|
-
end
|
141
124
|
end
|
@@ -12,7 +12,7 @@
|
|
12
12
|
.container-fluid
|
13
13
|
.collapse.navbar-collapse#maestrano-navbar-collapse
|
14
14
|
%ul.nav.navbar-nav
|
15
|
-
=image_tag "logos/default.png", class: '
|
15
|
+
=image_tag "logos/default.png", class: 'logo'
|
16
16
|
|
17
17
|
%ul.nav.navbar-nav
|
18
18
|
%li=link_to "Status", root_path
|
@@ -11,7 +11,7 @@ describe SharedEntitiesController, :type => :controller do
|
|
11
11
|
let(:idmap) { create(:idmap, organization: organization) }
|
12
12
|
before {
|
13
13
|
allow_any_instance_of(Maestrano::Connector::Rails::SessionHelper).to receive(:current_organization).and_return(organization)
|
14
|
-
allow_any_instance_of(
|
14
|
+
allow_any_instance_of(Maestrano::Connector::Rails::SessionHelper).to receive(:is_admin).and_return(true)
|
15
15
|
}
|
16
16
|
|
17
17
|
it 'assigns the idmaps' do
|
File without changes
|
@@ -2,16 +2,16 @@
|
|
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 0.2.
|
5
|
+
# stub: maestrano-connector-rails 0.2.19 ruby lib
|
6
6
|
|
7
7
|
Gem::Specification.new do |s|
|
8
8
|
s.name = "maestrano-connector-rails"
|
9
|
-
s.version = "0.2.
|
9
|
+
s.version = "0.2.19"
|
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
13
|
s.authors = ["Pierre Berard"]
|
14
|
-
s.date = "2016-03-
|
14
|
+
s.date = "2016-03-10"
|
15
15
|
s.description = "Maestrano is the next generation marketplace for SME applications. See https://maestrano.com for details."
|
16
16
|
s.email = "pierre.berard@maestrano.com"
|
17
17
|
s.executables = ["rails"]
|
@@ -39,8 +39,11 @@ Gem::Specification.new do |s|
|
|
39
39
|
"app/jobs/maestrano/connector/rails/push_to_connec_job.rb",
|
40
40
|
"app/jobs/maestrano/connector/rails/synchronization_job.rb",
|
41
41
|
"app/models/maestrano/connector/rails/complex_entity.rb",
|
42
|
+
"app/models/maestrano/connector/rails/concerns/complex_entity.rb",
|
43
|
+
"app/models/maestrano/connector/rails/concerns/connector_logger.rb",
|
42
44
|
"app/models/maestrano/connector/rails/concerns/entity.rb",
|
43
45
|
"app/models/maestrano/connector/rails/concerns/external.rb",
|
46
|
+
"app/models/maestrano/connector/rails/concerns/sub_entity_base.rb",
|
44
47
|
"app/models/maestrano/connector/rails/connector_logger.rb",
|
45
48
|
"app/models/maestrano/connector/rails/entity.rb",
|
46
49
|
"app/models/maestrano/connector/rails/external.rb",
|
@@ -86,8 +89,8 @@ Gem::Specification.new do |s|
|
|
86
89
|
"lib/generators/connector/templates/stylesheets/layout.sass",
|
87
90
|
"lib/generators/connector/templates/stylesheets/spacers.sass",
|
88
91
|
"lib/generators/connector/templates/stylesheets/variables.sass",
|
89
|
-
"lib/generators/connector/templates/sychronizations_controller_spec.rb",
|
90
92
|
"lib/generators/connector/templates/synchronizations_controller.rb",
|
93
|
+
"lib/generators/connector/templates/synchronizations_controller_spec.rb",
|
91
94
|
"lib/generators/connector/templates/synchronizations_index.haml",
|
92
95
|
"lib/maestrano-connector-rails.rb",
|
93
96
|
"lib/maestrano/connector/rails.rb",
|
@@ -3,7 +3,7 @@ def current_directory
|
|
3
3
|
if __FILE__ =~ %r{\Ahttps?://}
|
4
4
|
tempdir = Dir.mktmpdir("maestrano-connector-rails-")
|
5
5
|
at_exit { FileUtils.remove_entry(tempdir) }
|
6
|
-
git :clone => "--quiet https://github.com/
|
6
|
+
git :clone => "--quiet https://github.com/maestrano/maestrano-connector-rails/ #{tempdir}"
|
7
7
|
|
8
8
|
"#{tempdir}/template"
|
9
9
|
else
|
@@ -30,7 +30,7 @@ run 'touch Gemfile'
|
|
30
30
|
add_source 'https://rubygems.org'
|
31
31
|
|
32
32
|
if yes?("Use JRuby? [y/n]")
|
33
|
-
run 'echo "ruby \'2.2.
|
33
|
+
run 'echo "ruby \'2.2.3\', :engine => \'jruby\', :engine_version => \'9.0.5.0\'" | cat - Gemfile > temp && mv temp Gemfile'
|
34
34
|
gem_group :production do
|
35
35
|
gem 'activerecord-jdbcpostgresql-adapter'
|
36
36
|
end
|
@@ -41,12 +41,17 @@ else
|
|
41
41
|
gem 'sqlite3'
|
42
42
|
end
|
43
43
|
|
44
|
+
gem 'haml-rails'
|
45
|
+
gem 'bootstrap-sass'
|
46
|
+
gem 'autoprefixer-rails'
|
47
|
+
|
44
48
|
gem 'rails', '4.2.4'
|
45
49
|
gem 'turbolinks'
|
46
50
|
gem 'jquery-rails'
|
47
51
|
gem 'puma'
|
48
52
|
gem 'figaro'
|
49
53
|
gem 'tzinfo-data', platforms: [:mingw, :mswin, :jruby]
|
54
|
+
gem 'uglifier', '>= 1.3.0'
|
50
55
|
|
51
56
|
gem 'maestrano-connector-rails'
|
52
57
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: maestrano-connector-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.19
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Pierre Berard
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-03-
|
11
|
+
date: 2016-03-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: maestrano-rails
|
@@ -249,8 +249,11 @@ files:
|
|
249
249
|
- app/jobs/maestrano/connector/rails/push_to_connec_job.rb
|
250
250
|
- app/jobs/maestrano/connector/rails/synchronization_job.rb
|
251
251
|
- app/models/maestrano/connector/rails/complex_entity.rb
|
252
|
+
- app/models/maestrano/connector/rails/concerns/complex_entity.rb
|
253
|
+
- app/models/maestrano/connector/rails/concerns/connector_logger.rb
|
252
254
|
- app/models/maestrano/connector/rails/concerns/entity.rb
|
253
255
|
- app/models/maestrano/connector/rails/concerns/external.rb
|
256
|
+
- app/models/maestrano/connector/rails/concerns/sub_entity_base.rb
|
254
257
|
- app/models/maestrano/connector/rails/connector_logger.rb
|
255
258
|
- app/models/maestrano/connector/rails/entity.rb
|
256
259
|
- app/models/maestrano/connector/rails/external.rb
|
@@ -296,8 +299,8 @@ files:
|
|
296
299
|
- lib/generators/connector/templates/stylesheets/layout.sass
|
297
300
|
- lib/generators/connector/templates/stylesheets/spacers.sass
|
298
301
|
- lib/generators/connector/templates/stylesheets/variables.sass
|
299
|
-
- lib/generators/connector/templates/sychronizations_controller_spec.rb
|
300
302
|
- lib/generators/connector/templates/synchronizations_controller.rb
|
303
|
+
- lib/generators/connector/templates/synchronizations_controller_spec.rb
|
301
304
|
- lib/generators/connector/templates/synchronizations_index.haml
|
302
305
|
- lib/maestrano-connector-rails.rb
|
303
306
|
- lib/maestrano/connector/rails.rb
|