Class: SkinnyControllers::Operation::Base

Inherits:
Object
  • Object
show all
Includes:
ModelHelpers
Defined in:
lib/skinny_controllers/operation/base.rb

Overview

An example Operation may looy like

module EventOperations

class Read < SkinnyControllers::Operation::Base
  def run
    model if allowed?
  end
end

end

TODO: make the above the ‘default’ and not require to be defined

Direct Known Subclasses

Default

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from ModelHelpers

#find_model, #model, #model_from_id, #model_from_named_id, #model_from_params, #model_from_parent, #model_from_scope, #model_param_name, #model_params, #sanitized_params, #scoped_model

Constructor Details

#initialize(current_user, controller_params, params_for_action = nil, action = nil, lookup = nil, options = {}) ⇒ Base

TODO: too many optional parameters. Group into options hash

Parameters:

  • current_user (Model)

    the logged in user

  • controller_params (Hash)

    the params hash raw from the controller

  • params_for_action (Hash) (defaults to: nil)

    optional params hash, generally the result of strong parameters

  • action (string) (defaults to: nil)

    the current action on the controller



48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/skinny_controllers/operation/base.rb', line 48

def initialize(current_user,
  controller_params, params_for_action = nil,
  action = nil,
  lookup = nil,
  options = {})
  self.authorized_via_parent = false
  self.current_user = current_user
  self.action = action || controller_params[:action]
  self.params = controller_params
  self.params_for_action = params_for_action || controller_params
  self._lookup = lookup
  self.options = options
  self.model_key = options[:model_params_key]
  self.association_name = options[:association_name]
end

Instance Attribute Details

#_lookupObject

Returns the value of attribute _lookup.



19
20
21
# File 'lib/skinny_controllers/operation/base.rb', line 19

def _lookup
  @_lookup
end

#actionObject

Returns the value of attribute action.



19
20
21
# File 'lib/skinny_controllers/operation/base.rb', line 19

def action
  @action
end

#association_nameObject

Returns the value of attribute association_name.



19
20
21
# File 'lib/skinny_controllers/operation/base.rb', line 19

def association_name
  @association_name
end

#authorized_via_parentObject

Returns the value of attribute authorized_via_parent.



19
20
21
# File 'lib/skinny_controllers/operation/base.rb', line 19

def authorized_via_parent
  @authorized_via_parent
end

#current_userObject

Returns the value of attribute current_user.



19
20
21
# File 'lib/skinny_controllers/operation/base.rb', line 19

def current_user
  @current_user
end

#model_keyObject

Returns the value of attribute model_key.



19
20
21
# File 'lib/skinny_controllers/operation/base.rb', line 19

def model_key
  @model_key
end

#optionsObject

Returns the value of attribute options.



19
20
21
# File 'lib/skinny_controllers/operation/base.rb', line 19

def options
  @options
end

#paramsObject

Returns the value of attribute params.



19
20
21
# File 'lib/skinny_controllers/operation/base.rb', line 19

def params
  @params
end

#params_for_actionObject

Returns the value of attribute params_for_action.



19
20
21
# File 'lib/skinny_controllers/operation/base.rb', line 19

def params_for_action
  @params_for_action
end

Class Method Details

.callObject

To support the shorthand ruby/block syntax e.g.: MyOperation.()



32
33
34
35
# File 'lib/skinny_controllers/operation/base.rb', line 32

def run(current_user, params)
  object = new(current_user, params)
  object.run
end

.run(current_user, params) ⇒ Object



25
26
27
28
# File 'lib/skinny_controllers/operation/base.rb', line 25

def run(current_user, params)
  object = new(current_user, params)
  object.run
end

Instance Method Details

#allowed?Boolean

Returns:

  • (Boolean)


106
107
108
# File 'lib/skinny_controllers/operation/base.rb', line 106

def allowed?
  allowed_for?(model)
end

#allowed_for?(object) ⇒ Boolean

checks the policy

Returns:

  • (Boolean)


115
116
117
# File 'lib/skinny_controllers/operation/base.rb', line 115

def allowed_for?(object)
  policy_for(object).send(policy_method_name)
end

#association_name_from_objectObject

TODO: maybe make this configurable?

Examples:

model_name == Namespace::Item

-> model_name.tableize == namespace/items
-> split.last == items


93
94
95
# File 'lib/skinny_controllers/operation/base.rb', line 93

def association_name_from_object
  association_name || model_name.tableize.split('/').last
end

#check_allowed!(*args) ⇒ Object

Raises:



110
111
112
# File 'lib/skinny_controllers/operation/base.rb', line 110

def check_allowed!(*args)
  raise DeniedByPolicy.new(*args.presence || action) unless allowed?
end

#id_from_paramsObject



73
74
75
76
77
78
79
80
81
82
# File 'lib/skinny_controllers/operation/base.rb', line 73

def id_from_params
  unless @id_from_params
    @id_from_params = params[:id]
    if filter = params[:filter]
      @id_from_params = filter[:id].split(',')
    end
  end

  @id_from_params
end

#lookupObject



64
65
66
67
68
69
70
71
# File 'lib/skinny_controllers/operation/base.rb', line 64

def lookup
  @lookup ||= begin
    _lookup || Lookup.from_operation(
      operation_class: self.class,
      model_class: options[:model_class]
    )
  end
end

#policy_for(object) ⇒ Object

Returns a new policy object and caches it.

Returns:

  • a new policy object and caches it



98
99
100
101
102
103
104
# File 'lib/skinny_controllers/operation/base.rb', line 98

def policy_for(object)
  @policy ||= policy_class.new(
    current_user,
    object,
    authorized_via_parent: authorized_via_parent
  )
end

#runObject Also known as: call

To be overridden



36
# File 'lib/skinny_controllers/operation/base.rb', line 36

def run; end