maestrano-connector-rails 0.2.18 → 0.2.19
Sign up to get free protection for your applications and to get access to all the features.
- 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
|