From ad974d2d2e3bf4e5493876b63b9a04c0f9a1cd40 Mon Sep 17 00:00:00 2001 From: Matt Date: Fri, 15 Nov 2024 14:46:46 +0100 Subject: [PATCH 1/7] fix: check the role provided into the condition for smartaction --- .../forest_admin_agent/services/smart_action_checker.rb | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/forest_admin_agent/lib/forest_admin_agent/services/smart_action_checker.rb b/packages/forest_admin_agent/lib/forest_admin_agent/services/smart_action_checker.rb index d7ec0c2c4..07143e16e 100644 --- a/packages/forest_admin_agent/lib/forest_admin_agent/services/smart_action_checker.rb +++ b/packages/forest_admin_agent/lib/forest_admin_agent/services/smart_action_checker.rb @@ -50,7 +50,8 @@ def can_trigger? if smart_action[:triggerEnabled].include?(role_id) && !smart_action[:approvalRequired].include?(role_id) return true if smart_action[:triggerConditions].empty? || match_conditions(:triggerConditions) elsif smart_action[:approvalRequired].include?(role_id) && smart_action[:triggerEnabled].include?(role_id) - if smart_action[:approvalRequiredConditions].empty? || match_conditions(:approvalRequiredConditions) + approval_condition = smart_action[:approvalRequiredConditions].find { |c| c['roleId'] } + if approval_condition.blank? || match_conditions(:approvalRequiredConditions) raise RequireApproval.new( 'This action requires to be approved.', REQUIRE_APPROVAL_ERROR, @@ -71,11 +72,11 @@ def match_conditions(condition_name) else Nodes::ConditionTreeLeaf.new(pk, 'IN', attributes[:ids]) end - condition = smart_action[condition_name][0][:filter] + condition = smart_action[condition_name].find { |c| c['roleId'] == @role_id } conditional_filter = filter.override( condition_tree: ConditionTreeFactory.intersect( [ - ConditionTreeParser.from_plain_object(collection, condition), + ConditionTreeParser.from_plain_object(collection, condition[:filter]), filter.condition_tree, condition_filter ] From eaf244546683d74c3979067cb19cc3f5e871bc23 Mon Sep 17 00:00:00 2001 From: Matt Date: Mon, 18 Nov 2024 10:11:04 +0100 Subject: [PATCH 2/7] fix: condition can_approve --- .rubocop.yml | 1 + .../services/smart_action_checker.rb | 11 +++++++---- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index 70668f85b..6d31cc6bb 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -286,6 +286,7 @@ Layout/LineLength: - 'packages/forest_admin_agent/lib/forest_admin_agent/http/forest_admin_api_requester.rb' - 'packages/forest_admin_agent/lib/forest_admin_agent/routes/resources/list.rb' - 'packages/forest_admin_agent/lib/forest_admin_agent/services/permissions.rb' + - 'packages/forest_admin_agent/lib/forest_admin_agent/services/smart_action_checker.rb' - 'packages/forest_admin_datasource_customizer/lib/forest_admin_datasource_customizer/decorators/action/form_layout_element.rb' - 'packages/forest_admin_datasource_customizer/lib/forest_admin_datasource_customizer/decorators/override/context/create_override_customization_context.rb' - 'packages/forest_admin_datasource_customizer/lib/forest_admin_datasource_customizer/decorators/override/context/update_override_customization_context.rb' diff --git a/packages/forest_admin_agent/lib/forest_admin_agent/services/smart_action_checker.rb b/packages/forest_admin_agent/lib/forest_admin_agent/services/smart_action_checker.rb index 07143e16e..b1331c856 100644 --- a/packages/forest_admin_agent/lib/forest_admin_agent/services/smart_action_checker.rb +++ b/packages/forest_admin_agent/lib/forest_admin_agent/services/smart_action_checker.rb @@ -37,7 +37,7 @@ def can_execute? def can_approve? if smart_action[:userApprovalEnabled].include?(role_id) && - (smart_action[:userApprovalConditions].empty? || match_conditions(:userApprovalConditions)) && + (condition_by_role_id(smart_action[:userApprovalConditions]).blank? || match_conditions(:userApprovalConditions)) && (attributes[:signed_approval_request][:data][:attributes][:requester_id] != caller.id || smart_action[:selfApprovalEnabled].include?(role_id)) return true @@ -50,8 +50,7 @@ def can_trigger? if smart_action[:triggerEnabled].include?(role_id) && !smart_action[:approvalRequired].include?(role_id) return true if smart_action[:triggerConditions].empty? || match_conditions(:triggerConditions) elsif smart_action[:approvalRequired].include?(role_id) && smart_action[:triggerEnabled].include?(role_id) - approval_condition = smart_action[:approvalRequiredConditions].find { |c| c['roleId'] } - if approval_condition.blank? || match_conditions(:approvalRequiredConditions) + if condition_by_role_id(smart_action[:approvalRequiredConditions]).blank? || match_conditions(:approvalRequiredConditions) raise RequireApproval.new( 'This action requires to be approved.', REQUIRE_APPROVAL_ERROR, @@ -72,7 +71,7 @@ def match_conditions(condition_name) else Nodes::ConditionTreeLeaf.new(pk, 'IN', attributes[:ids]) end - condition = smart_action[condition_name].find { |c| c['roleId'] == @role_id } + condition = condition_by_role_id(smart_action[condition_name]) conditional_filter = filter.override( condition_tree: ConditionTreeFactory.intersect( [ @@ -91,6 +90,10 @@ def match_conditions(condition_name) INVALID_ACTION_CONDITION_ERROR ) end + + def condition_by_role_id(condition) + condition.find { |c| c['roleId'] == role_id } + end end end end From 277137cb19994570a5b4c24fb7b2a83f8404cd0f Mon Sep 17 00:00:00 2001 From: Matt Date: Mon, 18 Nov 2024 10:22:36 +0100 Subject: [PATCH 3/7] chore: lint --- .../components/query/aggregation.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/forest_admin_datasource_toolkit/lib/forest_admin_datasource_toolkit/components/query/aggregation.rb b/packages/forest_admin_datasource_toolkit/lib/forest_admin_datasource_toolkit/components/query/aggregation.rb index 0d12b5441..30cf67ace 100644 --- a/packages/forest_admin_datasource_toolkit/lib/forest_admin_datasource_toolkit/components/query/aggregation.rb +++ b/packages/forest_admin_datasource_toolkit/lib/forest_admin_datasource_toolkit/components/query/aggregation.rb @@ -46,7 +46,7 @@ def replace_fields end def override(**args) - Aggregation.new(**to_h.merge(args)) + Aggregation.new(**to_h, **args) end def apply(records, timezone, limit = nil) From 74ce0251ac65abee6d0172162754d3b36a25eb81 Mon Sep 17 00:00:00 2001 From: Matt Date: Mon, 18 Nov 2024 10:23:58 +0100 Subject: [PATCH 4/7] chore: lint --- .../forest_admin_agent/builder/agent_factory.rb | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/packages/forest_admin_agent/lib/forest_admin_agent/builder/agent_factory.rb b/packages/forest_admin_agent/lib/forest_admin_agent/builder/agent_factory.rb index 4e32b2940..ef5a86172 100644 --- a/packages/forest_admin_agent/lib/forest_admin_agent/builder/agent_factory.rb +++ b/packages/forest_admin_agent/lib/forest_admin_agent/builder/agent_factory.rb @@ -80,13 +80,10 @@ def build_cache return unless @has_env_secret cache = @container.resolve(:cache) - @options[:customize_error_message] = @options[:customize_error_message] - &.source - &.strip - &.delete_prefix('config.customize_error_message =') - &.strip - @options[:logger] = @options[:logger]&.source&.strip&.delete_prefix('config.logger =')&.strip + @options[:customize_error_message] = + clean_option_value(@options[:customize_error_message], 'config.customize_error_message =') + @options[:logger] = clean_option_value(@options[:logger], 'config.logger =') cache.set('config', @options.to_h) end @@ -95,6 +92,14 @@ def build_logger @logger = Services::LoggerService.new(@options[:loggerLevel], @options[:logger]) @container.register(:logger, @logger) end + + def clean_option_value(option, prefix) + return unless option + + source = option.source + cleaned_option = source&.strip if source + cleaned_option&.delete_prefix(prefix)&.strip + end end end end From 81116c2429059005516723b023072868a7c3f2cb Mon Sep 17 00:00:00 2001 From: Matt Date: Mon, 18 Nov 2024 10:38:50 +0100 Subject: [PATCH 5/7] chore: update gemfile --- packages/forest_admin_datasource_active_record/Gemfile | 2 +- packages/forest_admin_datasource_active_record/Gemfile-test | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/forest_admin_datasource_active_record/Gemfile b/packages/forest_admin_datasource_active_record/Gemfile index d3cfa3f4b..fcb660e5c 100644 --- a/packages/forest_admin_datasource_active_record/Gemfile +++ b/packages/forest_admin_datasource_active_record/Gemfile @@ -14,5 +14,5 @@ group :development, :test do gem 'simplecov', '~> 0.22', require: false gem 'simplecov-html', '~> 0.12.3' gem 'simplecov_json_formatter', '~> 0.1.4' - gem 'sqlite3', '< 2.0' + gem 'sqlite3' end diff --git a/packages/forest_admin_datasource_active_record/Gemfile-test b/packages/forest_admin_datasource_active_record/Gemfile-test index b9c9ef8bd..b9c65ad44 100644 --- a/packages/forest_admin_datasource_active_record/Gemfile-test +++ b/packages/forest_admin_datasource_active_record/Gemfile-test @@ -14,5 +14,5 @@ group :development, :test do gem 'simplecov', '~> 0.22', require: false gem 'simplecov-html', '~> 0.12.3' gem 'simplecov_json_formatter', '~> 0.1.4' - gem 'sqlite3', '< 2.0' + gem 'sqlite3' end From 8e02d2399aa4a2d429c30f658ce3aaa0297ce334 Mon Sep 17 00:00:00 2001 From: Matt Date: Mon, 18 Nov 2024 11:11:29 +0100 Subject: [PATCH 6/7] fix: permission --- .../lib/forest_admin_agent/services/smart_action_checker.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/forest_admin_agent/lib/forest_admin_agent/services/smart_action_checker.rb b/packages/forest_admin_agent/lib/forest_admin_agent/services/smart_action_checker.rb index b1331c856..44c25b4a0 100644 --- a/packages/forest_admin_agent/lib/forest_admin_agent/services/smart_action_checker.rb +++ b/packages/forest_admin_agent/lib/forest_admin_agent/services/smart_action_checker.rb @@ -48,7 +48,9 @@ def can_approve? def can_trigger? if smart_action[:triggerEnabled].include?(role_id) && !smart_action[:approvalRequired].include?(role_id) - return true if smart_action[:triggerConditions].empty? || match_conditions(:triggerConditions) + if condition_by_role_id(smart_action[:triggerConditions]).blank? || match_conditions(:triggerConditions) + return true + end elsif smart_action[:approvalRequired].include?(role_id) && smart_action[:triggerEnabled].include?(role_id) if condition_by_role_id(smart_action[:approvalRequiredConditions]).blank? || match_conditions(:approvalRequiredConditions) raise RequireApproval.new( From 1093c080fa55150402616d8ab5f4616b5bbc0893 Mon Sep 17 00:00:00 2001 From: Matt Date: Mon, 18 Nov 2024 11:16:39 +0100 Subject: [PATCH 7/7] fix: permission --- .../lib/forest_admin_agent/services/smart_action_checker.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/forest_admin_agent/lib/forest_admin_agent/services/smart_action_checker.rb b/packages/forest_admin_agent/lib/forest_admin_agent/services/smart_action_checker.rb index 44c25b4a0..3c1330bda 100644 --- a/packages/forest_admin_agent/lib/forest_admin_agent/services/smart_action_checker.rb +++ b/packages/forest_admin_agent/lib/forest_admin_agent/services/smart_action_checker.rb @@ -58,7 +58,7 @@ def can_trigger? REQUIRE_APPROVAL_ERROR, smart_action[:userApprovalEnabled] ) - elsif smart_action[:triggerConditions].empty? || match_conditions(:triggerConditions) + elsif condition_by_role_id(smart_action[:triggerConditions]).blank? || match_conditions(:triggerConditions) return true end end