maestrano-connector-rails 2.0.1 → 2.0.2.pre.RC1
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/controllers/maestrano/connec_controller.rb +4 -3
- data/app/controllers/maestrano/synchronizations_controller.rb +11 -0
- data/app/helpers/maestrano/connector/rails/entity_helper.rb +22 -0
- data/app/jobs/maestrano/connector/rails/push_to_connec_job.rb +1 -1
- data/app/jobs/maestrano/connector/rails/synchronization_job.rb +4 -2
- data/app/models/maestrano/connector/rails/concerns/entity.rb +2 -2
- data/app/models/maestrano/connector/rails/organization.rb +32 -5
- data/config/routes.rb +1 -0
- data/db/migrate/20170202033323_update_organization_metadata.rb +15 -0
- data/lib/generators/connector/templates/home.js +1 -1
- data/lib/generators/connector/templates/home_controller.rb +9 -6
- data/lib/generators/connector/templates/home_index.haml +17 -9
- data/lib/generators/connector/templates/stylesheets/layout.sass +7 -0
- data/maestrano-connector-rails.gemspec +6 -4
- data/spec/controllers/connec_controller_spec.rb +17 -4
- data/spec/dummy/db/schema.rb +3 -1
- data/spec/integration/complex_id_references_spec.rb +1 -0
- data/spec/integration/complex_naming_spec.rb +1 -0
- data/spec/integration/complex_spec.rb +4 -1
- data/spec/integration/connec_to_external_spec.rb +8 -2
- data/spec/integration/external_to_connec_spec.rb +5 -1
- data/spec/integration/id_references_spec.rb +4 -1
- data/spec/integration/singleton_spec.rb +5 -1
- data/spec/jobs/push_to_connec_job_spec.rb +6 -2
- data/spec/jobs/synchronization_job_spec.rb +0 -8
- data/spec/models/entity_spec.rb +2 -0
- data/spec/models/organization_spec.rb +19 -4
- metadata +6 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 74dbb8e9c430a2e596fdd639adffb4c5ffe72b00
|
4
|
+
data.tar.gz: 2d7d7e742c74765d315728913e846bc31268bb2b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fc6c45a3e8b39444508ec0430fe001907135ff52591d44c4914a74aeb763e8a3ff3f905eb4438063a3d1bd5201e90c6962b82d570e045698514d394c71006b80
|
7
|
+
data.tar.gz: 72cfe2b906911c29480de3420934921e66a07495db4d89e5195883ecd8c6e33de95b50cbfdbe8a683961d51ab1b45fb133a1e08ac6a730d14b85b8269262e71f
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.0.
|
1
|
+
2.0.2.pre.RC1
|
@@ -49,7 +49,7 @@ class Maestrano::ConnecController < Maestrano::Rails::WebHookController
|
|
49
49
|
return false
|
50
50
|
end
|
51
51
|
|
52
|
-
unless organization.sync_enabled && organization.synchronized_entities[entity_class_hash[:name].to_sym]
|
52
|
+
unless organization.sync_enabled && organization.synchronized_entities[entity_class_hash[:name].to_sym][:can_push_to_external]
|
53
53
|
Maestrano::Connector::Rails::ConnectorLogger.log('info', organization, "Skipping notification from Connec! webhook, entity_name=\"#{entity_name}\"")
|
54
54
|
return false
|
55
55
|
end
|
@@ -58,12 +58,13 @@ class Maestrano::ConnecController < Maestrano::Rails::WebHookController
|
|
58
58
|
end
|
59
59
|
|
60
60
|
def find_entity_class(entity_name)
|
61
|
+
parametrised_entity_name = entity_name.parameterize('_').pluralize
|
61
62
|
Maestrano::Connector::Rails::External.entities_list.each do |entity_name_from_list|
|
62
63
|
clazz = "Entities::#{entity_name_from_list.singularize.titleize.split.join}".constantize
|
63
64
|
if clazz.methods.include?('connec_entities_names'.to_sym)
|
64
65
|
formatted_entities_names = clazz.connec_entities_names.map { |n| n.parameterize('_').pluralize }
|
65
|
-
return {class: clazz, is_complex: true, name: entity_name_from_list} if formatted_entities_names.include?(
|
66
|
-
elsif clazz.methods.include?('connec_entity_name'.to_sym) && clazz.normalized_connec_entity_name ==
|
66
|
+
return {class: clazz, is_complex: true, name: entity_name_from_list} if formatted_entities_names.include?(parametrised_entity_name)
|
67
|
+
elsif clazz.methods.include?('connec_entity_name'.to_sym) && clazz.normalized_connec_entity_name == parametrised_entity_name
|
67
68
|
return {class: clazz, is_complex: false, name: entity_name_from_list}
|
68
69
|
end
|
69
70
|
end
|
@@ -27,6 +27,17 @@ class Maestrano::SynchronizationsController < Maestrano::Rails::WebHookControlle
|
|
27
27
|
render_organization_sync(organization, status, 201)
|
28
28
|
end
|
29
29
|
|
30
|
+
def update_metadata
|
31
|
+
tenant = params[:tenant]
|
32
|
+
uid = params[:group_id]
|
33
|
+
organization = Maestrano::Connector::Rails::Organization.find_by(uid: uid, tenant: tenant)
|
34
|
+
return render json: {errors: [{message: 'Organization not found', code: 404}]}, status: :not_found unless organization
|
35
|
+
|
36
|
+
organization.set_instance_metadata
|
37
|
+
organization.reset_synchronized_entities
|
38
|
+
render_organization_sync(organization, status, 200)
|
39
|
+
end
|
40
|
+
|
30
41
|
def toggle_sync
|
31
42
|
tenant = params[:tenant]
|
32
43
|
uid = params[:group_id]
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Maestrano::Connector::Rails
|
2
|
+
module EntityHelper
|
3
|
+
def self.snake_name(entity)
|
4
|
+
class_name = entity.class.name.underscore.split('/').last
|
5
|
+
if entity.is_a?(Maestrano::Connector::Rails::SubEntityBase)
|
6
|
+
name = ''
|
7
|
+
Entities.constants&.each do |c|
|
8
|
+
klass = Entities.const_get(c)
|
9
|
+
next unless klass.respond_to?(:formatted_external_entities_names)
|
10
|
+
if klass.formatted_external_entities_names.values.include?(class_name.camelize) ||
|
11
|
+
klass.formatted_connec_entities_names.values.include?(class_name.camelize)
|
12
|
+
name = c
|
13
|
+
break
|
14
|
+
end
|
15
|
+
end
|
16
|
+
name.to_s.underscore.to_sym
|
17
|
+
else
|
18
|
+
class_name.to_sym
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -12,7 +12,7 @@ module Maestrano::Connector::Rails
|
|
12
12
|
|
13
13
|
entities_hash.each do |external_entity_name, entities|
|
14
14
|
if entity_instance_hash = find_entity_instance(external_entity_name, organization, connec_client, external_client, opts)
|
15
|
-
next unless organization.synchronized_entities[entity_instance_hash[:name].to_sym]
|
15
|
+
next unless organization.synchronized_entities[entity_instance_hash[:name].to_sym][:can_push_to_connec]
|
16
16
|
|
17
17
|
entity_instance = entity_instance_hash[:instance]
|
18
18
|
|
@@ -38,7 +38,8 @@ module Maestrano::Connector::Rails
|
|
38
38
|
# We also do batched sync as the first one can be quite huge
|
39
39
|
if last_synchronization.nil?
|
40
40
|
ConnectorLogger.log('info', organization, 'First synchronization ever. Doing two half syncs to allow smart merging to work its magic.')
|
41
|
-
organization.synchronized_entities.
|
41
|
+
organization.synchronized_entities.each do |entity, settings|
|
42
|
+
next unless settings[:can_push_to_connec] || settings[:can_push_to_external]
|
42
43
|
ConnectorLogger.log('info', organization, "First synchronization ever. Doing half sync from external for #{entity}.")
|
43
44
|
first_sync_entity(entity.to_s, organization, connec_client, external_client, last_synchronization_date, opts, true)
|
44
45
|
ConnectorLogger.log('info', organization, "First synchronization ever. Doing half sync from Connec! for #{entity}.")
|
@@ -52,7 +53,8 @@ module Maestrano::Connector::Rails
|
|
52
53
|
sync_entity(entity, organization, connec_client, external_client, last_synchronization_date, opts)
|
53
54
|
end
|
54
55
|
else
|
55
|
-
organization.synchronized_entities.
|
56
|
+
organization.synchronized_entities.each do |entity, settings|
|
57
|
+
next unless settings[:can_push_to_connec] || settings[:can_push_to_external]
|
56
58
|
sync_entity(entity.to_s, organization, connec_client, external_client, last_synchronization_date, opts)
|
57
59
|
end
|
58
60
|
end
|
@@ -253,7 +253,7 @@ module Maestrano::Connector::Rails::Concerns::Entity
|
|
253
253
|
# * connec_id and push timestamp
|
254
254
|
# * error message
|
255
255
|
def push_entities_to_connec_to(mapped_external_entities_with_idmaps, connec_entity_name)
|
256
|
-
return unless
|
256
|
+
return unless @organization.push_to_connec_enabled?(self)
|
257
257
|
|
258
258
|
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}")
|
259
259
|
|
@@ -304,7 +304,7 @@ module Maestrano::Connector::Rails::Concerns::Entity
|
|
304
304
|
# Pushes connec entities to the external application
|
305
305
|
# Sends new external ids to Connec! (either only the id, or the id + the id references)
|
306
306
|
def push_entities_to_external_to(mapped_connec_entities_with_idmaps, external_entity_name)
|
307
|
-
return unless
|
307
|
+
return unless @organization.push_to_external_enabled?(self)
|
308
308
|
|
309
309
|
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}")
|
310
310
|
|
@@ -15,7 +15,7 @@ module Maestrano::Connector::Rails
|
|
15
15
|
super
|
16
16
|
self.synchronized_entities = {}
|
17
17
|
External.entities_list.each do |entity|
|
18
|
-
self.synchronized_entities[entity.to_sym] = true
|
18
|
+
self.synchronized_entities[entity.to_sym] = {can_push_to_connec: true, can_push_to_external: true}
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
@@ -49,13 +49,13 @@ module Maestrano::Connector::Rails
|
|
49
49
|
|
50
50
|
def displayable_synchronized_entities
|
51
51
|
result = {}
|
52
|
-
synchronized_entities.each do |entity,
|
52
|
+
synchronized_entities.each do |entity, hash|
|
53
53
|
begin
|
54
54
|
clazz = "Entities::#{entity.to_s.titleize.split.join}".constantize
|
55
55
|
rescue
|
56
56
|
next
|
57
57
|
end
|
58
|
-
result[entity] = {
|
58
|
+
result[entity] = {connec_name: clazz.public_connec_entity_name, external_name: clazz.public_external_entity_name}.merge(hash)
|
59
59
|
end
|
60
60
|
result
|
61
61
|
end
|
@@ -115,10 +115,37 @@ module Maestrano::Connector::Rails
|
|
115
115
|
last_successful_synchronization&.updated_at || date_filtering_limit
|
116
116
|
end
|
117
117
|
|
118
|
-
def reset_synchronized_entities
|
118
|
+
def reset_synchronized_entities(default = false)
|
119
119
|
synchronized_entities.slice!(*External.entities_list.map(&:to_sym))
|
120
|
-
External.entities_list.each
|
120
|
+
External.entities_list.each do |entity|
|
121
|
+
if synchronized_entities[entity.to_sym].is_a?(Hash)
|
122
|
+
can_push_to_external = synchronized_entities[entity.to_sym][:can_push_to_external]
|
123
|
+
can_push_to_connec = synchronized_entities[entity.to_sym][:can_push_to_connec]
|
124
|
+
else
|
125
|
+
can_push_to_external = synchronized_entities[entity.to_sym]
|
126
|
+
can_push_to_connec = synchronized_entities[entity.to_sym]
|
127
|
+
end
|
128
|
+
synchronized_entities[entity.to_sym] = {can_push_to_connec: (can_push_to_connec || default) && !pull_disabled, can_push_to_external: (can_push_to_external || default) && !push_disabled}
|
129
|
+
end
|
121
130
|
save
|
122
131
|
end
|
132
|
+
|
133
|
+
def push_to_connec_enabled?(entity)
|
134
|
+
synchronized_entities.dig(EntityHelper.snake_name(entity), :can_push_to_connec) && entity&.class.can_write_connec?
|
135
|
+
end
|
136
|
+
|
137
|
+
def push_to_external_enabled?(entity)
|
138
|
+
synchronized_entities.dig(EntityHelper.snake_name(entity), :can_push_to_external) && entity&.class.can_write_external?
|
139
|
+
end
|
140
|
+
|
141
|
+
def set_instance_metadata
|
142
|
+
auth = {:username => Maestrano[tenant].param('api.id'), :password => Maestrano[tenant].param('api.key')}
|
143
|
+
res = HTTParty.get("#{ENV['HUB_HOST']}/api/v1/account/groups/#{uid}", :basic_auth => auth)
|
144
|
+
|
145
|
+
self.push_disabled = res.dig('data', 'metadata', 'push_disabled')
|
146
|
+
self.pull_disabled = res.dig('data', 'metadata', 'pull_disabled')
|
147
|
+
|
148
|
+
self.save
|
149
|
+
end
|
123
150
|
end
|
124
151
|
end
|
data/config/routes.rb
CHANGED
@@ -0,0 +1,15 @@
|
|
1
|
+
class UpdateOrganizationMetadata < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
add_column :organizations, :push_disabled, :boolean
|
4
|
+
add_column :organizations, :pull_disabled, :boolean
|
5
|
+
# Migration to update the way we handle synchronized_entities for data sharing.
|
6
|
+
# Before : synchronized_entities = {company: true}
|
7
|
+
# After: synchronized_entities = {company: {can_push_to_connec: true, can_push_to_external: true}}
|
8
|
+
|
9
|
+
#We also add metadata from MnoHub
|
10
|
+
Maestrano::Connector::Rails::Organization.all.each do |o|
|
11
|
+
o.set_instance_metadata
|
12
|
+
o.reset_synchronized_entities
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -5,15 +5,18 @@ class HomeController < ApplicationController
|
|
5
5
|
|
6
6
|
# Update list of entities to synchronize
|
7
7
|
current_organization.synchronized_entities.keys.each do |entity|
|
8
|
-
current_organization.synchronized_entities[entity] = params[entity.to_s]
|
8
|
+
current_organization.synchronized_entities[entity][:can_push_to_connec] = params[entity.to_s]["to_connec"] == "1"
|
9
|
+
current_organization.synchronized_entities[entity][:can_push_to_external] = params[entity.to_s]["to_external"] == "1"
|
9
10
|
end
|
11
|
+
full_sync = params['historical-data'].present? && !current_organization.historical_data
|
12
|
+
opts = {full_sync: full_sync}
|
10
13
|
current_organization.sync_enabled = current_organization.synchronized_entities.values.any?
|
11
14
|
current_organization.enable_historical_data(params['historical-data'].present?)
|
12
|
-
trigger_sync = current_organization.sync_enabled
|
15
|
+
trigger_sync = current_organization.sync_enabled
|
13
16
|
current_organization.save
|
14
17
|
|
15
18
|
# Trigger sync only if the sync has been enabled
|
16
|
-
start_synchronization if trigger_sync
|
19
|
+
start_synchronization(opts) if trigger_sync
|
17
20
|
|
18
21
|
redirect_to(:back)
|
19
22
|
end
|
@@ -32,8 +35,8 @@ class HomeController < ApplicationController
|
|
32
35
|
|
33
36
|
private
|
34
37
|
|
35
|
-
def start_synchronization
|
36
|
-
Maestrano::Connector::Rails::SynchronizationJob.perform_later(current_organization.id,
|
37
|
-
flash[:info] = 'Congrats, you\'re all set up! Your data are now being synced'
|
38
|
+
def start_synchronization(opts)
|
39
|
+
Maestrano::Connector::Rails::SynchronizationJob.perform_later(current_organization.id, opts)
|
40
|
+
flash[:info] = 'Congrats, you\'re all set up! Your data are now being synced' if current_organization.sync_enabled_changed?
|
38
41
|
end
|
39
42
|
end
|
@@ -4,7 +4,7 @@
|
|
4
4
|
.banners
|
5
5
|
.row
|
6
6
|
.col-md-10.col-md-offset-2
|
7
|
-
%
|
7
|
+
%h1 ApplicationName Connector
|
8
8
|
%p
|
9
9
|
-if current_organization
|
10
10
|
Link your company <strong>#{current_organization.name} (#{current_organization.uid})</strong> to ApplicationName to get your business in synch. Check the status of your connection on this screen.
|
@@ -23,7 +23,7 @@
|
|
23
23
|
%span.badge.link-step-badge
|
24
24
|
1
|
25
25
|
.col-md-6.link-step-description
|
26
|
-
%
|
26
|
+
%p
|
27
27
|
- if current_organization.oauth_uid
|
28
28
|
Your ApplicationName account <strong>#{current_organization.oauth_name} (#{current_organization.oauth_uid})</strong> is currently linked
|
29
29
|
- else
|
@@ -44,22 +44,30 @@
|
|
44
44
|
.col-md-1.text-center.link-step-number
|
45
45
|
%span.badge.link-step-badge 2
|
46
46
|
.col-md-9.link-step-description
|
47
|
-
%
|
47
|
+
%p You can customize which entities are synchronized by the connector:
|
48
|
+
%p (#{image_tag "logos/to_connec.png", class: "small-image"} : from ApplicationName to Connec! and #{image_tag "logos/to_external.png", class: "small-image"} : from Connec! to ApplicationName)
|
48
49
|
.spacer1
|
49
50
|
.row
|
50
51
|
.col-md-11.col-md-offset-1.center
|
51
|
-
.
|
52
|
-
|
53
|
-
|
54
|
-
|
52
|
+
.row
|
53
|
+
.col-md-1
|
54
|
+
=image_tag "logos/to_connec.png", class: "image"
|
55
|
+
.col-md-1
|
56
|
+
=image_tag "logos/to_external.png", class: "image"
|
57
|
+
.col-md-4
|
58
|
+
Vend wording
|
59
|
+
.col-md-3
|
60
|
+
Universal wording
|
55
61
|
.spacer1
|
56
62
|
.row
|
57
63
|
.col-md-11.col-md-offset-1
|
58
64
|
- current_organization.displayable_synchronized_entities.each do |k, v|
|
59
65
|
.row.sync-entity
|
60
66
|
.col-md-1.link-step-action
|
61
|
-
|
62
|
-
|
67
|
+
#{check_box("#{k}", "to_connec", {checked: (v[:can_push_to_connec] || v[:can_push_to_external]) && !current_organization.pull_disabled, onclick: "return !#{k}_to_external.checked;", disabled: current_organization.pull_disabled})}
|
68
|
+
.col-md-1.link-step-action
|
69
|
+
#{check_box("#{k}", "to_external", {checked: v[:can_push_to_external] && !current_organization.push_disabled, onchange: "#{k}_to_connec.checked = #{!current_organization.pull_disabled};", disabled: current_organization.push_disabled})}
|
70
|
+
%label.col-md-7{:for => "#{k}", style: 'padding-top: 5px;'}
|
63
71
|
.col-md-6
|
64
72
|
#{v[:external_name]}
|
65
73
|
.col-md-6
|
@@ -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 2.0.
|
5
|
+
# stub: maestrano-connector-rails 2.0.2.pre.RC1 ruby lib
|
6
6
|
|
7
7
|
Gem::Specification.new do |s|
|
8
8
|
s.name = "maestrano-connector-rails".freeze
|
9
|
-
s.version = "2.0.
|
9
|
+
s.version = "2.0.2.pre.RC1"
|
10
10
|
|
11
|
-
s.required_rubygems_version = Gem::Requirement.new("
|
11
|
+
s.required_rubygems_version = Gem::Requirement.new("> 1.3.1".freeze) if s.respond_to? :required_rubygems_version=
|
12
12
|
s.require_paths = ["lib".freeze]
|
13
13
|
s.authors = ["Maestrano".freeze]
|
14
|
-
s.date = "2017-
|
14
|
+
s.date = "2017-02-02"
|
15
15
|
s.description = "Maestrano is the next generation marketplace for SME applications. See https://sme.maestrano.com for details.".freeze
|
16
16
|
s.email = "developers@maestrano.com".freeze
|
17
17
|
s.executables = ["rails".freeze, "rake".freeze]
|
@@ -41,6 +41,7 @@ Gem::Specification.new do |s|
|
|
41
41
|
"app/controllers/maestrano/sessions_controller.rb",
|
42
42
|
"app/controllers/maestrano/synchronizations_controller.rb",
|
43
43
|
"app/controllers/version_controller.rb",
|
44
|
+
"app/helpers/maestrano/connector/rails/entity_helper.rb",
|
44
45
|
"app/helpers/maestrano/connector/rails/session_helper.rb",
|
45
46
|
"app/jobs/maestrano/connector/rails/all_synchronizations_job.rb",
|
46
47
|
"app/jobs/maestrano/connector/rails/push_to_connec_job.rb",
|
@@ -82,6 +83,7 @@ Gem::Specification.new do |s|
|
|
82
83
|
"db/migrate/20160614160654_add_encryption_on_oauth_keys.rb",
|
83
84
|
"db/migrate/20161011005751_add_unique_index_on_organization_oauth_uid.rb",
|
84
85
|
"db/migrate/20161018155513_add_org_uid_to_organization.rb",
|
86
|
+
"db/migrate/20170202033323_update_organization_metadata.rb",
|
85
87
|
"lib/generators/connector/USAGE",
|
86
88
|
"lib/generators/connector/complex_entity_generator.rb",
|
87
89
|
"lib/generators/connector/install_generator.rb",
|
@@ -76,7 +76,7 @@ describe Maestrano::ConnecController, type: :controller do
|
|
76
76
|
before {
|
77
77
|
allow(Entities::ContactAndLead).to receive(:external_entities_names).and_return(%w())
|
78
78
|
}
|
79
|
-
let!(:organization) { create(:organization, uid: group_id, oauth_uid: 'lala', sync_enabled: true
|
79
|
+
let!(:organization) { create(:organization, uid: group_id, oauth_uid: 'lala', sync_enabled: true) }
|
80
80
|
|
81
81
|
it 'process the data and push them' do
|
82
82
|
expect_any_instance_of(Entities::ContactAndLead).to receive(:before_sync)
|
@@ -130,7 +130,7 @@ describe Maestrano::ConnecController, type: :controller do
|
|
130
130
|
|
131
131
|
context 'with a valid organization' do
|
132
132
|
context 'with sync disabled' do
|
133
|
-
let!(:organization) { create(:organization, uid: group_id, oauth_uid: 'lala', sync_enabled: false
|
133
|
+
let!(:organization) { create(:organization, uid: group_id, oauth_uid: 'lala', sync_enabled: false) }
|
134
134
|
|
135
135
|
it 'does nothing' do
|
136
136
|
expect(Maestrano::Connector::Rails::External).to_not receive(:get_client).with(organization)
|
@@ -139,7 +139,7 @@ describe Maestrano::ConnecController, type: :controller do
|
|
139
139
|
end
|
140
140
|
|
141
141
|
context 'with sync disabled for this entity' do
|
142
|
-
let!(:organization) { create(:organization, uid: group_id, oauth_uid: 'lala', sync_enabled: true, synchronized_entities: {person: false}) }
|
142
|
+
let!(:organization) { create(:organization, uid: group_id, oauth_uid: 'lala', sync_enabled: true, synchronized_entities: {person: {can_push_to_connec: false}}) }
|
143
143
|
|
144
144
|
it 'does nothing' do
|
145
145
|
expect(Maestrano::Connector::Rails::External).to_not receive(:get_client).with(organization)
|
@@ -148,7 +148,7 @@ describe Maestrano::ConnecController, type: :controller do
|
|
148
148
|
end
|
149
149
|
|
150
150
|
context "when syncing" do
|
151
|
-
let!(:organization) { create(:organization, uid: group_id, oauth_uid: 'lala', sync_enabled: true
|
151
|
+
let!(:organization) { create(:organization, uid: group_id, oauth_uid: 'lala', sync_enabled: true) }
|
152
152
|
|
153
153
|
it 'process the data and push them' do
|
154
154
|
expect_any_instance_of(Entities::Person).to receive(:before_sync)
|
@@ -158,6 +158,19 @@ describe Maestrano::ConnecController, type: :controller do
|
|
158
158
|
expect_any_instance_of(Entities::Person).to receive(:after_sync)
|
159
159
|
subject
|
160
160
|
end
|
161
|
+
|
162
|
+
context 'with different entity name case and singular' do
|
163
|
+
let(:notifications) { {'Person' => [entity]} }
|
164
|
+
|
165
|
+
it 'process the data and push them' do
|
166
|
+
expect_any_instance_of(Entities::Person).to receive(:before_sync)
|
167
|
+
expect_any_instance_of(Entities::Person).to receive(:filter_connec_entities).and_return([entity])
|
168
|
+
expect_any_instance_of(Entities::Person).to receive(:consolidate_and_map_data).with([entity], []).and_return({})
|
169
|
+
expect_any_instance_of(Entities::Person).to receive(:push_entities_to_external)
|
170
|
+
expect_any_instance_of(Entities::Person).to receive(:after_sync)
|
171
|
+
subject
|
172
|
+
end
|
173
|
+
end
|
161
174
|
end
|
162
175
|
end
|
163
176
|
end
|
data/spec/dummy/db/schema.rb
CHANGED
@@ -11,7 +11,7 @@
|
|
11
11
|
#
|
12
12
|
# It's strongly recommended that you check this file into your version control system.
|
13
13
|
|
14
|
-
ActiveRecord::Schema.define(version:
|
14
|
+
ActiveRecord::Schema.define(version: 20170202033323) do
|
15
15
|
|
16
16
|
create_table "id_maps", force: :cascade do |t|
|
17
17
|
t.string "connec_id"
|
@@ -56,6 +56,8 @@ ActiveRecord::Schema.define(version: 20161018155513) do
|
|
56
56
|
t.string "encrypted_refresh_token_iv"
|
57
57
|
t.string "encrypted_refresh_token_salt"
|
58
58
|
t.string "org_uid"
|
59
|
+
t.boolean "push_disabled"
|
60
|
+
t.boolean "pull_disabled"
|
59
61
|
end
|
60
62
|
|
61
63
|
add_index "organizations", ["oauth_uid"], name: "index_organizations_on_oauth_uid", unique: true
|
@@ -90,6 +90,7 @@ describe 'complex id references' do
|
|
90
90
|
|
91
91
|
before {
|
92
92
|
allow(Maestrano::Connector::Rails::External).to receive(:entities_list).and_return(%w(id_payment))
|
93
|
+
organization.reset_synchronized_entities(true)
|
93
94
|
|
94
95
|
allow(connec_client).to receive(:get).and_return(ActionDispatch::Response.new(200, {}, {idpayments: [connec_payment]}.to_json, {}))
|
95
96
|
allow(connec_client).to receive(:batch).and_return(ActionDispatch::Response.new(200, {}, {results: [{status: 200, body: {payments: {}}}]}.to_json, {}))
|
@@ -87,6 +87,7 @@ describe 'complex entity subentities naming conflict' do
|
|
87
87
|
|
88
88
|
before {
|
89
89
|
allow(Maestrano::Connector::Rails::External).to receive(:entities_list).and_return(%w(name_payment))
|
90
|
+
organization.reset_synchronized_entities(true)
|
90
91
|
}
|
91
92
|
|
92
93
|
subject { Maestrano::Connector::Rails::SynchronizationJob.new.sync_entity('name_payment', organization, connec_client, external_client, organization.last_synchronization_date, {}) }
|
@@ -212,14 +212,17 @@ describe 'complex entities workflow' do
|
|
212
212
|
}
|
213
213
|
}
|
214
214
|
let!(:supplier_idmap) { Entities::SubEntities::CompSupplier.create_idmap(organization_id: organization.id, external_id: ext_supplier_id, connec_entity: 'comporganization') }
|
215
|
+
let(:entity_name) { 'customer_and_supplier' }
|
215
216
|
|
216
217
|
before do
|
217
218
|
allow(connec_client).to receive(:get).and_return(ActionDispatch::Response.new(200, {}, {comporganizations: connec_orgs}.to_json, {}))
|
218
219
|
allow_any_instance_of(Entities::SubEntities::CompCustomer).to receive(:get_external_entities).and_return([ext_customer])
|
219
220
|
allow_any_instance_of(Entities::SubEntities::CompSupplier).to receive(:get_external_entities).and_return([ext_supplier])
|
221
|
+
allow(Maestrano::Connector::Rails::External).to receive(:entities_list).and_return([entity_name])
|
222
|
+
organization.reset_synchronized_entities(true)
|
220
223
|
end
|
221
224
|
|
222
|
-
subject { Maestrano::Connector::Rails::SynchronizationJob.new.sync_entity(
|
225
|
+
subject { Maestrano::Connector::Rails::SynchronizationJob.new.sync_entity(entity_name, organization, connec_client, external_client, nil, {}) }
|
223
226
|
|
224
227
|
it 'handles the fetching correctly' do
|
225
228
|
expect_any_instance_of(Entities::CustomerAndSupplier).to receive(:consolidate_and_map_data).with({'CompOrganization' => connec_orgs}, {'CompCustomer' => [ext_customer], 'CompSupplier' => [ext_supplier]}).and_return({connec_entities: [], external_entities: []})
|
@@ -88,15 +88,18 @@ describe 'connec to the external application' do
|
|
88
88
|
}
|
89
89
|
}
|
90
90
|
let(:person) { person1 }
|
91
|
+
let(:entity_name) { 'connec_to_external' }
|
91
92
|
|
92
93
|
before do
|
93
94
|
allow(connec_client).to receive(:get).and_return(ActionDispatch::Response.new(200, {}, {people: [person]}.to_json, {}))
|
94
95
|
allow(connec_client).to receive(:batch).and_return(ActionDispatch::Response.new(200, {}, {results: [{status: 200, body: {people: {}}}]}.to_json, {}))
|
95
96
|
|
96
97
|
allow_any_instance_of(Entities::ConnecToExternal).to receive(:get_external_entities).and_return([])
|
98
|
+
allow(Maestrano::Connector::Rails::External).to receive(:entities_list).and_return([entity_name])
|
99
|
+
organization.reset_synchronized_entities(true)
|
97
100
|
end
|
98
101
|
|
99
|
-
subject { Maestrano::Connector::Rails::SynchronizationJob.new.sync_entity(
|
102
|
+
subject { Maestrano::Connector::Rails::SynchronizationJob.new.sync_entity(entity_name, organization, connec_client, external_client, organization.last_synchronization_date, {}) }
|
100
103
|
|
101
104
|
describe 'a new record created in connec with all references known' do
|
102
105
|
before {
|
@@ -228,11 +231,14 @@ describe 'connec to the external application' do
|
|
228
231
|
|
229
232
|
describe 'a creation from connec where the creation_only_mapper has to be used' do
|
230
233
|
#idmap.last_push_to_external is nil
|
234
|
+
let(:entity_name) { 'connec_to_external_missing_field' }
|
231
235
|
before do
|
232
236
|
allow_any_instance_of(Entities::ConnecToExternalMissingField).to receive(:get_external_entities).and_return([])
|
237
|
+
allow(Maestrano::Connector::Rails::External).to receive(:entities_list).and_return([entity_name])
|
238
|
+
organization.reset_synchronized_entities(true)
|
233
239
|
end
|
234
240
|
|
235
|
-
subject { Maestrano::Connector::Rails::SynchronizationJob.new.sync_entity(
|
241
|
+
subject { Maestrano::Connector::Rails::SynchronizationJob.new.sync_entity(entity_name, organization, connec_client, external_client, organization.last_synchronization_date, {}) }
|
236
242
|
|
237
243
|
class Entities::ConnecToExternalMissingField < Entities::ConnecToExternal
|
238
244
|
|
@@ -88,12 +88,16 @@ describe 'external application to connec' do
|
|
88
88
|
}
|
89
89
|
}
|
90
90
|
|
91
|
+
let(:entity_name) { 'external_to_connec' }
|
92
|
+
|
91
93
|
before {
|
92
94
|
allow_any_instance_of(Entities::ExternalToConnec).to receive(:get_connec_entities).and_return([])
|
93
95
|
allow_any_instance_of(Entities::ExternalToConnec).to receive(:get_external_entities).and_return([contact])
|
96
|
+
allow(Maestrano::Connector::Rails::External).to receive(:entities_list).and_return([entity_name])
|
97
|
+
organization.reset_synchronized_entities(true)
|
94
98
|
}
|
95
99
|
|
96
|
-
subject { Maestrano::Connector::Rails::SynchronizationJob.new.sync_entity(
|
100
|
+
subject { Maestrano::Connector::Rails::SynchronizationJob.new.sync_entity(entity_name, organization, connec_client, external_client, nil, {}) }
|
97
101
|
|
98
102
|
describe 'creating an record in connec' do
|
99
103
|
before {
|
@@ -58,6 +58,7 @@ describe 'id references' do
|
|
58
58
|
let(:ext_line_id2) { 'ext line id2' }
|
59
59
|
|
60
60
|
let(:payment_title) { 'This is a payment' }
|
61
|
+
let(:entity_name) { 'id_reference' }
|
61
62
|
|
62
63
|
|
63
64
|
before {
|
@@ -65,9 +66,11 @@ describe 'id references' do
|
|
65
66
|
allow(connec_client).to receive(:batch).and_return(ActionDispatch::Response.new(200, {}, {results: [{status: 200, body: {payments: {}}}]}.to_json, {}))
|
66
67
|
|
67
68
|
allow_any_instance_of(Entities::IdReference).to receive(:get_external_entities).and_return([])
|
69
|
+
allow(Maestrano::Connector::Rails::External).to receive(:entities_list).and_return([entity_name])
|
70
|
+
organization.reset_synchronized_entities(true)
|
68
71
|
}
|
69
72
|
|
70
|
-
subject { Maestrano::Connector::Rails::SynchronizationJob.new.sync_entity(
|
73
|
+
subject { Maestrano::Connector::Rails::SynchronizationJob.new.sync_entity(entity_name, organization, connec_client, external_client, organization.last_synchronization_date, {}) }
|
71
74
|
|
72
75
|
describe 'a creation from connec' do
|
73
76
|
before {
|
@@ -85,15 +85,19 @@ describe 'singleton workflow' do
|
|
85
85
|
}
|
86
86
|
}
|
87
87
|
|
88
|
+
let(:synchronized_entity) { "singleton_integration" }
|
89
|
+
|
88
90
|
|
89
91
|
before {
|
90
92
|
allow(connec_client).to receive(:get).and_return(ActionDispatch::Response.new(200, {}, {company: company}.to_json, {}))
|
91
93
|
allow_any_instance_of(Entities::SingletonIntegration).to receive(:get_external_entities).and_return(ext_company)
|
92
94
|
allow_any_instance_of(Entities::SingletonIntegration).to receive(:update_external_entity).and_return(nil)
|
93
95
|
allow(connec_client).to receive(:batch).and_return(ActionDispatch::Response.new(200, {}, {results: [{status: 200, body: {company: {id: [{provider: 'connec', id: 'some connec id'}]}}}]}.to_json, {}))
|
96
|
+
allow(Maestrano::Connector::Rails::External).to receive(:entities_list).and_return([synchronized_entity])
|
97
|
+
organization.reset_synchronized_entities(true)
|
94
98
|
}
|
95
99
|
|
96
|
-
subject { Maestrano::Connector::Rails::SynchronizationJob.new.sync_entity(
|
100
|
+
subject { Maestrano::Connector::Rails::SynchronizationJob.new.sync_entity(synchronized_entity, organization, connec_client, external_client, nil, {}) }
|
97
101
|
|
98
102
|
|
99
103
|
describe 'when no idmap' do
|
@@ -60,7 +60,9 @@ describe Maestrano::Connector::Rails::PushToConnecJob do
|
|
60
60
|
describe 'with entities in synchronized entities' do
|
61
61
|
|
62
62
|
describe 'complex entity' do
|
63
|
-
|
63
|
+
let(:hash1) { {can_push_to_connec: false, can_push_to_external: false} }
|
64
|
+
let(:hash2) { {can_push_to_connec: true, can_push_to_external: true} }
|
65
|
+
before { organization.update(synchronized_entities: {:"#{entity_name1}" => hash1, :"#{entity_name2}" => hash2})}
|
64
66
|
|
65
67
|
it 'calls consolidate and map data on the complex entity with the right arguments' do
|
66
68
|
expect_any_instance_of(Entities::Entity2).to receive(:consolidate_and_map_data).with({"Connec name" => []}, {"Subs"=>[entity21], "ll"=>[]})
|
@@ -81,7 +83,9 @@ describe Maestrano::Connector::Rails::PushToConnecJob do
|
|
81
83
|
end
|
82
84
|
|
83
85
|
describe 'non complex entity' do
|
84
|
-
|
86
|
+
let(:hash1) { {can_push_to_connec: true, can_push_to_external: true} }
|
87
|
+
let(:hash2) { {can_push_to_connec: false, can_push_to_external: false} }
|
88
|
+
before { organization.update(synchronized_entities: {:"#{entity_name1}" => hash1, :"#{entity_name2}" => hash2})}
|
85
89
|
|
86
90
|
it 'calls consolidate_and_map_data on the non complex entity with the right arguments' do
|
87
91
|
expect_any_instance_of(Entities::Entity1).to receive(:consolidate_and_map_data).with([], [entity11, entity12]).and_return({})
|
@@ -80,14 +80,6 @@ describe Maestrano::Connector::Rails::SynchronizationJob do
|
|
80
80
|
|
81
81
|
it { performes }
|
82
82
|
|
83
|
-
it 'calls sync entity on all the organization synchronized entities set to true' do
|
84
|
-
organization.synchronized_entities[organization.synchronized_entities.keys.first] = false
|
85
|
-
organization.save
|
86
|
-
expect_any_instance_of(Maestrano::Connector::Rails::SynchronizationJob).to receive(:sync_entity).exactly(organization.synchronized_entities.count - 1).times
|
87
|
-
|
88
|
-
subject
|
89
|
-
end
|
90
|
-
|
91
83
|
context 'with options' do
|
92
84
|
context 'with only_entities' do
|
93
85
|
let(:opts) { {only_entities: %w(people price)} }
|
data/spec/models/entity_spec.rb
CHANGED
@@ -154,6 +154,8 @@ describe Maestrano::Connector::Rails::Entity do
|
|
154
154
|
before do
|
155
155
|
allow(subject.class).to receive(:connec_entity_name).and_return(connec_name)
|
156
156
|
allow(subject.class).to receive(:external_entity_name).and_return(external_name)
|
157
|
+
allow(Maestrano::Connector::Rails::External).to receive(:entities_list).and_return(%w(entity))
|
158
|
+
organization.reset_synchronized_entities(true)
|
157
159
|
end
|
158
160
|
|
159
161
|
describe 'Mapper methods' do
|
@@ -209,19 +209,34 @@ describe Maestrano::Connector::Rails::Organization do
|
|
209
209
|
end
|
210
210
|
|
211
211
|
describe '#reset_synchronized_entities' do
|
212
|
-
let(:
|
212
|
+
let(:hash1) { {can_push_to_connec: true, can_push_to_external: true} }
|
213
|
+
let(:hash2) { {can_push_to_connec: false, can_push_to_external: false} }
|
214
|
+
let(:organization) { create(:organization, synchronized_entities: {entity1: true, entity2: true, tomatoes: false}) }
|
213
215
|
subject { organization.reset_synchronized_entities }
|
214
216
|
|
215
217
|
it 'keeps only the known entities' do
|
216
218
|
subject
|
217
|
-
expect(organization.synchronized_entities).to eql(entity1:
|
219
|
+
expect(organization.synchronized_entities).to eql(entity1: hash1, entity2: hash1)
|
218
220
|
end
|
219
221
|
|
220
222
|
it 'adds missing entities' do
|
221
|
-
organization.update_attributes(synchronized_entities: {entity1: true, tomatoes:
|
223
|
+
organization.update_attributes(synchronized_entities: {entity1: true, tomatoes: false})
|
222
224
|
|
223
225
|
subject
|
224
|
-
expect(organization.synchronized_entities).to eql(entity1:
|
226
|
+
expect(organization.synchronized_entities).to eql(entity1: hash1, entity2: hash2)
|
227
|
+
end
|
228
|
+
|
229
|
+
context 'with metadata from mnohub' do
|
230
|
+
before {
|
231
|
+
organization.push_disabled = true
|
232
|
+
organization.pull_disabled = true
|
233
|
+
}
|
234
|
+
|
235
|
+
|
236
|
+
it 'takes into account the metadata' do
|
237
|
+
subject
|
238
|
+
expect(organization.synchronized_entities).to eql(entity1: hash2, entity2: hash2)
|
239
|
+
end
|
225
240
|
end
|
226
241
|
end
|
227
242
|
end
|
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: 2.0.
|
4
|
+
version: 2.0.2.pre.RC1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Maestrano
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-02-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -420,6 +420,7 @@ files:
|
|
420
420
|
- app/controllers/maestrano/sessions_controller.rb
|
421
421
|
- app/controllers/maestrano/synchronizations_controller.rb
|
422
422
|
- app/controllers/version_controller.rb
|
423
|
+
- app/helpers/maestrano/connector/rails/entity_helper.rb
|
423
424
|
- app/helpers/maestrano/connector/rails/session_helper.rb
|
424
425
|
- app/jobs/maestrano/connector/rails/all_synchronizations_job.rb
|
425
426
|
- app/jobs/maestrano/connector/rails/push_to_connec_job.rb
|
@@ -461,6 +462,7 @@ files:
|
|
461
462
|
- db/migrate/20160614160654_add_encryption_on_oauth_keys.rb
|
462
463
|
- db/migrate/20161011005751_add_unique_index_on_organization_oauth_uid.rb
|
463
464
|
- db/migrate/20161018155513_add_org_uid_to_organization.rb
|
465
|
+
- db/migrate/20170202033323_update_organization_metadata.rb
|
464
466
|
- lib/generators/connector/USAGE
|
465
467
|
- lib/generators/connector/complex_entity_generator.rb
|
466
468
|
- lib/generators/connector/install_generator.rb
|
@@ -610,9 +612,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
610
612
|
version: '0'
|
611
613
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
612
614
|
requirements:
|
613
|
-
- - "
|
615
|
+
- - ">"
|
614
616
|
- !ruby/object:Gem::Version
|
615
|
-
version:
|
617
|
+
version: 1.3.1
|
616
618
|
requirements: []
|
617
619
|
rubyforge_project:
|
618
620
|
rubygems_version: 2.6.8
|