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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d330b1a5acfacc191ccffec7849305d517a1c70e50bc5e9937a07b15239f950c
4
- data.tar.gz: 4f3c2df1fec8854571ab7d57abc7129662679fbc7d53b70704ca92b8915a82a6
3
+ metadata.gz: c4baf7748a113d4c68af920c55257fb5840bb6c136a60f002cbc13558a20e4d9
4
+ data.tar.gz: d7ab07da8c225023bc734f45d075f460951ca59597d6a0a2d0206e73d5f30a3a
5
5
  SHA512:
6
- metadata.gz: '0842937fcd45b32c6cb384e7c26fc2fb8556abbae9ef9cfdb5a429fad034a6b1c82d2e85d3d50747b6375359b67e55adffb6f6000f06162640d8c622ff5defa6'
7
- data.tar.gz: b6f0a89a8b057fb960517622affcbab9911c222af51449eccfe4691488d2bac4c939eafba235d624a5f7f5f98ee29c8564514a02b61ae0e7b4bfe8992a5a5976
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.permits = %i[admin user super_user]
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
- template "create_permits_permissions.rb", "db/migrate/#{Time.current.strftime("%Y%m%d%H%M%S")}_create_permits_permissions.rb"
8
- template "create_permits_invites.rb", "db/migrate/#{Time.current.strftime("%Y%m%d%H%M%S")}_create_permits_invites.rb"
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
@@ -1,6 +1,6 @@
1
1
  module Permits
2
2
  module Forms
3
- class NewInvite
3
+ class NewInviteForm
4
4
  include ActiveModel::Model
5
5
  include ActiveModel::Attributes
6
6
  include ActiveModel::Validations
@@ -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, "is not a valid permits for #{resource.class}")
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 }
@@ -1,3 +1,3 @@
1
1
  module Permits
2
- VERSION = "0.3.0"
2
+ VERSION = "1.1.0"
3
3
  end
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/new_invite"
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.permits
21
- config.permits = config.permits.map!(&:to_sym)
22
- config.permits.each do |role|
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: 0.3.0
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-02-26 00:00:00.000000000 Z
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/new_invite.rb
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