Class: Wf::Guard

Inherits:
ApplicationRecord show all
Defined in:
app/models/wf/guard.rb

Constant Summary collapse

OP =
%w[
  =
  >
  <
  >=
  <=
  is_empty
].freeze

Instance Method Summary collapse

Instance Method Details

#check_exp(entry, workitem) ⇒ Object



53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'app/models/wf/guard.rb', line 53

def check_exp(entry, workitem)
  form_hash = if entry
    entry.for_mini_racer
  else
    {}
  end

  target_hash = workitem&.case&.targetable&.attributes || {}
  user_hash = workitem&.holding_user&.attributes || {}

  # 1000ms, 200mb
  context = MiniRacer::Context.new(timeout: 1000, max_memory: 200_000_000)
  context.eval("let form = #{form_hash.to_json};")
  context.eval("let user = #{user_hash.to_json};")
  context.eval("let target = #{target_hash.to_json};")
  exp_value = context.eval(exp)
  yes_or_no?(exp_value, value)
end

#check_fieldable(entry) ⇒ Object



72
73
74
75
76
77
# File 'app/models/wf/guard.rb', line 72

def check_fieldable(entry)
  fv = entry.field_values.where(field_id: fieldable_id).first
  return unless fv

  yes_or_no?(fv.value_after_cast, value_after_cast)
end

#inspectObject



97
98
99
100
101
102
103
# File 'app/models/wf/guard.rb', line 97

def inspect
  if exp
    %(eval(exp) #{op} #{value})
  else
    %(#{fieldable&.form&.name}.#{fieldable&.name} #{op} #{value})
  end
end

#pass?(entry, workitem) ⇒ Boolean

Returns:

  • (Boolean)


45
46
47
48
49
50
51
# File 'app/models/wf/guard.rb', line 45

def pass?(entry, workitem)
  if exp
    check_exp(entry, workitem)
  else
    check_fieldable(entry)
  end
end

#validate_exp_and_fieldableObject



105
106
107
108
109
110
111
112
# File 'app/models/wf/guard.rb', line 105

def validate_exp_and_fieldable
  if fieldable && exp.present?
    errors.add(:exp, "Exp and Fieldable can not be set at the same time.")
    return
  end

  errors.add(:exp, "Must set one of Exp and Fieldable.") unless fieldable || exp.present?
end

#value_after_castObject



40
41
42
43
# File 'app/models/wf/guard.rb', line 40

def value_after_cast
  field = fieldable
  fieldable&.cast(value)
end

#yes_or_no?(input_value, setting_value) ⇒ Boolean

Returns:

  • (Boolean)


79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
# File 'app/models/wf/guard.rb', line 79

def yes_or_no?(input_value, setting_value)
  if op == "="
    input_value == setting_value
  elsif op == ">"
    input_value > setting_value
  elsif op == "<"
    input_value < setting_value
  elsif op == ">="
    input_value >= setting_value
  elsif op == "<="
    input_value <= setting_value
  elsif op == "is_empty"
    input_value.blank?
  else
    false
  end
end