Class: RailsBase::AdminUpdateAttribute

Inherits:
ServiceBase show all
Defined in:
app/services/rails_base/admin_update_attribute.rb

Instance Method Summary collapse

Methods inherited from ServiceBase

inherited, #internal_validate, #service_base_logging

Methods included from ServiceLogging

#aletered_message, #class_name, #log, #log_prefix, #logger, #service_id

Instance Method Details

#callObject



7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# File 'app/services/rails_base/admin_update_attribute.rb', line 7

def call
  validate_model!
  validate_model_row!

  attribute = validate_attribute!
  validate_permission!(attribute: attribute)
  fail_attribute!(attribute: attribute)

  original_value = model_row.public_send(attribute)
  begin
    model_row.update!(attribute => sanitized_value)
  rescue ActiveRecord::RecordInvalid => e
    context.fail!(message: "Failed to update [#{attribute}] with #{sanitized_value} on #{model}##{model_row.id}. #{e.message}")
  rescue StandardError
    context.fail!(message: "Failed to update [#{attribute}] with #{sanitized_value} on #{model}##{model_row.id}")
  end
  context.attribute = sanitized_value
  context.original_attribute = original_value
  context.model = model_row
  context.message = "#{model}##{params[:id]} has changed attribute [#{attribute}] from [#{original_value}]=>#{sanitized_value}"
end

#fail_attribute!(attribute:) ⇒ Object



29
30
31
32
33
34
# File 'app/services/rails_base/admin_update_attribute.rb', line 29

def fail_attribute!(attribute:)
  if params[:_fail_].present?
    log(level: :warn, msg: "FAIL param passed in. Automagic failure for admin update")
    context.fail!(message: "Failed to update [#{attribute}] with #{sanitized_value} on #{model}##{model_row.id}")
  end
end

#modelObject



62
63
64
# File 'app/services/rails_base/admin_update_attribute.rb', line 62

def model
  @model ||= klass_string ? klass_string.constantize : User
end

#model_rowObject



66
67
68
69
70
71
72
# File 'app/services/rails_base/admin_update_attribute.rb', line 66

def model_row
  @model_row ||= begin
    model.find(params[:id])
  rescue ActiveRecord::RecordNotFound
    nil
  end
end

#sanitized_valueObject



51
52
53
54
55
56
57
58
59
60
# File 'app/services/rails_base/admin_update_attribute.rb', line 51

def sanitized_value
  case params[:value]
  when 'true'
    true
  when 'false'
    false
  else
    params[:value]
  end
end

#validate!Object



94
95
96
97
98
# File 'app/services/rails_base/admin_update_attribute.rb', line 94

def validate!
  raise "Expected params to be a Hash. Received #{params.class}" unless [ActionController::Parameters, Hash].include?(params.class)
  raise "Expected params to have a id. Received #{params[:id]}" if params[:id].nil?
  raise "Expected admin_user." if admin_user.nil?
end

#validate_attribute!Object



43
44
45
46
47
48
49
# File 'app/services/rails_base/admin_update_attribute.rb', line 43

def validate_attribute!
  attribute = params[:attribute].to_sym
  unless model::SAFE_AUTOMAGIC_UPGRADE_COLS.keys.include?(attribute)
    context.fail!(message: "#{attribute} is not part of allowed updatable columns")
  end
  attribute
end

#validate_model!Object



80
81
82
83
84
85
86
87
88
89
90
91
92
# File 'app/services/rails_base/admin_update_attribute.rb', line 80

def validate_model!
  begin
    model
  rescue StandardError
    context.fail!(message: "Failed to find model")
  end

  begin
    model::SAFE_AUTOMAGIC_UPGRADE_COLS
  rescue StandardError
    context.fail!(message: "#{model}::SAFE_AUTOMAGIC_UPGRADE_COLS array does not exist")
  end
end

#validate_model_row!Object



74
75
76
77
78
# File 'app/services/rails_base/admin_update_attribute.rb', line 74

def validate_model_row!
  return if model_row

  context.fail!(message: "Failed to find id:#{params[:id]} on model: #{model}")
end

#validate_permission!(attribute:) ⇒ Object



36
37
38
39
40
41
# File 'app/services/rails_base/admin_update_attribute.rb', line 36

def validate_permission!(attribute:)
  proc = model::SAFE_AUTOMAGIC_UPGRADE_COLS[attribute]
  return if proc.call(admin_user)

  context.fail!(message: "User does not have permissions to update #{attribute}")
end