From fd5d2d57a8b3d118ac7682f7b8d7fa9d26dbfba3 Mon Sep 17 00:00:00 2001 From: James Cole Date: Sat, 20 Apr 2024 07:19:15 +0200 Subject: [PATCH] Fix https://github.com/firefly-iii/firefly-iii/issues/8804 --- .../V1/Requests/Models/Rule/StoreRequest.php | 23 ++++++++++--------- .../V1/Requests/Models/Rule/UpdateRequest.php | 16 +++++++------ app/Transformers/RuleTransformer.php | 20 +++++++++++----- config/firefly.php | 2 +- 4 files changed, 36 insertions(+), 25 deletions(-) diff --git a/app/Api/V1/Requests/Models/Rule/StoreRequest.php b/app/Api/V1/Requests/Models/Rule/StoreRequest.php index 2177eadf34..1d91a816ef 100644 --- a/app/Api/V1/Requests/Models/Rule/StoreRequest.php +++ b/app/Api/V1/Requests/Models/Rule/StoreRequest.php @@ -71,8 +71,9 @@ class StoreRequest extends FormRequest if (is_array($triggers)) { foreach ($triggers as $trigger) { $return[] = [ - 'type' => $trigger['type'], - 'value' => $trigger['value'], + 'type' => $trigger['type'] ?? '', + 'value' => $trigger['value'] ?? null, + 'prohibited' => $this->convertBoolean((string)($trigger['prohibited'] ?? 'false')), 'active' => $this->convertBoolean((string)($trigger['active'] ?? 'true')), 'stop_processing' => $this->convertBoolean((string)($trigger['stop_processing'] ?? 'false')), ]; @@ -105,8 +106,8 @@ class StoreRequest extends FormRequest */ public function rules(): array { - $validTriggers = $this->getTriggers(); - $validActions = array_keys(config('firefly.rule-actions')); + $validTriggers = $this->getTriggers(); + $validActions = array_keys(config('firefly.rule-actions')); // some triggers and actions require text: $contextTriggers = implode(',', $this->getTriggersWithContext()); @@ -118,11 +119,11 @@ class StoreRequest extends FormRequest 'rule_group_id' => 'belongsToUser:rule_groups|required_without:rule_group_title', 'rule_group_title' => 'nullable|min:1|max:255|required_without:rule_group_id|belongsToUser:rule_groups,title', 'trigger' => 'required|in:store-journal,update-journal', - 'triggers.*.type' => 'required|in:'.implode(',', $validTriggers), - 'triggers.*.value' => 'required_if:actions.*.type,'.$contextTriggers.'|min:1|ruleTriggerValue|max:1024', + 'triggers.*.type' => 'required|in:' . implode(',', $validTriggers), + 'triggers.*.value' => 'required_if:actions.*.type,' . $contextTriggers . '|min:1|ruleTriggerValue|max:1024', 'triggers.*.stop_processing' => [new IsBoolean()], 'triggers.*.active' => [new IsBoolean()], - 'actions.*.type' => 'required|in:'.implode(',', $validActions), + 'actions.*.type' => 'required|in:' . implode(',', $validActions), 'actions.*.value' => [sprintf('required_if:actions.*.type,%s', $contextActions), new IsValidActionExpression(), 'ruleActionValue'], 'actions.*.stop_processing' => [new IsBoolean()], 'actions.*.active' => [new IsBoolean()], @@ -181,10 +182,10 @@ class StoreRequest extends FormRequest */ protected function atLeastOneActiveTrigger(Validator $validator): void { - $data = $validator->getData(); + $data = $validator->getData(); /** @var null|array|int|string $triggers */ - $triggers = $data['triggers'] ?? []; + $triggers = $data['triggers'] ?? []; // need at least one trigger if (!is_countable($triggers) || 0 === count($triggers)) { return; @@ -210,10 +211,10 @@ class StoreRequest extends FormRequest */ protected function atLeastOneActiveAction(Validator $validator): void { - $data = $validator->getData(); + $data = $validator->getData(); /** @var null|array|int|string $actions */ - $actions = $data['actions'] ?? []; + $actions = $data['actions'] ?? []; // need at least one trigger if (!is_countable($actions) || 0 === count($actions)) { return; diff --git a/app/Api/V1/Requests/Models/Rule/UpdateRequest.php b/app/Api/V1/Requests/Models/Rule/UpdateRequest.php index 6f4be69a3d..afbf52b175 100644 --- a/app/Api/V1/Requests/Models/Rule/UpdateRequest.php +++ b/app/Api/V1/Requests/Models/Rule/UpdateRequest.php @@ -47,7 +47,7 @@ class UpdateRequest extends FormRequest */ public function getAll(): array { - $fields = [ + $fields = [ 'title' => ['title', 'convertString'], 'description' => ['description', 'stringWithNewlines'], 'rule_group_id' => ['rule_group_id', 'convertInteger'], @@ -81,10 +81,12 @@ class UpdateRequest extends FormRequest if (is_array($triggers)) { foreach ($triggers as $trigger) { $active = array_key_exists('active', $trigger) ? $trigger['active'] : true; + $prohibited = array_key_exists('prohibited', $trigger) ? $trigger['prohibited'] : false; $stopProcessing = array_key_exists('stop_processing', $trigger) ? $trigger['stop_processing'] : false; $return[] = [ 'type' => $trigger['type'], 'value' => $trigger['value'], + 'prohibited' => $prohibited, 'active' => $active, 'stop_processing' => $stopProcessing, ]; @@ -120,11 +122,11 @@ class UpdateRequest extends FormRequest */ public function rules(): array { - $validTriggers = $this->getTriggers(); - $validActions = array_keys(config('firefly.rule-actions')); + $validTriggers = $this->getTriggers(); + $validActions = array_keys(config('firefly.rule-actions')); /** @var Rule $rule */ - $rule = $this->route()->parameter('rule'); + $rule = $this->route()->parameter('rule'); // some triggers and actions require text: $contextTriggers = implode(',', $this->getTriggersWithContext()); @@ -136,11 +138,11 @@ class UpdateRequest extends FormRequest 'rule_group_id' => 'belongsToUser:rule_groups', 'rule_group_title' => 'nullable|min:1|max:255|belongsToUser:rule_groups,title', 'trigger' => 'in:store-journal,update-journal', - 'triggers.*.type' => 'required|in:'.implode(',', $validTriggers), - 'triggers.*.value' => 'required_if:actions.*.type,'.$contextTriggers.'|min:1|ruleTriggerValue|max:1024', + 'triggers.*.type' => 'required|in:' . implode(',', $validTriggers), + 'triggers.*.value' => 'required_if:actions.*.type,' . $contextTriggers . '|min:1|ruleTriggerValue|max:1024', 'triggers.*.stop_processing' => [new IsBoolean()], 'triggers.*.active' => [new IsBoolean()], - 'actions.*.type' => 'required|in:'.implode(',', $validActions), + 'actions.*.type' => 'required|in:' . implode(',', $validActions), 'actions.*.value' => [sprintf('required_if:actions.*.type,%s', $contextActions), new IsValidActionExpression(), 'ruleActionValue'], 'actions.*.stop_processing' => [new IsBoolean()], 'actions.*.active' => [new IsBoolean()], diff --git a/app/Transformers/RuleTransformer.php b/app/Transformers/RuleTransformer.php index bb4431d536..3b46278084 100644 --- a/app/Transformers/RuleTransformer.php +++ b/app/Transformers/RuleTransformer.php @@ -34,8 +34,7 @@ use FireflyIII\Repositories\Rule\RuleRepositoryInterface; */ class RuleTransformer extends AbstractTransformer { - /** @var RuleRepositoryInterface */ - private $ruleRepository; + private RuleRepositoryInterface $ruleRepository; /** * CurrencyTransformer constructor. @@ -72,7 +71,7 @@ class RuleTransformer extends AbstractTransformer 'links' => [ [ 'rel' => 'self', - 'uri' => '/rules/'.$rule->id, + 'uri' => '/rules/' . $rule->id, ], ], ]; @@ -109,18 +108,27 @@ class RuleTransformer extends AbstractTransformer if ('user_action' === $ruleTrigger->trigger_type) { continue; } + $triggerType = (string) $ruleTrigger->trigger_type; $triggerValue = (string)$ruleTrigger->trigger_value; - $needsContext = config(sprintf('search.operators.%s.needs_context', $ruleTrigger->trigger_type), true); + $prohibited = false; + + if(str_starts_with($triggerType, '-')) { + $prohibited = true; + $triggerType = substr($triggerType, 1); + } + + $needsContext = config(sprintf('search.operators.%s.needs_context', $triggerType), true); if (false === $needsContext) { $triggerValue = 'true'; } - $result[] = [ + $result[] = [ 'id' => (string)$ruleTrigger->id, 'created_at' => $ruleTrigger->created_at->toAtomString(), 'updated_at' => $ruleTrigger->updated_at->toAtomString(), - 'type' => $ruleTrigger->trigger_type, + 'type' => $triggerType, 'value' => $triggerValue, + 'prohibited' => $prohibited, 'order' => $ruleTrigger->order, 'active' => $ruleTrigger->active, 'stop_processing' => $ruleTrigger->stop_processing, diff --git a/config/firefly.php b/config/firefly.php index 4b86d8da65..9b2bedb5c1 100644 --- a/config/firefly.php +++ b/config/firefly.php @@ -118,7 +118,7 @@ return [ // see cer.php for exchange rates feature flag. ], 'version' => 'develop/2024-04-18', - 'api_version' => '2.0.13', + 'api_version' => '2.0.14', 'db_version' => 24, // generic settings