multi_client 2.2.1 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4a6e1687c81abaeab7384d68ba3a9bc6ac3c5913
4
- data.tar.gz: ce98f18cbda27d89d807825807adcf79c10f34fe
3
+ metadata.gz: d9fe6bf2d773b9549c7b637e9905ec592c059e68
4
+ data.tar.gz: 68e12f5338a2a36fe5a2d23fb94d67ebd794a02b
5
5
  SHA512:
6
- metadata.gz: 4d7d2adf77960c0aa426598734720488a2b2bb76c66c31f1f8f5e227e6bcc834d6411e8011359216c7796f7c74200fb5d0464ae3b18a4c9b34ca59d39ce3ee94
7
- data.tar.gz: 234ee38c3ab4fff5081d8fda76a6e771a21e5cfee0e57e0c367a41406ca6805c54e307358cec24f32161b17c588419efe6a9210f2cb6bc859a03d080c0643ce6
6
+ metadata.gz: 70599b057fdddb47846ec157b43b5225d9c52860822597e3d2c7beb8f6aeeb90c0a3d02deba2a33298a0304135c6ce8b31db1df362c70c4c2000e64016ee8726
7
+ data.tar.gz: a421e291f1837fccb98e8df58e19dbe0cedf3f0b493d2cdb5a29fedf4522069d8434f7f6ea9e95e4607a98dd9f7390a2c7ec17ee9f9d5d36389af983d0143ea0
data/README.rdoc CHANGED
@@ -20,6 +20,24 @@ Add migrations and migrate
20
20
 
21
21
  > rake multi_client:install:migrations && rake db:migrate
22
22
 
23
+ = How do I scope routing to clients?
24
+
25
+ # config/routes.rb
26
+ constraints MultiClient::Subdomain do
27
+ resources :posts
28
+ end
29
+
30
+ => acme.example.com/posts
31
+
32
+ = How do I scope routing to non-clients?
33
+
34
+ # config/routes.rb
35
+ constraints MultiClient::NoSubdomain do
36
+ resources :posts
37
+ end
38
+
39
+ => www.example.com/posts
40
+
23
41
  = How do I set the current client?
24
42
 
25
43
  # console
@@ -5,7 +5,7 @@ module MultiClient
5
5
  included do
6
6
  around_action :set_current_client
7
7
 
8
- helper_method :current_client
8
+ helper_method :current_client if respond_to?(:current_client)
9
9
  end
10
10
 
11
11
  private
@@ -1,5 +1,6 @@
1
1
  module MultiClientHelper
2
2
  def render_client_navigation
3
+ return unless MultiClient::Client.master?
3
4
  clients = MultiClient::Client.all
4
5
  render 'multi_client/client_navigation', clients: clients
5
6
  end
@@ -9,7 +9,7 @@ module MultiClient
9
9
  scope :enabled, -> { where(enabled: true) }
10
10
 
11
11
  def self.master
12
- where(identifier: Configuration.master_tenant_identifier).first
12
+ where(identifier: Configuration.master_client_identifier).first
13
13
  end
14
14
 
15
15
  def self.current_id=(id)
@@ -36,26 +36,26 @@ module MultiClient
36
36
  self.current_id = nil
37
37
  end
38
38
 
39
- def self.with_tenant(tenant, &block)
39
+ def self.with_client(client, &block)
40
40
  original_id = current_id
41
41
  begin
42
- self.current_id = tenant.id
43
- Rails.logger.info "Temporarily set tenant id to #{tenant.id}"
42
+ self.current_id = client.id
43
+ Rails.logger.info "Temporarily set client id to #{client.id}"
44
44
  block.call
45
45
  rescue
46
46
  raise
47
47
  ensure
48
- Rails.logger.info "Restored tenant id to #{original_id}"
48
+ Rails.logger.info "Restored client id to #{original_id}"
49
49
  self.current_id = original_id
50
50
  end
51
51
  end
52
52
 
53
53
  def self.master?
54
- !!(current && current.identifier == Configuration.master_tenant_identifier)
54
+ !!(current && current.identifier == Configuration.master_client_identifier)
55
55
  end
56
56
 
57
57
  def self.set_current_to_master
58
- set_current_by_identifier(Configuration.master_tenant_identifier)
58
+ set_current_by_identifier(Configuration.master_client_identifier)
59
59
  end
60
60
 
61
61
  end
@@ -0,0 +1,158 @@
1
+ module MultiClient
2
+ class CreateClientService < Itsf::Services::V2::Service::Base
3
+ class Response < Itsf::Services::V2::Response::Base
4
+ # attr_accessor :client, :client_setting, :users, :licensed_products, :roles, :permissions
5
+ attr_accessor :client, :users, :roles, :permissions
6
+ end
7
+
8
+ # attr_accessor :subdomain, :identifier, :enabled, :brand_primary_color, :logo, :user_emails, :product_ids, :create_roles_and_permissions, :request_host
9
+ attr_accessor :subdomain, :identifier, :enabled, :user_emails, :create_roles_and_permissions, :request_host
10
+
11
+ # validates :subdomain, :identifier, :enabled, :brand_primary_color, :logo, :user_emails, :create_roles_and_permissions, :request_host, presence: true
12
+ validates :subdomain, :identifier, :enabled, :user_emails, :create_roles_and_permissions, :request_host, presence: true
13
+
14
+ def do_work
15
+ say "Running on environment #{Rails.env}"
16
+ say "Validating input"
17
+ return response unless valid?
18
+ say "Input is valid"
19
+ ActiveRecord::Base.transaction do
20
+ response.client = create_client
21
+ Client.with_client(response.client) do
22
+ # response.client_setting = create_client_setting
23
+ response.roles, response.permissions = create_default_roles_and_permissions if create_roles_and_permissions == true
24
+ response.users = create_users
25
+ # response.licensed_products = create_licensed_products
26
+ raise ActiveRecord::Rollback if errors.any?
27
+ request_user_password_resets(response.users.map(&:email))
28
+ end
29
+ end
30
+ say "Done"
31
+ respond
32
+ end
33
+
34
+ private
35
+
36
+ def create_client
37
+ say "Creating client", indent: 1
38
+ client = Client.new(client_attributes)
39
+ if client.save
40
+ say "Created #{client.class} #{client}", indent: 2
41
+ else
42
+ add_error_and_say :client, "Error creating #{client.class} #{client}. Errors: #{client.errors.full_messages.to_sentence}", indent: 2
43
+ end
44
+ say "Done", indent: 1
45
+ return client
46
+ end
47
+
48
+ # def create_client_setting
49
+ # say "Creating client setting", indent: 1
50
+ # client_setting = ClientSetting.new(client_setting_attributes)
51
+ # if client_setting.save
52
+ # say "Created #{client_setting.class} #{client_setting}", indent: 2
53
+ # else
54
+ # add_error_and_say :client_setting, "Error creating #{client_setting.class} #{client_setting}. Errors: #{client_setting.errors.full_messages.to_sentence}", indent: 2
55
+ # end
56
+ # say "Done", indent: 1
57
+ # return client_setting
58
+ # end
59
+
60
+ def create_default_roles_and_permissions
61
+ say "Creating roles", indent: 1
62
+ result = Ecm::Rbac::ImportDefaultPermissionsService.call(filename: Rails.root.join("config", "rbac.yml"))
63
+ if result.success?
64
+ say "Created roles", indent: 2
65
+ else
66
+ add_error_and_say :create_roles_and_permissions, "Error creating roles. Errors: #{result.errors.full_messages.to_sentence}", indent: 2
67
+ end
68
+ say "Done", indent: 1
69
+ return result.roles, result.permissions
70
+ end
71
+
72
+ def create_users
73
+ say "Creating #{splitted_user_emails.size} users", indent: 1
74
+ users = splitted_user_emails.collect do |user_email|
75
+ create_user(user_email)
76
+ end
77
+ say "Done", indent: 1
78
+ return users
79
+ end
80
+
81
+ def create_user(email)
82
+ say "Creating user", indent: 1
83
+ random_password = SecureRandom.hex
84
+ user = Ecm::UserArea::User.new(email: email, password: random_password, password_confirmation: random_password, active: true, confirmed: true, approved: true, roles: user_roles)
85
+ if user.save
86
+ say "Created #{user.class} #{user}", indent: 2
87
+ else
88
+ add_error_and_say :user_emails, "Error creating #{user.class} #{user}. Errors: #{user.errors.full_messages.to_sentence}", indent: 2
89
+ end
90
+ say "Done", indent: 1
91
+ return user
92
+ end
93
+
94
+ # def create_licensed_products
95
+ # say "Creating #{product_ids.size} licensed products", indent: 1
96
+ # licensed_products = product_ids.collect do |product_id|
97
+ # create_licensed_product(product_id)
98
+ # end
99
+ # say "Done", indent: 1
100
+ # return licensed_products
101
+ # end
102
+
103
+ # def create_licensed_product(product_id)
104
+ # say "Creating licensed product", indent: 1
105
+ # licensed_product = Chi::Licensing::LicensedProduct.new(licensee: response.client)
106
+ # licensed_product.product = load_product(product_id)
107
+ # if licensed_product.save
108
+ # say "Created #{licensed_product.class} #{licensed_product}", indent: 2
109
+ # else
110
+ # add_error_and_say :product_ids, "Error creating #{licensed_product.class} #{licensed_product}. Errors: #{licensed_product.errors.full_messages.to_sentence}", indent: 2
111
+ # end
112
+ # say "Done", indent: 1
113
+ # return licensed_product
114
+ # end
115
+
116
+ def client_attributes
117
+ { subdomain: subdomain, identifier: identifier, enabled: enabled }
118
+ end
119
+
120
+ def client_setting_attributes
121
+ { brand_primary_color: brand_primary_color, logo: logo }
122
+ end
123
+
124
+ def splitted_user_emails
125
+ user_emails.split(/[^\w+@\.\+\-\_]/)
126
+ end
127
+
128
+ def request_user_password_resets(emails)
129
+ host = request_host.gsub(Client.master.subdomain, subdomain)
130
+ emails.map do |email|
131
+ Ecm::UserArea::UserPasswordResetRequest.call(email: email, host: host)
132
+ end
133
+ end
134
+
135
+ # def load_product(product_id)
136
+ # Chi::Licensing::Product.where(id: product_id).first
137
+ # end
138
+
139
+ def create_roles_and_permissions
140
+ if Rails.version < '5'
141
+ ActiveRecord::Type::Boolean.new.type_cast_from_user(@create_roles_and_permissions)
142
+ else
143
+ ActiveRecord::Type::Boolean.new.cast(@create_roles_and_permissions)
144
+ end
145
+ end
146
+
147
+ def user_roles
148
+ [
149
+ Ecm::Rbac::Role.where(identifier: 'rt_imager/admin').first,
150
+ Ecm::Rbac::Role.where(identifier: 'rt_imager/web').first,
151
+ ].compact
152
+ end
153
+
154
+ # def product_ids
155
+ # @product_ids ||= []
156
+ # end
157
+ end
158
+ end
@@ -1,3 +1,16 @@
1
1
  de:
2
2
  classes:
3
- multi_client/client: Mandant
3
+ multi_client/client: 'Mandant'
4
+ multi_client/create_client_service: 'Dienst zum einrichten von Mandanten'
5
+ activerecord:
6
+ attributes:
7
+ multi_client/client:
8
+ identifier: 'Bezeichner'
9
+ subdomain: 'Subdomain'
10
+ enabled: 'Aktiv'
11
+ created_at: 'Erstellt am'
12
+ updated_at: 'Aktualisiert am'
13
+ models:
14
+ multi_client/client:
15
+ one: 'Mandant'
16
+ other: 'Mandanten'
@@ -61,10 +61,10 @@ MultiClient.configure do |config|
61
61
  #
62
62
  config.no_subdomain_prefixes = ->(request) { ['www', '', nil] }
63
63
 
64
- # The master tenant is a special tenant. You can ask Tenant.master? to
65
- # check, if the actual tenant is the master tenant.
64
+ # The master client is a special client. You can ask MultiClient::Client.master? to
65
+ # check, if the actual client is the master client.
66
66
  #
67
- # Default: config.master_tenant_identifier = '000'
67
+ # Default: config.master_client_identifier = '000'
68
68
  #
69
- config.master_tenant_identifier = '000'
69
+ config.master_client_identifier = '000'
70
70
  end
@@ -24,7 +24,7 @@ module MultiClient
24
24
 
25
25
  mattr_accessor(:force_client_scope_for_unscoped_callers) { [] }
26
26
 
27
- mattr_accessor(:master_tenant_identifier) { '000' }
27
+ mattr_accessor(:master_client_identifier) { '000' }
28
28
 
29
29
  def self.namespaced_model_name
30
30
  "MultiClient::#{model_name}"
@@ -1,9 +1,9 @@
1
1
  module MultiClient
2
2
  module SpecHelper
3
- def use_tenant(tenant)
4
- Tenant.current_id = tenant.id
3
+ def use_client(client)
4
+ MultiClient::Client.current_id = client.id
5
5
  Capybara.current_session.driver.reset!
6
- Capybara.default_host = Capybara.default_host.sub(/(.*?\/\/)(.*?)(\..*)/, "\\1#{tenant.subdomain}\\3")
6
+ Capybara.default_host = Capybara.default_host.sub(/(.*?\/\/)(.*?)(\..*)/, "\\1#{client.subdomain}\\3")
7
7
  end
8
8
  end
9
9
  end
@@ -1,3 +1,3 @@
1
1
  module MultiClient
2
- VERSION = '2.2.1'.freeze
2
+ VERSION = '3.0.0'.freeze
3
3
  end
data/lib/multi_client.rb CHANGED
@@ -3,4 +3,8 @@ require 'multi_client/configuration'
3
3
 
4
4
  module MultiClient
5
5
  extend Configuration
6
+
7
+ def self.table_name_prefix
8
+ 'multi_client_'
9
+ end
6
10
  end
@@ -1,4 +1,15 @@
1
- # desc "Explaining what the task does"
2
- # task :multi_client do
3
- # # Task goes here
4
- # end
1
+ namespace :multi_client do
2
+ namespace :create do
3
+ desc "Explaining what the task does"
4
+ task create_master: :environment do
5
+ if MultiClient::Client.exists?(subdomain: 'master')
6
+ puts "Master tenant already exists"
7
+ next
8
+ end
9
+ if MultiClient::Client.enabled.create!(subdomain: 'master', identifier: MultiClient::Configuration.master_client_identifier)
10
+ puts "Created master tenant"
11
+ end
12
+ puts "Done"
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,12 @@
1
+ FactoryGirl.define do
2
+ factory :multi_client_client, class: MultiClient::Client do
3
+ sequence(:identifier)
4
+ sequence(:subdomain)
5
+ enabled true
6
+
7
+ trait(:master) do
8
+ identifier MultiClient::Configuration.master_client_identifier
9
+ subdomain 'master'
10
+ end
11
+ end
12
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: multi_client
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.1
4
+ version: 3.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Roberto Vasquez Angel
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-04-13 00:00:00.000000000 Z
11
+ date: 2016-05-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -141,6 +141,7 @@ files:
141
141
  - app/helpers/multi_client_helper.rb
142
142
  - app/models/concerns/multi_client/model_with_client.rb
143
143
  - app/models/multi_client/client.rb
144
+ - app/services/multi_client/create_client_service.rb
144
145
  - app/views/layouts/multi_client/application.html.erb
145
146
  - app/views/multi_client/_client_navigation.haml
146
147
  - app/views/multi_client/_current_client.html.erb
@@ -159,6 +160,7 @@ files:
159
160
  - lib/multi_client/subdomain.rb
160
161
  - lib/multi_client/version.rb
161
162
  - lib/tasks/multi_client_tasks.rake
163
+ - spec/factories/multi_client/client_factories.rb
162
164
  homepage: https://github.com/robotex82/multi_client
163
165
  licenses:
164
166
  - MIT