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