Make sure rules respect active flag.

This commit is contained in:
James Cole
2021-03-12 06:11:34 +01:00
parent 625e31d053
commit b0c9745982
4 changed files with 92 additions and 63 deletions

View File

@@ -46,31 +46,27 @@ class UpdateRequest extends FormRequest
*/ */
public function getAll(): array public function getAll(): array
{ {
$strict = null; $fields = [
$active = null; 'title' => ['title', 'string'],
$stopProcessing = null; 'description' => ['description', 'nlString'],
if (null !== $this->get('active')) { 'rule_group_id' => ['rule_group_id', 'integer'],
$active = $this->boolean('active'); 'trigger' => ['trigger', 'string'],
'strict' => ['strict', 'boolean'],
'stop_processing' => ['stop_processing', 'boolean'],
'active' => ['active', 'boolean'],
];
$return = $this->getAllData($fields);
$triggers = $this->getRuleTriggers();
$actions = $this->getRuleActions();
if(null !== $triggers) {
$return['triggers'] = $triggers;
} }
if (null !== $this->get('strict')) { if(null !== $actions) {
$strict = $this->boolean('strict'); $return['actions'] = $actions;
}
if (null !== $this->get('stop_processing')) {
$stopProcessing = $this->boolean('stop_processing');
} }
return [ return $return;
'title' => $this->nullableString('title'),
'description' => $this->nullableString('description'),
'rule_group_id' => $this->nullableInteger('rule_group_id'),
'rule_group_title' => $this->nullableString('rule_group_title'),
'trigger' => $this->nullableString('trigger'),
'strict' => $strict,
'stop_processing' => $stopProcessing,
'active' => $active,
'triggers' => $this->getRuleTriggers(),
'actions' => $this->getRuleActions(),
];
} }
/** /**
@@ -85,11 +81,13 @@ class UpdateRequest extends FormRequest
$return = []; $return = [];
if (is_array($triggers)) { if (is_array($triggers)) {
foreach ($triggers as $trigger) { foreach ($triggers as $trigger) {
$active = array_key_exists('active', $trigger) ? $trigger['active'] : true;
$stopProcessing= array_key_exists('stop_processing', $trigger) ? $trigger['stop_processing'] : false;
$return[] = [ $return[] = [
'type' => $trigger['type'], 'type' => $trigger['type'],
'value' => $trigger['value'], 'value' => $trigger['value'],
'active' => $this->convertBoolean((string) ($trigger['active'] ?? 'false')), 'active' => $active,
'stop_processing' => $this->convertBoolean((string) ($trigger['stop_processing'] ?? 'false')), 'stop_processing' => $stopProcessing,
]; ];
} }
} }

View File

@@ -46,7 +46,6 @@ class UpdateRequest extends FormRequest
public function getAll(): array public function getAll(): array
{ {
// return nothing that isn't explicitely in the array: // return nothing that isn't explicitely in the array:
// this is the way
$fields = [ $fields = [
'name' => ['name', 'string'], 'name' => ['name', 'string'],
'code' => ['code', 'string'], 'code' => ['code', 'string'],
@@ -56,7 +55,6 @@ class UpdateRequest extends FormRequest
'enabled' => ['enabled', 'boolean'], 'enabled' => ['enabled', 'boolean'],
]; ];
// this is the way.
$return = $this->getAllData($fields); $return = $this->getAllData($fields);
return $return; return $return;

View File

@@ -30,7 +30,6 @@ use FireflyIII\Models\RuleTrigger;
use FireflyIII\Support\Search\OperatorQuerySearch; use FireflyIII\Support\Search\OperatorQuerySearch;
use FireflyIII\User; use FireflyIII\User;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use Log;
/** /**
* Class RuleRepository. * Class RuleRepository.
@@ -319,7 +318,7 @@ class RuleRepository implements RuleRepositoryInterface
$ruleAction = new RuleAction; $ruleAction = new RuleAction;
$ruleAction->rule()->associate($rule); $ruleAction->rule()->associate($rule);
$ruleAction->order = $values['order']; $ruleAction->order = $values['order'];
$ruleAction->active = true; $ruleAction->active = $values['active'];
$ruleAction->stop_processing = $values['stop_processing']; $ruleAction->stop_processing = $values['stop_processing'];
$ruleAction->action_type = $values['action']; $ruleAction->action_type = $values['action'];
$ruleAction->action_value = $values['value'] ?? ''; $ruleAction->action_value = $values['value'] ?? '';
@@ -339,7 +338,7 @@ class RuleRepository implements RuleRepositoryInterface
$ruleTrigger = new RuleTrigger; $ruleTrigger = new RuleTrigger;
$ruleTrigger->rule()->associate($rule); $ruleTrigger->rule()->associate($rule);
$ruleTrigger->order = $values['order']; $ruleTrigger->order = $values['order'];
$ruleTrigger->active = true; $ruleTrigger->active = $values['active'];
$ruleTrigger->stop_processing = $values['stop_processing']; $ruleTrigger->stop_processing = $values['stop_processing'];
$ruleTrigger->trigger_type = $values['action']; $ruleTrigger->trigger_type = $values['action'];
$ruleTrigger->trigger_value = $values['value'] ?? ''; $ruleTrigger->trigger_value = $values['value'] ?? '';
@@ -357,24 +356,37 @@ class RuleRepository implements RuleRepositoryInterface
public function update(Rule $rule, array $data): Rule public function update(Rule $rule, array $data): Rule
{ {
// update rule: // update rule:
$fields = [
$rule->rule_group_id = $data['rule_group_id'] ?? $rule->rule_group_id; 'title',
$rule->active = $data['active'] ?? $rule->active; 'description',
$rule->stop_processing = $data['stop_processing'] ?? $rule->stop_processing; 'strict',
$rule->title = $data['title'] ?? $rule->title; 'rule_group_id',
$rule->strict = $data['strict'] ?? $rule->strict; 'active',
$rule->description = $data['description'] ?? $rule->description; 'stop_processing',
];
foreach ($fields as $field) {
if (array_key_exists($field, $data)) {
$rule->$field = $data[$field];
}
}
$rule->save(); $rule->save();
// update the triggers:
if (null !== $data['triggers']) { if (array_key_exists('trigger', $data) && 'update-journal' === $data['trigger']) {
$this->setRuleTrigger('update-journal', $rule);
}
if (array_key_exists('trigger', $data) && 'store-journal' === $data['trigger']) {
$this->setRuleTrigger('store-journal', $rule);
}
if (array_key_exists('triggers', $data)) {
// delete triggers: // delete triggers:
$rule->ruleTriggers()->delete(); $rule->ruleTriggers()->where('trigger_type', '!=', 'user_action')->delete();
// recreate triggers: // recreate triggers:
$this->storeTriggers($rule, $data); $this->storeTriggers($rule, $data);
} }
if (null !== $data['actions']) {
// delete actions: if (array_key_exists('actions', $data)) {
// delete triggers:
$rule->ruleActions()->delete(); $rule->ruleActions()->delete();
// recreate actions: // recreate actions:
@@ -384,6 +396,30 @@ class RuleRepository implements RuleRepositoryInterface
return $rule; return $rule;
} }
/**
* @param string $moment
* @param Rule $rule
*/
private function setRuleTrigger(string $moment, Rule $rule): void
{
/** @var RuleTrigger $trigger */
$trigger = $rule->ruleTriggers()->where('trigger_type', 'user_action')->first();
if (null !== $trigger) {
$trigger->trigger_value = $moment;
$trigger->save();
return;
}
$trigger = new RuleTrigger;
$trigger->order = 0;
$trigger->trigger_type = 'user_action';
$trigger->trigger_value = $moment;
$trigger->rule_id = $rule->id;
$trigger->active = true;
$trigger->stop_processing = false;
$trigger->save();
}
/** /**
* @param Rule $rule * @param Rule $rule
* @param array $data * @param array $data
@@ -396,16 +432,18 @@ class RuleRepository implements RuleRepositoryInterface
foreach ($data['actions'] as $action) { foreach ($data['actions'] as $action) {
$value = $action['value'] ?? ''; $value = $action['value'] ?? '';
$stopProcessing = $action['stop_processing'] ?? false; $stopProcessing = $action['stop_processing'] ?? false;
$active = $action['active'] ?? true;
$actionValues = [ $actionValues = [
'action' => $action['type'], 'action' => $action['type'],
'value' => $value, 'value' => $value,
'stop_processing' => $stopProcessing, 'stop_processing' => $stopProcessing,
'order' => $order, 'order' => $order,
'active' => $active,
]; ];
app('telemetry')->feature('rules.actions.uses_action', $action['type']); app('telemetry')->feature('rules.actions.uses_action', $action['type']);
$this->storeAction($rule, $actionValues); $this->storeAction($rule, $actionValues);
++$order;
} }
return true; return true;
@@ -420,25 +458,17 @@ class RuleRepository implements RuleRepositoryInterface
private function storeTriggers(Rule $rule, array $data): bool private function storeTriggers(Rule $rule, array $data): bool
{ {
$order = 1; $order = 1;
$stopProcessing = false;
$triggerValues = [
'action' => 'user_action',
'value' => $data['trigger'],
'stop_processing' => $stopProcessing,
'order' => $order,
];
$this->storeTrigger($rule, $triggerValues);
foreach ($data['triggers'] as $trigger) { foreach ($data['triggers'] as $trigger) {
$value = $trigger['value'] ?? ''; $value = $trigger['value'] ?? '';
$stopProcessing = $trigger['stop_processing'] ?? false; $stopProcessing = $trigger['stop_processing'] ?? false;
$active = $trigger['active'] ?? true;
$triggerValues = [ $triggerValues = [
'action' => $trigger['type'], 'action' => $trigger['type'],
'value' => $value, 'value' => $value,
'stop_processing' => $stopProcessing, 'stop_processing' => $stopProcessing,
'order' => $order, 'order' => $order,
'active' => $active,
]; ];
app('telemetry')->feature('rules.triggers.uses_trigger', $trigger['type']); app('telemetry')->feature('rules.triggers.uses_trigger', $trigger['type']);
@@ -514,6 +544,7 @@ class RuleRepository implements RuleRepositoryInterface
} }
} }
} }
return $filtered; return $filtered;
} }
@@ -540,6 +571,7 @@ class RuleRepository implements RuleRepositoryInterface
} }
} }
} }
return $filtered; return $filtered;
} }
@@ -562,6 +594,7 @@ class RuleRepository implements RuleRepositoryInterface
$params[] = sprintf('%s:"%s"', OperatorQuerySearch::getRootOperator($trigger->trigger_type), $trigger->trigger_value); $params[] = sprintf('%s:"%s"', OperatorQuerySearch::getRootOperator($trigger->trigger_type), $trigger->trigger_value);
} }
} }
return implode(' ', $params); return implode(' ', $params);
} }

View File

@@ -61,7 +61,7 @@ class RuleTransformer extends AbstractTransformer
$this->ruleRepository->setUser($rule->user); $this->ruleRepository->setUser($rule->user);
return [ return [
'id' => (int)$rule->id, 'id' => (string)$rule->id,
'created_at' => $rule->created_at->toAtomString(), 'created_at' => $rule->created_at->toAtomString(),
'updated_at' => $rule->updated_at->toAtomString(), 'updated_at' => $rule->updated_at->toAtomString(),
'rule_group_id' => (string) $rule->rule_group_id, 'rule_group_id' => (string) $rule->rule_group_id,