. */ declare(strict_types=1); namespace FireflyIII\Http\Requests; use FireflyIII\Models\Rule; /** * Class RuleFormRequest. */ class RuleFormRequest extends Request { /** * Verify the request. * * @return bool */ public function authorize(): bool { // Only allow logged in users return auth()->check(); } /** * Get all data for controller. * * @return array * * @SuppressWarnings(PHPMD.ExcessiveMethodLength) * @SuppressWarnings(PHPMD.CyclomaticComplexity) */ public function getRuleData(): array { $data = [ 'title' => $this->string('title'), 'rule_group_id' => $this->integer('rule_group_id'), 'active' => $this->boolean('active'), 'trigger' => $this->string('trigger'), 'description' => $this->string('description'), 'stop_processing' => $this->boolean('stop_processing'), 'strict' => $this->boolean('strict'), 'triggers' => $this->getRuleTriggerData(), 'actions' => $this->getRuleActionData(), ]; return $data; } /** * Rules for this request. * * @return array */ public function rules(): array { $validTriggers = array_keys(config('firefly.rule-triggers')); $validActions = array_keys(config('firefly.rule-actions')); // some actions require text (aka context): $contextActions = implode(',', config('firefly.context-rule-actions')); // some triggers require text (aka context): $contextTriggers = implode(',', config('firefly.context-rule-triggers')); // initial set of rules: $rules = [ 'title' => 'required|between:1,100|uniqueObjectForUser:rules,title', 'description' => 'between:1,5000|nullable', 'stop_processing' => 'boolean', 'rule_group_id' => 'required|belongsToUser:rule_groups', 'trigger' => 'required|in:store-journal,update-journal', 'triggers.*.name' => 'required|in:' . implode(',', $validTriggers), 'triggers.*.value' => sprintf('required_if:triggers.*.name,%s|min:1|ruleTriggerValue', $contextTriggers), 'actions.*.name' => 'required|in:' . implode(',', $validActions), 'actions.*.value' => sprintf('required_if:actions.*.name,%s|min:1|ruleActionValue', $contextActions), 'strict' => 'in:0,1', ]; /** @var Rule $rule */ $rule = $this->route()->parameter('rule'); if (null !== $rule) { $rules['title'] = 'required|between:1,100|uniqueObjectForUser:rules,title,' . $rule->id; } return $rules; } /** * @return array */ private function getRuleActionData(): array { $return = []; $actionData = $this->get('actions'); if (\is_array($actionData)) { foreach ($actionData as $action) { $stopProcessing = $action['stop_processing'] ?? '0'; $return[] = [ 'name' => $action['name'] ?? 'invalid', 'value' => $action['value'] ?? '', 'stop_processing' => 1 === (int)$stopProcessing, ]; } } return $return; } /** * @return array */ private function getRuleTriggerData(): array { $return = []; $triggerData = $this->get('triggers'); if (\is_array($triggerData)) { foreach ($triggerData as $trigger) { $stopProcessing = $trigger['stop_processing'] ?? '0'; $return[] = [ 'name' => $trigger['name'] ?? 'invalid', 'value' => $trigger['value'] ?? '', 'stop_processing' => 1 === (int)$stopProcessing, ]; } } return $return; } }