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
# File 'app/models/wf/guard.rb', line 53

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

#check_fieldable(entry) ⇒ Object



62
63
64
65
66
67
# File 'app/models/wf/guard.rb', line 62

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



87
88
89
90
91
92
93
# File 'app/models/wf/guard.rb', line 87

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



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

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)


69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# File 'app/models/wf/guard.rb', line 69

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