forcast 0.0.110
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +1 -0
- data/COPYRIGHTS +11 -0
- data/Gemfile +22 -0
- data/Gemfile.lock +166 -0
- data/PENDIENTES +39 -0
- data/README.md +35 -0
- data/Rakefile +7 -0
- data/VERSION +1 -0
- data/bin/console +14 -0
- data/bin/rake +28 -0
- data/bin/setup +8 -0
- data/forcast.gemspec +73 -0
- data/lib/forcast.rb +5 -0
- data/lib/forcast/controllers/all.rb +2 -0
- data/lib/forcast/controllers/application/all.rb +12 -0
- data/lib/forcast/controllers/application/crud.rb +91 -0
- data/lib/forcast/controllers/application/database.rb +34 -0
- data/lib/forcast/controllers/application/error.rb +18 -0
- data/lib/forcast/controllers/application/exception_handler.rb +25 -0
- data/lib/forcast/controllers/application/json.rb +83 -0
- data/lib/forcast/controllers/application/locale.rb +30 -0
- data/lib/forcast/controllers/application/log.rb +22 -0
- data/lib/forcast/controllers/application/login.rb +41 -0
- data/lib/forcast/controllers/application/meta.rb +61 -0
- data/lib/forcast/controllers/application/model.rb +17 -0
- data/lib/forcast/controllers/application/permitirtodo.rb +27 -0
- data/lib/forcast/controllers/application/utils.rb +28 -0
- data/lib/forcast/controllers/controller/all.rb +8 -0
- data/lib/forcast/controllers/controller/asociar.rb +121 -0
- data/lib/forcast/controllers/controller/busqueda.rb +151 -0
- data/lib/forcast/controllers/controller/definitor/definitor.rb +322 -0
- data/lib/forcast/controllers/controller/definitor/definitor_page.rb +40 -0
- data/lib/forcast/controllers/controller/definitor_all.rb +2 -0
- data/lib/forcast/controllers/controller/filtro.rb +48 -0
- data/lib/forcast/controllers/controller/login/controllers/base_controller.rb +135 -0
- data/lib/forcast/controllers/controller/login/controllers/login_controller.rb +38 -0
- data/lib/forcast/controllers/controller/login/login.rb +71 -0
- data/lib/forcast/controllers/controller/login_all.rb +1 -0
- data/lib/forcast/controllers/controller/paper_trail/paper_trail.rb +21 -0
- data/lib/forcast/controllers/controller/paper_trail_all.rb +1 -0
- data/lib/forcast/controllers/controller/relacion.rb +157 -0
- data/lib/forcast/controllers/controller/rule_engine/action_engine.rb +92 -0
- data/lib/forcast/controllers/controller/rule_engine/controllers/action_logs_controller.rb +12 -0
- data/lib/forcast/controllers/controller/rule_engine/controllers/actions_controller.rb +10 -0
- data/lib/forcast/controllers/controller/rule_engine/controllers/pollings_controller.rb +13 -0
- data/lib/forcast/controllers/controller/rule_engine/controllers/rule_logs_controller.rb +12 -0
- data/lib/forcast/controllers/controller/rule_engine/controllers/rules_controller.rb +19 -0
- data/lib/forcast/controllers/controller/rule_engine/controllers/webhooks_controller.rb +27 -0
- data/lib/forcast/controllers/controller/rule_engine/polling_engine.rb +76 -0
- data/lib/forcast/controllers/controller/rule_engine/rule_controller.rb +27 -0
- data/lib/forcast/controllers/controller/rule_engine/rule_engine.rb +88 -0
- data/lib/forcast/controllers/controller/rule_engine/webhook_engine.rb +38 -0
- data/lib/forcast/controllers/controller/rule_engine_all.rb +5 -0
- data/lib/forcast/jobs/all.rb +2 -0
- data/lib/forcast/jobs/jobs_assets.rb +25 -0
- data/lib/forcast/jobs/jobs_wrapper.rb +25 -0
- data/lib/forcast/jobs/rule_engine/jobs_actions.rb +73 -0
- data/lib/forcast/jobs/rule_engine/jobs_pollings.rb +77 -0
- data/lib/forcast/jobs/rule_engine/jobs_webhooks.rb +54 -0
- data/lib/forcast/migrations/0_migracion_general.rb +44 -0
- data/lib/forcast/migrations/paper_trail/versions.rb +61 -0
- data/lib/forcast/migrations/rule_engine/action_logs.rb +15 -0
- data/lib/forcast/migrations/rule_engine/actions.rb +15 -0
- data/lib/forcast/migrations/rule_engine/pollings.rb +26 -0
- data/lib/forcast/migrations/rule_engine/rule_logs.rb +22 -0
- data/lib/forcast/migrations/rule_engine/rules.rb +27 -0
- data/lib/forcast/migrations/rule_engine/webhooks.rb +25 -0
- data/lib/forcast/models/all.rb +8 -0
- data/lib/forcast/models/asociar.rb +74 -0
- data/lib/forcast/models/busqueda.rb +17 -0
- data/lib/forcast/models/login/authorization.rb +37 -0
- data/lib/forcast/models/login/json_web_token.rb +15 -0
- data/lib/forcast/models/login/login.rb +26 -0
- data/lib/forcast/models/login_all.rb +2 -0
- data/lib/forcast/models/meta.rb +19 -0
- data/lib/forcast/models/modelo.rb +125 -0
- data/lib/forcast/models/models/meta.rb +6 -0
- data/lib/forcast/models/paper_trail/paper_trail.rb +13 -0
- data/lib/forcast/models/paper_trail_all.rb +1 -0
- data/lib/forcast/models/permitirtodo.rb +57 -0
- data/lib/forcast/models/rule_engine/action_engine.rb +19 -0
- data/lib/forcast/models/rule_engine/models/action.rb +41 -0
- data/lib/forcast/models/rule_engine/models/action_log.rb +40 -0
- data/lib/forcast/models/rule_engine/models/polling.rb +43 -0
- data/lib/forcast/models/rule_engine/models/rule.rb +44 -0
- data/lib/forcast/models/rule_engine/models/rule_log.rb +39 -0
- data/lib/forcast/models/rule_engine/models/webhook.rb +43 -0
- data/lib/forcast/models/rule_engine/polling_engine.rb +113 -0
- data/lib/forcast/models/rule_engine/rule.rb +62 -0
- data/lib/forcast/models/rule_engine/rule_engine.rb +137 -0
- data/lib/forcast/models/rule_engine/rule_scope.rb +35 -0
- data/lib/forcast/models/rule_engine/webhook_engine.rb +55 -0
- data/lib/forcast/models/rule_engine_all.rb +6 -0
- data/lib/forcast/routes/concerns/asociar.rb +15 -0
- data/lib/forcast/routes/concerns/buscar.rb +6 -0
- data/lib/forcast/routes/concerns/definitor.rb +3 -0
- data/lib/forcast/routes/concerns/modelo.rb +6 -0
- data/lib/forcast/routes/database.rb +4 -0
- data/lib/forcast/routes/login.rb +4 -0
- data/lib/forcast/routes/paper_trail/paper_trail.rb +3 -0
- data/lib/forcast/routes/rule_engine/rule.rb +5 -0
- data/lib/forcast/tasks/.giosaveZr0hbs +21 -0
- data/lib/forcast/tasks/.keep +0 -0
- data/lib/forcast/tasks/all.rb +16 -0
- data/lib/forcast/tasks/diagramas.rake +32 -0
- data/lib/forcast/tasks/documentation/documentation.rb +100 -0
- data/lib/forcast/tasks/env.rake +10 -0
- data/lib/forcast/tasks/git.rake +22 -0
- data/lib/forcast/tasks/indy/indy.rb +28 -0
- data/lib/forcast/tasks/logs.rake +13 -0
- data/lib/forcast/tasks/process.rake +18 -0
- data/lib/forcast/tasks/schema.rake +17 -0
- data/lib/forcast/tasks/schema/recips/action.rb +18 -0
- data/lib/forcast/tasks/schema/recips/controller.rb +29 -0
- data/lib/forcast/tasks/schema/recips/definitor.rb +38 -0
- data/lib/forcast/tasks/schema/recips/model.rb +43 -0
- data/lib/forcast/tasks/schema/recips/project.rb +19 -0
- data/lib/forcast/tasks/schema/recips/route.rb +9 -0
- data/lib/forcast/tasks/schema/recips/tmp/controller.rb +0 -0
- data/lib/forcast/tasks/schema/recips/tmp/model.rb +0 -0
- data/lib/forcast/tasks/schema/recips/tmp/model/.keep +0 -0
- data/lib/forcast/tasks/schema/rule_engine/rule_engine.rb +98 -0
- data/lib/forcast/tasks/schema/schema.rb +346 -0
- data/lib/forcast/tasks/test.rake +129 -0
- data/lib/forcast/tasks/utils.rake +68 -0
- data/lib/forcast/tasks/yard.rake +18 -0
- data/lib/forcast/utils/all.rb +4 -0
- data/lib/forcast/utils/email.rb +49 -0
- data/lib/forcast/utils/email/forcast/utils/email/layout/default.html.erb +3 -0
- data/lib/forcast/utils/email/forcast/utils/email/layout/default.text.erb +5 -0
- data/lib/forcast/utils/firebase.rb +60 -0
- data/lib/forcast/utils/firebase_database.rb +117 -0
- data/lib/forcast/utils/measure.rb +44 -0
- data/lib/forcast/utils/qvo.rb +141 -0
- data/lib/forcast/utils/server.rb +296 -0
- data/lib/forcast/utils/telegram.rb +82 -0
- data/lib/forcast/utils/thing.rb +180 -0
- data/lib/forcast/version.rb +15 -0
- data/lib/lib/backup.rb +42 -0
- data/lib/lib/deploy.sh +40 -0
- data/lib/lib/forcast_servidor_rails.sh +11 -0
- data/lib/lib/pg_generator.sh +10 -0
- data/lib/lib/production.rb +66 -0
- data/lib/lib/production/production.rb +30 -0
- data/lib/lib/systemctl_maker.rb +88 -0
- data/lib/lib/update.rb +100 -0
- data/production.rb +31 -0
- 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
|