Class: Methodist::Interactor

Inherits:
Pattern
  • Object
show all
Includes:
Dry::Transaction
Defined in:
lib/methodist/interactor.rb

Overview

Methodist::Interactor

Base class for a Methodist interactor.

Methodist::Interactor dependency from dry-rb transactions and dry-rb validations

Defined Under Namespace

Classes: ContractDefinitionError, DryValidationVersionError, InputClassError, ValidatorDefinitionError

Constant Summary collapse

NEW_DRY_VALIDATION_V =
'1.0.0'.freeze

Class Attribute Summary collapse

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from Pattern

#methodistic?

Class Attribute Details

.contract_classObject (readonly)

Returns the value of attribute contract_class.



18
19
20
# File 'lib/methodist/interactor.rb', line 18

def contract_class
  @contract_class
end

.input_schemaObject (readonly)

Returns the value of attribute input_schema.



18
19
20
# File 'lib/methodist/interactor.rb', line 18

def input_schema
  @input_schema
end

Instance Attribute Details

#validation_resultObject

Returns the value of attribute validation_result.



15
16
17
# File 'lib/methodist/interactor.rb', line 15

def validation_result
  @validation_result
end

Class Method Details

.contract(contract_class: nil, &block) ⇒ Object

ATTENTION: require dry-validation >= 1.0.0 Method set Dry::Validation::Contract contract for an interactor.

Receive block for generating Dry::Validation:Contract result.

class InteractorClass < Methodist::Interactor
  contract do
    params do
      required(:name).value(:str?)
    end

    rule(:name) do
       ...
    end
  end

  step :validate
end

InteractorClass.new.call(name: nil) #=> Failure(ValidationError)

Or you can pass contract class:

class InteractorClass < Methodist::Interactor
  contract contract_class: MyContract

  step :validate
end

See

dry-rb.org/gems/dry-validation/

github.com/dry-rb/dry-transaction



84
85
86
87
88
89
90
91
92
93
94
95
96
# File 'lib/methodist/interactor.rb', line 84

def contract(contract_class: nil, &block)
  unless new_dry_validation?
    raise DryValidationVersionError,
      "Your depended dry-validation gem version must be gteq #{NEW_DRY_VALIDATION_V}"
  end

  unless block_given? || contract_class
    raise ContractDefinitionError, 'You must pass block or contract_class to `contract`'
  end

  @contract_class = contract_class
  @contract_class ||= Class.new(Dry::Validation::Contract, &block)
end

.schema(&block) ⇒ Object

Method set Dry::Validation schema for an interactor.

Receive block for generating Dry::Validation schema result.

class InteractorClass < Methodist::Interactor
  schema do
    required(:name).value(:str?)
  end

  step :validate
end

InteractorClass.new.call(name: nil) #=> Failure(ValidationError)

See

dry-rb.org/gems/dry-validation/

github.com/dry-rb/dry-transaction



41
42
43
44
45
46
47
# File 'lib/methodist/interactor.rb', line 41

def schema(&block)
  if block_given?
    @input_schema = dry_schema(&block)
  else
    raise SchemaDefinitionError, 'You must pass block to `schema`'
  end
end

Instance Method Details

#validate(input) ⇒ Object

Method for validation input of interactor parameters.

Parameters

  • input [Hash] - parameters for interactor

Example

# app/interactors/interactor_class.rb
class InteractorClass < Methodist::Interactor
  schema do
    required(:name).value(:str?)
  end

  step :validate
end

# your controller action
def create
  result = InteractorClass.new.call(name: nil) #=> Failure(ValidationError)
  raise InteractorError, result.value if result.failure?
end

Return

  • Dry::Monads::Result::Success - success result of interactor step

  • Dry::Monads::Result::Failure - failure result of interactor step

Raise

  • SchemaDefinitionError - raise if method was called without a schema definition

Attention

You can redefine failure_validation_value for a custom value returning in case of validation Failure

Raises:



145
146
147
148
149
150
151
152
153
# File 'lib/methodist/interactor.rb', line 145

def validate(input)
  input = {} unless input
  raise InputClassError, 'If you want to use custom #validate, you have to pass a hash to an interactor' unless input.is_a?(Hash)
  validator = contract_class ? contract_class : input_schema
  raise ValidatorDefinitionError, 'you must define schema via #schema OR define contract via #contract' unless validator
  @validation_result = validator.call(input)
  return Success(validation_result.to_h) if validation_result.success?
  Failure(failure_validation_value)
end