permits 0.1.4 → 0.3.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: 81ac6b69542c7d7b1f09688cbe4beb0896990b297c6057f2c714eccf479d1682
4
- data.tar.gz: d3a0f82e5a9d7d2167a33f945b1cd6017451aea44912826c35da02aa84f01055
3
+ metadata.gz: d330b1a5acfacc191ccffec7849305d517a1c70e50bc5e9937a07b15239f950c
4
+ data.tar.gz: 4f3c2df1fec8854571ab7d57abc7129662679fbc7d53b70704ca92b8915a82a6
5
5
  SHA512:
6
- metadata.gz: 5e8cd3716c4741fa257cdee4bb9f5e205c7706266bc4d0cb9414223923e799daa14b730e62908f0d855dcc19727e3bf1ce27656c609bf562aac74059b1373e13
7
- data.tar.gz: 98450a579ce833d512cd4b358c5f311e697c99d770471408297aed2892380d54c06374f4514834009d4b2f62243dd2512f73a4a3724e0bb1aed9cad22e916db6
6
+ metadata.gz: '0842937fcd45b32c6cb384e7c26fc2fb8556abbae9ef9cfdb5a429fad034a6b1c82d2e85d3d50747b6375359b67e55adffb6f6000f06162640d8c622ff5defa6'
7
+ data.tar.gz: b6f0a89a8b057fb960517622affcbab9911c222af51449eccfe4691488d2bac4c939eafba235d624a5f7f5f98ee29c8564514a02b61ae0e7b4bfe8992a5a5976
data/Rakefile CHANGED
@@ -1,19 +1,19 @@
1
- require 'rake'
1
+ require "rake"
2
2
 
3
3
  begin
4
- require 'bundler/setup'
4
+ require "bundler/setup"
5
5
  Bundler::GemHelper.install_tasks
6
6
  rescue LoadError
7
- puts 'although not required, bundler is recommended for running the tests'
7
+ puts "although not required, bundler is recommended for running the tests"
8
8
  end
9
9
 
10
10
  task default: :spec
11
11
 
12
- require 'rspec/core/rake_task'
12
+ require "rspec/core/rake_task"
13
13
  RSpec::Core::RakeTask.new(:spec)
14
14
 
15
- require 'rubocop/rake_task'
15
+ require "rubocop/rake_task"
16
16
  RuboCop::RakeTask.new do |task|
17
- task.requires << 'rubocop-performance'
18
- task.requires << 'rubocop-rspec'
17
+ task.requires << "rubocop-performance"
18
+ task.requires << "rubocop-rspec"
19
19
  end
@@ -5,6 +5,7 @@ module Permits
5
5
 
6
6
  def copy_application_policy
7
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"
8
9
  end
9
10
  end
10
11
  end
@@ -0,0 +1,14 @@
1
+ class CreatePermitsInvites < ActiveRecord::Migration[7.1]
2
+ def change
3
+ create_table :permits_invites, id: :uuid do |t|
4
+ t.references :invited_by, polymorphic: true, index: true, type: :uuid, null: false
5
+ t.references :invitee, polymorphic: true, index: true, type: :uuid, null: true
6
+ t.string :email, null: false
7
+ t.string :aasm_state, null: false
8
+ t.string :slug, null: false
9
+ t.datetime :started_at
10
+ t.datetime :ended_at
11
+ t.timestamps
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,11 @@
1
+ require "active_support/concern"
2
+
3
+ module Permits
4
+ module HasPermissions
5
+ extend ActiveSupport::Concern
6
+
7
+ included do
8
+ has_many :permissions, -> { active }, as: :owner, class_name: "::Permits::Permission", dependent: :destroy
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,58 @@
1
+ module Permits
2
+ module Forms
3
+ class NewInvite
4
+ include ActiveModel::Model
5
+ include ActiveModel::Attributes
6
+ include ActiveModel::Validations
7
+
8
+ attribute :invited_by
9
+ attribute :email
10
+ attribute :permission_attributes
11
+
12
+ validates :invited_by, presence: true
13
+ validates :email, presence: true
14
+
15
+ def save
16
+ return false unless valid?
17
+
18
+ ActiveRecord::Base.transaction do
19
+ invite.save!
20
+ process_permissions if permission_attributes.present?
21
+ end
22
+ true
23
+ end
24
+
25
+ def invite
26
+ @invite ||= Invite.new(
27
+ invited_by: invited_by,
28
+ email: email,
29
+ started_at: Time.current
30
+ )
31
+ end
32
+
33
+ private
34
+
35
+ def process_permissions
36
+ permission_attributes.each do |resource, permissions|
37
+ policy_class = if resource.respond_to?(:policy_class)
38
+ resource.policy_class
39
+ else
40
+ ::Permits::Policy::Base
41
+ end
42
+ next unless policy_class.authorized?(invited_by, resource, :invite)
43
+
44
+ create_permissions(resource, permissions)
45
+ end
46
+ end
47
+
48
+ def create_permissions(resource, *permissions)
49
+ permissions.flatten.each do |permits|
50
+ invite.permissions.find_or_create_by!(
51
+ resource: resource,
52
+ permits: permits
53
+ )
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,54 @@
1
+ require "timelines"
2
+
3
+ module Permits
4
+ class Invite < ActiveRecord::Base
5
+ self.table_name = "permits_invites"
6
+
7
+ include ::AASM
8
+ include ::Timelines::Ephemeral
9
+ include ::Permits::HasPermissions
10
+
11
+ belongs_to :invited_by, polymorphic: true, required: true
12
+ belongs_to :invitee, polymorphic: true, optional: true
13
+
14
+ validates :email, presence: true
15
+ validates :aasm_state, presence: true
16
+ validates :slug, presence: true
17
+
18
+ scope :active, -> { where(ended_at: nil) }
19
+
20
+ attribute :slug, default: -> { SecureRandom.hex(3).upcase }
21
+
22
+ aasm do
23
+ state :pending, initial: true
24
+ state :accepted
25
+ state :declined
26
+
27
+ event :accept do
28
+ transitions from: :pending, to: :accepted, after: :add_invitee_permissions
29
+ end
30
+
31
+ event :decline do
32
+ transitions from: :pending, to: :declined, after: :end_invite_permissions
33
+ end
34
+ end
35
+
36
+ def add_invitee_permissions
37
+ ActiveRecord::Base.transaction do
38
+ permissions.each do |permission|
39
+ invitee_permission = permission.dup
40
+ invitee_permission.update!(owner: invitee, started_at: Time.current)
41
+ permission.destroy
42
+ end
43
+ end
44
+ end
45
+
46
+ def end_invite_permissions
47
+ ActiveRecord::Base.transaction do
48
+ permissions.each do |permission|
49
+ permission.update!(ended_at: Time.current)
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -29,7 +29,7 @@ module Permits
29
29
  return false unless valid?
30
30
 
31
31
  if respond_to?("#{action}?")
32
- return send("#{action}?")
32
+ send("#{action}?")
33
33
  else
34
34
  has_action_permissions?(action)
35
35
  end
@@ -40,7 +40,7 @@ module Permits
40
40
  def has_action_permissions?(action, for_resource: resource)
41
41
  return false unless owner_permissions.respond_to?("permits_#{action}")
42
42
 
43
- return owner_permissions.send("permits_#{action}").where(resource: for_resource).exists?
43
+ owner_permissions.send("permits_#{action}").where(resource: for_resource).exists?
44
44
  end
45
45
 
46
46
  def owner_permissions
@@ -1,3 +1,3 @@
1
1
  module Permits
2
- VERSION = "0.1.4"
2
+ VERSION = "0.3.0"
3
3
  end
data/lib/permits.rb CHANGED
@@ -1,9 +1,14 @@
1
- require "permits/version"
2
- require "permits/railtie"
1
+ require "active_support/configurable"
2
+ require "aasm"
3
+ require "permits/concerns/has_permissions"
4
+ require "permits/forms/new_invite"
5
+ require "permits/invite"
3
6
  require "permits/permission"
4
- require "permits/policy/base"
5
7
  require "permits/policy/unauthorized_error"
6
- require "active_support/configurable"
8
+ require "permits/policy/base"
9
+ require "permits/railtie"
10
+ require "permits/version"
11
+ require "timelines"
7
12
 
8
13
  module Permits
9
14
  include ActiveSupport::Configurable
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: permits
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.3.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: 2023-10-11 00:00:00.000000000 Z
11
+ date: 2024-02-26 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: aasm
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 5.5.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 5.5.0
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: rails
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -134,8 +148,12 @@ files:
134
148
  - Rakefile
135
149
  - lib/generators/permits/install/USAGE
136
150
  - lib/generators/permits/install/install_generator.rb
151
+ - lib/generators/permits/install/templates/create_permits_invites.rb
137
152
  - lib/generators/permits/install/templates/create_permits_permissions.rb
138
153
  - lib/permits.rb
154
+ - lib/permits/concerns/has_permissions.rb
155
+ - lib/permits/forms/new_invite.rb
156
+ - lib/permits/invite.rb
139
157
  - lib/permits/permission.rb
140
158
  - lib/permits/policy/base.rb
141
159
  - lib/permits/policy/unauthorized_error.rb
@@ -164,7 +182,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
164
182
  - !ruby/object:Gem::Version
165
183
  version: '0'
166
184
  requirements: []
167
- rubygems_version: 3.4.20
185
+ rubygems_version: 3.5.4
168
186
  signing_key:
169
187
  specification_version: 4
170
188
  summary: A User and Role management gem for Rails 7