forcast 0.0.110

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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