Class: ActionInteractor::Base

Inherits:
Object
  • Object
show all
Defined in:
lib/action_interactor/base.rb

Overview

Action Interactor Base

This is a base class for an interactor (data processing unit). It gets a payload (input) as an initialization parameter and execute some methods which is described in execute method. After that, the results can be obtained by results method. In Ruby on Rails, it can be used for doing some business logic like new user registration process. For example inserting user data in the database and creating a notification message, registering a job for sending the message.

class RegistrationInteractor < ActionInteractor::Base

def execute
  return failure! unless payload[:name]
  user = User.create!(name: payload[:name])
  notiticaion = user.notifications.create!(name: 'Welcome')
  RegistrationNotificationJob.perform_later!
  results.add(:user, user)
  successful!
end

end

Direct Known Subclasses

Composite

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(payload) ⇒ Base

Initialize with payload Errors and Results data and initial state will be set.



30
31
32
33
34
35
36
# File 'lib/action_interactor/base.rb', line 30

def initialize(payload)
  @payload = payload
  @errors = payload[:errors] || Errors.new
  @results = payload[:results] || Results.new
  @state = payload[:state] || ExecutionState.new
  @interactor_name = payload[:interactor_name] || underscore(self.class.name)
end

Instance Attribute Details

#errorsObject (readonly)

Returns the value of attribute errors.



26
27
28
# File 'lib/action_interactor/base.rb', line 26

def errors
  @errors
end

#interactor_nameObject (readonly)

Returns the value of attribute interactor_name.



26
27
28
# File 'lib/action_interactor/base.rb', line 26

def interactor_name
  @interactor_name
end

#payloadObject (readonly)

Returns the value of attribute payload.



26
27
28
# File 'lib/action_interactor/base.rb', line 26

def payload
  @payload
end

#resultsObject (readonly)

Returns the value of attribute results.



26
27
28
# File 'lib/action_interactor/base.rb', line 26

def results
  @results
end

#stateObject (readonly)

Returns the value of attribute state.



26
27
28
# File 'lib/action_interactor/base.rb', line 26

def state
  @state
end

Class Method Details

.execute(payload) ⇒ Object

Execute the operation with given payload.



111
112
113
# File 'lib/action_interactor/base.rb', line 111

def execute(payload)
  new(payload).tap(&:execute)
end

.execute!(payload) ⇒ Object

Execute the operation with given payload. If there are some errors, ActionInteractor::ExeuctionError will be raised.



117
118
119
# File 'lib/action_interactor/base.rb', line 117

def execute!(payload)
  new(payload).tap(&:execute!)
end

Instance Method Details

#abort!Object

Mark the operation as aborted.



91
92
93
# File 'lib/action_interactor/base.rb', line 91

def abort!
  state.aborted!
end

#aborted?Boolean

Returns true if the operation was not successful and not finished otherwise false.

Returns:

  • (Boolean)


81
82
83
# File 'lib/action_interactor/base.rb', line 81

def aborted?
  state.aborted?
end

#executeObject

Execute the operation with given payload. (Should be overridden.)



40
41
42
43
44
45
46
47
48
49
# File 'lib/action_interactor/base.rb', line 40

def execute
  # if the interactor already finished execution, do nothing.
  return if finished?
  # if contract is not satisfied= (ex: payload is empty), mark as failure.
  return failure! if payload.nil?
  # (Implement some codes for the operation.)

  # if finished execution, mark as successful.
  successful!
end

#execute!Object

Execute the operation with given payload. If there are some errors, ActionInteractor::ExeuctionError will be raised.



53
54
55
56
# File 'lib/action_interactor/base.rb', line 53

def execute!
  execute
  successful? || raise(ExecutionError.new("Failed to execute the interactor"))
end

#failure!Object Also known as: fail!

Mask the operation as failure.



103
104
105
# File 'lib/action_interactor/base.rb', line 103

def failure!
  state.failure!
end

#failure?Boolean

Returns true if not marked as success or there are some errors otherwise false.

Returns:

  • (Boolean)


76
77
78
# File 'lib/action_interactor/base.rb', line 76

def failure?
  !successful?
end

#finished?Boolean

Returns true if marked as finished otherwise false.

Returns:

  • (Boolean)


59
60
61
# File 'lib/action_interactor/base.rb', line 59

def finished?
  state.successful? || state.failure?
end

#reset!Object

Reset statuses.



86
87
88
# File 'lib/action_interactor/base.rb', line 86

def reset!
  @state = State.new
end

#successful!Object Also known as: success!

Mark the operation as successful.



96
97
98
# File 'lib/action_interactor/base.rb', line 96

def successful!
  state.successful!
end

#successful?Boolean Also known as: success?

Returns true if marked as success and there are no errors otherwise false.

Returns:

  • (Boolean)


69
70
71
# File 'lib/action_interactor/base.rb', line 69

def successful?
  state.successful? && @errors.empty?
end

#unfinished?Boolean

Returns true if not marked as finished otherwise false.

Returns:

  • (Boolean)


64
65
66
# File 'lib/action_interactor/base.rb', line 64

def unfinished?
  !finished?
end