devise_invitable 2.0.14 → 3.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +66 -0
  3. data/README.md +166 -97
  4. data/app/controllers/devise/invitations_controller.rb +8 -2
  5. data/app/controllers/devise_invitable/registrations_controller.rb +15 -10
  6. data/lib/devise_invitable/invitation.rb +89 -0
  7. data/lib/devise_invitable/inviter.rb +23 -1
  8. data/lib/devise_invitable/migrator.rb +113 -0
  9. data/lib/devise_invitable/models.rb +353 -86
  10. data/lib/devise_invitable/rails.rb +10 -0
  11. data/lib/devise_invitable/version.rb +1 -1
  12. data/lib/devise_invitable.rb +40 -4
  13. data/lib/generators/active_record/devise_invitable_install_generator.rb +22 -0
  14. data/lib/generators/active_record/devise_invitable_upgrade_generator.rb +28 -0
  15. data/lib/generators/active_record/templates/create_devise_invitations.rb +23 -0
  16. data/lib/generators/active_record/templates/upgrade_devise_invitations.rb +72 -0
  17. data/lib/generators/devise_invitable/devise_invitable_generator.rb +2 -4
  18. data/lib/generators/devise_invitable/install_generator.rb +8 -10
  19. data/lib/generators/devise_invitable/upgrade_generator.rb +16 -0
  20. data/lib/generators/mongoid/devise_invitable_install_generator.rb +7 -0
  21. data/lib/generators/mongoid/devise_invitable_upgrade_generator.rb +11 -0
  22. data/lib/tasks/devise_invitable_tasks.rake +10 -0
  23. data/test/functional/registrations_controller_test.rb +24 -3
  24. data/test/generators_test.rb +16 -9
  25. data/test/integration/invitation_test.rb +24 -3
  26. data/test/mailers/invitation_mail_test.rb +1 -0
  27. data/test/models/invitable_test.rb +40 -2
  28. data/test/models/separate_invitations_test.rb +181 -0
  29. data/test/models_test.rb +34 -0
  30. data/test/rails_app/app/controllers/boolean_inviter_invitations_controller.rb +11 -0
  31. data/test/rails_app/app/controllers/restricted_invitations_controller.rb +9 -0
  32. data/test/rails_app/app/models/user.rb +8 -2
  33. data/test/rails_app/config/initializers/devise.rb +0 -9
  34. data/test/rails_app/config/routes.rb +2 -0
  35. data/test/rails_app/db/migrate/20100401102949_create_tables.rb +22 -0
  36. data/test/routes_test.rb +6 -0
  37. metadata +26 -13
  38. data/lib/generators/active_record/devise_invitable_generator.rb +0 -19
  39. data/lib/generators/active_record/templates/migration.rb +0 -22
  40. data/lib/generators/mongoid/devise_invitable_generator.rb +0 -8
@@ -0,0 +1,181 @@
1
+ require 'test_helper'
2
+ require 'model_tests_helper'
3
+
4
+ class SeparateInvitationsTest < ActiveSupport::TestCase
5
+ setup do
6
+ @create_resource_on_invitation = User.create_resource_on_invitation
7
+ DeviseInvitable::Invitation.delete_all
8
+ end
9
+
10
+ teardown do
11
+ User.create_resource_on_invitation = @create_resource_on_invitation
12
+ end
13
+
14
+ test 'an invitation can be persisted without creating a resource' do
15
+ User.create_resource_on_invitation = false
16
+ registered = User.create!(email: 'registered@example.com', password: '123456789')
17
+
18
+ invited = User.invite!(email: 'deferred@example.com')
19
+ invitation = DeviseInvitable::Invitation.first
20
+
21
+ assert_predicate invited, :new_record?
22
+ assert_equal 0, User.where(email: 'deferred@example.com').count
23
+ assert_equal({ 'email' => 'deferred@example.com' }, invitation.invite_key.to_h.stringify_keys)
24
+ assert_nil invitation.invitable_id
25
+ assert_nil invitation.resource_created_at
26
+ assert_includes User.no_active_invitation, registered
27
+ end
28
+
29
+ test 'accepting one of multiple invitations creates the resource and supersedes the others' do
30
+ User.create_resource_on_invitation = false
31
+ first_inviter = User.create!(email: 'first@example.com', password: '123456789')
32
+ second_inviter = User.create!(email: 'second@example.com', password: '123456789')
33
+
34
+ User.invite!({ email: 'multiple@example.com' }, first_inviter)
35
+ first = DeviseInvitable::Invitation.order(id: :asc).first
36
+ User.invite!({ email: 'multiple@example.com' }, second_inviter)
37
+ accepted_token = Thread.current[:token]
38
+
39
+ user = User.accept_invitation!(
40
+ invitation_token: accepted_token,
41
+ password: '123456789',
42
+ password_confirmation: '123456789'
43
+ )
44
+
45
+ assert_predicate user, :persisted?
46
+ refute_predicate user, :invitation_pending?
47
+ assert DeviseInvitable::Invitation.accepted.where(invitable: user).exists?
48
+ assert_equal 'accepted_other_invitation', first.reload.superseded_reason
49
+ assert_equal first_inviter, first.invited_by
50
+ assert_equal second_inviter, DeviseInvitable::Invitation.accepted.find_by!(invitable: user).invited_by
51
+ assert_equal user, first.invitable
52
+ end
53
+
54
+ test 'resending stages the new inviter without changing the previous invitation' do
55
+ User.create_resource_on_invitation = true
56
+ first_inviter = User.create!(email: 'first@example.com', password: '123456789')
57
+ second_inviter = User.create!(email: 'second@example.com', password: '123456789')
58
+
59
+ User.invite!({ email: 'multiple@example.com' }, first_inviter)
60
+ first_invitation = DeviseInvitable::Invitation.order(id: :asc).first
61
+
62
+ User.invite!({ email: 'multiple@example.com' }, second_inviter) do |invitable|
63
+ assert_equal second_inviter, invitable.invited_by
64
+ assert_equal second_inviter, invitable.invited_by_for_next_invitation
65
+ end
66
+
67
+ assert_equal first_inviter, first_invitation.reload.invited_by
68
+ assert_equal second_inviter, DeviseInvitable::Invitation.order(id: :asc).last.invited_by
69
+ end
70
+
71
+ test 'an inviter exposes its sent invitations' do
72
+ inviter = Admin.create!(email: 'admin@example.com', password: '123456789')
73
+
74
+ User.invite!({ email: 'invited@example.com' }, inviter)
75
+
76
+ assert_equal [DeviseInvitable::Invitation.last], inviter.sent_invitations.to_a
77
+ end
78
+
79
+ test 'deleting an inviter preserves sent invitations' do
80
+ inviter = Admin.create!(email: 'admin@example.com', password: '123456789')
81
+ User.invite!({ email: 'invited@example.com' }, inviter)
82
+ invitation = DeviseInvitable::Invitation.last
83
+
84
+ inviter.destroy!
85
+
86
+ assert_predicate invitation.reload, :persisted?
87
+ assert_nil invitation.invited_by
88
+ end
89
+
90
+ test 'a placeholder is inactive until an invitation is accepted' do
91
+ User.create_resource_on_invitation = true
92
+
93
+ user = User.invite!(email: 'placeholder@example.com')
94
+ user.update!(confirmed_at: Time.now.utc)
95
+
96
+ assert_predicate user, :invitation_pending?
97
+ refute_predicate user, :active_for_authentication?
98
+ assert_nil user.valid_password?('unknown')
99
+
100
+ user.password = user.password_confirmation = '123456789'
101
+ assert user.accept_invitation!
102
+ refute_predicate user.reload, :invitation_pending?
103
+ assert_predicate user, :active_for_authentication?
104
+ end
105
+
106
+ test 'resource attributes raise when placeholder creation is disabled' do
107
+ User.create_resource_on_invitation = false
108
+
109
+ error = assert_raises DeviseInvitable::ResourceAttributesRequirePlaceholderError do
110
+ User.invite!(email: 'attributes@example.com', username: 'invited')
111
+ end
112
+
113
+ assert_includes error.message, 'username'
114
+ assert_includes error.message, 'create_resource_on_invitation is disabled'
115
+ assert_equal 0, DeviseInvitable::Invitation.count
116
+ end
117
+
118
+ test 'resource attributes assigned by a block raise when placeholder creation is disabled' do
119
+ User.create_resource_on_invitation = false
120
+
121
+ error = assert_raises DeviseInvitable::ResourceAttributesRequirePlaceholderError do
122
+ User.invite!(email: 'attributes@example.com') do |invitable|
123
+ invitable.username = 'invited'
124
+ end
125
+ end
126
+
127
+ assert_includes error.message, 'username'
128
+ assert_equal 0, DeviseInvitable::Invitation.count
129
+ end
130
+
131
+ test 'deferred invitations validate their invite keys' do
132
+ User.create_resource_on_invitation = false
133
+
134
+ invited = User.invite!(email: 'not-an-email')
135
+
136
+ assert_includes invited.errors.details[:email], error: :invalid
137
+ assert_equal 0, DeviseInvitable::Invitation.count
138
+ end
139
+
140
+ test 'legacy invitation data migration is idempotent' do
141
+ skip unless DEVISE_ORM == :mongoid
142
+
143
+ user = User.create!(email: 'legacy@example.com', password: '123456789')
144
+ created_at = 1.day.ago
145
+ User.collection.find(_id: user.id).update_one(
146
+ '$set' => {
147
+ invitation_token: 'legacy-digest',
148
+ invitation_created_at: created_at,
149
+ invitation_sent_at: created_at,
150
+ invited_by_type: 'User'
151
+ }
152
+ )
153
+
154
+ assert_equal 1, DeviseInvitable::Migrator.call(User)
155
+ assert_equal 0, DeviseInvitable::Migrator.call(User)
156
+
157
+ invitation = DeviseInvitable::Invitation.find_by!(invitation_token: 'legacy-digest')
158
+ assert_equal user, invitation.invitable
159
+ assert_equal({ 'email' => 'legacy@example.com' }, invitation.invite_key.to_h.stringify_keys)
160
+ assert_equal created_at.to_i, invitation.resource_created_at.to_i
161
+ end
162
+
163
+ test 'legacy invitation migration processes multiple resources in a batch' do
164
+ skip unless DEVISE_ORM == :mongoid
165
+
166
+ first = User.create!(email: 'first-legacy@example.com', password: '123456789')
167
+ second = User.create!(email: 'second-legacy@example.com', password: '123456789')
168
+ created_at = 1.day.ago
169
+ User.collection.find(_id: first.id).update_one(
170
+ '$set' => { invitation_token: 'first-legacy-digest', invitation_created_at: created_at }
171
+ )
172
+ User.collection.find(_id: second.id).update_one(
173
+ '$set' => { invitation_token: 'second-legacy-digest', invitation_created_at: created_at }
174
+ )
175
+
176
+ assert_equal 2, DeviseInvitable::Migrator.call(User)
177
+ assert_equal 2, DeviseInvitable::Invitation.where(:invitable_id.in => [first.id, second.id]).count
178
+ refute first.reload.attributes.key?('invitation_created_at')
179
+ refute second.reload.attributes.key?('invitation_created_at')
180
+ end
181
+ end
data/test/models_test.rb CHANGED
@@ -32,10 +32,19 @@ class ModelsTest < ActiveSupport::TestCase
32
32
  assert_nil User.invitation_limit
33
33
  end
34
34
 
35
+ test 'does not create placeholder resources by default' do
36
+ assert_equal false, Devise.create_resource_on_invitation
37
+ end
38
+
35
39
  test 'should have a default value for invite_key' do
36
40
  assert !User.invite_key.nil?
37
41
  end
38
42
 
43
+ test 'uses the root model class for invitations' do
44
+ assert_equal User, User.devise_invitable_base_class
45
+ assert_equal User, Invitable.devise_invitable_base_class
46
+ end
47
+
39
48
  test 'set a custom value for invite_for' do
40
49
  old_invite_for = User.invite_for
41
50
  User.invite_for = 5.days
@@ -63,6 +72,31 @@ class ModelsTest < ActiveSupport::TestCase
63
72
  User.invitation_limit = old_invitation_limit
64
73
  end
65
74
 
75
+ test 'warns when deprecated invited_by settings are configured globally' do
76
+ DeviseInvitable.deprecator.expects(:warn).with(includes('invited_by_class_name')).once
77
+ DeviseInvitable.deprecator.expects(:warn).with(includes('invited_by_foreign_key')).once
78
+
79
+ Devise.invited_by_class_name = 'Admin'
80
+ Devise.invited_by_foreign_key = :inviter_id
81
+ ensure
82
+ Devise.class_variable_set(:@@invited_by_class_name, nil)
83
+ Devise.class_variable_set(:@@invited_by_foreign_key, nil)
84
+ end
85
+
86
+ test 'warns when deprecated invited_by settings are configured on a model' do
87
+ DeviseInvitable.deprecator.expects(:warn).with(includes('invited_by_class_name')).once
88
+ DeviseInvitable.deprecator.expects(:warn).with(includes('invited_by_foreign_key')).once
89
+
90
+ model = Class.new(User) do
91
+ devise :invitable,
92
+ invited_by_class_name: 'Admin',
93
+ invited_by_foreign_key: :inviter_id
94
+ end
95
+
96
+ assert_equal 'Admin', model.invited_by_class_name
97
+ assert_equal :inviter_id, model.invited_by_foreign_key
98
+ end
99
+
66
100
  test 'set a default value for validate_on_invite' do
67
101
  assert_equal true, Invitable.validate_on_invite
68
102
  end
@@ -0,0 +1,11 @@
1
+ class BooleanInviterInvitationsController < Devise::InvitationsController
2
+ protected
3
+
4
+ def authenticate_inviter!
5
+ true
6
+ end
7
+
8
+ def current_user
9
+ User.find_by(email: 'boolean-inviter@example.com')
10
+ end
11
+ end
@@ -0,0 +1,9 @@
1
+ class RestrictedInvitationsController < Devise::InvitationsController
2
+ protected
3
+
4
+ def authenticate_inviter!
5
+ return if current_admin
6
+
7
+ redirect_back fallback_location: root_path, alert: 'You are not authorized to access this page'
8
+ end
9
+ end
@@ -34,9 +34,11 @@ class User < PARENT_MODEL_CLASS
34
34
  validates_presence_of :encrypted_password, if: :password_required?
35
35
  end
36
36
 
37
- devise :database_authenticatable, :registerable, :validatable, :confirmable, :invitable, :recoverable
37
+ devise :database_authenticatable, :registerable, :validatable, :confirmable, :invitable, :recoverable,
38
+ create_resource_on_invitation: true
38
39
 
39
- attr_accessor :after_invitation_created_callback_works, :after_invitation_accepted_callback_works, :bio, :token
40
+ attr_accessor :before_invitation_created_callback_works, :after_invitation_created_callback_works,
41
+ :after_invitation_accepted_callback_works, :bio, :token
40
42
  validates :username, length: { maximum: 20 }
41
43
 
42
44
  attr_accessor :testing_accepted_or_not_invited
@@ -52,6 +54,10 @@ class User < PARENT_MODEL_CLASS
52
54
  object.after_invitation_created_callback_works = true
53
55
  end
54
56
 
57
+ before_invitation_created do |object|
58
+ object.before_invitation_created_callback_works = true
59
+ end
60
+
55
61
  after_invitation_accepted do |object|
56
62
  object.after_invitation_accepted_callback_works = true
57
63
  end
@@ -120,15 +120,6 @@ Devise.setup do |config|
120
120
  # Default: true
121
121
  # config.resend_invitation = false
122
122
 
123
- # The class name of the inviting model. If this is nil,
124
- # the #invited_by association is declared to be polymorphic.
125
- # Default: nil
126
- # config.invited_by_class_name = 'User'
127
-
128
- # The foreign key to the inviting model (if invited_by_class_name is set)
129
- # Default: :invited_by_id
130
- # config.invited_by_foreign_key = :invited_by_id
131
-
132
123
  # The column name used for counter_cache column. If this is nil,
133
124
  # the #invited_by association is declared without counter_cache.
134
125
  # Default: nil
@@ -1,7 +1,9 @@
1
1
  RailsApp::Application.routes.draw do
2
2
  devise_for :users
3
3
  devise_scope :user do
4
+ resource :boolean_inviter_invitation, only: [:new, :create]
4
5
  resource :free_invitation, only: [:new, :create]
6
+ resource :restricted_invitation, only: [:new, :create]
5
7
  resource :admin, only: [:new, :create]
6
8
  end
7
9
  devise_for :admins
@@ -33,6 +33,28 @@ class CreateTables < (Rails.version < '5.1' ? ActiveRecord::Migration : ActiveRe
33
33
  end
34
34
  add_index :users, :invitation_token, :unique => true
35
35
 
36
+ create_table :devise_invitations do |t|
37
+ t.string :invitation_token
38
+ t.datetime :invitation_created_at
39
+ t.datetime :invitation_sent_at
40
+ t.datetime :invitation_accepted_at
41
+ t.datetime :superseded_at
42
+ t.string :superseded_reason
43
+ t.datetime :revoked_at
44
+ t.datetime :resource_created_at
45
+ t.json :invite_key, null: false, default: {}
46
+ t.string :invite_key_digest, null: false
47
+ t.integer :invitable_id
48
+ t.string :invitable_type
49
+ t.integer :invited_by_id
50
+ t.string :invited_by_type
51
+ t.timestamps
52
+ end
53
+ add_index :devise_invitations, :invitation_token, unique: true
54
+ add_index :devise_invitations, [:invitable_type, :invitable_id]
55
+ add_index :devise_invitations, [:invited_by_type, :invited_by_id]
56
+ add_index :devise_invitations, [:invitable_type, :invite_key_digest]
57
+
36
58
  create_table :admins do |t|
37
59
  ## Database authenticatable
38
60
  t.string :email, :null => true, :default => ""
data/test/routes_test.rb CHANGED
@@ -2,6 +2,12 @@ require 'test_helper'
2
2
 
3
3
  class RoutesTest < ActionController::TestCase
4
4
 
5
+ test 'preserve custom controller module for registrations' do
6
+ mapping = Devise::Mapping.new(:users, module: :users)
7
+
8
+ assert_equal 'users/registrations', mapping.controllers[:registrations]
9
+ end
10
+
5
11
  test 'map new user invitation' do
6
12
  assert_recognizes({ controller: 'devise/invitations', action: 'new' }, { path: 'users/invitation/new', method: :get })
7
13
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: devise_invitable
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.14
4
+ version: 3.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sergio Cambra
@@ -15,42 +15,42 @@ dependencies:
15
15
  requirements:
16
16
  - - ">="
17
17
  - !ruby/object:Gem::Version
18
- version: '5.0'
18
+ version: '7.0'
19
19
  type: :runtime
20
20
  prerelease: false
21
21
  version_requirements: !ruby/object:Gem::Requirement
22
22
  requirements:
23
23
  - - ">="
24
24
  - !ruby/object:Gem::Version
25
- version: '5.0'
25
+ version: '7.0'
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: devise
28
28
  requirement: !ruby/object:Gem::Requirement
29
29
  requirements:
30
30
  - - ">="
31
31
  - !ruby/object:Gem::Version
32
- version: '4.6'
32
+ version: '5.0'
33
33
  type: :runtime
34
34
  prerelease: false
35
35
  version_requirements: !ruby/object:Gem::Requirement
36
36
  requirements:
37
37
  - - ">="
38
38
  - !ruby/object:Gem::Version
39
- version: '4.6'
39
+ version: '5.0'
40
40
  - !ruby/object:Gem::Dependency
41
41
  name: bundler
42
42
  requirement: !ruby/object:Gem::Requirement
43
43
  requirements:
44
- - - "~>"
44
+ - - ">="
45
45
  - !ruby/object:Gem::Version
46
- version: '4.0'
46
+ version: '2.0'
47
47
  type: :development
48
48
  prerelease: false
49
49
  version_requirements: !ruby/object:Gem::Requirement
50
50
  requirements:
51
- - - "~>"
51
+ - - ">="
52
52
  - !ruby/object:Gem::Version
53
- version: '4.0'
53
+ version: '2.0'
54
54
  description: It adds support for send invitations by email (it requires to be authenticated)
55
55
  and accept the invitation by setting a password.
56
56
  email:
@@ -95,23 +95,30 @@ files:
95
95
  - config/locales/zh-TW.yml
96
96
  - lib/devise_invitable.rb
97
97
  - lib/devise_invitable/controllers/helpers.rb
98
+ - lib/devise_invitable/invitation.rb
98
99
  - lib/devise_invitable/inviter.rb
99
100
  - lib/devise_invitable/mailer.rb
100
101
  - lib/devise_invitable/mapping.rb
102
+ - lib/devise_invitable/migrator.rb
101
103
  - lib/devise_invitable/models.rb
102
104
  - lib/devise_invitable/models/authenticatable.rb
103
105
  - lib/devise_invitable/parameter_sanitizer.rb
104
106
  - lib/devise_invitable/rails.rb
105
107
  - lib/devise_invitable/routes.rb
106
108
  - lib/devise_invitable/version.rb
107
- - lib/generators/active_record/devise_invitable_generator.rb
108
- - lib/generators/active_record/templates/migration.rb
109
+ - lib/generators/active_record/devise_invitable_install_generator.rb
110
+ - lib/generators/active_record/devise_invitable_upgrade_generator.rb
111
+ - lib/generators/active_record/templates/create_devise_invitations.rb
112
+ - lib/generators/active_record/templates/upgrade_devise_invitations.rb
109
113
  - lib/generators/devise_invitable/devise_invitable_generator.rb
110
114
  - lib/generators/devise_invitable/install_generator.rb
111
115
  - lib/generators/devise_invitable/templates/simple_form_for/invitations/edit.html.erb
112
116
  - lib/generators/devise_invitable/templates/simple_form_for/invitations/new.html.erb
117
+ - lib/generators/devise_invitable/upgrade_generator.rb
113
118
  - lib/generators/devise_invitable/views_generator.rb
114
- - lib/generators/mongoid/devise_invitable_generator.rb
119
+ - lib/generators/mongoid/devise_invitable_install_generator.rb
120
+ - lib/generators/mongoid/devise_invitable_upgrade_generator.rb
121
+ - lib/tasks/devise_invitable_tasks.rake
115
122
  - test/functional/controller_helpers_test.rb
116
123
  - test/functional/registrations_controller_test.rb
117
124
  - test/generators/views_generator_test.rb
@@ -123,14 +130,17 @@ files:
123
130
  - test/mailers/parent_mailer_test.rb
124
131
  - test/model_tests_helper.rb
125
132
  - test/models/invitable_test.rb
133
+ - test/models/separate_invitations_test.rb
126
134
  - test/models_test.rb
127
135
  - test/orm/active_record.rb
128
136
  - test/orm/mongoid.rb
129
137
  - test/rails_app/Rakefile
130
138
  - test/rails_app/app/controllers/admins_controller.rb
131
139
  - test/rails_app/app/controllers/application_controller.rb
140
+ - test/rails_app/app/controllers/boolean_inviter_invitations_controller.rb
132
141
  - test/rails_app/app/controllers/free_invitations_controller.rb
133
142
  - test/rails_app/app/controllers/home_controller.rb
143
+ - test/rails_app/app/controllers/restricted_invitations_controller.rb
134
144
  - test/rails_app/app/controllers/users_controller.rb
135
145
  - test/rails_app/app/helpers/application_helper.rb
136
146
  - test/rails_app/app/mailers/application_mailer.rb
@@ -182,7 +192,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
182
192
  requirements:
183
193
  - - ">="
184
194
  - !ruby/object:Gem::Version
185
- version: 2.2.2
195
+ version: 2.7.0
186
196
  required_rubygems_version: !ruby/object:Gem::Requirement
187
197
  requirements:
188
198
  - - ">="
@@ -204,14 +214,17 @@ test_files:
204
214
  - test/mailers/parent_mailer_test.rb
205
215
  - test/model_tests_helper.rb
206
216
  - test/models/invitable_test.rb
217
+ - test/models/separate_invitations_test.rb
207
218
  - test/models_test.rb
208
219
  - test/orm/active_record.rb
209
220
  - test/orm/mongoid.rb
210
221
  - test/rails_app/Rakefile
211
222
  - test/rails_app/app/controllers/admins_controller.rb
212
223
  - test/rails_app/app/controllers/application_controller.rb
224
+ - test/rails_app/app/controllers/boolean_inviter_invitations_controller.rb
213
225
  - test/rails_app/app/controllers/free_invitations_controller.rb
214
226
  - test/rails_app/app/controllers/home_controller.rb
227
+ - test/rails_app/app/controllers/restricted_invitations_controller.rb
215
228
  - test/rails_app/app/controllers/users_controller.rb
216
229
  - test/rails_app/app/helpers/application_helper.rb
217
230
  - test/rails_app/app/mailers/application_mailer.rb
@@ -1,19 +0,0 @@
1
- require 'rails/generators/active_record'
2
-
3
- module ActiveRecord
4
- module Generators
5
- class DeviseInvitableGenerator < ActiveRecord::Generators::Base
6
- source_root File.expand_path('../templates', __FILE__)
7
-
8
- def copy_devise_migration
9
- migration_template 'migration.rb', "db/migrate/devise_invitable_add_to_#{table_name}.rb", migration_version: migration_version
10
- end
11
-
12
- def migration_version
13
- if Rails::VERSION::MAJOR >= 5
14
- "[#{Rails::VERSION::MAJOR}.#{Rails::VERSION::MINOR}]"
15
- end
16
- end
17
- end
18
- end
19
- end
@@ -1,22 +0,0 @@
1
- class DeviseInvitableAddTo<%= table_name.camelize %> < ActiveRecord::Migration<%= migration_version %>
2
- def up
3
- change_table :<%= table_name %> do |t|
4
- t.string :invitation_token
5
- t.datetime :invitation_created_at
6
- t.datetime :invitation_sent_at
7
- t.datetime :invitation_accepted_at
8
- t.integer :invitation_limit
9
- t.references :invited_by, polymorphic: true
10
- t.integer :invitations_count, default: 0
11
- t.index :invitation_token, unique: true # for invitable
12
- t.index :invited_by_id
13
- end
14
- end
15
-
16
- def down
17
- change_table :<%= table_name %> do |t|
18
- t.remove_references :invited_by, polymorphic: true
19
- t.remove :invitations_count, :invitation_limit, :invitation_sent_at, :invitation_accepted_at, :invitation_token, :invitation_created_at
20
- end
21
- end
22
- end
@@ -1,8 +0,0 @@
1
- require 'generators/devise/orm_helpers'
2
-
3
- module Mongoid
4
- module Generators
5
- class DeviseInvitableGenerator < Rails::Generators::NamedBase
6
- end
7
- end
8
- end