permits 0.3.0 → 1.1.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
  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