permits 0.1.4 → 0.3.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: 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