. */ declare(strict_types=1); namespace FireflyIII\Transformers; use FireflyIII\Exceptions\FireflyException; use FireflyIII\Models\Rule; use FireflyIII\Models\RuleAction; use FireflyIII\Models\RuleTrigger; use FireflyIII\Repositories\Rule\RuleRepositoryInterface; /** * Class RuleTransformer */ class RuleTransformer extends AbstractTransformer { /** @var RuleRepositoryInterface */ private $ruleRepository; /** * CurrencyTransformer constructor. * */ public function __construct() { $this->ruleRepository = app(RuleRepositoryInterface::class); } /** * Transform the rule. * * @param Rule $rule * * @return array * @throws FireflyException */ public function transform(Rule $rule): array { $this->ruleRepository->setUser($rule->user); return [ 'id' => (string)$rule->id, 'created_at' => $rule->created_at->toAtomString(), 'updated_at' => $rule->updated_at->toAtomString(), 'rule_group_id' => (string)$rule->rule_group_id, 'rule_group_title' => (string)$rule->ruleGroup->title, 'title' => $rule->title, 'description' => $rule->description, 'order' => (int)$rule->order, 'active' => $rule->active, 'strict' => $rule->strict, 'stop_processing' => $rule->stop_processing, 'trigger' => $this->getRuleTrigger($rule), 'triggers' => $this->triggers($rule), 'actions' => $this->actions($rule), 'links' => [ [ 'rel' => 'self', 'uri' => '/rules/'.$rule->id, ], ], ]; } /** * @param Rule $rule * * @return array */ private function actions(Rule $rule): array { $result = []; $actions = $this->ruleRepository->getRuleActions($rule); /** @var RuleAction $ruleAction */ foreach ($actions as $ruleAction) { $result[] = [ 'id' => (string)$ruleAction->id, 'created_at' => $ruleAction->created_at->toAtomString(), 'updated_at' => $ruleAction->updated_at->toAtomString(), 'type' => $ruleAction->action_type, 'value' => $ruleAction->action_value, 'order' => $ruleAction->order, 'active' => $ruleAction->active, 'stop_processing' => $ruleAction->stop_processing, ]; } return $result; } /** * @param Rule $rule * * @return string * @throws FireflyException */ private function getRuleTrigger(Rule $rule): string { $moment = null; $triggers = $this->ruleRepository->getRuleTriggers($rule); /** @var RuleTrigger $ruleTrigger */ foreach ($triggers as $ruleTrigger) { if ('user_action' === $ruleTrigger->trigger_type) { $moment = $ruleTrigger->trigger_value; } } if (null === $moment) { throw new FireflyException(sprintf('Rule #%d has no valid trigger moment. Edit it in the Firefly III user interface to correct this.', $rule->id)); } return $moment; } /** * @param Rule $rule * * @return array */ private function triggers(Rule $rule): array { $result = []; $triggers = $this->ruleRepository->getRuleTriggers($rule); /** @var RuleTrigger $ruleTrigger */ foreach ($triggers as $ruleTrigger) { if ('user_action' === $ruleTrigger->trigger_type) { continue; } $result[] = [ 'id' => (string)$ruleTrigger->id, 'created_at' => $ruleTrigger->created_at->toAtomString(), 'updated_at' => $ruleTrigger->updated_at->toAtomString(), 'type' => $ruleTrigger->trigger_type, 'value' => $ruleTrigger->trigger_value, 'order' => $ruleTrigger->order, 'active' => $ruleTrigger->active, 'stop_processing' => $ruleTrigger->stop_processing, ]; } return $result; } }