approval 0.4.0 → 0.5.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: 887c9791882f3ddcad06255f3c51bdce3f3a3bc2c0303f4b08c6675049cab402
4
- data.tar.gz: cf49a8a8805feb9197b07d7248032da32b8fa22d8baee4e403c75f5b266627f7
3
+ metadata.gz: 2b64f5cbbf148b7340aff7de77d998bded8d7b3ee0437e7993f9a2089adb7c66
4
+ data.tar.gz: e80a019fd898640e4ed837664661e84053c7bee2501d1e26ea73ce1587ff6ace
5
5
  SHA512:
6
- metadata.gz: acc899127438f3fc8ed8c157fb91cf677a7dab0a41ba54e78300cfe4d9cee722fc530fea6d87d0be1537362ae317432e88d8819de604137afe761044302b4f8c
7
- data.tar.gz: 8e2d0d89ce1b639a025f400e0cb0b3e64cd00218fb1b646df538957c63665c9f2e283b4cec710ce588f742512ae32045b471216549bd57fd384b039fa9bf03b2
6
+ metadata.gz: a0ab4cfb2e56c725b36188c4d6c91962c2c67c0cc64a95e9624e95d94d24560a733cc8d648ec9364e05b20bff396b553c49a439fb933bfbd576b9d42cf05a78f
7
+ data.tar.gz: '090a5b2c02d64f05a7c0b3519b5bb7c2439bc1ba4d279817c4df24c294228763ae9b56c7d38df49fa05223a8f26ade7e7e1ff485b637806ad4a5e8a6d054ce95'
data/README.md CHANGED
@@ -35,6 +35,16 @@
35
35
  end
36
36
  ```
37
37
 
38
+ Or if you want to use PORO:
39
+
40
+ ```ruby
41
+ class SomeProcess
42
+ def self.perform
43
+ # something
44
+ end
45
+ end
46
+ ```
47
+
38
48
  ## Approval Flow
39
49
 
40
50
  ### Make request
@@ -83,6 +93,16 @@ request = staff.request_for_destroy(records, reason: "something")
83
93
  request.save!
84
94
  ```
85
95
 
96
+ #### :pray: Perform
97
+
98
+ ```ruby
99
+ staff = User.find_or_create_by(email: "staff@example.com")
100
+
101
+ record = MyProcess.new(recipient: "somebody@example.com")
102
+ request = staff.request_for_perform(record, reason: "something")
103
+ request.save
104
+ ```
105
+
86
106
  ### Respond
87
107
 
88
108
  #### :ok_woman: Approve
@@ -3,7 +3,7 @@ module Approval
3
3
  class UnexistResource < StandardError; end
4
4
 
5
5
  self.table_name = :approval_items
6
- EVENTS = %w[create update destroy].freeze
6
+ EVENTS = %w[create update destroy perform].freeze
7
7
 
8
8
  belongs_to :request, class_name: :"Approval::Request", inverse_of: :items
9
9
  belongs_to :resource, polymorphic: true, optional: true
@@ -11,17 +11,11 @@ module Approval
11
11
  serialize :params, Hash
12
12
 
13
13
  validates :resource_type, presence: true
14
+ validates :resource_id, presence: true, if: ->(item) { item.update_event? || item.destroy_event? }
14
15
  validates :event, presence: true, inclusion: { in: EVENTS }
16
+ validates :params, presence: true, if: :update_event?
15
17
 
16
- with_options unless: :create_event? do
17
- validates :resource_id, presence: true
18
- end
19
-
20
- with_options if: :update_event? do
21
- validates :params, presence: true
22
- end
23
-
24
- validate :ensure_resource_be_valid
18
+ validate :ensure_resource_be_valid, if: ->(item) { item.create_event? || item.update_event? }
25
19
 
26
20
  EVENTS.each do |event_name|
27
21
  define_method "#{event_name}_event?" do
@@ -30,30 +24,45 @@ module Approval
30
24
  end
31
25
 
32
26
  def apply
33
- case event
34
- when "create"
27
+ send("exec_#{event}")
28
+ end
29
+
30
+ private
31
+
32
+ def exec_create
35
33
  resource_model.create!(params).tap do |created_resource|
36
34
  update!(resource_id: created_resource.id)
37
35
  end
38
- when "update"
36
+ end
37
+
38
+ def exec_update
39
39
  raise UnexistResource unless resource
40
40
 
41
41
  resource.update!(params)
42
- when "destroy"
42
+ end
43
+
44
+ def exec_destroy
43
45
  raise UnexistResource unless resource
44
46
 
45
47
  resource.destroy
46
48
  end
47
- end
48
49
 
49
- private
50
+ def exec_perform
51
+ raise NotImplementedError unless resource_model.respond_to?(:perform)
52
+
53
+ if resource_model.method(:perform).arity > 0
54
+ resource_model.perform(params)
55
+ else
56
+ resource_model.perform
57
+ end
58
+ end
50
59
 
51
60
  def resource_model
52
61
  @resource_model ||= resource_type.to_s.safe_constantize
53
62
  end
54
63
 
55
64
  def ensure_resource_be_valid
56
- return if resource_model.nil? || destroy_event?
65
+ return unless resource_model
57
66
 
58
67
  record = if resource_id.present?
59
68
  resource_model.find(resource_id).tap {|m| m.assign_attributes(params) }
@@ -0,0 +1,25 @@
1
+ module Approval
2
+ module RequestForm
3
+ class Perform < Base
4
+ private
5
+
6
+ def prepare
7
+ ::Approval::Request.transaction do
8
+ request.comments.new(user_id: user.id, content: reason)
9
+ Array(records).each do |record|
10
+ request.items.new(
11
+ event: "perform",
12
+ resource_type: record.class.to_s,
13
+ params: extract_params_from(record),
14
+ )
15
+ end
16
+ yield(request)
17
+ end
18
+ end
19
+
20
+ def extract_params_from(record)
21
+ record.try(:attributes) || record.try(:to_h) || {}
22
+ end
23
+ end
24
+ end
25
+ end
@@ -19,6 +19,10 @@ module Approval
19
19
  Approval::RequestForm::Destroy.new(user: self, reason: reason, records: records)
20
20
  end
21
21
 
22
+ def request_for_perform(records, reason:)
23
+ Approval::RequestForm::Perform.new(user: self, reason: reason, records: records)
24
+ end
25
+
22
26
  def cancel_request(request, reason:)
23
27
  Approval::RespondForm::Cancel.new(user: self, reason: reason, request: request)
24
28
  end
@@ -1,3 +1,3 @@
1
1
  module Approval
2
- VERSION = "0.4.0".freeze
2
+ VERSION = "0.5.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.4.0
4
+ version: 0.5.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-17 00:00:00.000000000 Z
11
+ date: 2018-04-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -41,6 +41,7 @@ files:
41
41
  - app/models/approval/request_form/base.rb
42
42
  - app/models/approval/request_form/create.rb
43
43
  - app/models/approval/request_form/destroy.rb
44
+ - app/models/approval/request_form/perform.rb
44
45
  - app/models/approval/request_form/update.rb
45
46
  - app/models/approval/respond_form/approve.rb
46
47
  - app/models/approval/respond_form/approve_with_execute.rb