approval 0.3.7 → 0.4.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: 036447a5b614f818fa6a3ace7ee80d56c736d307bf1b8020cca81c2e6458ac07
4
- data.tar.gz: 95feed0024428c045f96adaa675618751481ac9111f3aeafb79e02d6d9e17856
3
+ metadata.gz: 887c9791882f3ddcad06255f3c51bdce3f3a3bc2c0303f4b08c6675049cab402
4
+ data.tar.gz: cf49a8a8805feb9197b07d7248032da32b8fa22d8baee4e403c75f5b266627f7
5
5
  SHA512:
6
- metadata.gz: afdc581773b236d893187061146bbb58e4c3e5760eda31b74a73105c52ee22b3647ad2400f5b31421cf3224b9c5920fcc0f4ae572101721f741e746fd567f19b
7
- data.tar.gz: 05a14a3c41748d87ecbdc9365b3198a7f750be241385966c5a5b55cc53c7c7874fdcb4092c933195a1f43b01dff5c81c91fbdd4ceb5c5e81c4df50fd67f58f8b
6
+ metadata.gz: acc899127438f3fc8ed8c157fb91cf677a7dab0a41ba54e78300cfe4d9cee722fc530fea6d87d0be1537362ae317432e88d8819de604137afe761044302b4f8c
7
+ data.tar.gz: 8e2d0d89ce1b639a025f400e0cb0b3e64cd00218fb1b646df538957c63665c9f2e283b4cec710ce588f742512ae32045b471216549bd57fd384b039fa9bf03b2
@@ -0,0 +1,57 @@
1
+ module Approval
2
+ class ExecuteForm
3
+ include ::ActiveModel::Model
4
+
5
+ attr_accessor :user, :reason, :request
6
+
7
+ def initialize(user:, reason:, request:)
8
+ @user = user
9
+ @reason = reason
10
+ @request = request
11
+ end
12
+
13
+ validates :user, presence: true
14
+ validates :request, presence: true
15
+ validates :reason, allow_blank: true, length: { maximum: Approval.config.comment_maximum }
16
+
17
+ validate :ensure_request_is_approved
18
+ validate :ensure_user_same_as_request_user
19
+
20
+ def save
21
+ return false unless valid?
22
+
23
+ execute(&:save)
24
+ end
25
+
26
+ def save!
27
+ raise ::ActiveRecord::RecordInvalid unless valid?
28
+
29
+ execute(&:save!)
30
+ end
31
+
32
+ private
33
+
34
+ def execute
35
+ ::Approval::Request.transaction do
36
+ request.lock!
37
+ request.comments.new(user_id: user.id, content: reason) if reason
38
+ request.execute
39
+ yield(request)
40
+ end
41
+ end
42
+
43
+ def ensure_request_is_approved
44
+ return unless request
45
+
46
+ errors.add(:request, :is_not_approved) unless request.approved?
47
+ end
48
+
49
+ def ensure_user_same_as_request_user
50
+ return unless user && request
51
+
52
+ unless user.id == request.request_user_id
53
+ errors.add(:user, :cannot_execute_others_request)
54
+ end
55
+ end
56
+ end
57
+ end
@@ -10,7 +10,7 @@ module Approval
10
10
  has_many :comments, class_name: :"Approval::Comment", inverse_of: :request, dependent: :destroy
11
11
  has_many :items, class_name: :"Approval::Item", inverse_of: :request, dependent: :destroy
12
12
 
13
- enum state: { pending: 0, cancelled: 1, approved: 2, rejected: 3 }
13
+ enum state: { pending: 0, cancelled: 1, approved: 2, rejected: 3, executed: 4 }
14
14
 
15
15
  scope :recently, -> { order(id: :desc) }
16
16
 
@@ -28,12 +28,20 @@ module Approval
28
28
  self.requested_at = Time.current
29
29
  end
30
30
 
31
+ def execute
32
+ self.state = :executed
33
+ self.executed_at = Time.current
34
+ items.each(&:apply)
35
+ end
36
+
31
37
  private
32
38
 
33
39
  def ensure_state_was_pending
34
40
  return unless persisted?
35
41
 
36
- errors.add(:base, :already_performed) if state_was != "pending"
42
+ if %w[pending approved].exclude?(state_was)
43
+ errors.add(:base, :already_performed)
44
+ end
37
45
  end
38
46
  end
39
47
  end
@@ -11,11 +11,9 @@ module Approval
11
11
  @records = records
12
12
  end
13
13
 
14
- with_options presence: true do
15
- validates :user
16
- validates :reason, length: { maximum: Approval.config.comment_maximum }
17
- validates :records
18
- end
14
+ validates :user, presence: true
15
+ validates :reason, presence: true, length: { maximum: Approval.config.comment_maximum }
16
+ validates :records, presence: true
19
17
 
20
18
  def save
21
19
  return false unless valid?
@@ -10,7 +10,6 @@ module Approval
10
10
  request.lock!
11
11
  request.assign_attributes(state: :approved, approved_at: Time.current, respond_user_id: user.id)
12
12
  request.comments.new(user_id: user.id, content: reason)
13
- request.items.each(&:apply)
14
13
  yield(request)
15
14
  end
16
15
  end
@@ -0,0 +1,19 @@
1
+ module Approval
2
+ module RespondForm
3
+ class ApproveWithExecute < Base
4
+ validate :ensure_user_cannot_respond_to_my_request
5
+
6
+ private
7
+
8
+ def prepare
9
+ ::Approval::Request.transaction do
10
+ request.lock!
11
+ request.assign_attributes(state: :approved, approved_at: Time.current, respond_user_id: user.id)
12
+ request.comments.new(user_id: user.id, content: reason)
13
+ request.execute
14
+ yield(request)
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -11,11 +11,9 @@ module Approval
11
11
  @request = request
12
12
  end
13
13
 
14
- with_options presence: true do
15
- validates :user
16
- validates :reason, length: { maximum: Approval.config.comment_maximum }
17
- validates :request
18
- end
14
+ validates :user, presence: true
15
+ validates :reason, presence: true, length: { maximum: Approval.config.comment_maximum }
16
+ validates :request, presence: true
19
17
 
20
18
  def save
21
19
  return false unless valid?
@@ -23,12 +23,20 @@ module Approval
23
23
  Approval::RespondForm::Cancel.new(user: self, reason: reason, request: request)
24
24
  end
25
25
 
26
- def approve_request(request, reason:)
27
- Approval::RespondForm::Approve.new(user: self, reason: reason, request: request)
26
+ def approve_request(request, reason:, execute: true)
27
+ if execute
28
+ Approval::RespondForm::ApproveWithExecute.new(user: self, reason: reason, request: request)
29
+ else
30
+ Approval::RespondForm::Approve.new(user: self, reason: reason, request: request)
31
+ end
28
32
  end
29
33
 
30
34
  def reject_request(request, reason:)
31
35
  Approval::RespondForm::Reject.new(user: self, reason: reason, request: request)
32
36
  end
37
+
38
+ def execute_request(request, reason: nil)
39
+ Approval::ExecuteForm.new(user: self, reason: reason, request: request)
40
+ end
33
41
  end
34
42
  end
@@ -3,6 +3,8 @@ en:
3
3
  messages:
4
4
  already_performed: "This request has already performed."
5
5
  cannot_respond_to_own_request: "cannot respond to own request."
6
+ cannot_execute_others_request: "cannot execute others request."
7
+ is_not_approved: "is not approved."
6
8
 
7
9
  attributes:
8
10
  id: "ID"
@@ -3,6 +3,8 @@ ja:
3
3
  messages:
4
4
  already_performed: "申請は既に実行されています"
5
5
  cannot_respond_to_own_request: "は自身の申請のため対応できません"
6
+ cannot_execute_others_request: "は自身の申請ではないため実行できません"
7
+ is_not_approved: "は承認されていません"
6
8
 
7
9
  attributes:
8
10
  id: ID
@@ -8,6 +8,7 @@ class CreateApprovalTables < ActiveRecord::Migration[5.0]
8
8
  t.datetime :cancelled_at
9
9
  t.datetime :approved_at
10
10
  t.datetime :rejected_at
11
+ t.datetime :executed_at
11
12
 
12
13
  t.timestamps
13
14
 
@@ -1,3 +1,3 @@
1
1
  module Approval
2
- VERSION = "0.3.7".freeze
2
+ VERSION = "0.4.0".freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: approval
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.7
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yoshiyuki Hirano
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-04-10 00:00:00.000000000 Z
11
+ date: 2018-04-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -35,6 +35,7 @@ files:
35
35
  - README.md
36
36
  - app/models/approval/application_record.rb
37
37
  - app/models/approval/comment.rb
38
+ - app/models/approval/execute_form.rb
38
39
  - app/models/approval/item.rb
39
40
  - app/models/approval/request.rb
40
41
  - app/models/approval/request_form/base.rb
@@ -42,6 +43,7 @@ files:
42
43
  - app/models/approval/request_form/destroy.rb
43
44
  - app/models/approval/request_form/update.rb
44
45
  - app/models/approval/respond_form/approve.rb
46
+ - app/models/approval/respond_form/approve_with_execute.rb
45
47
  - app/models/approval/respond_form/base.rb
46
48
  - app/models/approval/respond_form/cancel.rb
47
49
  - app/models/approval/respond_form/reject.rb