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,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