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,41 @@
1
+ class Action < ApplicationRecord
2
+ belongs_to :rule
3
+ has_many :action_log
4
+ include Forcast::Model::Modelo
5
+ include Forcast::Model::Permitirtodo
6
+ include Forcast::Model::RuleEngine::ActionEngine
7
+ def init(params)
8
+ #self.password=(params['password_hash'])
9
+ end
10
+
11
+ def self.parametros_necesario_create
12
+ array = []
13
+ return array
14
+ end
15
+
16
+ def self.parametros_a_validar_modelo_create
17
+ #return parametros_a_validar_modelo_create = [{:param => 'tipo_valor', :validacion => 'validaciones_tipo_valor', :error => :bad_param_not_allow_type}]
18
+ return parametros_a_validar_modelo_create = []
19
+ end
20
+
21
+ def self.parametros_a_validar_modelo_update
22
+ #return parametros_a_validar_modelo_update = [{:param => 'tipo_valor', :validacion => 'validaciones_tipo_valor', :error => :bad_param_not_allow_type}]
23
+ return parametros_a_validar_modelo_update = []
24
+ end
25
+
26
+ def self.parametros_permitido_asociar
27
+ return parametros_permitido_asociar = []
28
+ end
29
+
30
+ def self.parametros_a_comprobar_si_existen_create
31
+ return parametros_a_comprobar_si_existen_create = []
32
+ end
33
+
34
+ def self.parametros_a_comprobar_si_existen_update
35
+ return parametros_a_comprobar_si_existen_update = []
36
+ end
37
+ # def self.validaciones_tipo_valor(valor)
38
+ # return true unless ['string','integer','decimal'].include?(valor)
39
+ # end
40
+ end
41
+
@@ -0,0 +1,40 @@
1
+ class ActionLog < ApplicationRecord
2
+ belongs_to :action
3
+ include Forcast::Model::Modelo
4
+ include Forcast::Model::Permitirtodo
5
+ def init(params)
6
+ #self.password=(params['password_hash'])
7
+ end
8
+
9
+ def self.parametros_necesario_create
10
+ array = []
11
+ return array
12
+ end
13
+
14
+ def self.parametros_a_validar_modelo_create
15
+ #return parametros_a_validar_modelo_create = [{:param => 'tipo_valor', :validacion => 'validaciones_tipo_valor', :error => :bad_param_not_allow_type}]
16
+ return parametros_a_validar_modelo_create = []
17
+ end
18
+
19
+ def self.parametros_a_validar_modelo_update
20
+ #return parametros_a_validar_modelo_update = [{:param => 'tipo_valor', :validacion => 'validaciones_tipo_valor', :error => :bad_param_not_allow_type}]
21
+ return parametros_a_validar_modelo_update = []
22
+ end
23
+
24
+ def self.parametros_permitido_asociar
25
+ return parametros_permitido_asociar = []
26
+ end
27
+
28
+ def self.parametros_a_comprobar_si_existen_create
29
+ return parametros_a_comprobar_si_existen_create = []
30
+ end
31
+
32
+ def self.parametros_a_comprobar_si_existen_update
33
+ return parametros_a_comprobar_si_existen_update = []
34
+ end
35
+ # def self.validaciones_tipo_valor(valor)
36
+ # return true unless ['string','integer','decimal'].include?(valor)
37
+ # end
38
+
39
+ end
40
+
@@ -0,0 +1,43 @@
1
+ class Polling < ApplicationRecord
2
+
3
+ belongs_to :rule
4
+ include Forcast::Model::Modelo
5
+ include Forcast::Model::Permitirtodo
6
+ include Forcast::Model::RuleEngine::PollingEngine
7
+
8
+ def init(params)
9
+ #self.password=(params['password_hash'])
10
+ end
11
+
12
+ def self.parametros_necesario_create
13
+ array = []
14
+ return array
15
+ end
16
+
17
+ def self.parametros_a_validar_modelo_create
18
+ #return parametros_a_validar_modelo_create = [{:param => 'tipo_valor', :validacion => 'validaciones_tipo_valor', :error => :bad_param_not_allow_type}]
19
+ return parametros_a_validar_modelo_create = []
20
+ end
21
+
22
+ def self.parametros_a_validar_modelo_update
23
+ #return parametros_a_validar_modelo_update = [{:param => 'tipo_valor', :validacion => 'validaciones_tipo_valor', :error => :bad_param_not_allow_type}]
24
+ return parametros_a_validar_modelo_update = []
25
+ end
26
+
27
+ def self.parametros_permitido_asociar
28
+ return parametros_permitido_asociar = []
29
+ end
30
+
31
+ def self.parametros_a_comprobar_si_existen_create
32
+ return parametros_a_comprobar_si_existen_create = []
33
+ end
34
+
35
+ def self.parametros_a_comprobar_si_existen_update
36
+ return parametros_a_comprobar_si_existen_update = []
37
+ end
38
+ # def self.validaciones_tipo_valor(valor)
39
+ # return true unless ['string','integer','decimal'].include?(valor)
40
+ # end
41
+
42
+ end
43
+
@@ -0,0 +1,44 @@
1
+ class Rule < ApplicationRecord
2
+ has_many :webhook
3
+ has_many :polling
4
+ has_many :action
5
+ has_many :rule_log
6
+ include Forcast::Model::Modelo
7
+ include Forcast::Model::Permitirtodo
8
+ include Forcast::Model::RuleEngine::RuleScope
9
+ include Forcast::Model::RuleEngine::RuleEngine
10
+
11
+ def init(params)
12
+ # self.password=(params['password_hash'])
13
+ end
14
+
15
+ def self.parametros_necesario_create
16
+ []
17
+ end
18
+
19
+ def self.parametros_a_validar_modelo_create
20
+ # [{:param => 'tipo_valor', :validacion => 'validaciones_tipo_valor', :error => :bad_param_not_allow_type}]
21
+ []
22
+ end
23
+
24
+ def self.parametros_a_validar_modelo_update
25
+ # [{:param => 'tipo_valor', :validacion => 'validaciones_tipo_valor', :error => :bad_param_not_allow_type}]
26
+ []
27
+ end
28
+
29
+ def self.parametros_permitido_asociar
30
+ []
31
+ end
32
+
33
+ def self.parametros_a_comprobar_si_existen_create
34
+ []
35
+ end
36
+
37
+ def self.parametros_a_comprobar_si_existen_update
38
+ []
39
+ end
40
+
41
+ # def self.validaciones_tipo_valor(valor)
42
+ # return true unless ['string','integer','decimal'].include?(valor)
43
+ # end
44
+ end
@@ -0,0 +1,39 @@
1
+ class RuleLog < ApplicationRecord
2
+ belongs_to :rule
3
+ include Forcast::Model::Modelo
4
+ include Forcast::Model::Permitirtodo
5
+ def init(params)
6
+ #self.password=(params['password_hash'])
7
+ end
8
+
9
+ def self.parametros_necesario_create
10
+ array = []
11
+ return array
12
+ end
13
+
14
+ def self.parametros_a_validar_modelo_create
15
+ #return parametros_a_validar_modelo_create = [{:param => 'tipo_valor', :validacion => 'validaciones_tipo_valor', :error => :bad_param_not_allow_type}]
16
+ return parametros_a_validar_modelo_create = []
17
+ end
18
+
19
+ def self.parametros_a_validar_modelo_update
20
+ #return parametros_a_validar_modelo_update = [{:param => 'tipo_valor', :validacion => 'validaciones_tipo_valor', :error => :bad_param_not_allow_type}]
21
+ return parametros_a_validar_modelo_update = []
22
+ end
23
+
24
+ def self.parametros_permitido_asociar
25
+ return parametros_permitido_asociar = []
26
+ end
27
+
28
+ def self.parametros_a_comprobar_si_existen_create
29
+ return parametros_a_comprobar_si_existen_create = []
30
+ end
31
+
32
+ def self.parametros_a_comprobar_si_existen_update
33
+ return parametros_a_comprobar_si_existen_update = []
34
+ end
35
+ # def self.validaciones_tipo_valor(valor)
36
+ # return true unless ['string','integer','decimal'].include?(valor)
37
+ # end
38
+ end
39
+
@@ -0,0 +1,43 @@
1
+ class Webhook < ApplicationRecord
2
+
3
+ belongs_to :rule
4
+ include Forcast::Model::Modelo
5
+ include Forcast::Model::Permitirtodo
6
+ include Forcast::Model::RuleEngine::WebhookEngine
7
+
8
+ def init(params)
9
+ #self.password=(params['password_hash'])
10
+ end
11
+
12
+ def self.parametros_necesario_create
13
+ array = []
14
+ return array
15
+ end
16
+
17
+ def self.parametros_a_validar_modelo_create
18
+ #return parametros_a_validar_modelo_create = [{:param => 'tipo_valor', :validacion => 'validaciones_tipo_valor', :error => :bad_param_not_allow_type}]
19
+ return parametros_a_validar_modelo_create = []
20
+ end
21
+
22
+ def self.parametros_a_validar_modelo_update
23
+ #return parametros_a_validar_modelo_update = [{:param => 'tipo_valor', :validacion => 'validaciones_tipo_valor', :error => :bad_param_not_allow_type}]
24
+ return parametros_a_validar_modelo_update = []
25
+ end
26
+
27
+ def self.parametros_permitido_asociar
28
+ return parametros_permitido_asociar = []
29
+ end
30
+
31
+ def self.parametros_a_comprobar_si_existen_create
32
+ return parametros_a_comprobar_si_existen_create = []
33
+ end
34
+
35
+ def self.parametros_a_comprobar_si_existen_update
36
+ return parametros_a_comprobar_si_existen_update = []
37
+ end
38
+ # def self.validaciones_tipo_valor(valor)
39
+ # return true unless ['string','integer','decimal'].include?(valor)
40
+ # end
41
+
42
+ end
43
+
@@ -0,0 +1,113 @@
1
+ require 'active_support'
2
+ module Forcast
3
+ module Model
4
+ module RuleEngine
5
+ module PollingEngine
6
+ extend ActiveSupport::Concern
7
+ included do
8
+ def self.duplicate_object?(object)
9
+ return self.exists?(object)
10
+ end
11
+
12
+ def self.validate_if_work_exists_to_polling(args={})
13
+ found_work = logic_work_polling(args[:polling_model],args[:polling_model_id])
14
+ if found_work
15
+ puts "Work already exists"
16
+ else
17
+ puts "Push Work"
18
+ add_worker_to_polling(args)
19
+ end
20
+ end
21
+
22
+ def self.add_worker_to_polling(args={})
23
+ JobsPollings::AddModelPolling.perform_async(args)
24
+ end
25
+
26
+ def self.logic_work_polling(polling_model,polling_model_id)
27
+ work = 'JobsPollings::ValidateModelPolling'
28
+ scheduled = Sidekiq::ScheduledSet.new
29
+ scheduled_jobs = scheduled.select {|job| job.klass == work}
30
+ queue = Sidekiq::Queue.new("polling_queue")
31
+ queue_jobs = queue.select {|job| job.klass == work}
32
+ jobs = scheduled_jobs + queue_jobs
33
+ regulate_works_logic_from_pollings_actives(jobs,polling_model,polling_model_id)
34
+ end
35
+
36
+ def self.regulate_works_logic_from_pollings_actives(jobs,polling_model,polling_model_id)
37
+ found_works = jobs.select {|job| job.args[0]["polling_model"]==polling_model&&job.args[0]["polling_model_id"]==polling_model_id}
38
+ if found_works.length > 0
39
+ puts "[polling] Work found "+found_works[0].args.to_s
40
+ return true
41
+ elsif found_works.length > 1
42
+ puts "[polling] Deleting another work found "+found_works[1].args.to_s
43
+ found_works[1].delete
44
+ return true
45
+ else
46
+ puts "[polling] Work not found "+polling_model.to_s+" "+polling_model_id.to_s
47
+ return false
48
+ end
49
+ end
50
+ end
51
+
52
+ def validate_execute_time
53
+ puts "validate_execute_time"
54
+ execution_time = self.review_time
55
+ execution_time ||= 30
56
+ last_execution = self.last_execution
57
+ testing_time = last_execution + execution_time.second
58
+ if testing_time.to_i > Time.now.to_i
59
+ puts "It should not be executed"
60
+ self.update_columns(:execute? => false)
61
+ return false
62
+ else
63
+ puts "Must be executed"
64
+ self.update_columns(:last_execution => Time.now,
65
+ :execute? => true)
66
+ return true
67
+ end
68
+
69
+ end
70
+
71
+ def validate_duration_time
72
+ puts "validate_duration_time"
73
+ polling_duration_time = self.duration_time
74
+ polling_duration_time ||= 1
75
+ testing_time = self.created_at + polling_duration_time.minutes
76
+ if testing_time.to_i < Time.now.to_i
77
+ self.update_columns(:active? => false)
78
+ puts "Duration period expire"
79
+ return false
80
+ else
81
+ puts "Duration period still active"
82
+ return true
83
+ end
84
+ end
85
+
86
+ def validate_send_time
87
+ puts "validate_send_time"
88
+ send_time = self.send_time
89
+ send_time ||= 30
90
+ last_review_send = self.last_review_send
91
+ last_review_send ||= Time.now
92
+ testing_time = last_review_send + send_time.second
93
+ remain = testing_time.to_i - Time.now.to_i
94
+ if testing_time.to_i > Time.now.to_i
95
+ puts "Dont send yet, remains #{remain} seconds"
96
+ self.update_columns( :last_review_send => Time.now,
97
+ :send? => false)
98
+ return false
99
+ else
100
+ puts "Send now"
101
+ self.update_columns(:last_send => Time.now,
102
+ :send? => true)
103
+ return true
104
+ end
105
+
106
+ end
107
+
108
+ end
109
+ end
110
+ end
111
+ end
112
+
113
+
@@ -0,0 +1,62 @@
1
+ module Forcast
2
+ module Model
3
+ module RuleEngine
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ after_create :send_webhook_create
8
+ after_update :send_webhook_update
9
+ after_destroy :send_webhook_destroy
10
+ end
11
+
12
+ def class_polling
13
+ Polling.where(polling_model: self.class.name, class_polling?: true)
14
+ end
15
+
16
+ def class_rule
17
+ Rule.for_class(self.class.name)
18
+ end
19
+
20
+ def webhook
21
+ Webhook.joins(:rule).merge(rule)
22
+ end
23
+
24
+ def object_webhook
25
+ Webhook.joins(:rule).merge(Rule.for_object(self))
26
+ end
27
+
28
+ def polling
29
+ Polling.where(polling_model: self.class.name, polling_model_id: id)
30
+ end
31
+
32
+ def rule
33
+ Rule.for_object_and_class(self)
34
+ end
35
+
36
+ def send_webhook_create
37
+ puts 'send_webhook_create'
38
+ end
39
+
40
+ def send_webhook_destroy
41
+ puts 'send_webhook_destroy'
42
+ end
43
+
44
+ def send_webhook_update
45
+ puts 'send_webhook_update'
46
+ JobsWebhooks::ValidateModelWebhook.perform_later(
47
+ webhook_model: self.class.name,
48
+ webhook_model_id: id,
49
+ changed_attrs_json: saved_changes.to_json,
50
+ created_at: Time.now.to_s
51
+ )
52
+ end
53
+
54
+ def currents_pollings
55
+ arr1 = polling.where(created_at: 4.week.ago.beginning_of_day..Time.now)
56
+ .where(active?: true)
57
+ arr2 = class_polling.where(active?: true)
58
+ arr2 + arr1
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,137 @@
1
+ require 'active_support'
2
+ module Forcast
3
+ module Model
4
+ module RuleEngine
5
+ module RuleEngine
6
+ extend ActiveSupport::Concern
7
+
8
+ RULE_VALUES_MAP = {
9
+ string: :value_s,
10
+ integer: :value_i,
11
+ decimal: :value_d,
12
+ boolean: :value_b,
13
+ datetime: :value_t
14
+ }.freeze
15
+
16
+ VALID_RULE_COMPARATORS_MAP = {
17
+ string: %w[eql? ==],
18
+ integer: %w[eql? > >= < <= ==],
19
+ decimal: %w[eql? > >= < <= ==],
20
+ boolean: %w[eql? ==],
21
+ datetime: %w[eql? > >= < <= ==]
22
+ }.freeze
23
+
24
+ class_methods do
25
+ def validate_logic_rule(rule, value1, value2)
26
+ return false unless value1
27
+
28
+ value1.send(rule.to_s, value2)
29
+ end
30
+
31
+ def logical_calculation(arr, op)
32
+ case op
33
+ when 'and' then arr.reduce(:&)
34
+ when 'or' then arr.reduce(:|)
35
+ else
36
+ false
37
+ end
38
+ end
39
+
40
+ def rule_value(rule_class)
41
+ RULE_VALUES_MAP[rule_class.to_sym]&.to_s || 'value_s'
42
+ end
43
+
44
+ def validate_rule_and_class(rule, rule_class, params)
45
+ return false unless RULE_VALUES_MAP[rule_class.to_sym].present?
46
+
47
+ value_name = RULE_VALUES_MAP[rule_class.to_sym]
48
+ params[value_name] =
49
+ case rule_class
50
+ when 'string' then params[:value].to_s
51
+ when 'integer' then params[:value].to_i
52
+ when 'decimal' then params[:value].to_f
53
+ when 'boolean' then params[:value]
54
+ when 'datetime' then params[:value].to_date
55
+ end
56
+
57
+ VALID_RULE_COMPARATORS_MAP[rule_class.to_sym].include?(rule)
58
+ end
59
+
60
+ def validate_class_update(rule_class)
61
+ RULE_VALUES_MAP[rule_class.to_sym]&.to_s || false
62
+ end
63
+
64
+ def rules_allowed
65
+ VALID_RULE_COMPARATORS_MAP.values.flatten.uniq
66
+ end
67
+
68
+ def rules_type_allowed
69
+ %w[logic change]
70
+ end
71
+
72
+ def rules_class_allowed
73
+ RULE_VALUES_MAP.keys.map(&:to_s)
74
+ end
75
+
76
+ def valid_combine_type
77
+ %w[and or]
78
+ end
79
+
80
+ def validate_rule_duplicate(hash_new)
81
+ if hash_new
82
+ !Rule.exists?(hash_new)
83
+ else
84
+ !Rule.exists?(attr_comparable: @attr_comparable,
85
+ rule_model: @rule_model,
86
+ rule_model_id: @rule_model_id,
87
+ rule: @rule,
88
+ rule_class: @rule_class,
89
+ rule_type: @rule_type,
90
+ combine_type: @combine_type)
91
+ end
92
+ end
93
+
94
+ def validate_model_id(rule_model, rule_model_id)
95
+ rule_model.classify.constantize.find(rule_model_id)
96
+ end
97
+
98
+ def validate_attr_model(rule_model,attribute)
99
+ rule_model = rule_model.classify.constantize
100
+ return false unless rule_model.column_names.include?(attribute)
101
+
102
+ @rule_class = rule_model.columns_hash[attribute.to_s].type.to_s
103
+ end
104
+ end
105
+
106
+ def validate_logic(object)
107
+ attr_comparable = self.attr_comparable
108
+ case rule_type
109
+ when 'logic'
110
+ value_attr_comparable = object.send(attr_comparable.to_s)
111
+ value_type = Rule.rule_value(rule_class)
112
+ value_comparable = send(value_type)
113
+ puts "Attr Value: #{value_attr_comparable}"
114
+ puts "Rule Value: #{value_comparable}"
115
+ validation = Rule.validate_logic_rule(rule, value_attr_comparable, value_comparable)
116
+ when 'change'
117
+ value_attr_comparable = object.send(attr_comparable.to_s)
118
+ last_value_attr_comparable = self.last_value_attr_comparable
119
+ validation = !Rule.validate_logic_rule('eql?', value_attr_comparable, last_value_attr_comparable)
120
+ update_columns(last_value_attr_comparable: value_attr_comparable)
121
+ when 'logic_comparable'
122
+ rules_to = Rule.where(id: rule.split(',').map(&:to_i))
123
+ boolean_array = []
124
+ rules_to.each do |rule_to|
125
+ boolean_array.push(validate_logic(object,rule_to))
126
+ end
127
+ validation = Rule.logical_calculation(boolean_array, combine_type)
128
+ else
129
+ validation = false
130
+ end
131
+ validation
132
+ end
133
+
134
+ end
135
+ end
136
+ end
137
+ end