invitation 0.4.5 → 0.5.0
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.
- checksums.yaml +4 -4
- data/app/controllers/invitation/invites_controller.rb +84 -111
- data/app/forms/invitation/invite_form.rb +36 -0
- data/lib/generators/invitation/controllers/controllers_generator.rb +4 -0
- data/lib/invitation/version.rb +1 -1
- metadata +3 -3
- data/lib/tasks/invitation_tasks.rake +0 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4a8f89d369c24f891983b625b72501697feb718b
|
4
|
+
data.tar.gz: 63d62ec182515cfc19cb56c0f8b277627807a3dc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d09d203673dcaf4b5a1016b8f4043767a91f1c09ed881e7c962ae8a5f549c50bc6c8eacfacfcac3988dbd0db315b13eef5361e9757f8fda4accd18256399ea63
|
7
|
+
data.tar.gz: 9c9beaad4470e5dad9fa5c0796090d7c9ca2a7552b63023fdbbfa63019ffe7228ffaa42db55ad060a8f044173dee4af8f35b13bed7e1ff5528354d8c9ed302c7
|
@@ -1,133 +1,106 @@
|
|
1
|
-
|
2
|
-
# Invitation::InvitesController - issue invitations to users via email address.
|
3
|
-
#
|
4
|
-
# Controller uses an (inner class) Form object that is not a persisted model. The
|
5
|
-
# form can accept many email addresses, and creates on Invite per email address.
|
6
|
-
#
|
7
|
-
# Subclass and modify or extend, or copy the controller into your app with `rails generate invitation:controller`.
|
8
|
-
#
|
9
|
-
# Common extensions include:
|
10
|
-
# * add authorization checks: subclass and add before_actions to :new and :create.
|
11
|
-
# * override after_invite_existing_user or after_invite_new_user
|
12
|
-
#
|
13
|
-
class Invitation::InvitesController < ApplicationController
|
14
|
-
def new
|
15
|
-
@invite = InviteForm.new(invite_params)
|
16
|
-
render template: 'invites/new'
|
17
|
-
end
|
1
|
+
module Invitation
|
18
2
|
|
19
|
-
# Create one or more Invite instances.
|
20
|
-
# invite: { invitable_id, invitable_type, email or emails:[] }
|
21
3
|
#
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
4
|
+
# Invitation::InvitesController - issue invitations to users via email address.
|
5
|
+
#
|
6
|
+
# Controller uses an (inner class) Form object that is not a persisted model. The
|
7
|
+
# form can accept many email addresses, and creates on Invite per email address.
|
8
|
+
#
|
9
|
+
# Subclass and modify/extend, or copy the controller into your app with `rails generate invitation:controller`.
|
10
|
+
#
|
11
|
+
# Common extensions could include:
|
12
|
+
# * add authorization checks: subclass and add before_actions to :new and :create.
|
13
|
+
# * override after_invite_existing_user or after_invite_new_user
|
14
|
+
#
|
15
|
+
class InvitesController < ApplicationController
|
16
|
+
|
17
|
+
def new
|
18
|
+
@invite = InviteForm.new(invite_params)
|
19
|
+
render template: 'invites/new'
|
27
20
|
end
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
21
|
+
|
22
|
+
#
|
23
|
+
# Create one or more Invite instances.
|
24
|
+
# invite: { invitable_id, invitable_type, email or emails:[] }
|
25
|
+
#
|
26
|
+
def create
|
27
|
+
failures = []
|
28
|
+
invites = InviteForm.new(invite_params).build_invites(current_user)
|
29
|
+
ActiveRecord::Base.transaction do
|
30
|
+
invites.each { |invite| invite.save ? do_invite(invite) : failures << invite.email }
|
37
31
|
end
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
32
|
+
|
33
|
+
logger.info "!!!!!!!!!!!!!!!!!!!!! INSIDE CREATE: current_user: #{current_user.inspect}"
|
34
|
+
respond_to do |format|
|
35
|
+
format.html do
|
36
|
+
if failures.empty?
|
37
|
+
flash[:notice] = t('invitation.flash.invite_issued', count: invites.count)
|
38
|
+
else
|
39
|
+
flash[:error] = t('invitation.flash.invite_error', count: failures.count, email: failures.to_sentence)
|
40
|
+
end
|
41
|
+
redirect_to url_after_invite(invites.first) # FIXME: redirect to back
|
42
|
+
end
|
43
|
+
format.json do
|
44
|
+
if failures.empty?
|
45
|
+
# If we received a single email, json response should be a scalar, not an array.
|
46
|
+
invites = params[:invite].key?('email') ? invites.first : invites
|
47
|
+
render json: invites.as_json(except: [:token, :created_at, :updated_at]), status: 201
|
48
|
+
else
|
49
|
+
render json: {
|
50
|
+
message: t('invitation.flash.invite_error', count: failures.count, email: failures.to_sentence),
|
51
|
+
status: :unprocessable_entity
|
52
|
+
}
|
53
|
+
end
|
48
54
|
end
|
49
55
|
end
|
50
56
|
end
|
51
|
-
end
|
52
57
|
|
53
|
-
|
54
|
-
|
55
|
-
# A form object pretends to be 'invite', but accepts both 'email' and 'emails'.
|
56
|
-
# It knows how to build all of the invite instances.
|
57
|
-
class InviteForm
|
58
|
-
include ActiveModel::Model
|
59
|
-
attr_accessor :invitable_id, :invitable_type, :email, :emails
|
60
|
-
attr_reader :invitable
|
58
|
+
private
|
61
59
|
|
62
|
-
|
63
|
-
|
60
|
+
# Override this if you want to do something more complicated for existing users.
|
61
|
+
# For example, if you have a more complex permissions scheme than just a simple
|
62
|
+
# has_many relationship, enable it here.
|
63
|
+
def after_invite_existing_user(invite)
|
64
|
+
# Add the user to the invitable resource/organization
|
65
|
+
invite.invitable.add_invited_user(invite.recipient)
|
64
66
|
end
|
65
67
|
|
66
|
-
|
67
|
-
|
68
|
-
|
68
|
+
# Override if you want to do something more complicated for new users.
|
69
|
+
# By default we don't do anything extra.
|
70
|
+
def after_invite_new_user(invite)
|
69
71
|
end
|
70
72
|
|
71
|
-
|
72
|
-
|
73
|
+
# After an invite is created, redirect the user here.
|
74
|
+
# Default implementation doesn't return a url, just the invitable.
|
75
|
+
def url_after_invite(invite)
|
76
|
+
invite.invitable
|
73
77
|
end
|
74
78
|
|
75
|
-
def
|
76
|
-
|
77
|
-
Invite.new(invitable_id: @invitable_id, invitable_type: @invitable_type, sender_id: current_user.id, email: e)
|
78
|
-
end
|
79
|
+
def invite_params
|
80
|
+
params[:invite] ? params.require(:invite).permit(:invitable_id, :invitable_type, :email, emails: []) : {}
|
79
81
|
end
|
80
82
|
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
invite.invitable.add_invited_user(invite.recipient)
|
94
|
-
end
|
95
|
-
|
96
|
-
# Override if you want to do something more complicated for new users.
|
97
|
-
# By default we don't do anything extra.
|
98
|
-
def after_invite_new_user(invite)
|
99
|
-
end
|
100
|
-
|
101
|
-
# After an invite is created, redirect the user here.
|
102
|
-
# Default implementation doesn't return a url, just the invitable.
|
103
|
-
def url_after_invite(invite)
|
104
|
-
invite.invitable
|
105
|
-
end
|
106
|
-
|
107
|
-
def invite_params
|
108
|
-
params[:invite] ? params.require(:invite).permit(:invitable_id, :invitable_type, :email, emails: []) : {}
|
109
|
-
end
|
110
|
-
|
111
|
-
# Invite user by sending email.
|
112
|
-
# Existing users are granted permissions via #after_invite_existing_user.
|
113
|
-
# New users are granted permissions via #after_invite_new_user, currently a null op.
|
114
|
-
def do_invite(invite)
|
115
|
-
if invite.existing_user?
|
116
|
-
deliver_email(InviteMailer.existing_user(invite))
|
117
|
-
after_invite_existing_user(invite)
|
118
|
-
invite.save
|
119
|
-
else
|
120
|
-
deliver_email(InviteMailer.new_user(invite))
|
121
|
-
after_invite_new_user(invite)
|
83
|
+
# Invite user by sending email.
|
84
|
+
# Existing users are granted permissions via #after_invite_existing_user.
|
85
|
+
# New users are granted permissions via #after_invite_new_user, currently a null op.
|
86
|
+
def do_invite(invite)
|
87
|
+
if invite.existing_user?
|
88
|
+
deliver_email(InviteMailer.existing_user(invite))
|
89
|
+
after_invite_existing_user(invite)
|
90
|
+
invite.save
|
91
|
+
else
|
92
|
+
deliver_email(InviteMailer.new_user(invite))
|
93
|
+
after_invite_new_user(invite)
|
94
|
+
end
|
122
95
|
end
|
123
|
-
end
|
124
96
|
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
97
|
+
# Use deliver_later from rails 4.2+ if available.
|
98
|
+
def deliver_email(mail)
|
99
|
+
if mail.respond_to?(:deliver_later)
|
100
|
+
mail.deliver_later
|
101
|
+
else
|
102
|
+
mail.deliver
|
103
|
+
end
|
131
104
|
end
|
132
105
|
end
|
133
106
|
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Invitation
|
2
|
+
|
3
|
+
# A form object pretends to be 'invite', but accepts both 'email' and 'emails'.
|
4
|
+
# It knows how to build all of the invite instances.
|
5
|
+
class InviteForm
|
6
|
+
include ActiveModel::Model
|
7
|
+
|
8
|
+
attr_accessor :invitable_id, :invitable_type, :email, :emails
|
9
|
+
attr_reader :invitable
|
10
|
+
|
11
|
+
def self.model_name # form masquerades as 'invite'
|
12
|
+
ActiveModel::Name.new(self, nil, 'Invite')
|
13
|
+
end
|
14
|
+
|
15
|
+
def initialize(attributes = {})
|
16
|
+
@emails ||= []
|
17
|
+
super
|
18
|
+
end
|
19
|
+
|
20
|
+
def invitable
|
21
|
+
@invitable ||= @invitable_type.classify.constantize.find(@invitable_id)
|
22
|
+
end
|
23
|
+
|
24
|
+
def build_invites(current_user)
|
25
|
+
all_emails.reject(&:blank?).collect do |e|
|
26
|
+
Invite.new(invitable_id: @invitable_id, invitable_type: @invitable_type, sender_id: current_user.id, email: e)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
def all_emails
|
33
|
+
@emails + [@email]
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
data/lib/invitation/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: invitation
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Justin Tomich
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-03-
|
11
|
+
date: 2018-03-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -207,6 +207,7 @@ extra_rdoc_files: []
|
|
207
207
|
files:
|
208
208
|
- Rakefile
|
209
209
|
- app/controllers/invitation/invites_controller.rb
|
210
|
+
- app/forms/invitation/invite_form.rb
|
210
211
|
- app/mailers/invite_mailer.rb
|
211
212
|
- app/models/invite.rb
|
212
213
|
- app/views/invite_mailer/existing_user.html.erb
|
@@ -235,7 +236,6 @@ files:
|
|
235
236
|
- lib/invitation/user.rb
|
236
237
|
- lib/invitation/user_registration.rb
|
237
238
|
- lib/invitation/version.rb
|
238
|
-
- lib/tasks/invitation_tasks.rake
|
239
239
|
homepage: http://github.com/tomichj/invitation
|
240
240
|
licenses:
|
241
241
|
- MIT
|