Class: DeepUnrest::ApplicationController

Inherits:
ActionController::API
  • Object
show all
Defined in:
app/controllers/deep_unrest/application_controller.rb

Constant Summary collapse

@@temp_ids =
{}
@@destroyed_entities =
[]
@@changed_entities =
[]

Instance Method Summary collapse

Instance Method Details

#allow_nested_arraysObject



114
115
116
117
118
# File 'app/controllers/deep_unrest/application_controller.rb', line 114

def allow_nested_arrays
  ::ActionController::Parameters::PERMITTED_SCALAR_TYPES << Array
  yield
  ::ActionController::Parameters::PERMITTED_SCALAR_TYPES - [Array]
end

#allowed_write_paramsObject



106
107
108
109
110
111
112
# File 'app/controllers/deep_unrest/application_controller.rb', line 106

def allowed_write_params
  params.permit(data: [:redirect,
                       data: [:destroy,
                              :path,
                              :errorPath,
                              { attributes: {} }]])
end

#contextObject



13
14
15
# File 'app/controllers/deep_unrest/application_controller.rb', line 13

def context
  { current_user: current_user }
end

#current_userObject



102
103
104
# File 'app/controllers/deep_unrest/application_controller.rb', line 102

def current_user
  instance_eval &DeepUnrest.get_user
end

#readObject



34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# File 'app/controllers/deep_unrest/application_controller.rb', line 34

def read
  repaired_params = params[:data]
  data = repaired_params[:data]
  context = repaired_params[:context] || {}
  context[:uuid] = request.uuid
  context[:current_user] = current_user

  instance_eval &DeepUnrest.before_read if DeepUnrest.before_read

  results = DeepUnrest.perform_read(context, data, current_user)
  render json: results, status: :ok
rescue DeepUnrest::Unauthorized => err
  render json: err.message, status: :forbidden
rescue DeepUnrest::UnpermittedParams => err
  render json: err.message, status: :method_not_allowed
end

#repair_nested_params(obj) ⇒ Object

rails can’t deal with array indices in params (converts them to hashes) see gist.github.com/bloudermilk/2884947



19
20
21
22
23
24
25
26
27
28
29
30
31
32
# File 'app/controllers/deep_unrest/application_controller.rb', line 19

def repair_nested_params(obj)
  return unless obj.respond_to?(:each)
  obj.each do |key, value|
    if value.is_a?(ActionController::Parameters) || value.is_a?(Hash)
      # If any non-integer keys
      if value.keys.find { |k, _| k =~ /\D/ }
        repair_nested_params(value)
      else
        obj[key] = value.values
        value.values.each { |h| repair_nested_params(h) }
      end
    end
  end
end

#updateObject



75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
# File 'app/controllers/deep_unrest/application_controller.rb', line 75

def update
  redirect = allowed_write_params[:data][:redirect]
  context = allowed_write_params[:data][:context] || {}
  context[:uuid] = request.uuid
  context[:current_user] = current_user
  data = repair_nested_params(params)[:data][:data]

  instance_eval &DeepUnrest.before_update if DeepUnrest.before_update

  results = DeepUnrest.perform_update(context, data, current_user)
  resp = { destroyed: results[:destroyed],
           changed: results[:changed],
           tempIds: results[:temp_ids] }
  resp[:redirect] = results[:redirect_regex].call(redirect) if redirect
  render json: resp, status: :ok
rescue DeepUnrest::Unauthorized => err
  render json: err.message, status: :forbidden
rescue DeepUnrest::UnpermittedParams => err
  render json: err.message, status: :method_not_allowed
rescue DeepUnrest::Conflict => err
  render json: err.message, status: :conflict
ensure
  @@temp_ids.delete(request.uuid)
  @@destroyed_entities.clear
  @@changed_entities.clear
end

#writeObject



51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# File 'app/controllers/deep_unrest/application_controller.rb', line 51

def write
  repaired_params = repair_nested_params(params[:data])
  data = repaired_params[:data]
  data = ActionController::Parameters.new({}) if data&.blank?
  context = repaired_params[:context] || {}
  context[:uuid] = request.uuid
  context[:current_user] = current_user

  instance_eval &DeepUnrest.before_update if DeepUnrest.before_update

  results = DeepUnrest.perform_write(context, data, current_user)
  render json: results, status: :ok
rescue DeepUnrest::Unauthorized => err
  render json: err.message, status: :forbidden
rescue DeepUnrest::UnpermittedParams => err
  render json: err.message, status: :method_not_allowed
rescue DeepUnrest::Conflict => err
  render json: err.message, status: :conflict
ensure
  @@temp_ids.delete(request.uuid)
  @@destroyed_entities.clear
  @@changed_entities.clear
end