approval 0.4.0 → 0.5.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: 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