Module: Forcast::Controller::Relacion

Extended by:
ActiveSupport::Concern
Included in:
Api::ActionLogsController, Api::ActionsController, Api::PollingsController, Api::RuleLogsController, Api::RulesController, Api::VARIABLEController, Api::WebhooksController
Defined in:
lib/forcast/controllers/controller/relacion.rb

Instance Method Summary collapse

Instance Method Details

#c_to_m(str) ⇒ Object



29
30
31
# File 'lib/forcast/controllers/controller/relacion.rb', line 29

def c_to_m(str)
  return str.classify.constantize
end

#comprobar_relacion(re, var) ⇒ Object



45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/forcast/controllers/controller/relacion.rb', line 45

def comprobar_relacion(re,var)

  model.reflect_on_all_associations(re).each do |x|
     n = x.name.to_s
     if n == var
      return true
      break
     else
      next
     end
  end
  return false
end

#deep_deep_relation(init, comp, i, arr) ⇒ Object



116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
# File 'lib/forcast/controllers/controller/relacion.rb', line 116

def deep_deep_relation (init,comp,i,arr)
  #Encuentra la cadena de relaciones entre un modelo padre y otro hijo
  #EX: [usuario,recinto,ubicacion,camara,grabacions]
  #Toma usuario y grabacions y encuentra la cadena
  init.reflect_on_all_associations(:has_many).each do |x|
    x = x.name.to_s
    #p x
    #p i
    arr.push(x)
    if x == comp
      throw :exit
    else
      i = i + 1
      deep_deep_relation(c_to_m(x),comp,i,arr)
    end
    i = i - 1
    arr.delete(x)
  end
end

#deep_relacion_directa_indirecta(rel) ⇒ Object

Comprueba que el recurso anidado corresponda al orden del request EX: localhost:4000/api/usuarios/20/recintos/2/ubicacions El metodo comprueba que la ubicacion pertenezca al recinto 2 asociado al usuario 20



80
81
82
83
84
85
86
87
88
89
90
91
92
# File 'lib/forcast/controllers/controller/relacion.rb', line 80

def deep_relacion_directa_indirecta(rel)
  init = c_to_m(rel[0]).find(params[rel[0]+'_id'])
  rel.each_with_index do |ar,index|
     next if index + 1 == rel.length
     #Lanza un error si no encuentra el recurso en alguno de los padres
     begin 
       init = init.send(rel[index+1]).find(params[rel[index+1]+'_id'])
     rescue => e
       raise Application::Error::General.new(t("error_deep_relation_doesnt_exist", param: e))
     end
  end
  relation
end

#deep_relationObject



94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
# File 'lib/forcast/controllers/controller/relacion.rb', line 94

def deep_relation

  return @model unless request.request_method_symbol == :get 
  rel = []
  params.keys.map { |val|  rel.push(val.chomp('_id')) if val.include?('_id') && val != 'model_id' && val != 'modelo_id' && val != 'modelo'}
  rel = rel.last
  #Entender bien cuando se produce el Trigger, si la url es 
  #/usuarios el last es action, si es /usuario/:id es id
  #ademas si  /usuario limit=1 envio parametos el last key es igual a usuario
  #entonces compruebo el largo de los params
  return @model if rel == nil || rel == 'action' || rel == 'id' || params.keys.length > 7
  return @model if comprobar_relacion(:belongs_to, rel)
  init = c_to_m(rel)
  i = 0
  arr = []
  arr.push(rel)
  comp = model.name.to_s.downcase!
  catch :exit do
    deep_deep_relation(init,comp,i,arr)
  end
  return fetch_from_relations_model(arr,rel)
end

#fetch_from_relations_model(arr, rel) ⇒ Object



135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
# File 'lib/forcast/controllers/controller/relacion.rb', line 135

def fetch_from_relations_model(arr,rel)
  #Recibe un array con las relaciones ordenadas de mayor a menos
  #[usuario,recinto,ubicacion,camara]
  #Recibe rel que es igual al primer valor del parametro mayor
  #params[:usuario_id]
  rel = params[rel+'_id']

  init = c_to_m(arr[0]).find(rel)
  arr.each_with_index do |ar,index|
    next if index + 1 == arr.length
    init = c_to_m(arr[index+1]).send(:where, { ar + '_id' => init})
  end
  @model = init
  # @model = Grabacion.where(camara_id: 
  #      Camara.where(hub_id: 
  #      Hub.where(recinto_id: 
  #      Recinto.where(usuario_id: 
  #      Usuario.find(rel)))))
end

#relacion_directa_indirectaObject



67
68
69
70
71
72
73
74
75
76
# File 'lib/forcast/controllers/controller/relacion.rb', line 67

def relacion_directa_indirecta
  ##Fijarse en estos parametros ya que nos interesan solo los de la url original, quizas sea mejor parsear la url.split("/")
  return @model unless request.request_method_symbol == :get 
  rel = []
  params.keys.map { |val|  rel.push(val.chomp('_id')) if val.include?('_id') && val != 'model_id' && val != 'modelo_id' && val != 'modelo'}
  if rel.length > 1
    return deep_relacion_directa_indirecta(rel)
  end
  relation
end

#relacion_padreObject



59
60
61
62
63
64
65
# File 'lib/forcast/controllers/controller/relacion.rb', line 59

def relacion_padre

  raise Application::Error::General.new(t("error_relation_param", param: params[:padre])) unless comprobar_relacion(:belongs_to, params[:padre])
  params_permitidos_enviar = abstract_controller(params[:padre]).new.send (:params_permitidos_enviar)
  @response  = c_to_m(params[:padre]).find(@model_id.send(params[:padre]+'_id'))
  @response = @response.attributes.slice(*params_permitidos_enviar)
end

#relationObject



33
34
35
36
37
38
39
40
41
42
43
# File 'lib/forcast/controllers/controller/relacion.rb', line 33

def relation
  controller = controller_name.chomp('s')
  model.reflect_on_all_associations(:belongs_to).each do |x|
     n = x.name.to_s
     nid = n +"_id"
     if params.include?(nid)
      return c_to_m(n).find(params[nid]).send(controller)
      break
     end
  end
end