maestrano-connector-rails 0.2.0 → 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/DEVELOPER.md +1 -1
  3. data/README.md +5 -3
  4. data/VERSION +1 -1
  5. data/app/controllers/maestrano/connec_controller.rb +62 -0
  6. data/app/jobs/maestrano/connector/rails/synchronization_job.rb +1 -0
  7. data/app/models/maestrano/connector/rails/id_map.rb +0 -1
  8. data/app/models/maestrano/connector/rails/organization.rb +0 -1
  9. data/app/models/maestrano/connector/rails/synchronization.rb +0 -1
  10. data/app/models/maestrano/connector/rails/user.rb +0 -1
  11. data/app/models/maestrano/connector/rails/user_organization_rel.rb +0 -1
  12. data/config/routes.rb +3 -22
  13. data/db/migrate/20151122162100_create_users.rb +16 -0
  14. data/db/migrate/{20151122162414_create_maestrano_connector_rails_organizations.rb → 20151122162414_create_organizations.rb} +3 -3
  15. data/db/migrate/20151122162613_create_user_organization_rels.rb +12 -0
  16. data/db/migrate/20151122163325_create_synchronizations.rb +13 -0
  17. data/db/migrate/20151122163449_create_id_maps.rb +18 -0
  18. data/db/migrate/20160205132857_add_sync_enabled_to_organizations.rb +5 -0
  19. data/lib/generators/connector/install_generator.rb +2 -1
  20. data/lib/generators/connector/templates/admin_controller.rb +10 -0
  21. data/lib/generators/connector/templates/admin_index.html.erb +6 -2
  22. data/lib/generators/connector/templates/home_index.html.erb +6 -0
  23. data/maestrano-connector-rails.gemspec +23 -9
  24. data/spec/controllers/connec_controller_spec.rb +144 -0
  25. data/spec/dummy/db/development.sqlite3 +0 -0
  26. data/spec/dummy/db/migrate/20160204223447_create_users.maestrano_connector_rails_engine.rb +17 -0
  27. data/spec/dummy/db/migrate/20160204223448_create_organizations.maestrano_connector_rails_engine.rb +22 -0
  28. data/spec/dummy/db/migrate/20160204223449_create_user_organization_rels.maestrano_connector_rails_engine.rb +13 -0
  29. data/spec/dummy/db/migrate/20160204223450_create_synchronizations.maestrano_connector_rails_engine.rb +14 -0
  30. data/spec/dummy/db/migrate/20160204223451_create_id_maps.maestrano_connector_rails_engine.rb +19 -0
  31. data/spec/dummy/db/migrate/20160205133024_add_sync_enabled_to_organizations.maestrano_connector_rails_engine.rb +6 -0
  32. data/spec/dummy/db/schema.rb +17 -16
  33. data/spec/dummy/db/test.sqlite3 +0 -0
  34. data/spec/jobs/syncrhonization_job_spec.rb +33 -18
  35. data/spec/routing/connec_routing_spec.rb +12 -0
  36. data/spec/spec_helper.rb +3 -0
  37. data/template/factories.rb +23 -0
  38. data/template/gitignore +20 -0
  39. data/template/maestrano-connector-template.rb +85 -0
  40. data/template/spec_helper.rb +22 -0
  41. metadata +21 -7
  42. data/db/migrate/20151122162100_create_maestrano_connector_rails_users.rb +0 -16
  43. data/db/migrate/20151122162613_create_maestrano_connector_rails_user_organization_rels.rb +0 -12
  44. data/db/migrate/20151122163325_create_maestrano_connector_rails_synchronizations.rb +0 -13
  45. data/db/migrate/20151122163449_create_maestrano_connector_rails_id_maps.rb +0 -18
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c188e34977256c1d84f9fd43bd026233acf2833f
4
- data.tar.gz: d7cf8ca5aa83e6ab639fa1ca2b71ef7a48614f47
3
+ metadata.gz: cb050d36d97af9d68812330c80a035c9c91fb28b
4
+ data.tar.gz: ebe39a369c26144236473fc9a9da62c381c95c62
5
5
  SHA512:
6
- metadata.gz: 0ce346b75f378364d2d74922f6c0950713ec1b9f8f6dec9753e2194a2b2be0631d6acc8a6dfbd1c96b8d8c15dbfa638e8b58829eb62f98e6d2e2e705cb22e81e
7
- data.tar.gz: 4d1c4050ee4ac5a88ed3c722d8ff3663de69ba5a69d105a60263d046d13b661bdce424c427f045ea9136cf6d27b4fd89cd6c7f8edd903eff622614964e189f78
6
+ metadata.gz: b0680266b20d2ceed8569d483d38788bd42afc935af499b1e94cfd3aa9534b066deca706d98ee60355b35321cd153cc6d30e238b3f517e2bff1ac73d4a0284ab
7
+ data.tar.gz: 1bdc3afa7d0e70a3b8752d1a0ba7650074249ecd1b17d7d2cd02ebf3efdf7f836f4ce90820a995064c4d3635f7ee51b070c792e669a75fb153102a7e1c19e8db
data/DEVELOPER.md CHANGED
@@ -4,7 +4,7 @@ Release the gem using jeweler
4
4
 
5
5
  ``` bash
6
6
  gem install jeweler
7
- bundle exec rake version:bump:minor
7
+ bundle exec rake version:bump:patch
8
8
  bundle exec rake gemspec:release
9
9
  bundle exec rake release
10
10
  ```
data/README.md CHANGED
@@ -1,5 +1,7 @@
1
+ [ ![Codeship Status for maestrano/maestrano-connector-rails](https://codeship.com/projects/e7990b70-b04d-0133-c4e7-5e399acd7f73/status?branch=master)](https://codeship.com/projects/132645)
2
+
1
3
  <p align="center">
2
- <img src="https://raw.github.com/berardpi/maestrano-connector-rails/master/maestrano.png" alt="Maestrano Logo">
4
+ <img src="https://raw.github.com/maestrano/maestrano-connector-rails/master/maestrano.png" alt="Maestrano Logo">
3
5
  <br/>
4
6
  <br/>
5
7
  </p>
@@ -29,7 +31,7 @@ Before integrating with us you will need an Connec!™ API ID and Connec!™ API
29
31
  ## Getting Started
30
32
  Create a new rails application using the connector template
31
33
  ```console
32
- rails new <project_name> -m https://raw.githubusercontent.com/Berardpi/maestrano-connector-template/master/maestrano-connector-template.rb
34
+ rails new <project_name> -m https://raw.githubusercontent.com/Berardpi/maestrano-connector-rails/master/template/maestrano-connector-template.rb
33
35
  ```
34
36
 
35
37
  If and only if you have an error in the template's rails generate step, you'll need to re-run the following command in your project folder:
@@ -135,4 +137,4 @@ rails g connector:complex_entity
135
137
 
136
138
  This will generate some example files demonstrating a 1 to 2 correspondance between Connec!™ person and external contact and lead data models.
137
139
 
138
- The complex entities workflow uses two methods to pre-process data which you have to implements for each complex entity (see contact_and_lead.rb). They are called before the mapping step, and you can use them to perform any data model specific operations.
140
+ The complex entities workflow uses two methods to pre-process data which you have to implements for each complex entity (see contact_and_lead.rb). They are called before the mapping step, and you can use them to perform any data model specific operations.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.0
1
+ 0.2.2
@@ -0,0 +1,62 @@
1
+ class Maestrano::ConnecController < Maestrano::Rails::WebHookController
2
+
3
+ def notifications
4
+ Rails.logger.debug "Received notification from Connec!: #{params}"
5
+
6
+ begin
7
+ params['notification'].each do |entity_name, entities|
8
+ if entity_instance_hash = find_entity_instance(entity_name)
9
+ entity_instance = entity_instance_hash[:instance]
10
+
11
+ entities.each do |entity|
12
+ if (organization = Maestrano::Connector::Rails::Organization.find_by(uid: entity[:group_id], tenant: params[:tenant])) && organization.oauth_uid
13
+ Maestrano::Connector::Rails::ConnectorLogger.log('info', organization, "Received entity from Connec! webhook: Entity=#{entity_name}, Data=#{entity}")
14
+ if organization.sync_enabled && organization.synchronized_entities[entity_instance_hash[:name].to_sym]
15
+ external_client = Maestrano::Connector::Rails::External.get_client(organization)
16
+
17
+ # Build expected input for consolidate_and_map_data
18
+ if entity_instance_hash[:is_complex]
19
+ entity = Hash[ *entity_instance.connec_entities_names.collect{|name| name == entity_name.singularize ? [name, [entity]] : [ name, []]}.flatten(1) ]
20
+ entity_instance.consolidate_and_map_data(entity, Hash[ *entity_instance.external_entities_names.collect{|name| [ name, []]}.flatten(1) ], organization, {})
21
+ else
22
+ entity = [entity]
23
+ entity_instance.consolidate_and_map_data(entity, [], organization, {})
24
+ end
25
+
26
+ entity_instance.push_entities_to_external(external_client, entity, organization)
27
+ end
28
+
29
+ else
30
+ Rails.logger.warn "Received notification from Connec! for unknown group or group without oauth: #{entity['group_id']} (tenant: #{params[:tenant]})"
31
+ end
32
+ end
33
+ else
34
+ Rails.logger.warn "Received notification from Connec! for unknow entity: #{entity_name}"
35
+ end
36
+ end
37
+ rescue => e
38
+ Rails.logger.warn("error processing notification #{e.message} - #{e.backtrace.join("\n")}")
39
+ end
40
+
41
+ head 200, content_type: "application/json"
42
+ end
43
+
44
+
45
+
46
+ private
47
+ def find_entity_instance(entity_name)
48
+ if Maestrano::Connector::Rails::Entity.entities_list.include?(entity_name.singularize)
49
+ return {instance: "Entities::#{entity_name.singularize.titleize.split.join}".constantize.new, is_complex: false, name: entity_name.singularize}
50
+ else
51
+ Maestrano::Connector::Rails::Entity.entities_list.each do |entity_name_from_list|
52
+ instance = "Entities::#{entity_name_from_list.singularize.titleize.split.join}".constantize.new
53
+ if instance.methods.include?('connec_entities_names'.to_sym)
54
+ return {instance: instance, is_complex: true, name: entity_name_from_list} if instance.connec_entities_names.include?(entity_name.singularize)
55
+ elsif instance.methods.include?('connec_entity_name'.to_sym)
56
+ return {instance: instance, is_complex: false, name: entity_name_from_list} if instance.connec_entity_name == entity_name.singularize
57
+ end
58
+ end
59
+ end
60
+ nil
61
+ end
62
+ end
@@ -8,6 +8,7 @@ module Maestrano::Connector::Rails
8
8
  # * :full_sync => true synchronization is performed without date filtering
9
9
  # * :connec_preemption => true|false : preemption is always|never given to connec in case of conflict (if not set, the most recently updated entity is kept)
10
10
  def perform(organization, opts)
11
+ return unless organization.sync_enabled
11
12
  ConnectorLogger.log('info', organization, "Start synchronization, opts=#{opts}")
12
13
  current_synchronization = Synchronization.create_running(organization)
13
14
 
@@ -1,6 +1,5 @@
1
1
  module Maestrano::Connector::Rails
2
2
  class IdMap < ActiveRecord::Base
3
- self.table_name = "maestrano_connector_rails_id_maps"
4
3
 
5
4
  belongs_to :organization
6
5
  end
@@ -1,6 +1,5 @@
1
1
  module Maestrano::Connector::Rails
2
2
  class Organization < ActiveRecord::Base
3
- self.table_name = "maestrano_connector_rails_organizations"
4
3
 
5
4
  # Enable Maestrano for this group
6
5
  maestrano_group_via :provider, :uid, :tenant do |group, maestrano|
@@ -1,6 +1,5 @@
1
1
  module Maestrano::Connector::Rails
2
2
  class Synchronization < ActiveRecord::Base
3
- self.table_name = "maestrano_connector_rails_synchronizations"
4
3
 
5
4
  #===================================
6
5
  # Associations
@@ -1,6 +1,5 @@
1
1
  module Maestrano::Connector::Rails
2
2
  class User < ActiveRecord::Base
3
- self.table_name = "maestrano_connector_rails_users"
4
3
 
5
4
  # Enable Maestrano for this user
6
5
  maestrano_user_via :provider, :uid, :tenant do |user, maestrano|
@@ -1,6 +1,5 @@
1
1
  module Maestrano::Connector::Rails
2
2
  class UserOrganizationRel < ActiveRecord::Base
3
- self.table_name = "maestrano_connector_rails_user_organization_rels"
4
3
 
5
4
  #===================================
6
5
  # Associations
data/config/routes.rb CHANGED
@@ -1,28 +1,9 @@
1
1
  Maestrano::Connector::Rails::Engine.routes.draw do
2
2
  maestrano_routes
3
3
 
4
- #--------------------------------------------------------------------
5
- # Maintainability issue
6
- # Should use maestrano_routes but it creates a scoping error with the metadata routes
7
- # get '/maestrano/metadata', to: '/maestrano/rails/metadata#index'
8
- # get '/maestrano/metadata/:tenant', to: '/maestrano/rails/metadata#index', as: 'tenant'
9
-
10
- # namespace :maestrano do
11
- # namespace :auth do
12
- # resources :saml, only:[] do
13
- # get 'init', on: :collection
14
- # get 'init/:tenant', on: :collection, to: 'saml#init', as: 'tenant'
15
- # post 'consume', on: :collection
16
- # end
17
- # end
18
-
19
- # namespace :account do
20
- # resources :groups, only: [:destroy] do
21
- # resources :users, only: [:destroy], controller: 'group_users'
22
- # end
23
- # end
24
- # end
25
- #--------------------------------------------------------------------
4
+ namespace :maestrano do
5
+ post 'connec/notifications/:tenant' => 'connec#notifications'
6
+ end
26
7
 
27
8
  match 'signout', to: 'sessions#destroy', as: 'signout', via: [:get, :post]
28
9
  end
@@ -0,0 +1,16 @@
1
+ class CreateUsers < ActiveRecord::Migration
2
+ def change
3
+ create_table :users do |t|
4
+ t.string :provider
5
+ t.string :uid
6
+ t.string :first_name
7
+ t.string :last_name
8
+ t.string :email
9
+ t.string :tenant
10
+
11
+ t.timestamps null: false
12
+ end
13
+
14
+ add_index :users, [:uid, :tenant], name: 'user_uid_index'
15
+ end
16
+ end
@@ -1,6 +1,6 @@
1
- class CreateMaestranoConnectorRailsOrganizations < ActiveRecord::Migration
1
+ class CreateOrganizations < ActiveRecord::Migration
2
2
  def change
3
- create_table :maestrano_connector_rails_organizations do |t|
3
+ create_table :organizations do |t|
4
4
  t.string :provider
5
5
  t.string :uid
6
6
  t.string :name
@@ -16,6 +16,6 @@ class CreateMaestranoConnectorRailsOrganizations < ActiveRecord::Migration
16
16
 
17
17
  t.timestamps null: false
18
18
  end
19
- add_index :maestrano_connector_rails_organizations, [:uid, :tenant], name: 'orga_uid_index'
19
+ add_index :organizations, [:uid, :tenant], name: 'orga_uid_index'
20
20
  end
21
21
  end
@@ -0,0 +1,12 @@
1
+ class CreateUserOrganizationRels < ActiveRecord::Migration
2
+ def change
3
+ create_table :user_organization_rels do |t|
4
+ t.integer :user_id
5
+ t.integer :organization_id
6
+
7
+ t.timestamps
8
+ end
9
+ add_index :user_organization_rels, :organization_id, name: 'rels_orga_index'
10
+ add_index :user_organization_rels, :user_id, name: 'rels_user_index'
11
+ end
12
+ end
@@ -0,0 +1,13 @@
1
+ class CreateSynchronizations < ActiveRecord::Migration
2
+ def change
3
+ create_table :synchronizations do |t|
4
+ t.integer :organization_id
5
+ t.string :status
6
+ t.text :message
7
+ t.boolean :partial, default: false
8
+
9
+ t.timestamps null: false
10
+ end
11
+ add_index :synchronizations, :organization_id, name: 'synchronization_orga_id_index'
12
+ end
13
+ end
@@ -0,0 +1,18 @@
1
+ class CreateIdMaps < ActiveRecord::Migration
2
+ def change
3
+ create_table :id_maps do |t|
4
+ t.string :connec_id
5
+ t.string :connec_entity
6
+ t.string :external_id
7
+ t.string :external_entity
8
+ t.integer :organization_id
9
+ t.datetime :last_push_to_connec
10
+ t.datetime :last_push_to_external
11
+
12
+ t.timestamps null: false
13
+ end
14
+ add_index :id_maps, [:connec_id, :connec_entity, :organization_id], name: 'idmap_connec_index'
15
+ add_index :id_maps, [:external_id, :external_entity, :organization_id], name: 'idmap_external_index'
16
+ add_index :id_maps, :organization_id, name: 'idmap_organization_index'
17
+ end
18
+ end
@@ -0,0 +1,5 @@
1
+ class AddSyncEnabledToOrganizations < ActiveRecord::Migration
2
+ def change
3
+ add_column :organizations, :sync_enabled, :boolean, default: false
4
+ end
5
+ end
@@ -30,7 +30,8 @@ module Connector
30
30
  "get 'home/index' => 'home#index'",
31
31
  "get 'admin/index' => 'admin#index'",
32
32
  "put 'admin/update' => 'admin#update'",
33
- "post 'admin/synchronize' => 'admin#synchronize'"
33
+ "post 'admin/synchronize' => 'admin#synchronize'",
34
+ "put 'admin/toggle_sync' => 'admin#toggle_sync'"
34
35
  ]
35
36
 
36
37
  in_root do
@@ -41,6 +41,16 @@ class AdminController < ApplicationController
41
41
  redirect_to root_path
42
42
  end
43
43
 
44
+ def toggle_sync
45
+ if is_admin
46
+ current_organization = Maestrano::Connector::Rails::Organization.first
47
+ current_organization.update(sync_enabled: !current_organization.sync_enabled)
48
+ flash[:notice] = current_organization.sync_enabled ? 'Synchronization enabled' : 'Synchronization disabled'
49
+ end
50
+
51
+ redirect_to admin_index_path
52
+ end
53
+
44
54
  private
45
55
  def is_admin
46
56
  current_user && current_organization && is_admin?(current_user, current_organization)
@@ -26,14 +26,18 @@ and functions available on the admin panel -->
26
26
  </li>
27
27
  </ul>
28
28
 
29
+ <h3>Enable or disable synchronizations</h3>
30
+ <%= "Synchronizations are currently #{@organization.sync_enabled ? 'enabled' : 'disabled'}." %>
31
+ <%= link_to "#{@organization.sync_enabled ? 'Disable' : 'Enable'} them", admin_toggle_sync_path, method: :put %>
32
+
29
33
  <h3>Synchronized entities</h3>
30
- <p>You can customize which entities are synchronized by the connector.</p>
34
+ <p>You can customize which entities are synchronized by the connector</p>
31
35
  <%= form_tag admin_update_path(id: @organization.id), method: :put do %>
32
36
  <% @organization.synchronized_entities.each do |k, v| %>
33
37
  <label for="<%= k %>">#{k.to_s.humanize}</label>
34
38
  <input checked="<%= v %>" id="<%= k %>" name="<%= k %>" type="checkbox"></input>
35
39
  <% if v && @organization.oauth_uid %>
36
- <%= link_to "Force a synchronization for #{k.to_s.pluralize} only", admin_synchronize_path(opts: {only_entities: [k.to_s]}), method: :post %>
40
+ <%= link_to "Force a synchronization for #{k.to_s.humanize.pluralize} only", admin_synchronize_path(opts: {only_entities: [k.to_s]}), method: :post %>
37
41
  <% end %>
38
42
  <% end %>
39
43
  <%= submit_tag :Update%>
@@ -18,6 +18,12 @@ can be displayed on the home page -->
18
18
  Linked to external app
19
19
  <% end %>
20
20
 
21
+ <% if !@organization.sync_enabled %>
22
+ Synchronizations are currently disabled. Go to the
23
+ <%= link_to " admin panel", admin_index_path %>
24
+ to enable them.
25
+ <% end %>
26
+
21
27
  <h2>Last synchronization</h2>
22
28
  <% if @synchronizations.first %>
23
29
  <%= "#{@synchronizations.first.updated_at} #{@synchronizations.first.status}" %>
@@ -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.0 ruby lib
5
+ # stub: maestrano-connector-rails 0.2.2 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "maestrano-connector-rails"
9
- s.version = "0.2.0"
9
+ s.version = "0.2.2"
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-02-05"
14
+ s.date = "2016-02-08"
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"]
@@ -32,6 +32,7 @@ Gem::Specification.new do |s|
32
32
  "app/controllers/maestrano/account/groups_controller.rb",
33
33
  "app/controllers/maestrano/application_controller.rb",
34
34
  "app/controllers/maestrano/auth/saml_controller.rb",
35
+ "app/controllers/maestrano/connec_controller.rb",
35
36
  "app/controllers/maestrano/sessions_controller.rb",
36
37
  "app/helpers/maestrano/connector/rails/session_helper.rb",
37
38
  "app/jobs/maestrano/connector/rails/synchronization_job.rb",
@@ -49,11 +50,12 @@ Gem::Specification.new do |s|
49
50
  "app/models/maestrano/connector/rails/user_organization_rel.rb",
50
51
  "bin/rails",
51
52
  "config/routes.rb",
52
- "db/migrate/20151122162100_create_maestrano_connector_rails_users.rb",
53
- "db/migrate/20151122162414_create_maestrano_connector_rails_organizations.rb",
54
- "db/migrate/20151122162613_create_maestrano_connector_rails_user_organization_rels.rb",
55
- "db/migrate/20151122163325_create_maestrano_connector_rails_synchronizations.rb",
56
- "db/migrate/20151122163449_create_maestrano_connector_rails_id_maps.rb",
53
+ "db/migrate/20151122162100_create_users.rb",
54
+ "db/migrate/20151122162414_create_organizations.rb",
55
+ "db/migrate/20151122162613_create_user_organization_rels.rb",
56
+ "db/migrate/20151122163325_create_synchronizations.rb",
57
+ "db/migrate/20151122163449_create_id_maps.rb",
58
+ "db/migrate/20160205132857_add_sync_enabled_to_organizations.rb",
57
59
  "lib/generators/connector/USAGE",
58
60
  "lib/generators/connector/complex_entity_generator.rb",
59
61
  "lib/generators/connector/install_generator.rb",
@@ -77,6 +79,7 @@ Gem::Specification.new do |s|
77
79
  "maestrano-connector-rails.gemspec",
78
80
  "maestrano.png",
79
81
  "pkg/maestrano-connector-rails-0.0.1.gem",
82
+ "spec/controllers/connec_controller_spec.rb",
80
83
  "spec/dummy/README.md",
81
84
  "spec/dummy/Rakefile",
82
85
  "spec/dummy/app/assets/images/.keep",
@@ -122,6 +125,12 @@ Gem::Specification.new do |s|
122
125
  "spec/dummy/config/routes.rb",
123
126
  "spec/dummy/config/secrets.yml",
124
127
  "spec/dummy/db/development.sqlite3",
128
+ "spec/dummy/db/migrate/20160204223447_create_users.maestrano_connector_rails_engine.rb",
129
+ "spec/dummy/db/migrate/20160204223448_create_organizations.maestrano_connector_rails_engine.rb",
130
+ "spec/dummy/db/migrate/20160204223449_create_user_organization_rels.maestrano_connector_rails_engine.rb",
131
+ "spec/dummy/db/migrate/20160204223450_create_synchronizations.maestrano_connector_rails_engine.rb",
132
+ "spec/dummy/db/migrate/20160204223451_create_id_maps.maestrano_connector_rails_engine.rb",
133
+ "spec/dummy/db/migrate/20160205133024_add_sync_enabled_to_organizations.maestrano_connector_rails_engine.rb",
125
134
  "spec/dummy/db/schema.rb",
126
135
  "spec/dummy/db/test.sqlite3",
127
136
  "spec/dummy/lib/assets/.keep",
@@ -142,7 +151,12 @@ Gem::Specification.new do |s|
142
151
  "spec/models/synchronization_spec.rb",
143
152
  "spec/models/user_organization_rel_spec.rb",
144
153
  "spec/models/user_spec.rb",
145
- "spec/spec_helper.rb"
154
+ "spec/routing/connec_routing_spec.rb",
155
+ "spec/spec_helper.rb",
156
+ "template/factories.rb",
157
+ "template/gitignore",
158
+ "template/maestrano-connector-template.rb",
159
+ "template/spec_helper.rb"
146
160
  ]
147
161
  s.homepage = "http://github.com/maestrano/maestrano-connector-rails"
148
162
  s.licenses = ["MIT"]
@@ -0,0 +1,144 @@
1
+ require 'spec_helper'
2
+
3
+ describe Maestrano::ConnecController, type: :controller do
4
+ routes { Maestrano::Connector::Rails::Engine.routes }
5
+
6
+ describe 'notifications' do
7
+ let(:notif) { {} }
8
+ let(:group_id) { 'cld_333' }
9
+ let(:entity) { {group_id: group_id, last_name: 'Georges', first_name: 'Teddy'} }
10
+ subject { post :notifications, tenant: 'default', notification: notif }
11
+
12
+ context 'without authentication' do
13
+ before {
14
+ controller.class.before_filter :authenticate_maestrano!
15
+ }
16
+
17
+ it 'respond with unauthorized' do
18
+ subject
19
+ expect(response.status).to eq(401)
20
+ end
21
+ end
22
+
23
+ context 'with authentication' do
24
+ before {
25
+ controller.class.skip_before_filter :authenticate_maestrano!
26
+ }
27
+
28
+ it 'is a success' do
29
+ subject
30
+ expect(response.status).to eq(200)
31
+ end
32
+
33
+ context "with an unknown entity" do
34
+ let(:notif) { {people: [entity]} }
35
+ before {
36
+ allow(Maestrano::Connector::Rails::Entity).to receive(:entities_list).and_return(%w())
37
+ }
38
+
39
+ it 'logs a warning' do
40
+ expect(Rails.logger).to receive(:warn).with('Received notification from Connec! for unknow entity: people')
41
+ subject
42
+ end
43
+ end
44
+
45
+ context "with a known complex entity" do
46
+ let(:notif) { {lead: [entity]} }
47
+
48
+ before {
49
+ allow(Maestrano::Connector::Rails::Entity).to receive(:entities_list).and_return(%w(contact_and_lead))
50
+ class Entities::ContactAndLead < Maestrano::Connector::Rails::ComplexEntity
51
+ def connec_entities_names
52
+ %w(lead)
53
+ end
54
+ end
55
+ module Entities::SubEntities end;
56
+ class Entities::SubEntities::Lead < Maestrano::Connector::Rails::SubEntityBase
57
+ end
58
+ }
59
+
60
+ it 'looks for an organization' do
61
+ expect(Maestrano::Connector::Rails::Organization).to receive(:find_by).with(uid: group_id, tenant: 'default')
62
+ subject
63
+ end
64
+
65
+ context 'when syncing' do
66
+ before {
67
+ allow_any_instance_of(Entities::ContactAndLead).to receive(:external_entities_names).and_return(%w())
68
+ }
69
+ let!(:organization) { create(:organization, uid: group_id, oauth_uid: 'lala', sync_enabled: true, synchronized_entities: {contact_and_lead: true}) }
70
+
71
+ it 'process the data and push them' do
72
+ expect_any_instance_of(Entities::ContactAndLead).to receive(:consolidate_and_map_data).with({"lead"=>[entity]}, {}, organization, {})
73
+ expect_any_instance_of(Entities::ContactAndLead).to receive(:push_entities_to_external)
74
+ subject
75
+ end
76
+ end
77
+ end
78
+
79
+ context "with a known non complex entity" do
80
+ let(:notif) { {people: [entity]} }
81
+
82
+ before {
83
+ allow(Maestrano::Connector::Rails::Entity).to receive(:entities_list).and_return(%w(person))
84
+ class Entities::Person < Maestrano::Connector::Rails::Entity
85
+ end
86
+ }
87
+
88
+ it 'looks for an organization' do
89
+ expect(Maestrano::Connector::Rails::Organization).to receive(:find_by).with(uid: group_id, tenant: 'default')
90
+ subject
91
+ end
92
+
93
+ context 'with an invalid organization' do
94
+ context 'with no organization' do
95
+ it 'logs a warning' do
96
+ expect(Rails.logger).to receive(:warn).with("Received notification from Connec! for unknown group or group without oauth: #{group_id} (tenant: default)")
97
+ subject
98
+ end
99
+ end
100
+
101
+ context 'with an organization with no oauth' do
102
+ let!(:organization) { create(:organization, uid: group_id, oauth_uid: nil) }
103
+
104
+ it 'logs a warning' do
105
+ expect(Rails.logger).to receive(:warn).with("Received notification from Connec! for unknown group or group without oauth: #{group_id} (tenant: default)")
106
+ subject
107
+ end
108
+ end
109
+ end
110
+
111
+ context 'with a valid organization' do
112
+ context 'with sync disabled' do
113
+ let!(:organization) { create(:organization, uid: group_id, oauth_uid: 'lala', sync_enabled: false, synchronized_entities: {person: true}) }
114
+
115
+ it 'does nothing' do
116
+ expect(Maestrano::Connector::Rails::External).to_not receive(:get_client).with(organization)
117
+ subject
118
+ end
119
+ end
120
+
121
+ context 'with sync disabled for this entity' do
122
+ let!(:organization) { create(:organization, uid: group_id, oauth_uid: 'lala', sync_enabled: true, synchronized_entities: {person: false}) }
123
+
124
+ it 'does nothing' do
125
+ expect(Maestrano::Connector::Rails::External).to_not receive(:get_client).with(organization)
126
+ subject
127
+ end
128
+ end
129
+
130
+ context "when syncing" do
131
+ let!(:organization) { create(:organization, uid: group_id, oauth_uid: 'lala', sync_enabled: true, synchronized_entities: {person: true}) }
132
+
133
+ it 'process the data and push them' do
134
+ expect_any_instance_of(Entities::Person).to receive(:consolidate_and_map_data).with([entity], [], organization, {})
135
+ expect_any_instance_of(Entities::Person).to receive(:push_entities_to_external)
136
+ subject
137
+ end
138
+ end
139
+ end
140
+
141
+ end
142
+ end
143
+ end
144
+ end
Binary file
@@ -0,0 +1,17 @@
1
+ # This migration comes from maestrano_connector_rails_engine (originally 20151122162100)
2
+ class CreateUsers < ActiveRecord::Migration
3
+ def change
4
+ create_table :users do |t|
5
+ t.string :provider
6
+ t.string :uid
7
+ t.string :first_name
8
+ t.string :last_name
9
+ t.string :email
10
+ t.string :tenant
11
+
12
+ t.timestamps null: false
13
+ end
14
+
15
+ add_index :users, [:uid, :tenant], name: 'user_uid_index'
16
+ end
17
+ end
@@ -0,0 +1,22 @@
1
+ # This migration comes from maestrano_connector_rails_engine (originally 20151122162414)
2
+ class CreateOrganizations < ActiveRecord::Migration
3
+ def change
4
+ create_table :organizations do |t|
5
+ t.string :provider
6
+ t.string :uid
7
+ t.string :name
8
+ t.string :tenant
9
+
10
+ t.string :oauth_provider
11
+ t.string :oauth_uid
12
+ t.string :oauth_token
13
+ t.string :refresh_token
14
+ t.string :instance_url
15
+
16
+ t.string :synchronized_entities
17
+
18
+ t.timestamps null: false
19
+ end
20
+ add_index :organizations, [:uid, :tenant], name: 'orga_uid_index'
21
+ end
22
+ end
@@ -0,0 +1,13 @@
1
+ # This migration comes from maestrano_connector_rails_engine (originally 20151122162613)
2
+ class CreateUserOrganizationRels < ActiveRecord::Migration
3
+ def change
4
+ create_table :user_organization_rels do |t|
5
+ t.integer :user_id
6
+ t.integer :organization_id
7
+
8
+ t.timestamps
9
+ end
10
+ add_index :user_organization_rels, :organization_id, name: 'rels_orga_index'
11
+ add_index :user_organization_rels, :user_id, name: 'rels_user_index'
12
+ end
13
+ end
@@ -0,0 +1,14 @@
1
+ # This migration comes from maestrano_connector_rails_engine (originally 20151122163325)
2
+ class CreateSynchronizations < ActiveRecord::Migration
3
+ def change
4
+ create_table :synchronizations do |t|
5
+ t.integer :organization_id
6
+ t.string :status
7
+ t.text :message
8
+ t.boolean :partial, default: false
9
+
10
+ t.timestamps null: false
11
+ end
12
+ add_index :synchronizations, :organization_id, name: 'synchronization_orga_id_index'
13
+ end
14
+ end
@@ -0,0 +1,19 @@
1
+ # This migration comes from maestrano_connector_rails_engine (originally 20151122163449)
2
+ class CreateIdMaps < ActiveRecord::Migration
3
+ def change
4
+ create_table :id_maps do |t|
5
+ t.string :connec_id
6
+ t.string :connec_entity
7
+ t.string :external_id
8
+ t.string :external_entity
9
+ t.integer :organization_id
10
+ t.datetime :last_push_to_connec
11
+ t.datetime :last_push_to_external
12
+
13
+ t.timestamps null: false
14
+ end
15
+ add_index :id_maps, [:connec_id, :connec_entity, :organization_id], name: 'idmap_connec_index'
16
+ add_index :id_maps, [:external_id, :external_entity, :organization_id], name: 'idmap_external_index'
17
+ add_index :id_maps, :organization_id, name: 'idmap_organization_index'
18
+ end
19
+ end
@@ -0,0 +1,6 @@
1
+ # This migration comes from maestrano_connector_rails_engine (originally 20160205132857)
2
+ class AddSyncEnabledToOrganizations < ActiveRecord::Migration
3
+ def change
4
+ add_column :organizations, :sync_enabled, :boolean, default: false
5
+ end
6
+ end
@@ -11,9 +11,9 @@
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: 20151122163449) do
14
+ ActiveRecord::Schema.define(version: 20160205133024) do
15
15
 
16
- create_table "maestrano_connector_rails_id_maps", force: :cascade do |t|
16
+ create_table "id_maps", force: :cascade do |t|
17
17
  t.string "connec_id"
18
18
  t.string "connec_entity"
19
19
  t.string "external_id"
@@ -25,11 +25,11 @@ ActiveRecord::Schema.define(version: 20151122163449) do
25
25
  t.datetime "updated_at", null: false
26
26
  end
27
27
 
28
- add_index "maestrano_connector_rails_id_maps", ["connec_id", "connec_entity", "organization_id"], name: "idmap_connec_index"
29
- add_index "maestrano_connector_rails_id_maps", ["external_id", "external_entity", "organization_id"], name: "idmap_external_index"
30
- add_index "maestrano_connector_rails_id_maps", ["organization_id"], name: "idmap_organization_index"
28
+ add_index "id_maps", ["connec_id", "connec_entity", "organization_id"], name: "idmap_connec_index"
29
+ add_index "id_maps", ["external_id", "external_entity", "organization_id"], name: "idmap_external_index"
30
+ add_index "id_maps", ["organization_id"], name: "idmap_organization_index"
31
31
 
32
- create_table "maestrano_connector_rails_organizations", force: :cascade do |t|
32
+ create_table "organizations", force: :cascade do |t|
33
33
  t.string "provider"
34
34
  t.string "uid"
35
35
  t.string "name"
@@ -40,13 +40,14 @@ ActiveRecord::Schema.define(version: 20151122163449) do
40
40
  t.string "refresh_token"
41
41
  t.string "instance_url"
42
42
  t.string "synchronized_entities"
43
- t.datetime "created_at", null: false
44
- t.datetime "updated_at", null: false
43
+ t.datetime "created_at", null: false
44
+ t.datetime "updated_at", null: false
45
+ t.boolean "sync_enabled", default: false
45
46
  end
46
47
 
47
- add_index "maestrano_connector_rails_organizations", ["uid", "tenant"], name: "orga_uid_index"
48
+ add_index "organizations", ["uid", "tenant"], name: "orga_uid_index"
48
49
 
49
- create_table "maestrano_connector_rails_synchronizations", force: :cascade do |t|
50
+ create_table "synchronizations", force: :cascade do |t|
50
51
  t.integer "organization_id"
51
52
  t.string "status"
52
53
  t.text "message"
@@ -55,19 +56,19 @@ ActiveRecord::Schema.define(version: 20151122163449) do
55
56
  t.datetime "updated_at", null: false
56
57
  end
57
58
 
58
- add_index "maestrano_connector_rails_synchronizations", ["organization_id"], name: "synchronization_orga_id_index"
59
+ add_index "synchronizations", ["organization_id"], name: "synchronization_orga_id_index"
59
60
 
60
- create_table "maestrano_connector_rails_user_organization_rels", force: :cascade do |t|
61
+ create_table "user_organization_rels", force: :cascade do |t|
61
62
  t.integer "user_id"
62
63
  t.integer "organization_id"
63
64
  t.datetime "created_at"
64
65
  t.datetime "updated_at"
65
66
  end
66
67
 
67
- add_index "maestrano_connector_rails_user_organization_rels", ["organization_id"], name: "rels_orga_index"
68
- add_index "maestrano_connector_rails_user_organization_rels", ["user_id"], name: "rels_user_index"
68
+ add_index "user_organization_rels", ["organization_id"], name: "rels_orga_index"
69
+ add_index "user_organization_rels", ["user_id"], name: "rels_user_index"
69
70
 
70
- create_table "maestrano_connector_rails_users", force: :cascade do |t|
71
+ create_table "users", force: :cascade do |t|
71
72
  t.string "provider"
72
73
  t.string "uid"
73
74
  t.string "first_name"
@@ -78,6 +79,6 @@ ActiveRecord::Schema.define(version: 20151122163449) do
78
79
  t.datetime "updated_at", null: false
79
80
  end
80
81
 
81
- add_index "maestrano_connector_rails_users", ["uid", "tenant"], name: "user_uid_index"
82
+ add_index "users", ["uid", "tenant"], name: "user_uid_index"
82
83
 
83
84
  end
Binary file
@@ -3,32 +3,47 @@ require 'spec_helper'
3
3
  describe Maestrano::Connector::Rails::SynchronizationJob do
4
4
  let(:organization) { create(:organization) }
5
5
  subject { Maestrano::Connector::Rails::SynchronizationJob.perform_now(organization, {}) }
6
-
6
+
7
7
  describe 'perform' do
8
- it 'creates a synchronization' do
9
- expect{ subject }.to change{ Maestrano::Connector::Rails::Synchronization.count }.by(1)
8
+ context 'with sync_enabled set to false' do
9
+ it 'does not creates a syncrhonization' do
10
+ expect{ subject }.to change{ Maestrano::Connector::Rails::Synchronization.count }.by(0)
11
+ end
12
+
13
+ it 'does not calls sync entity' do
14
+ expect_any_instance_of(Maestrano::Connector::Rails::SynchronizationJob).to_not receive(:sync_entity)
15
+ subject
16
+ end
10
17
  end
11
18
 
12
- it 'calls sync entity on all the organization synchronized entities set to true' do
13
- organization.synchronized_entities[organization.synchronized_entities.keys.first] = false
14
- expect_any_instance_of(Maestrano::Connector::Rails::SynchronizationJob).to receive(:sync_entity).exactly(organization.synchronized_entities.count - 1).times
19
+ context 'with sync_enabled set to true' do
20
+ before {organization.update(sync_enabled: true)}
15
21
 
16
- subject
17
- end
22
+ it 'creates a synchronization' do
23
+ expect{ subject }.to change{ Maestrano::Connector::Rails::Synchronization.count }.by(1)
24
+ end
18
25
 
19
- context 'with options' do
20
- context 'with only_entities' do
21
- subject { Maestrano::Connector::Rails::SynchronizationJob.perform_now(organization, {only_entities: %w(people price)}) }
26
+ it 'calls sync entity on all the organization synchronized entities set to true' do
27
+ organization.synchronized_entities[organization.synchronized_entities.keys.first] = false
28
+ expect_any_instance_of(Maestrano::Connector::Rails::SynchronizationJob).to receive(:sync_entity).exactly(organization.synchronized_entities.count - 1).times
22
29
 
23
- it 'calls sync entity on the specified entities' do
24
- expect_any_instance_of(Maestrano::Connector::Rails::SynchronizationJob).to receive(:sync_entity).twice
30
+ subject
31
+ end
25
32
 
26
- subject
27
- end
33
+ context 'with options' do
34
+ context 'with only_entities' do
35
+ subject { Maestrano::Connector::Rails::SynchronizationJob.perform_now(organization, {only_entities: %w(people price)}) }
36
+
37
+ it 'calls sync entity on the specified entities' do
38
+ expect_any_instance_of(Maestrano::Connector::Rails::SynchronizationJob).to receive(:sync_entity).twice
39
+
40
+ subject
41
+ end
28
42
 
29
- it 'set the current syncrhonization as partial' do
30
- subject
31
- expect(Maestrano::Connector::Rails::Synchronization.last.partial).to be(true)
43
+ it 'set the current syncrhonization as partial' do
44
+ subject
45
+ expect(Maestrano::Connector::Rails::Synchronization.last.partial).to be(true)
46
+ end
32
47
  end
33
48
  end
34
49
  end
@@ -0,0 +1,12 @@
1
+ require "spec_helper"
2
+
3
+ describe Maestrano::ConnecController, type: :controller do
4
+ routes { Maestrano::Connector::Rails::Engine.routes }
5
+
6
+ describe "routing" do
7
+
8
+ it "routes to #notifications" do
9
+ expect(:post => '/maestrano/connec/notifications/default').to route_to("maestrano/connec#notifications", tenant: 'default')
10
+ end
11
+ end
12
+ end
data/spec/spec_helper.rb CHANGED
@@ -4,6 +4,8 @@ require File.expand_path("../dummy/config/environment.rb", __FILE__)
4
4
  require 'rspec/rails'
5
5
  require 'factory_girl_rails'
6
6
  require 'shoulda/matchers'
7
+ require 'simplecov'
8
+ SimpleCov.start
7
9
 
8
10
  Rails.backtrace_cleaner.remove_silencers!
9
11
 
@@ -16,4 +18,5 @@ RSpec.configure do |config|
16
18
  config.infer_base_class_for_anonymous_controllers = false
17
19
  config.order = "random"
18
20
  config.include FactoryGirl::Syntax::Methods
21
+ config.include Maestrano::Connector::Rails::Engine.routes.url_helpers
19
22
  end
@@ -0,0 +1,23 @@
1
+ FactoryGirl.define do
2
+
3
+ factory :organization, class: Maestrano::Connector::Rails::Organization do
4
+ name "My company"
5
+ tenant "default"
6
+ end
7
+
8
+ factory :idmap, class: Maestrano::Connector::Rails::IdMap do
9
+ connec_id '6798-ada6-te43'
10
+ connec_entity 'person'
11
+ external_id '4567ada66'
12
+ external_entity 'contact'
13
+ last_push_to_external 2.day.ago
14
+ last_push_to_connec 1.day.ago
15
+ association :organization
16
+ end
17
+
18
+ factory :synchronization, class: Maestrano::Connector::Rails::Synchronization do
19
+ association :organization
20
+ status 'SUCCESS'
21
+ partial false
22
+ end
23
+ end
@@ -0,0 +1,20 @@
1
+ # See https://help.github.com/articles/ignoring-files for more about ignoring files.
2
+ #
3
+ # If you find yourself ignoring temporary files generated by your text editor
4
+ # or operating system, you probably want to add a global ignore instead:
5
+ # git config --global core.excludesfile '~/.gitignore_global'
6
+
7
+ # Ignore bundler config.
8
+ /.bundle
9
+
10
+ # Ignore the default SQLite database.
11
+ /db/*.sqlite3
12
+ /db/*.sqlite3-journal
13
+
14
+ # Ignore all logfiles and tempfiles.
15
+ /log/*
16
+ !/log/.keep
17
+ /tmp
18
+
19
+ # Ignore coverage files
20
+ coverage/
@@ -0,0 +1,85 @@
1
+ def current_directory
2
+ @current_directory ||=
3
+ if __FILE__ =~ %r{\Ahttps?://}
4
+ tempdir = Dir.mktmpdir("maestrano-connector-rails-")
5
+ at_exit { FileUtils.remove_entry(tempdir) }
6
+ git :clone => "--quiet https://github.com/berardpi/maestrano-connector-rails.git #{tempdir}"
7
+
8
+ "#{tempdir}/template"
9
+ else
10
+ File.expand_path(File.dirname(__FILE__))
11
+ end
12
+ end
13
+
14
+ # def current_directory
15
+ # File.expand_path(File.dirname(__FILE__))
16
+ # end
17
+
18
+ # Add the current directory to the path Thor uses
19
+ # to look up files
20
+ def source_paths
21
+ Array(super) + [current_directory]
22
+ end
23
+
24
+ #
25
+ # Rebuild the Gemfile from scratch
26
+ #
27
+ remove_file 'Gemfile'
28
+ run 'touch Gemfile'
29
+
30
+ add_source 'https://rubygems.org'
31
+
32
+ gem 'rails', '4.2.4'
33
+ gem 'turbolinks'
34
+ gem 'jquery-rails'
35
+ gem 'puma'
36
+ gem 'figaro'
37
+ gem 'tzinfo-data', platforms: [:mingw, :mswin, :jruby]
38
+
39
+ gem 'maestrano-connector-rails'
40
+ gem 'delayed_job_active_record'
41
+
42
+ gem 'sqlite3'
43
+
44
+ gem_group :test do
45
+ gem 'simplecov'
46
+ gem 'rspec-rails'
47
+ gem 'factory_girl_rails'
48
+ gem 'shoulda-matchers'
49
+ gem 'timecop'
50
+ end
51
+
52
+ remove_file '.gitignore'
53
+ copy_file 'gitignore', '.gitignore'
54
+
55
+
56
+ #
57
+ # Cleanup
58
+ #
59
+ after_bundle do
60
+ remove_dir 'app/mailers'
61
+ remove_dir 'test'
62
+ copy_file 'spec_helper.rb', 'spec/spec_helper.rb'
63
+ copy_file 'factories.rb', 'spec/factories.rb'
64
+
65
+ application do <<-RUBY
66
+ config.generators do |g|
67
+ g.test_framework :rspec, fixture: false
68
+ g.view_specs false
69
+ g.helper_specs false
70
+ end
71
+ RUBY
72
+ end
73
+
74
+ run 'rails g maestrano:initializer'
75
+ run 'rails g connector:install'
76
+ run 'bundle exec figaro install'
77
+ run 'rake railties:install:migrations'
78
+ run 'rails g delayed_job:active_record'
79
+ run 'rake db:migrate'
80
+
81
+ # Init repo and commit
82
+ git :init
83
+ git add: "."
84
+ git commit: "-a -m 'Initial commit'"
85
+ end
@@ -0,0 +1,22 @@
1
+ require 'simplecov'
2
+ SimpleCov.start
3
+
4
+ ENV['RAILS_ENV'] ||= 'test'
5
+
6
+ require File.expand_path("../../config/environment", __FILE__)
7
+ require 'rspec/rails'
8
+ require 'factory_girl_rails'
9
+ require 'shoulda/matchers'
10
+
11
+ Rails.backtrace_cleaner.remove_silencers!
12
+
13
+ # Load support files
14
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
15
+
16
+ RSpec.configure do |config|
17
+ config.mock_with :rspec
18
+ config.use_transactional_fixtures = true
19
+ config.infer_base_class_for_anonymous_controllers = false
20
+ config.order = "random"
21
+ config.include FactoryGirl::Syntax::Methods
22
+ 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: 0.2.0
4
+ version: 0.2.2
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-02-05 00:00:00.000000000 Z
11
+ date: 2016-02-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: maestrano-rails
@@ -200,6 +200,7 @@ files:
200
200
  - app/controllers/maestrano/account/groups_controller.rb
201
201
  - app/controllers/maestrano/application_controller.rb
202
202
  - app/controllers/maestrano/auth/saml_controller.rb
203
+ - app/controllers/maestrano/connec_controller.rb
203
204
  - app/controllers/maestrano/sessions_controller.rb
204
205
  - app/helpers/maestrano/connector/rails/session_helper.rb
205
206
  - app/jobs/maestrano/connector/rails/synchronization_job.rb
@@ -217,11 +218,12 @@ files:
217
218
  - app/models/maestrano/connector/rails/user_organization_rel.rb
218
219
  - bin/rails
219
220
  - config/routes.rb
220
- - db/migrate/20151122162100_create_maestrano_connector_rails_users.rb
221
- - db/migrate/20151122162414_create_maestrano_connector_rails_organizations.rb
222
- - db/migrate/20151122162613_create_maestrano_connector_rails_user_organization_rels.rb
223
- - db/migrate/20151122163325_create_maestrano_connector_rails_synchronizations.rb
224
- - db/migrate/20151122163449_create_maestrano_connector_rails_id_maps.rb
221
+ - db/migrate/20151122162100_create_users.rb
222
+ - db/migrate/20151122162414_create_organizations.rb
223
+ - db/migrate/20151122162613_create_user_organization_rels.rb
224
+ - db/migrate/20151122163325_create_synchronizations.rb
225
+ - db/migrate/20151122163449_create_id_maps.rb
226
+ - db/migrate/20160205132857_add_sync_enabled_to_organizations.rb
225
227
  - lib/generators/connector/USAGE
226
228
  - lib/generators/connector/complex_entity_generator.rb
227
229
  - lib/generators/connector/install_generator.rb
@@ -245,6 +247,7 @@ files:
245
247
  - maestrano-connector-rails.gemspec
246
248
  - maestrano.png
247
249
  - pkg/maestrano-connector-rails-0.0.1.gem
250
+ - spec/controllers/connec_controller_spec.rb
248
251
  - spec/dummy/README.md
249
252
  - spec/dummy/Rakefile
250
253
  - spec/dummy/app/assets/images/.keep
@@ -290,6 +293,12 @@ files:
290
293
  - spec/dummy/config/routes.rb
291
294
  - spec/dummy/config/secrets.yml
292
295
  - spec/dummy/db/development.sqlite3
296
+ - spec/dummy/db/migrate/20160204223447_create_users.maestrano_connector_rails_engine.rb
297
+ - spec/dummy/db/migrate/20160204223448_create_organizations.maestrano_connector_rails_engine.rb
298
+ - spec/dummy/db/migrate/20160204223449_create_user_organization_rels.maestrano_connector_rails_engine.rb
299
+ - spec/dummy/db/migrate/20160204223450_create_synchronizations.maestrano_connector_rails_engine.rb
300
+ - spec/dummy/db/migrate/20160204223451_create_id_maps.maestrano_connector_rails_engine.rb
301
+ - spec/dummy/db/migrate/20160205133024_add_sync_enabled_to_organizations.maestrano_connector_rails_engine.rb
293
302
  - spec/dummy/db/schema.rb
294
303
  - spec/dummy/db/test.sqlite3
295
304
  - spec/dummy/lib/assets/.keep
@@ -310,7 +319,12 @@ files:
310
319
  - spec/models/synchronization_spec.rb
311
320
  - spec/models/user_organization_rel_spec.rb
312
321
  - spec/models/user_spec.rb
322
+ - spec/routing/connec_routing_spec.rb
313
323
  - spec/spec_helper.rb
324
+ - template/factories.rb
325
+ - template/gitignore
326
+ - template/maestrano-connector-template.rb
327
+ - template/spec_helper.rb
314
328
  homepage: http://github.com/maestrano/maestrano-connector-rails
315
329
  licenses:
316
330
  - MIT
@@ -1,16 +0,0 @@
1
- class CreateMaestranoConnectorRailsUsers < ActiveRecord::Migration
2
- def change
3
- create_table :maestrano_connector_rails_users do |t|
4
- t.string :provider
5
- t.string :uid
6
- t.string :first_name
7
- t.string :last_name
8
- t.string :email
9
- t.string :tenant
10
-
11
- t.timestamps null: false
12
- end
13
-
14
- add_index :maestrano_connector_rails_users, [:uid, :tenant], name: 'user_uid_index'
15
- end
16
- end
@@ -1,12 +0,0 @@
1
- class CreateMaestranoConnectorRailsUserOrganizationRels < ActiveRecord::Migration
2
- def change
3
- create_table :maestrano_connector_rails_user_organization_rels do |t|
4
- t.integer :user_id
5
- t.integer :organization_id
6
-
7
- t.timestamps
8
- end
9
- add_index :maestrano_connector_rails_user_organization_rels, :organization_id, name: 'rels_orga_index'
10
- add_index :maestrano_connector_rails_user_organization_rels, :user_id, name: 'rels_user_index'
11
- end
12
- end
@@ -1,13 +0,0 @@
1
- class CreateMaestranoConnectorRailsSynchronizations < ActiveRecord::Migration
2
- def change
3
- create_table :maestrano_connector_rails_synchronizations do |t|
4
- t.integer :organization_id
5
- t.string :status
6
- t.text :message
7
- t.boolean :partial, default: false
8
-
9
- t.timestamps null: false
10
- end
11
- add_index :maestrano_connector_rails_synchronizations, :organization_id, name: 'synchronization_orga_id_index'
12
- end
13
- end
@@ -1,18 +0,0 @@
1
- class CreateMaestranoConnectorRailsIdMaps < ActiveRecord::Migration
2
- def change
3
- create_table :maestrano_connector_rails_id_maps do |t|
4
- t.string :connec_id
5
- t.string :connec_entity
6
- t.string :external_id
7
- t.string :external_entity
8
- t.integer :organization_id
9
- t.datetime :last_push_to_connec
10
- t.datetime :last_push_to_external
11
-
12
- t.timestamps null: false
13
- end
14
- add_index :maestrano_connector_rails_id_maps, [:connec_id, :connec_entity, :organization_id], name: 'idmap_connec_index'
15
- add_index :maestrano_connector_rails_id_maps, [:external_id, :external_entity, :organization_id], name: 'idmap_external_index'
16
- add_index :maestrano_connector_rails_id_maps, :organization_id, name: 'idmap_organization_index'
17
- end
18
- end