permits 0.3.0 → 1.1.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/README.md +18 -1
- data/lib/generators/permits/install/install_generator.rb +7 -2
- data/lib/permits/forms/invite_form.rb +65 -0
- data/lib/permits/forms/{new_invite.rb → new_invite_form.rb} +1 -1
- data/lib/permits/permission.rb +1 -1
- data/lib/permits/version.rb +1 -1
- data/lib/permits.rb +9 -4
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c4baf7748a113d4c68af920c55257fb5840bb6c136a60f002cbc13558a20e4d9
|
4
|
+
data.tar.gz: d7ab07da8c225023bc734f45d075f460951ca59597d6a0a2d0206e73d5f30a3a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a472133852912635c254bbc0b1be0ed2518c8363b64166509f527adee531bf8c8223cec3c44d7bcbd5de011b290878270a4d412c7fc12d660311861ff095d6fe
|
7
|
+
data.tar.gz: 037bd6a26de070e6b1499484db5003aea39896f8ed1aecbc5cd927bffd145547191a5f5cf88ee8a134c6465dd96fc7684d9b242eb8fb4cb1d21b9fc1b3c8cf32
|
data/README.md
CHANGED
@@ -9,7 +9,7 @@ Set up the valid `permits` values (roles/actions/levels):
|
|
9
9
|
|
10
10
|
# user levels example
|
11
11
|
::Permits.configure do |config|
|
12
|
-
config.
|
12
|
+
config.permit = %i[admin user super_user]
|
13
13
|
end
|
14
14
|
|
15
15
|
# user actions example
|
@@ -76,6 +76,23 @@ CustomPolicy.authorize!(owner, resource, :some_action)
|
|
76
76
|
CustomPolicy.authorized?(owner, resource, :some_action)
|
77
77
|
```
|
78
78
|
|
79
|
+
### Invites
|
80
|
+
`Permits` provides a simple pre-permissioned Invite system, with a `Permits::Invite` model, a `Permits::Form::NewInviteForm` form object for creating new invites, and a `Permits::Form::InviteForm` form object for accepting, declining and revoking invites. Invites can be pre-assigned permissions, so that when the invite is accepted, the invitee is automatically granted the permissions.
|
81
|
+
|
82
|
+
```irb
|
83
|
+
group = Group.create(name: "Group 1")
|
84
|
+
group_user = User.create(name: "User 1")
|
85
|
+
user_permission = Permits::Permission.create(owner: group_user, resource: group, action: :super_user)
|
86
|
+
|
87
|
+
NewInviteForm.new(
|
88
|
+
invited_by: group_user,
|
89
|
+
email: "invitee@email-address.com",
|
90
|
+
permission_attributes: {
|
91
|
+
group => [:read, :edit]
|
92
|
+
}
|
93
|
+
).save!
|
94
|
+
```
|
95
|
+
|
79
96
|
## Installation
|
80
97
|
Add this line to your application's Gemfile:
|
81
98
|
|
@@ -4,8 +4,13 @@ module Permits
|
|
4
4
|
source_root File.expand_path("templates", __dir__)
|
5
5
|
|
6
6
|
def copy_application_policy
|
7
|
-
|
8
|
-
|
7
|
+
[
|
8
|
+
"create_permits_permissions.rb",
|
9
|
+
"create_permits_invites.rb"
|
10
|
+
].each_with_index do |migration_file, index|
|
11
|
+
timestamp = (Time.current + index + 1).strftime("%Y%m%d%H%M%S")
|
12
|
+
template migration_file, "db/migrate/#{timestamp}_#{migration_file}.rb"
|
13
|
+
end
|
9
14
|
end
|
10
15
|
end
|
11
16
|
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
module Permits
|
2
|
+
module Forms
|
3
|
+
class InviteForm
|
4
|
+
include ActiveModel::Model
|
5
|
+
include ActiveModel::Attributes
|
6
|
+
include ActiveModel::Validations
|
7
|
+
|
8
|
+
attribute :invite_id
|
9
|
+
attribute :invited
|
10
|
+
attribute :token
|
11
|
+
|
12
|
+
validates :invite_id, presence: true
|
13
|
+
validates :invited, presence: true
|
14
|
+
validates :token, presence: true
|
15
|
+
|
16
|
+
def accept
|
17
|
+
return false unless valid_invite?
|
18
|
+
|
19
|
+
ActiveRecord::Base.transaction do
|
20
|
+
invite.accept!
|
21
|
+
end
|
22
|
+
true
|
23
|
+
end
|
24
|
+
|
25
|
+
def decline
|
26
|
+
return false unless valid_invite?
|
27
|
+
|
28
|
+
ActiveRecord::Base.transaction do
|
29
|
+
invite.decline!
|
30
|
+
end
|
31
|
+
true
|
32
|
+
end
|
33
|
+
|
34
|
+
def destroy
|
35
|
+
ActiveRecord::Base.transaction do
|
36
|
+
invite.permissions.destroy_all
|
37
|
+
invite.destroy
|
38
|
+
end
|
39
|
+
true
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
|
44
|
+
def valid_invite?
|
45
|
+
return false unless valid?
|
46
|
+
|
47
|
+
valid_email? && valid_token?
|
48
|
+
end
|
49
|
+
|
50
|
+
def valid_email?
|
51
|
+
raise I18n.t("errors.invited_does_not_respond_to_email") unless invited.respond_to?(:email)
|
52
|
+
|
53
|
+
invite.email == invited.email
|
54
|
+
end
|
55
|
+
|
56
|
+
def valid_token?
|
57
|
+
invite.slug == token
|
58
|
+
end
|
59
|
+
|
60
|
+
def invite
|
61
|
+
@invite ||= ::Permits::Invite.find(invite_id)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
data/lib/permits/permission.rb
CHANGED
@@ -17,7 +17,7 @@ module Permits
|
|
17
17
|
def permits_is_permissable
|
18
18
|
return if Permits.config.permits&.include?(permits&.to_sym)
|
19
19
|
|
20
|
-
errors.add(:permits, "
|
20
|
+
errors.add(:permits, I18n.t("errors.invalid_permits_param", class: resource.class.name))
|
21
21
|
end
|
22
22
|
|
23
23
|
scope :permits_any, -> { all }
|
data/lib/permits/version.rb
CHANGED
data/lib/permits.rb
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
require "active_support/configurable"
|
2
2
|
require "aasm"
|
3
3
|
require "permits/concerns/has_permissions"
|
4
|
-
require "permits/forms/
|
4
|
+
require "permits/forms/new_invite_form"
|
5
|
+
require "permits/forms/invite_form"
|
5
6
|
require "permits/invite"
|
6
7
|
require "permits/permission"
|
7
8
|
require "permits/policy/unauthorized_error"
|
@@ -17,12 +18,16 @@ module Permits
|
|
17
18
|
def configure
|
18
19
|
yield config
|
19
20
|
|
20
|
-
if config.
|
21
|
-
config.permits
|
22
|
-
config.
|
21
|
+
if config.permit
|
22
|
+
config.permits ||= []
|
23
|
+
config.permit.each do |role|
|
24
|
+
next if config.permits.include?(role.to_sym)
|
25
|
+
config.permits << role.to_sym
|
23
26
|
::Permits::Permission.scope "permits_#{role}", -> { where(permits: role) }
|
24
27
|
end
|
25
28
|
end
|
29
|
+
|
30
|
+
config.permit = config.permits
|
26
31
|
end
|
27
32
|
end
|
28
33
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: permits
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Craig Gilchrist
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-03-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: aasm
|
@@ -152,7 +152,8 @@ files:
|
|
152
152
|
- lib/generators/permits/install/templates/create_permits_permissions.rb
|
153
153
|
- lib/permits.rb
|
154
154
|
- lib/permits/concerns/has_permissions.rb
|
155
|
-
- lib/permits/forms/
|
155
|
+
- lib/permits/forms/invite_form.rb
|
156
|
+
- lib/permits/forms/new_invite_form.rb
|
156
157
|
- lib/permits/invite.rb
|
157
158
|
- lib/permits/permission.rb
|
158
159
|
- lib/permits/policy/base.rb
|