forcast 0.0.110

Sign up to get free protection for your applications and to get access to all the features.
Files changed (149) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +1 -0
  3. data/COPYRIGHTS +11 -0
  4. data/Gemfile +22 -0
  5. data/Gemfile.lock +166 -0
  6. data/PENDIENTES +39 -0
  7. data/README.md +35 -0
  8. data/Rakefile +7 -0
  9. data/VERSION +1 -0
  10. data/bin/console +14 -0
  11. data/bin/rake +28 -0
  12. data/bin/setup +8 -0
  13. data/forcast.gemspec +73 -0
  14. data/lib/forcast.rb +5 -0
  15. data/lib/forcast/controllers/all.rb +2 -0
  16. data/lib/forcast/controllers/application/all.rb +12 -0
  17. data/lib/forcast/controllers/application/crud.rb +91 -0
  18. data/lib/forcast/controllers/application/database.rb +34 -0
  19. data/lib/forcast/controllers/application/error.rb +18 -0
  20. data/lib/forcast/controllers/application/exception_handler.rb +25 -0
  21. data/lib/forcast/controllers/application/json.rb +83 -0
  22. data/lib/forcast/controllers/application/locale.rb +30 -0
  23. data/lib/forcast/controllers/application/log.rb +22 -0
  24. data/lib/forcast/controllers/application/login.rb +41 -0
  25. data/lib/forcast/controllers/application/meta.rb +61 -0
  26. data/lib/forcast/controllers/application/model.rb +17 -0
  27. data/lib/forcast/controllers/application/permitirtodo.rb +27 -0
  28. data/lib/forcast/controllers/application/utils.rb +28 -0
  29. data/lib/forcast/controllers/controller/all.rb +8 -0
  30. data/lib/forcast/controllers/controller/asociar.rb +121 -0
  31. data/lib/forcast/controllers/controller/busqueda.rb +151 -0
  32. data/lib/forcast/controllers/controller/definitor/definitor.rb +322 -0
  33. data/lib/forcast/controllers/controller/definitor/definitor_page.rb +40 -0
  34. data/lib/forcast/controllers/controller/definitor_all.rb +2 -0
  35. data/lib/forcast/controllers/controller/filtro.rb +48 -0
  36. data/lib/forcast/controllers/controller/login/controllers/base_controller.rb +135 -0
  37. data/lib/forcast/controllers/controller/login/controllers/login_controller.rb +38 -0
  38. data/lib/forcast/controllers/controller/login/login.rb +71 -0
  39. data/lib/forcast/controllers/controller/login_all.rb +1 -0
  40. data/lib/forcast/controllers/controller/paper_trail/paper_trail.rb +21 -0
  41. data/lib/forcast/controllers/controller/paper_trail_all.rb +1 -0
  42. data/lib/forcast/controllers/controller/relacion.rb +157 -0
  43. data/lib/forcast/controllers/controller/rule_engine/action_engine.rb +92 -0
  44. data/lib/forcast/controllers/controller/rule_engine/controllers/action_logs_controller.rb +12 -0
  45. data/lib/forcast/controllers/controller/rule_engine/controllers/actions_controller.rb +10 -0
  46. data/lib/forcast/controllers/controller/rule_engine/controllers/pollings_controller.rb +13 -0
  47. data/lib/forcast/controllers/controller/rule_engine/controllers/rule_logs_controller.rb +12 -0
  48. data/lib/forcast/controllers/controller/rule_engine/controllers/rules_controller.rb +19 -0
  49. data/lib/forcast/controllers/controller/rule_engine/controllers/webhooks_controller.rb +27 -0
  50. data/lib/forcast/controllers/controller/rule_engine/polling_engine.rb +76 -0
  51. data/lib/forcast/controllers/controller/rule_engine/rule_controller.rb +27 -0
  52. data/lib/forcast/controllers/controller/rule_engine/rule_engine.rb +88 -0
  53. data/lib/forcast/controllers/controller/rule_engine/webhook_engine.rb +38 -0
  54. data/lib/forcast/controllers/controller/rule_engine_all.rb +5 -0
  55. data/lib/forcast/jobs/all.rb +2 -0
  56. data/lib/forcast/jobs/jobs_assets.rb +25 -0
  57. data/lib/forcast/jobs/jobs_wrapper.rb +25 -0
  58. data/lib/forcast/jobs/rule_engine/jobs_actions.rb +73 -0
  59. data/lib/forcast/jobs/rule_engine/jobs_pollings.rb +77 -0
  60. data/lib/forcast/jobs/rule_engine/jobs_webhooks.rb +54 -0
  61. data/lib/forcast/migrations/0_migracion_general.rb +44 -0
  62. data/lib/forcast/migrations/paper_trail/versions.rb +61 -0
  63. data/lib/forcast/migrations/rule_engine/action_logs.rb +15 -0
  64. data/lib/forcast/migrations/rule_engine/actions.rb +15 -0
  65. data/lib/forcast/migrations/rule_engine/pollings.rb +26 -0
  66. data/lib/forcast/migrations/rule_engine/rule_logs.rb +22 -0
  67. data/lib/forcast/migrations/rule_engine/rules.rb +27 -0
  68. data/lib/forcast/migrations/rule_engine/webhooks.rb +25 -0
  69. data/lib/forcast/models/all.rb +8 -0
  70. data/lib/forcast/models/asociar.rb +74 -0
  71. data/lib/forcast/models/busqueda.rb +17 -0
  72. data/lib/forcast/models/login/authorization.rb +37 -0
  73. data/lib/forcast/models/login/json_web_token.rb +15 -0
  74. data/lib/forcast/models/login/login.rb +26 -0
  75. data/lib/forcast/models/login_all.rb +2 -0
  76. data/lib/forcast/models/meta.rb +19 -0
  77. data/lib/forcast/models/modelo.rb +125 -0
  78. data/lib/forcast/models/models/meta.rb +6 -0
  79. data/lib/forcast/models/paper_trail/paper_trail.rb +13 -0
  80. data/lib/forcast/models/paper_trail_all.rb +1 -0
  81. data/lib/forcast/models/permitirtodo.rb +57 -0
  82. data/lib/forcast/models/rule_engine/action_engine.rb +19 -0
  83. data/lib/forcast/models/rule_engine/models/action.rb +41 -0
  84. data/lib/forcast/models/rule_engine/models/action_log.rb +40 -0
  85. data/lib/forcast/models/rule_engine/models/polling.rb +43 -0
  86. data/lib/forcast/models/rule_engine/models/rule.rb +44 -0
  87. data/lib/forcast/models/rule_engine/models/rule_log.rb +39 -0
  88. data/lib/forcast/models/rule_engine/models/webhook.rb +43 -0
  89. data/lib/forcast/models/rule_engine/polling_engine.rb +113 -0
  90. data/lib/forcast/models/rule_engine/rule.rb +62 -0
  91. data/lib/forcast/models/rule_engine/rule_engine.rb +137 -0
  92. data/lib/forcast/models/rule_engine/rule_scope.rb +35 -0
  93. data/lib/forcast/models/rule_engine/webhook_engine.rb +55 -0
  94. data/lib/forcast/models/rule_engine_all.rb +6 -0
  95. data/lib/forcast/routes/concerns/asociar.rb +15 -0
  96. data/lib/forcast/routes/concerns/buscar.rb +6 -0
  97. data/lib/forcast/routes/concerns/definitor.rb +3 -0
  98. data/lib/forcast/routes/concerns/modelo.rb +6 -0
  99. data/lib/forcast/routes/database.rb +4 -0
  100. data/lib/forcast/routes/login.rb +4 -0
  101. data/lib/forcast/routes/paper_trail/paper_trail.rb +3 -0
  102. data/lib/forcast/routes/rule_engine/rule.rb +5 -0
  103. data/lib/forcast/tasks/.giosaveZr0hbs +21 -0
  104. data/lib/forcast/tasks/.keep +0 -0
  105. data/lib/forcast/tasks/all.rb +16 -0
  106. data/lib/forcast/tasks/diagramas.rake +32 -0
  107. data/lib/forcast/tasks/documentation/documentation.rb +100 -0
  108. data/lib/forcast/tasks/env.rake +10 -0
  109. data/lib/forcast/tasks/git.rake +22 -0
  110. data/lib/forcast/tasks/indy/indy.rb +28 -0
  111. data/lib/forcast/tasks/logs.rake +13 -0
  112. data/lib/forcast/tasks/process.rake +18 -0
  113. data/lib/forcast/tasks/schema.rake +17 -0
  114. data/lib/forcast/tasks/schema/recips/action.rb +18 -0
  115. data/lib/forcast/tasks/schema/recips/controller.rb +29 -0
  116. data/lib/forcast/tasks/schema/recips/definitor.rb +38 -0
  117. data/lib/forcast/tasks/schema/recips/model.rb +43 -0
  118. data/lib/forcast/tasks/schema/recips/project.rb +19 -0
  119. data/lib/forcast/tasks/schema/recips/route.rb +9 -0
  120. data/lib/forcast/tasks/schema/recips/tmp/controller.rb +0 -0
  121. data/lib/forcast/tasks/schema/recips/tmp/model.rb +0 -0
  122. data/lib/forcast/tasks/schema/recips/tmp/model/.keep +0 -0
  123. data/lib/forcast/tasks/schema/rule_engine/rule_engine.rb +98 -0
  124. data/lib/forcast/tasks/schema/schema.rb +346 -0
  125. data/lib/forcast/tasks/test.rake +129 -0
  126. data/lib/forcast/tasks/utils.rake +68 -0
  127. data/lib/forcast/tasks/yard.rake +18 -0
  128. data/lib/forcast/utils/all.rb +4 -0
  129. data/lib/forcast/utils/email.rb +49 -0
  130. data/lib/forcast/utils/email/forcast/utils/email/layout/default.html.erb +3 -0
  131. data/lib/forcast/utils/email/forcast/utils/email/layout/default.text.erb +5 -0
  132. data/lib/forcast/utils/firebase.rb +60 -0
  133. data/lib/forcast/utils/firebase_database.rb +117 -0
  134. data/lib/forcast/utils/measure.rb +44 -0
  135. data/lib/forcast/utils/qvo.rb +141 -0
  136. data/lib/forcast/utils/server.rb +296 -0
  137. data/lib/forcast/utils/telegram.rb +82 -0
  138. data/lib/forcast/utils/thing.rb +180 -0
  139. data/lib/forcast/version.rb +15 -0
  140. data/lib/lib/backup.rb +42 -0
  141. data/lib/lib/deploy.sh +40 -0
  142. data/lib/lib/forcast_servidor_rails.sh +11 -0
  143. data/lib/lib/pg_generator.sh +10 -0
  144. data/lib/lib/production.rb +66 -0
  145. data/lib/lib/production/production.rb +30 -0
  146. data/lib/lib/systemctl_maker.rb +88 -0
  147. data/lib/lib/update.rb +100 -0
  148. data/production.rb +31 -0
  149. metadata +301 -0
@@ -0,0 +1,40 @@
1
+ module Forcast
2
+ module Controller
3
+ module DefinitorPage
4
+ include Definitor
5
+
6
+ def definitor
7
+ raise Application::Error::General.new(t("operation_notValid")) unless permitted_definition.include?(@operation)
8
+ @response = send("#{@operation}_view_definitor")
9
+ json_response(@response, 'ok')
10
+ end
11
+
12
+ def permitted_definition
13
+ %w[wizard]
14
+ end
15
+
16
+ def wizard_create_resources_definitor(*args)
17
+ wizard = Hash.new
18
+ wizard[:type] = 'stepper'
19
+ wizard[:name] = 'stepper'
20
+ wizard[:label] = 'test stepper'
21
+ wizard[:inputType] = 'string'
22
+ wizard[:wizard] = *args.map {|e| constructor_wizard_create(e) }
23
+ wizard[:wizard].push({labelStepper: 'Done',fields: []})
24
+ wizard
25
+ end
26
+
27
+ def constructor_wizard_create(e)
28
+ key = e.keys.first
29
+ selected = e[key]
30
+ result = Hash.new
31
+ result[:labelStepper] = "Create #{key.to_s.pluralize.capitalize}"
32
+ result[:resource] = key.to_s.pluralize
33
+ result[:fields] = serializer_mongo(all_definitions(key.to_s).slice(*selected))
34
+ result
35
+ end
36
+
37
+
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,2 @@
1
+ require "forcast/controllers/controller/definitor/definitor"
2
+ require "forcast/controllers/controller/definitor/definitor_page"
@@ -0,0 +1,48 @@
1
+ module Forcast
2
+ module Controller
3
+ module Filtro
4
+
5
+ def index
6
+ filtrar_por if params_present?('filtrar_modelo') && params_present?('filtrar_por') && params_present?('filtro') && !params_present?('relacion')
7
+ deep_filtrar_por if params_present?('relacion') && params_present?('filtrar_modelo') && params_present?('filtrar_por') && params_present?('filtro')
8
+ super()
9
+ end
10
+
11
+ private
12
+
13
+ def filtrar_por
14
+
15
+ comprobar_filtrar_por
16
+ @response ||= @model.all
17
+ @response = @model.where(id: @response.pluck(:id))
18
+ @response = @response.includes(params[:filtrar_modelo])
19
+ .where( params[:filtrar_modelo]+'s' => { params[:filtrar_por] => params[:filtro] })
20
+ .last(@limit).pluck_to_hash(*params_permitidos_enviar)
21
+
22
+ end
23
+
24
+ #Si el metodo tiene la relacion activada
25
+ #Se trabaja con el array que proviene de buscar incluyendo relacion
26
+ #Se verifican las id que cumplan el criterio y luego se limpia el array de buscar / relacion
27
+ def deep_filtrar_por
28
+
29
+ comprobar_filtrar_por
30
+ paso = @model.where( :id => @response.map { |e| e[@model.to_s]['id'] })
31
+ paso2 = paso.includes(params[:filtrar_modelo])
32
+ .where( params[:filtrar_modelo]+'s' => { params[:filtrar_por] => params[:filtro] })
33
+ .last(@limit).pluck(:id)
34
+
35
+ @response = @response.map{ |e| e if paso2.include?(e[@model.to_s]['id']) }
36
+ @response = @response.compact
37
+ end
38
+
39
+ def comprobar_filtrar_por
40
+ raise Application::Error::General.new(t("error_relation_param", param: params[:filtrar_modelo])) unless comprobar_relacion(:has_many, params[:filtrar_modelo])
41
+ params_permitidos_filtrar = abstract_controller(params[:filtrar_modelo]).new.send (:params_permitidos_buscar)
42
+ raise Application::Error::General.new(t("error_filter_model_param", param: [params[:filtrar_modelo],params[:filtrar_por]])) unless params_permitidos_filtrar.include?(params[:filtrar_por])
43
+ end
44
+
45
+ end
46
+ end
47
+ end
48
+
@@ -0,0 +1,135 @@
1
+ module Api
2
+ class BaseController < ActionController::Base
3
+
4
+ before_action :check_authorization_presence, only: [:check_token_format,:authenticate]
5
+ before_action :authenticate, except: [:sign_in,:sign_out]
6
+ before_action :check_token_presence, except: [:sign_in,:sign_out]
7
+ before_action :check_token_revoke_format, only: [:sign_out]
8
+ #before_action :init_user
9
+
10
+ attr_reader :current_user
11
+
12
+ protected
13
+
14
+ # Check Methods
15
+ def check_content_type_presence
16
+ if request.method == "POST" || request.method == "PATCH"
17
+ unless request.env['CONTENT_TYPE'].present?
18
+ render json:{errors:[{title:'Content Type',
19
+ detail:"The content type is not present",
20
+ source:"Header content type" }]}, status: :bad_request
21
+ end
22
+ end
23
+ end
24
+
25
+ def check_token_presence
26
+ #Check presence and format token
27
+ if !(request.env['HTTP_AUTHORIZATION'].present?) && !(request.env['HTTP_AUTHORIZATION'].is_a?(String)) && ((request.env['HTTP_AUTHORIZATION'] =~ /Bearer [.]*/) != 0)
28
+ render json:{errors:[{title:'Http Authorization',
29
+ detail:"The http authorization is not present or the format is not valid, please check your header or the expected format",
30
+ source:"Header AUTHORIZATION" }]}, status: :bad_request
31
+ end
32
+ end
33
+
34
+ def check_token_format
35
+ #Authorization: Bearer e9629c2a-6763-45f4-9d3a-1b2c7822febe
36
+ authorization = request.env['HTTP_AUTHORIZATION']
37
+
38
+ #TODO: Manage the error when the split can't be executed
39
+ options = authorization.split(' ')
40
+
41
+ bearer_param = options.first
42
+ token_param = options.second
43
+
44
+ if bearer_param.blank? && token_param.blank? && (bearer_param != "Bearer" || token_param.blank?)
45
+ render json:{errors:[{title:'Authorization Format Token',
46
+ detail:"The format token is not valid, please check it",
47
+ source:"data/attributes/authorization" }]}, status: :bad_request
48
+
49
+ end
50
+ end
51
+
52
+ def check_authorization_presence
53
+ unless request.env['HTTP_AUTHORIZATION'].present?
54
+ render json:{errors:[{title:'Authorization Header',
55
+ detail:"The Authorization header is not present",
56
+ source:"data/headers" }]}, status: :bad_request
57
+ end
58
+
59
+ end
60
+
61
+ def check_token_revoke_format
62
+ token = token_in_params
63
+
64
+ if !(token.present?) && !(token.is_a?(String)) && ((token =~ /Bearer [.]*/) != 0)
65
+ render json:{errors:[{title:'Token presence or format',
66
+ detail:"The token is not present or the format is not valid, please check your params or the expected format",
67
+ source:"Token Params" }]}, status: :bad_request
68
+ end
69
+ end
70
+
71
+ #Action Methods
72
+ def authenticate
73
+ authorization = request.env['HTTP_AUTHORIZATION']
74
+
75
+ options = authorization.split(' ')
76
+
77
+ bearer_param = options.first
78
+ token_param = options.last
79
+
80
+ decoded_token = JsonWebToken.decode(token_param)
81
+
82
+ if decoded_token.blank?
83
+ render_access_denied
84
+ else
85
+ user_id = decoded_token[:user_id]
86
+ created_at_format = decoded_token[:birthday_date]
87
+ expiration_time = Time.at(decoded_token[:exp])
88
+
89
+ #Trick to located the token, it should be created_at
90
+ created_at = Time.parse(created_at_format)
91
+ auth = Authorization.find_by(user_id:user_id,active_time_stamp:created_at.to_i)
92
+
93
+ #TODO: Check how to use the operative attribute in Authorization model
94
+
95
+ if auth.blank? || !auth.try(:operative)
96
+ render json:{errors: [{message:"No estás autorizado a entrar", code:401}]}, status: :unauthorized
97
+ else
98
+ @current_user = User.find(decoded_token[:user_id])
99
+ end
100
+ end
101
+
102
+ end
103
+
104
+ #Methods for authorizations
105
+ def get_plants
106
+ if @current_user.rol_5s == User::USER_ROLES[:auditor] || @current_user.rol_5s == User::USER_ROLES[:supervisor]
107
+ [PlantService.get_plant(@current_user)["object"]]
108
+ elsif @current_user.rol_5s == User::USER_ROLES[:corporative]
109
+ PlantService.get_plants["object"]
110
+ end
111
+ end
112
+
113
+ #Methods for authorizations
114
+ def current_plant_id
115
+ puts "#NOMBRE => #{@current_user.userccu}, ROL => #{@current_user.rol_5s}"
116
+ if @current_user.rol_5s == User::USER_ROLES[:auditor] || @current_user.rol_5s == User::USER_ROLES[:supervisor]
117
+ @current_user.plant_id
118
+ elsif @current_user.rol_5s == User::USER_ROLES[:corporative]
119
+ puts "SOY CORPORATIVO"
120
+ params[:id]
121
+ end
122
+ end
123
+
124
+ #Acordarse de borrar
125
+ def init_user
126
+ puts controller_name
127
+ if params[:user_id]
128
+ @current_user = User.find_by(:instance_id => params[:user_id])
129
+ elsif params[:id] && controller_name == 'users'
130
+ @current_user = User.find_by(:instance_id => params[:id]) if params[:id]
131
+ end
132
+ end
133
+
134
+ end
135
+ end
@@ -0,0 +1,38 @@
1
+ class Api::LoginController < ApplicationController
2
+
3
+ include Forcast::Controller::Login
4
+
5
+ private
6
+
7
+
8
+ def validaciones_login (user)
9
+
10
+ #raise Application::Error::General.new(t("error_bad_custom")) if user.class.name == "Administrador"
11
+
12
+
13
+ end
14
+
15
+
16
+
17
+ def modelo_a_validar
18
+
19
+
20
+ return modelo_a_validar = []
21
+
22
+
23
+
24
+ end
25
+
26
+ def modelo_login
27
+
28
+
29
+ return modelo_login = []
30
+
31
+
32
+
33
+ end
34
+
35
+
36
+
37
+
38
+ end
@@ -0,0 +1,71 @@
1
+ require 'active_support'
2
+ module Forcast
3
+ module Controller
4
+ module Login
5
+
6
+ extend ActiveSupport::Concern
7
+
8
+ included do
9
+
10
+ before_action :set_user, only: [:create_login, :destroy_login]
11
+
12
+ end
13
+
14
+ def create_login
15
+ raise Application::Error::General.new(t("error_bad_password")) unless @user.is_password?(params[:password])
16
+ validaciones_login(@user)
17
+ h = Hash.new
18
+ h["auth_token"] = @user.generate_auth_token
19
+ h["token_telefono"] = @token_telefono
20
+ json_response(h,t("login_ok"))
21
+ end
22
+
23
+
24
+ def destroy_login
25
+ raise Application::Error::General.new(t("error_bad_password")) unless @user.is_password?(params[:password])
26
+ validaciones_login(@user)
27
+ @user.invalidate_auth_token
28
+ json_response('',t("logout_ok"))
29
+ end
30
+
31
+
32
+ private
33
+
34
+ def set_user
35
+
36
+ @variable = params[:variable]
37
+ @dato = params[:dato]
38
+ #raise Application::Error::General.new(t("error_present_mail")) unless params[:mail].present?
39
+ raise Application::Error::General.new(t("error_present_password")) unless params[:password].present?
40
+ set_user_using_model if params[:model].present?
41
+ mm = ''
42
+ modelo_a_validar.each do |x|
43
+ mm = c_to_m(x)
44
+ next unless mm.exists?("#{@variable}" => @dato)
45
+ user = mm.find_by("#{@variable}" => @dato)
46
+ @user ||= user
47
+ end
48
+ raise Application::Error::General.new(t("error_not_user")) if @user === nil
49
+
50
+ end
51
+
52
+ def set_user_using_model
53
+
54
+ raise Application::Error::General.new(t("error_present_modelo", params: params[:model])) unless modelo_a_validar.include?(params[:model])
55
+ mm = ''
56
+ modelo_a_validar.each do |x|
57
+ next if params[:model] != x
58
+ mm = c_to_m(x)
59
+ end
60
+ raise Application::Error::General.new(t("error_not_user", params: @dato)) unless mm.exists?("#{@variable}" => @dato)
61
+ @user ||= mm.find_by("#{@variable}" => @dato)
62
+
63
+ end
64
+
65
+ def c_to_m(str)
66
+ str.classify.constantize
67
+ end
68
+
69
+ end
70
+ end
71
+ end
@@ -0,0 +1 @@
1
+ require "forcast/controllers/controller/login/login"
@@ -0,0 +1,21 @@
1
+ require 'active_support'
2
+ module Forcast
3
+ module Controller
4
+ module PaperTrail
5
+ extend ActiveSupport::Concern
6
+
7
+ included do
8
+ before_action :set_model_id_version, only: [:versions]
9
+ end
10
+
11
+ def versions
12
+ json_response(@model_id.versions,'ok')
13
+ end
14
+
15
+ def set_model_id_version
16
+ set_model_id
17
+ end
18
+
19
+ end
20
+ end
21
+ end
@@ -0,0 +1 @@
1
+ require "forcast/controllers/controller/paper_trail/paper_trail"
@@ -0,0 +1,157 @@
1
+ require 'active_support'
2
+ module Forcast
3
+ module Controller
4
+ module Relacion
5
+
6
+ ## Este módulo hace que cuando se pregunta por los has_many de un modelo los entregue
7
+ ## EJ: GET api/camaras/1/alarmas => entregaria las alarmas de camaras_id = 1
8
+ ## EJ: GET api/camaras/1/alarmas/1 => entregaria la alarma_id = 1 de camaras_id = 1
9
+
10
+ extend ActiveSupport::Concern
11
+
12
+ included do
13
+ before_action :set_relation
14
+ before_action :set_relation_id, only: [:show, :update, :destroy]
15
+
16
+ def set_relation
17
+ ##Compruebo que exista el parametro de relacion
18
+ ##Porque el metodo relation arroja un Array en caso de no encontrar nada
19
+ relation.is_a?(Array) ? deep_relation : @model = relacion_directa_indirecta
20
+ end
21
+
22
+ def set_relation_id
23
+ relation.is_a?(Array) ? @model_id : @model_id = relation.find(params[:id])
24
+ relacion_padre if params[:padre]
25
+ end
26
+
27
+ end
28
+
29
+ def c_to_m(str)
30
+ return str.classify.constantize
31
+ end
32
+
33
+ def relation
34
+ controller = controller_name.chomp('s')
35
+ model.reflect_on_all_associations(:belongs_to).each do |x|
36
+ n = x.name.to_s
37
+ nid = n +"_id"
38
+ if params.include?(nid)
39
+ return c_to_m(n).find(params[nid]).send(controller)
40
+ break
41
+ end
42
+ end
43
+ end
44
+
45
+ def comprobar_relacion(re,var)
46
+
47
+ model.reflect_on_all_associations(re).each do |x|
48
+ n = x.name.to_s
49
+ if n == var
50
+ return true
51
+ break
52
+ else
53
+ next
54
+ end
55
+ end
56
+ return false
57
+ end
58
+
59
+ def relacion_padre
60
+
61
+ raise Application::Error::General.new(t("error_relation_param", param: params[:padre])) unless comprobar_relacion(:belongs_to, params[:padre])
62
+ params_permitidos_enviar = abstract_controller(params[:padre]).new.send (:params_permitidos_enviar)
63
+ @response = c_to_m(params[:padre]).find(@model_id.send(params[:padre]+'_id'))
64
+ @response = @response.attributes.slice(*params_permitidos_enviar)
65
+ end
66
+
67
+ def relacion_directa_indirecta
68
+ ##Fijarse en estos parametros ya que nos interesan solo los de la url original, quizas sea mejor parsear la url.split("/")
69
+ return @model unless request.request_method_symbol == :get
70
+ rel = []
71
+ params.keys.map { |val| rel.push(val.chomp('_id')) if val.include?('_id') && val != 'model_id' && val != 'modelo_id' && val != 'modelo'}
72
+ if rel.length > 1
73
+ return deep_relacion_directa_indirecta(rel)
74
+ end
75
+ relation
76
+ end
77
+ #Comprueba que el recurso anidado corresponda al orden del request
78
+ #EX: localhost:4000/api/usuarios/20/recintos/2/ubicacions
79
+ #El metodo comprueba que la ubicacion pertenezca al recinto 2 asociado al usuario 20
80
+ def deep_relacion_directa_indirecta(rel)
81
+ init = c_to_m(rel[0]).find(params[rel[0]+'_id'])
82
+ rel.each_with_index do |ar,index|
83
+ next if index + 1 == rel.length
84
+ #Lanza un error si no encuentra el recurso en alguno de los padres
85
+ begin
86
+ init = init.send(rel[index+1]).find(params[rel[index+1]+'_id'])
87
+ rescue => e
88
+ raise Application::Error::General.new(t("error_deep_relation_doesnt_exist", param: e))
89
+ end
90
+ end
91
+ relation
92
+ end
93
+
94
+ def deep_relation
95
+
96
+ return @model unless request.request_method_symbol == :get
97
+ rel = []
98
+ params.keys.map { |val| rel.push(val.chomp('_id')) if val.include?('_id') && val != 'model_id' && val != 'modelo_id' && val != 'modelo'}
99
+ rel = rel.last
100
+ #Entender bien cuando se produce el Trigger, si la url es
101
+ #/usuarios el last es action, si es /usuario/:id es id
102
+ #ademas si /usuario limit=1 envio parametos el last key es igual a usuario
103
+ #entonces compruebo el largo de los params
104
+ return @model if rel == nil || rel == 'action' || rel == 'id' || params.keys.length > 7
105
+ return @model if comprobar_relacion(:belongs_to, rel)
106
+ init = c_to_m(rel)
107
+ i = 0
108
+ arr = []
109
+ arr.push(rel)
110
+ comp = model.name.to_s.downcase!
111
+ catch :exit do
112
+ deep_deep_relation(init,comp,i,arr)
113
+ end
114
+ return fetch_from_relations_model(arr,rel)
115
+ end
116
+ def deep_deep_relation (init,comp,i,arr)
117
+ #Encuentra la cadena de relaciones entre un modelo padre y otro hijo
118
+ #EX: [usuario,recinto,ubicacion,camara,grabacions]
119
+ #Toma usuario y grabacions y encuentra la cadena
120
+ init.reflect_on_all_associations(:has_many).each do |x|
121
+ x = x.name.to_s
122
+ #p x
123
+ #p i
124
+ arr.push(x)
125
+ if x == comp
126
+ throw :exit
127
+ else
128
+ i = i + 1
129
+ deep_deep_relation(c_to_m(x),comp,i,arr)
130
+ end
131
+ i = i - 1
132
+ arr.delete(x)
133
+ end
134
+ end
135
+ def fetch_from_relations_model(arr,rel)
136
+ #Recibe un array con las relaciones ordenadas de mayor a menos
137
+ #[usuario,recinto,ubicacion,camara]
138
+ #Recibe rel que es igual al primer valor del parametro mayor
139
+ #params[:usuario_id]
140
+ rel = params[rel+'_id']
141
+
142
+ init = c_to_m(arr[0]).find(rel)
143
+ arr.each_with_index do |ar,index|
144
+ next if index + 1 == arr.length
145
+ init = c_to_m(arr[index+1]).send(:where, { ar + '_id' => init})
146
+ end
147
+ @model = init
148
+ # @model = Grabacion.where(camara_id:
149
+ # Camara.where(hub_id:
150
+ # Hub.where(recinto_id:
151
+ # Recinto.where(usuario_id:
152
+ # Usuario.find(rel)))))
153
+ end
154
+
155
+ end
156
+ end
157
+ end